■ユーザーズフォーラム リニューアルのお知らせ
新規投稿は新ユーザーズフォーラムにお願いします。

トップページにログインフォームを作成したい

 

 1  |  2   | 次のページ>

kemshim > トップページにログインフォームを作成したい @ 2014/8/4 11:06
お世話になっております。


現在、blue_aquaというテンプレートを利用して、webサイトを作成しています。
トップページにログインフォームを作成して、会員のみが閲覧出来るページ(固定ページ)を1つ作成したいと思っております。

イメージとしては、以下のようなものです。
http://mirrenta.com/mypage/users/login

ですが、当方PHPの知識が乏しく、うまく作成することが出来ません。


以下のフォーラムで希望する状態に近いものを見つけたのですが、その中のアドバイスを含めてコードを入力してみるとエラーが出てしまいます。

トップページのサイドバーにログインフォームを設けたい|フォーラム|baserCMSユーザーズ : http://forum.basercms.net/modules/newbb/viewtopic.php?viewmode=flat&order=ASC&topic_id=887&forum=5


出力されるエラーは以下のようなものです。

Fatal Error
エラー: Call to a member function create() on a non-object	
File: /home/users/0/*****/web/basercms/app/webroot/theme/blue_aqua/Pages/index.php	
Line: 18
注意: このエラーメッセージをカスタマイズしたい場合は、 app/View/Errors/fatal_error.ctp を作成してください



以下のコードに問題があることは分かるのですが、どのように対処すべきなのかが分からずご質問させていただきました。

<?php echo $bcForm->create($userModel, array('action' => 'login', 'url' => array('controller' => 'users'))) ?>



お手数おかけしてすみませんが、どなたかご教授いただけないでしょうか。

よろしくお願い致します。

<動作環境>
■ BaserCMSのバージョン:3.0.5.1
■ レンタルサーバー名:ロリポップ
■ スマートURLの利用: OFF
■ 設置フォルダ: 分かりません…
■ 利用しているデータベース: MySQL

n1215 > Re: トップページにログインフォームを作成したい @ 2014/8/4 16:42
kemshim 様

こんにちは。
参考に挙げられている質問と回答はbaserCMS2系の場合ですね。

ログインフォームを出力しているのはBcFormHelperという名前のHelperなのですが、
baserCMS3系ではViewで利用するHelperの呼び出し方が変更されています。
$helperName → $this->HelperName

$bcFormをすべて$this->BcFormと置換すればいかがでしょう?

Twitter: @n_1215

kemshim > Re: トップページにログインフォームを作成したい @ 2014/8/4 17:24
n1215 様


ご返信いただきましてありがとうございます。

早速教えてもらった方法で試してみたのですが、今度は以下のような形になってしまいました。。

Notice (8): Undefined variable: userModel [APP/webroot/theme/blue_aqua/Pages/index.php, line 18]
Notice (8): Undefined variable: userModel [APP/webroot/theme/blue_aqua/Pages/index.php, line 21]アカウント名
Notice (8): Undefined variable: userModel [APP/webroot/theme/blue_aqua/Pages/index.php, line 22]
Notice (8): Undefined variable: userModel [APP/webroot/theme/blue_aqua/Pages/index.php, line 26]パスワード
Notice (8): Undefined variable: userModel [APP/webroot/theme/blue_aqua/Pages/index.php, line 27]

Notice (8): Undefined variable: userModel [APP/webroot/theme/blue_aqua/Pages/index.php, line 35]保存する 
パスワードを忘れた場合はこちら


エラーメッセージから、userModelという変数が利用されていないのが原因、ということはなんとなく理解できるのですが、そこからの対処方法がわかりません。

お手数おかけいたしますが、よろしくお願い致します。

<動作環境>
■ BaserCMSのバージョン:3.0.5.1
■ レンタルサーバー名:ロリポップ
■ スマートURLの利用: OFF
■ 設置フォルダ: 分かりません…
■ 利用しているデータベース: MySQL

n1215 > Re: トップページにログインフォームを作成したい @ 2014/8/4 19:10
kenshim 様

作成しようとしている会員制サイト?のより詳細な仕様をお聞かせいただけますか?
例)
・会員はCMS自体の管理ユーザとは別に用意する
・会員の新規登録はメールフォームで申請され、管理者がユーザーを手動登録
・会員用の固定ページがとあるURLに用意されていてログインした会員のみ閲覧可能


baserCMSにはプレフィックス認証機構が用意されており
とあるディレクトリ(例:http://example.com/mysite/)以下のページは特定のユーザグループに所属するユーザのみアクセス可能、という形のサイトであれば実装の手間をかなり省くことができます。
この機構を利用する場合、テーマのテンプレートだけでは完結せず、設定ファイルなどもいじる必要があります。
この機構を利用しない場合はCakePHPによる独自開発が必要です。

●参考URL
baserCMS3系における同様の質問:http://forum.basercms.net/modules/newbb/viewtopic.php?topic_id=1525&forum=5#forumpost5760
マイページ用のログイン認証を簡単に作る方法(baserCMS1系):http://basercms.net/develop/archives/11

上記参考URLを読んでいただければ実装の難易度はおおよそ見当がつくかと思いますが、
どちらかというと万人向けではなく開発者向けの機能です。

Twitter: @n_1215

kemshim > Re: トップページにログインフォームを作成したい @ 2014/8/4 19:39
n1215 様

返信いただき有り難うございます。

作成しようとしているサイトの概要は以下のようなものです。

・スポーツスクールのホームページ
・会員のみが見られるページを作成し、そこに管理者が会員向けにアドバイス等を記載
・会員専用のページは、個別ページにて作成(出来れば管理者本人が簡単に更新できるもの)

n1215様がおっしゃっている例で言うと、以下の二つが該当するかと思います。
・会員はCMS自体の管理ユーザとは別に用意する
・会員用の固定ページがとあるURLに用意されていてログインした会員のみ閲覧可能

・会員の新規登録はメールフォームで申請され、管理者がユーザーを手動登録
→こちらに関しては必須ではなく、出来ればというレベルです。



引用:
baserCMS3系における同様の質問:http://forum.basercms.net/modules/newbb/viewtopic.php?topic_id=1525&forum=5#forumpost5760
マイページ用のログイン認証を簡単に作る方法(baserCMS1系):http://basercms.net/develop/archives/11


上記記事も参考にさせていただきました!
結果、管理者以外のユーザーの登録、それによるログイン、ログイン後のページ出力までは出来たのですが、
最初にご質問させていただいたような問題点が出てきてしまいました。その為、質問させていただいた次第です。


私としてはPHPも初心者で、わからないことだらけで申し訳ありませんが、
何卒よろしくお願いいたします。


<動作環境>
■ BaserCMSのバージョン:3.0.5.1
■ レンタルサーバー名:ロリポップ
■ スマートURLの利用: OFF
■ 設置フォルダ: 分かりません…
■ 利用しているデータベース: MySQL

n1215 > Re: トップページにログインフォームを作成したい @ 2014/8/4 20:12
kemshim 様

会員のログインは既に実装されていたのですね。失礼しました。

すでに会員ログイン画面を実装されているのであれば、
トップページのテンプレートにおいて、会員ログイン画面のテンプレートと同様の処理を行う
(同じ変数を揃えた上で同じフォームのHTMLを出力する)というだけの話になるかと思います。

/lib/Baser/View/Members/mypage/login.php
が会員ログイン画面のテンプレートですよね。
(テーマ内にこのファイルをコピーしている場合はコピーしたファイル優先ですが)

このテンプレートはデフォルトの状態では、
/lib/Baser/View/Users/admin/login.php
をインクルードするので、ログインフォームの出力は管理ユーザーログイン画面のテンプレートを参考にすればいいことがわかります。

/lib/Baser/View/Users/admin/login.php
を見ていただくと、14行目〜21行目あたりに変数$userModelと$userControllerを設定する処理があります。

Twitter: @n_1215

kemshim > Re: トップページにログインフォームを作成したい @ 2014/8/7 13:14
n1215 様


返信が遅くなって申し訳ありません。

アドバイス頂いたのち、色々と試してみたのですが、うまく行きませんでした…


恥ずかしながらアドバイスの意味についてご質問なのですが、

引用:
すでに会員ログイン画面を実装されているのであれば、
トップページのテンプレートにおいて、会員ログイン画面のテンプレートと同様の処理を行う
(同じ変数を揃えた上で同じフォームのHTMLを出力する)というだけの話になるかと思います。

/lib/Baser/View/Members/mypage/login.php
が会員ログイン画面のテンプレートですよね。
(テーマ内にこのファイルをコピーしている場合はコピーしたファイル優先ですが)

このテンプレートはデフォルトの状態では、
/lib/Baser/View/Users/admin/login.php
をインクルードするので、ログインフォームの出力は管理ユーザーログイン画面のテンプレートを参考にすればいいことがわかります。



上記のアドバイスのうち、「同じ変数を揃えた上で同じフォームのHTMLを出力する」とは、

	<div id="LoginInner">

		<h1><?php $this->BcBaser->contentsTitle() ?></h1>
		<div id="AlertMessage" class="message" style="display:none"></div>
		<?php if ($currentPrefix == 'front'): ?>
			<?php echo $this->BcForm->create($userModel, array('action' => 'ajax_login', 'url' => array('controller' => $userController))) ?>
		<?php else: ?>
			<?php echo $this->BcForm->create($userModel, array('action' => 'ajax_login', 'url' => array($this->request->params['prefix'] => true, 'controller' => $userController))) ?>
		<?php endif ?>
		<div class="float-left login-input">
			<?php echo $this->BcForm->label($userModel . '.name', 'アカウント名') ?>
			<?php echo $this->BcForm->input($userModel . '.name', array('type' => 'text', 'size' => 16, 'tabindex' => 1)) ?>
		</div>
		<div class="float-left login-input">
			<?php echo $this->BcForm->label($userModel . '.password', 'パスワード') ?>
			<?php echo $this->BcForm->input($userModel . '.password', array('type' => 'password', 'size' => 16, 'tabindex' => 2)) ?>
		</div>
		<div class="float-left submit">
			<?php echo $this->BcForm->submit('ログイン', array('div' => false, 'class' => 'btn-red button', 'id' => 'BtnLogin', 'tabindex' => 4)) ?>
		</div>
		<div class="clear login-etc">
			<?php echo $this->BcForm->input($userModel . '.saved', array('type' => 'checkbox', 'label' => '保存する', 'tabindex' => 3)) ?> 
			<?php if ($currentPrefix == 'front'): ?>
				<?php $this->BcBaser->link('パスワードを忘れた場合はこちら', array('action' => 'reset_password'), array('rel' => 'popup')) ?>
			<?php else: ?>
				<?php $this->BcBaser->link('パスワードを忘れた場合はこちら', array('action' => 'reset_password', $this->request->params['prefix'] => true), array('rel' => 'popup')) ?>
			<?php endif ?>
		</div>
		<?php echo $this->BcForm->end() ?>
	</div>



のうち、どの変数をどちらと揃える必要があるのでしょうか。

本当に初心者の質問ですみません。

<動作環境>
■ BaserCMSのバージョン:3.0.5.1
■ レンタルサーバー名:ロリポップ
■ スマートURLの利用: OFF
■ 設置フォルダ: 分かりません…
■ 利用しているデータベース: MySQL

n1215 > Re: トップページにログインフォームを作成したい @ 2014/8/8 12:18
kemshim 様

baserCMS(ないしCakePHP)ではURLごとに対応するView(テンプレート)が存在することはご存知ですよね?
テーマに含まれるテンプレートファイルが優先で、テーマに該当するファイルがない場合は
・baserCMSコア lib/Baser/View/以下
・プラグイン lib/Baser/Plugin/{プラグイン名}/View以下
などからテンプレートが選ばれます。

詳細は
ファイル読み込みの優先順位 http://basercms.net/manuals/3/programmers/3.html
をご覧ください。

●ログイン画面のテンプレート
会員ログイン画面は下記URLの通りに実装されているということでいいんですよね?
http://forum.basercms.net/modules/newbb/viewtopic.php?topic_id=1525&forum=5#forumpost5760
baserCMS自体もCakePHP上に構築されていますので、
管理画面やログイン画面にもトップページやブログ投稿のページと同じようにViewテンプレートが存在します。

管理者ログイン画面(http://example.com/admin/users/login) ⇒ lib/Baser/View/Users/admin/login.php
会員ログイン画面(http://example.com/mypage/members/login) ⇒ lib/Baser/View/Members/mypage/login.php

となっています。これらの画面にはすでにログインフォームがありますよね?
なので、これらのページのテンプレートを参考にして真似してはいかがでしょうかということです。

会員ログイン画面のテンプレートには
lib/Baser/View/Members/mypage/login.php

include BASER_VIEWS . 'users' . DS . 'admin' . DS . 'login.php';

とありますが、これは管理者ログイン画面のテンプレートをそっくりそのまま利用している、というだけです。

そして、管理者ログイン画面のテンプレートがこちらです。これが一番参考になるテンプレートとなります。
lib/Baser/View/Users/admin/login.php
https://github.com/baserproject/basercms/blob/dev-3/lib/Baser/View/Users/admin/login.php
長いので全部は掲載しませんが、14〜22行目で$userModelと$userControllerという変数に値が代入されています。

14 if ($this->Session->check('Message.auth')) { 
15 	$this->Session->flash('auth'); 
16 } 
17 $userModel = Configure::read('BcAuthPrefix.' . $currentPrefix . '.userModel'); 
18 if (!$userModel) { 
19 	$userModel = 'User'; 
20 } 
21 list(, $userModel) = pluginSplit($userModel); 
22 $userController = Inflector::tableize($userModel); 

23〜40行目がCSS
42〜122行目までがクレジットの表示などを設定しているJavaScript
そして貴方が掲載しているコードは128〜157行目に相当しますね。
128〜157行目には$userModelと$userControllerという変数が何回か利用されていますが、
この部分をコピー&ペーストするだけではその2つの変数は何も設定されていない、というわけです。

変数を設定するには14〜22行目と同じ処理をトップページのテンプレートにも書く必要があります。

Twitter: @n_1215

kemshim > Re: トップページにログインフォームを作成したい @ 2014/8/8 15:00
n1215 様


いつもご返信いただきありがとうございます。


引用:
baserCMS(ないしCakePHP)ではURLごとに対応するView(テンプレート)が存在することはご存知ですよね?
テーマに含まれるテンプレートファイルが優先で、テーマに該当するファイルがない場合は
・baserCMSコア lib/Baser/View/以下
・プラグイン lib/Baser/Plugin/{プラグイン名}/View以下
などからテンプレートが選ばれます。


はい、この点に関しては大丈夫です。


引用:
会員ログイン画面は下記URLの通りに実装されているということでいいんですよね?
http://forum.basercms.net/modules/newbb/viewtopic.php?topic_id=1525&forum=5#forumpost5760


こちらも上記フォーラム通りに実装しています。ログイン・ログアウトできる事も確認済みです。


引用:
変数を設定するには14〜22行目と同じ処理をトップページのテンプレートにも書く必要があります。


上記の処理を、
app/webroot/theme/{テーマ名}/Layouts/default.php
の最初に記載しました。

<?php 
 if ($this->Session->check('Message.auth')) { 
  $this->Session->flash('auth'); 
 } 
 $userModel = Configure::read('BcAuthPrefix.' . $currentPrefix . '.userModel'); 
 if (!$userModel) { 
  $userModel = 'User'; 
 } 
 list(, $userModel) = pluginSplit($userModel); 
 $userController = Inflector::tableize($userModel); ?>


次に、以下のコードのうち、
basercms/login.php at dev-3 · baserproject/basercms · GitHub : https://github.com/baserproject/basercms/blob/dev-3/lib/Baser/View/Users/admin/login.php

128〜157行目のコードを
app/webroot/theme/{テーマ名}/Layouts/default.php
に記述した所、見た目としては問題なく表示されました。


ただ、試しに登録したマイページ用ユーザーでログインしようとすると、以下のエラーが出力されます。

引用:
UsersController のプライベートメソッド
エラー: UsersController::admin_login() には直接アクセスできません。
注意: このエラーメッセージをカスタマイズしたい場合は、 app/View/Errors/private_action.ctp を作成してください
Stack Trace
CORE/Cake/Routing/Dispatcher.php line 185 → Controller->invokeAction(CakeRequest)
CORE/Cake/Routing/Dispatcher.php line 160 → Dispatcher->_invoke(UsersController, CakeRequest, CakeResponse)
APP/webroot/index.php line 151 → Dispatcher->dispatch(CakeRequest, CakeResponse)


ここでまた止まってしまいました。。。

貴重なお時間を頂いているのに、自力で解決できなくて申し訳ありません。


何卒よろしくお願いいたします。

<動作環境>
■ BaserCMSのバージョン:3.0.5.1
■ レンタルサーバー名:ロリポップ
■ スマートURLの利用: OFF
■ 設置フォルダ: 分かりません…
■ 利用しているデータベース: MySQL

n1215 > Re: トップページにログインフォームを作成したい @ 2014/8/8 21:15
kemshim 様

お疲れ様です。
ここまでくれば後はトップページと会員ログインページの差異を調べて詰めるということになってきます。

1.ログインにAjaxを用いる
現バージョン(3.0.2)のbaserCMSは管理画面へのログインをAjaxを利用して行っています。(そのうち通常のPOSTに代わるという話もあります)
→2014.08.12追記:3.0.5.1でPOSTに変わったようです。

AjaxはJavaScriptのXMLHttpRequestというオブジェクトを利用して画面遷移なしにサーバと通信する技術の総称です。
JavaScript(scriptタグの内部)の$("#BtnLogin").click(function(e){}で囲まれる部分がログインボタンを押した時の処理です。
この部分の処理と依存するjQueryプラグインが必要になります。

2.プレフィックスを指定してログイン先を選択する
もう1つ重要なものとして$currentPrefixという変数があります。
これはbaserCMSのControllerからViewに渡されている変数の一つで、URLのプレフィックスを表しています。
通常(プレフィックスなし)は'front'、管理画面なら'admin'、URLのとおりに設定した会員ページならば'mypage'という風になります。
フォームを出力している部分において、この変数と$this->request->params['prefix']の値を利用してログイン先のURLや利用するモデルを選択するようになっています。

該当箇所は
https://github.com/baserproject/basercms/blob/dev-3/lib/Baser/View/Users/admin/login.php
17行目
$userModel = Configure::read('BcAuthPrefix.' . $currentPrefix . '.userModel');


132〜136行目
		<?php if ($currentPrefix == 'front'): ?>
			<?php echo $this->BcForm->create($userModel, array('action' => 'login', 'url' => array('controller' => $userController))) ?>
		<?php else: ?>
			<?php echo $this->BcForm->create($userModel, array('action' => 'login', 'url' => array($this->request->params['prefix'] => true, 'controller' => $userController))) ?>
		<?php endif ?>


150〜154行目
			<?php if ($currentPrefix == 'front'): ?>
				<?php $this->BcBaser->link('パスワードを忘れた場合はこちら', array('action' => 'reset_password'), array('rel' => 'popup')) ?>
			<?php else: ?>
				<?php $this->BcBaser->link('パスワードを忘れた場合はこちら', array('action' => 'reset_password', $this->request->params['prefix'] => true), array('rel' => 'popup')) ?>
			<?php endif ?>

ですね。
トップページでは$currentPrefixは'front'と設定されていますが、/mypage/以下の会員ページにログインしたいのでこちらは'mypage'に変更しておきます。
これで$userModelは'Member'、$userControllerは'members'となり、$this->request->params['prefix']の代わりにプレフィックスを直接記入してやればログイン先が希望するURLになるはずです。


以下がコードの例になります。
<?php
//変数の設定は本来テンプレート内部に紛れ込まないほうが良いのでファイルの上部にまとめておくのがオススメ

if ($this->Session->check('Message.auth')) {
    $this->Session->flash('auth');
}

// 認証用のプレフィックスをここで指定する
$currentPrefix = 'mypage';

// app/Config/setting.phpの設定を読み込んでいる
$userModel = Configure::read('BcAuthPrefix.' . $currentPrefix . '.userModel');
if (!$userModel) {
    $userModel = 'User';
}
list(, $userModel) = pluginSplit($userModel);
$userController = Inflector::tableize($userModel);
// app/Config/setting.phpの設定を反映して $userModel = Member, $userController = 'members'となるはず
?>


<!-- JavaScriptの記述位置はどこでもOK -->


<?php
//Ajaxのフォーム投稿に利用されているjQueryのプラグインを読み込んでおく
$this->BcBaser->js(array('admin/jquery.form-2.94'));
?>
<script type="text/javascript">
    $(function() {

	$("#BtnLogin").click(function(e){

		$("#"+$("#UserModel").html()+"AjaxLoginForm").ajaxSubmit({
			beforeSend: function() {
				$("#Waiting").show();
			},
			url: $("#"+$("#UserModel").html()+"AjaxLoginForm").attr('action'),
			success: function(response, status) {
				if(response) {                            
                                        //クレジット関連の処理を省略
					document.location = response;
				} else {
					$("#AlertMessage").html('ログインに失敗しました。アカウント名、パスワードを確認してください。');
					$("#AlertMessage").fadeIn(500);
				}
			},
			error: function(XMLHttpRequest, textStatus, errorThrown) {
				var errorMessage = '';
				if(XMLHttpRequest.status == 404) {
					errorMessage = '<br />'+'送信先のプログラムが見つかりません。';
				} else {
					if(XMLHttpRequest.responseText) {
						errorMessage = '<br />'+XMLHttpRequest.responseText;
					} else {
						errorMessage = '<br />'+errorThrown;
					}
				}
				$("#AlertMessage").html('ログイン処理に失敗しました。'+errorMessage);
				$("#AlertMessage").fadeIn(500);
			},
			complete: function(){
				$("#Waiting").hide();
			}
		});

		return false;

	});

    });
</script>

<!-- 以下はフォームを設置したい場所へ記述 -->

<!-- 一見不要に見えるがJavaScriptに$userModelの値を受け渡すために利用されている -->
<div id="UserModel" style="display:none"><?php echo $userModel ?></div>
<!-- これは不要なので消しても良い
<div id="LoginCredit" style="display:none"><?php echo $this->BcBaser->siteConfig['login_credit'] ?></div>
-->
<div id="Login">

    <div id="LoginInner">

        <h1><?php $this->BcBaser->contentsTitle() ?></h1>
        <div id="AlertMessage" class="message" style="display:none"></div>
            <?php /* $currentPrefixを決め打ちで設定するのでif節による分岐は不要。
                  $this->request->params['prefix']については定義されていないのでこの値を参照せずに$currentPrefix = 'mypage'で代用*/ ?>
            <?php echo $this->BcForm->create($userModel, array('action' => 'ajax_login', 'url' => array($currentPrefix => true, 'controller' => $userController))) ?>
        <div class="float-left login-input">
            <?php echo $this->BcForm->label($userModel . '.name', 'アカウント名') ?>
            <?php echo $this->BcForm->input($userModel . '.name', array('type' => 'text', 'size' => 16, 'tabindex' => 1)) ?>
        </div>
        <div class="float-left login-input">
            <?php echo $this->BcForm->label($userModel . '.password', 'パスワード') ?>
            <?php echo $this->BcForm->input($userModel . '.password', array('type' => 'password', 'size' => 16, 'tabindex' => 2)) ?>
        </div>
        <div class="float-left submit">
            <?php echo $this->BcForm->submit('ログイン', array('div' => false, 'class' => 'btn-red button', 'id' => 'BtnLogin', 'tabindex' => 4)) ?>
        </div>
        <div class="clear login-etc">
            <?php echo $this->BcForm->input($userModel . '.saved', array('type' => 'checkbox', 'label' => '保存する', 'tabindex' => 3)) ?>
            
            <?php // 上記と同様にムダなif節を省き$currentPrefixを利用 ?>
            <?php $this->BcBaser->link('パスワードを忘れた場合はこちら', array('action' => 'reset_password', $currentPrefix => true), array('rel' => 'popup')) ?>
        </div>
        <?php echo $this->BcForm->end() ?>
    </div>

</div>


長くなりましたが以上でいかがでしょうか。

Twitter: @n_1215

 

 1  |  2   | 次のページ>

ログイン
ユーザー名:
パスワード:


  新規登録 / パスワード紛失

検索

facebook
フォーラムで悩みが解決した場合など、よかったら「いいね!」をポチっとクリックしてください!質問の回答者や開発者の励みになります

フォーラムガイド


関連リンク

オンライン状況
11 人のユーザが現在オンラインです。 (10 人のユーザが フォーラム を参照しています。)

登録ユーザ: 0
ゲスト: 11