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

管理者ダッシュボード>「最近の動き」の表示内容をユーザーグループで分岐したい

funi > 管理者ダッシュボード>「最近の動き」の表示内容をユーザーグループで分岐したい @ 2015/4/18 20:07
いつもお世話になっております。
複数で管理を行うサイトを作成中で、ユーザーグループ毎に管理ダッシュボードを切り替え表示させるために試行錯誤しています。

ユーザーグループ毎のランチャーについては、以下のryuringさまのコメントを参考にエレメントを作成し実装することが出来ました。
http://forum.basercms.net/modules/newbb/viewtopic.php?viewmode=flat&order=ASC&topic_id=1013&forum=4

<< baserCMSバージョン 3.0.6.1 を使用中 >>
/app/webroot/theme/***/Dashboard/admin/index.php 内の分岐表示させたい箇所で

<?php
if($user['user_group_id'] == 1) {
	$this->BcBaser->element('dashboard_admin');
} elseif($user['user_group_id'] == 2) {
	$this->BcBaser->element('dashboard_operator');
} elseif($user['user_group_id'] == 3) {
	$this->BcBaser->element('dashboard_editer');
} else {
	$this->BcBaser->element('dashboard_user');
}
?>

とすることで実装できました。ありがとうございました。

次に、「最近の動き」の表示について上位権限者( operators から見ると admins )の作業については表示されないようにしたいと思っているのですが
作業した人 $this->BcBaser->getUserName($record['User']) のユーザー名からユーザーグループを取得判別する方法がわかりません。
判別方法がわかれば、
/app/webroot/theme/***/Elements/admin/dashboard/index_dblog_list.php
<?php foreach ($viewDblogs as $record): ?>

の後で、ログインユーザーのユーザーグループ以下のログのみ表示させれば良いかと思うのですが、いかがでしょうか。

最近の動きそのものを外すのは簡単ですが、更新状況やミスなどを把握するためにも表示は残したいと思っています。
お手数かとは存じますが、アドバイス頂ければと思います。何卒よろしくお願いします。

公式サイト・フォーラム・wikiなど検索し尽くしたつもりですが、どこかに仕様などの記載があればご指摘頂ければ幸いです。

■ BaserCMS Ver:3.0.6.1 〜 4.1.0.1
■ サーバー名:lolipop
■ スマートURLの利用:ON
■ 設置フォルダ:サブフォルダ、サブドメイン等
■ 利用しているDB:SQLite

n1215 > Re: 管理者ダッシュボード>「最近の動き」の表示内容をユーザーグループで分岐したい @ 2015/4/20 21:56
funi 様

ページネ―ションの都合もあるので、テンプレートだけで処理するのは無駄が多いです。

コントローラでビュー変数の$viewDblogsに設定されている配列をあらかじめフィルタリングするのが良いでしょう。

1. lib/Baser/Controller/DashboardController.phpをapp/Controller/DashboardController.phpにコピー
2. 下記2つのメソッドを上書きし、それら2つから共通で利用する1つのメソッドを追加
※ユーザーグループ名の設定は適宜調整してください。

/**
 * [ADMIN] 管理者ダッシュボードページにajaxでデータを取得する
 *
 * @return void
 * @access public
 */
	public function admin_ajax_dblog_index() {
		$default = array('named' => array('num' => $this->siteConfigs['admin_list_num']));
		$this->setViewConditions('Dblog', array('default' => $default, 'action' => 'admin_index'));
		$this->set('viewDblogs', $this->getAllowedDblogs());
	}

/**
 * [ADMIN] 管理者ダッシュボードページを表示する
 *
 * @return void
 * @access public
 */
	public function admin_index() {
		$this->pageTitle = '管理者ダッシュボード';
		$default = array('named' => array('num' => $this->siteConfigs['admin_list_num']));
		$this->setViewConditions('Dblog', array('default' => $default));
		$this->set('viewDblogs', $this->getAllowedDblogs());
		$publishedPages = $this->Page->find('count', array('conditions' => array('Page.status' => true)));
		$unpublishedPages = $this->Page->find('count', array('conditions' => array('Page.status' => false)));
		$totalPages = $publishedPages + $unpublishedPages;
		$this->set(compact('publishedPages', 'unpublishedPages', 'totalPages'));
		$this->help = 'dashboard_index';
	}

/**
 * ユーザーグループに応じて閲覧が許される最近の動きを取得
 *
 * @return array
 */
	protected function getAllowedDblogs() {
		//ユーザグループ同士の閲覧権限を設定
		$allowedGroups = array(
			'admins' => array('admins', 'operators', 'editors', 'users'),
			'operators' => array('operators', 'editors', 'users'),
			'editors' => array('editors', 'users'),
			'users' => array('users')
		);

		//ログインしているユーザのグループ名を取得
		$user = $this->BcAuth->user();
		$groupName = ($user['UserGroup']['name']);
		$this->paginate = array(
			'fields' => '*',
			'conditions' => array('UserGroup.name' => $allowedGroups[$groupName]),
			'joins' => array(
				array(
					'table' => 'user_groups',
					'alias' => 'UserGroup',
					'conditions' => 'UserGroup.id = User.user_group_id',
				)
			),
			'order' => array('Dblog.created '=> 'DESC', 'Dblog.id' => 'DESC'),
			'limit' => $this->passedArgs['num']
		);

		return $this->paginate('Dblog');
	}

Twitter: @n_1215

funi > Re: 管理者ダッシュボード>「最近の動き」の表示内容をユーザーグループで分岐したい @ 2015/4/21 14:08
n1215さま

丁寧なご回答をありがとうございました。
アドバイス頂いた通りに記述を行ってみたところ下位権限者でログインした場合は上位の「最近の動き」が表示されなくなりました。

ただ、operators グループのアカウントで新着情報を追加したところ
admins operators の双方の「最近の動き」に下記のようなエラーが出るようになりました。

Notice (8): Undefined index: Dblog [APP/webroot/theme/***/Elements/admin/dashboard/index_dblog_list.php, line 52]Code Contextinclude - APP/webroot/theme/***/Elements/admin/dashboard/index_dblog_list.php, line 52
View::_evaluate() - CORE/Cake/View/View.php, line 948
View::_render() - CORE/Cake/View/View.php, line 910
View::_renderElement() - CORE/Cake/View/View.php, line 1213
View::element() - CORE/Cake/View/View.php, line 418
BcBaserHelper::getElement() - CORE/Baser/View/Helper/BcBaserHelper.php, line 521
BcBaserHelper::element() - CORE/Baser/View/Helper/BcBaserHelper.php, line 558
include - APP/webroot/theme/***/Dashboard/admin/index.php, line 45
View::_evaluate() - CORE/Cake/View/View.php, line 948
View::_render() - CORE/Cake/View/View.php, line 910
View::render() - CORE/Cake/View/View.php, line 471
Controller::render() - CORE/Cake/Controller/Controller.php, line 954
Dispatcher::_invoke() - CORE/Cake/Routing/Dispatcher.php, line 198
Dispatcher::dispatch() - CORE/Cake/Routing/Dispatcher.php, line 165
[main] - APP/webroot/index.php, line 151


上述頂いた以外に何かを行う(テンプレート側でも判別を行うなど)必要があるのでしょうか。
お手間をおかけしてしまい申し訳ありませんが、ご教授頂けると幸いです。
何卒よろしくお願いします。

■ BaserCMS Ver:3.0.6.1 〜 4.1.0.1
■ サーバー名:lolipop
■ スマートURLの利用:ON
■ 設置フォルダ:サブフォルダ、サブドメイン等
■ 利用しているDB:SQLite

n1215 > Re: 管理者ダッシュボード>「最近の動き」の表示内容をユーザーグループで分岐したい @ 2015/4/21 19:53
funi 様

3.0.6.1で試していますがこちらでは再現しませんね。

baserCMSを独自に改造していく場合は、PHPのエラーの読み方を覚えると楽になります。
[quote}Notice (8): Undefined index: Dblog [APP/webroot/theme/***/Elements/admin/dashboard/index_dblog_list.php, line 52]Code Contextinclude - APP/webroot/theme/***/Elements/admin/dashboard/index_dblog_list.php, line


提示していただいたエラーの一行目を読むだけでも相当な情報が得られます。

・Dblogというインデックス(index)が定義されていない(Undefined)
・エラーはapp/webroot/theme/***/Elements/admin/dashboard/index_dblog_list.phpの52行目で発生している。

もしこのファイルがbaserコアのテンプレートそのままであるとすると(独自に変更を加えていた場合は別ですが)
https://github.com/baserproject/basercms/blob/dev-3/lib/Baser/View/Elements/admin/dashboard/index_dblog_list.php#L52
この部分ですね。

		<?php foreach ($viewDblogs as $record): ?>
			<li><span class="date"><?php echo $this->BcTime->format('Y.m.d', $record['Dblog']['created']) ?></span>
				<small><?php echo $this->BcTime->format('H:i:s', $record['Dblog']['created']) ?>&nbsp;
					<?php
					$userName = $this->BcBaser->getUserName($record['User']);
					if ($userName) {
						echo '[' . $userName . ']';
					}
					?>
				</small><br />
				<?php echo $record['Dblog']['name'] ?></li>
		<?php endforeach; ?>


$recordという配列には'Dblog'というインデックスを持つはずですが、そうなっていないので値が取れないようです。

52行目の上にデバッグ用のコードを挿入し、$recordの中身を確認してみましょう。
<?php var_dump($record) ?>


参考までに手元ではこうなってます。
array (size=3)
  'Dblog' => 
    array (size=5)
      'id' => string '70' (length=2)
      'name' => string '記事「aaa」を追加しました。' (length=39)
      'user_id' => string '3' (length=1)
      'created' => string '2015-04-21 19:37:50' (length=19)
      'modified' => string '2015-04-21 19:37:50' (length=19)
  'User' => 
    array (size=10)
      'id' => string '3' (length=1)
      'name' => string 'test' (length=4)
      'password' => string '6ed58ca8ac0d02c2035f97ca89274ea9da20cd64' (length=40)
      'real_name_1' => string 'test' (length=4)
      'real_name_2' => string 'test' (length=4)
      'email' => string '' (length=0)
      'user_group_id' => string '2' (length=1)
      'nickname' => string '' (length=0)
      'created' => string '2015-04-12 19:25:56' (length=19)
      'modified' => string '2015-04-21 19:37:20' (length=19)
  'UserGroup' => 
    array (size=8)
      'id' => string '2' (length=1)
      'name' => string 'operators' (length=9)
      'title' => string 'サイト運営' (length=15)
      'auth_prefix' => string 'admin' (length=5)
      'use_admin_globalmenu' => boolean false
      'default_favorites' => string 'YTo1OntpOjA7YToyOntzOjQ6Im5hbWUiO3M6MjE6IuWbuuWumuODmuODvOOCuOeuoeeQhiI7czozOiJ1cmwiO3M6MTg6Ii9hZG1pbi9wYWdlcy9pbmRleCI7fWk6MTthOjI6e3M6NDoibmFtZSI7czoxODoi5paw552A5oOF5aCx566h55CGIjtzOjM6InVybCI7czozMDoiL2FkbWluL2Jsb2cvYmxvZ19wb3N0cy9pbmRleC8xIjt9aToyO2E6Mjp7czo0OiJuYW1lIjtzOjI0OiLjgYrllY/jgYTlkIjjgo/jgZvnrqHnkIYiO3M6MzoidXJsIjtzOjMxOiIvYWRtaW4vbWFpbC9tYWlsX2ZpZWxkcy9pbmRleC8xIjt9aTozO2E6Mjp7czo0OiJuYW1lIjtzOjIxOiLlj5fkv6Hjg6Hjg7zjg6vkuIDopqciO3M6MzoidXJsIjtzOjMzOiIvYWRtaW4vbWFpbC9tYWlsX21lc3NhZ2VzL2luZGV4'... (length=652)
      'modified' => null
      'created' => string '2015-04-09 00:01:24' (length=19)

Twitter: @n_1215

funi > Re: 管理者ダッシュボード>「最近の動き」の表示内容をユーザーグループで分岐したい @ 2015/4/22 15:53
n1215さま

度々ご回答頂きありがとうございます。
引用:
・Dblogというインデックス(index)が定義されていない(Undefined)
・エラーはapp/webroot/theme/***/Elements/admin/dashboard/index_dblog_list.phpの52行目で発生している。

ここまでは理解していたのですが、原因がわからず質問させて頂きました。
お教え頂いたデバッグ用コードを挿入して確認したところ以下のような結果になりました。

最近の動き エラー時:1個目
array(1) { 
[0]=> array(23) { 
["*"]=> string(1) "6" 
[1]=> string(45) "記事「テスト」を追加しました。" 
[2]=> string(1) "2" 
[3]=> string(19) "2015-04-22 13:17:20" 
[4]=> string(19) "2015-04-22 13:17:20" 
[5]=> string(1) "2" 
[6]=> string(3) "optest" 
[7]=> string(40) "a057a551654beadf0feb6e1434c514774fc15487" 
[8]=> string(6) "苗字" 
[9]=> string(6) "名前" 
[10]=> string(18) "none@email.com" 
[11]=> string(1) "2" 
[12]=> string(0) "" 
[13]=> string(19) "2015-04-22 13:16:09" 
[14]=> string(19) "2015-04-22 13:16:09" 
[15]=> string(1) "2" 
[16]=> string(9) "operators" 
[17]=> string(15) "サイト運営" 
[18]=> string(5) "admin" 
[19]=> string(1) "0" 
[20]=> string(652) "YTo1OntpOjA7YToyOntzOjQ6Im5hbWUiO3M6MjE6IuWbuuWumuODmuODvOOCuOeuoeeQhiI7czozOiJ1cmwiO3M6MTg6Ii9hZG1pbi9wYWdlcy9pbmRleCI7fWk6MTthOjI6e3M6NDoibmFtZSI7czoxODoi5paw552A5oOF5aCx566h55CGIjtzOjM6InVybCI7czozMDoiL2FkbWluL2Jsb2cvYmxvZ19wb3N0cy9pbmRleC8xIjt9aToyO2E6Mjp7czo0OiJuYW1lIjtzOjI0OiLjgYrllY/jgYTlkIjjgo/jgZvnrqHnkIYiO3M6MzoidXJsIjtzOjMxOiIvYWRtaW4vbWFpbC9tYWlsX2ZpZWxkcy9pbmRleC8xIjt9aTozO2E6Mjp7czo0OiJuYW1lIjtzOjIxOiLlj5fkv6Hjg6Hjg7zjg6vkuIDopqciO3M6MzoidXJsIjtzOjMzOiIvYWRtaW4vbWFpbC9tYWlsX21lc3NhZ2VzL2luZGV4LzEiO31pOjQ7YToyOntzOjQ6Im5hbWUiO3M6MTg6IuOCs+ODoeODs+ODiOS4gOimpyI7czozOiJ1cmwiO3M6MzM6Ii9hZG1pbi9ibG9nL2Jsb2dfY29tbWVudHMvaW5kZXgvMSI7fX0=" 
[21]=> NULL 
[22]=> string(19) "2015-02-16 11:50:13" } } 


n1215さま の参考例と同様かとは思いますが、元は以下のようになっています。
最近の動き エラーなし:1個目(DashboardController.php コアのまま)
array(2) { 
["Dblog"]=> array(5) { 
 ["id"]=> string(1) "6" 
 ["name"]=> string(45) "記事「テスト」を追加しました。" 
 ["user_id"]=> string(1) "2" 
 ["created"]=> string(19) "2015-04-22 13:17:20" 
 ["modified"]=> string(19) "2015-04-22 13:17:20"
} 
["User"]=> array(10) { 
 ["id"]=> string(1) "2" 
 ["name"]=> string(3) "optest" 
 ["password"]=> string(40) "a057a551654beadf0feb6e1434c514774fc15487" 
 ["real_name_1"]=> string(6) "苗字" 
 ["real_name_2"]=> string(6) "名前" 
 ["email"]=> string(18) "none@email.com" 
 ["user_group_id"]=> string(1) "2" 
 ["nickname"]=> string(0) "" 
 ["created"]=> string(19) "2015-04-22 13:16:09" 
 ["modified"]=> string(19) "2015-04-22 13:16:09" }
} 


エラーの場合も、ユーザーグループ名などの値は格納されているようですが、Dblogを含めキーがセットされていない形です。
どこでそうなったのか、DashboardController.php を見比べてみるものの私には、到底理解できそうにありません。

これを見ると、投稿者の user_group_id はオリジナルでも参照出来るようですので、ユーザーグループ名ではなくユーザーグループIDでテンプレートにて判別することが出来るのではないかと考え
app/webroot/theme/***/Elements/admin/dashboard/index_dblog_list.php にて
<ul class="clear">
<?php foreach ($viewDblogs as $record): ?>
	<?php if ($record['User']['user_group_id'] >= $user['user_group_id']): ?>
		<li><span class="date"><?php echo $this->BcTime->format('Y.m.d', $record['Dblog']['created']) ?></span>
		<small><?php echo $this->BcTime->format('H:i:s', $record['Dblog']['created']) ?>&nbsp;
		<?php
		$userName = $this->BcBaser->getUserName($record['User']);
		if ($userName) {
		echo '[' . $userName . ']';
		}
		?>
		</small><br />
		<?php echo $record['Dblog']['name'] ?></li>
	<?php endif; ?>
<?php endforeach; ?>
</ul>

としてみたのですが、先にご指摘頂いた通りページネーションが上手くいかない問題が残ってしまいます。

同じバージョンで試して頂いてもエラーが出ないとのことで、これ以上お手数をおかけするのも申し訳ないので、もう少し試行錯誤してみて駄目なようでしたら operators 以下はページネーションを外しても良いかと思っています。

色々とお手数をおかけした上に解決も出来ず申し訳ありませんが、n1215さまには心より感謝申し上げます。

■ BaserCMS Ver:3.0.6.1 〜 4.1.0.1
■ サーバー名:lolipop
■ スマートURLの利用:ON
■ 設置フォルダ:サブフォルダ、サブドメイン等
■ 利用しているDB:SQLite

n1215 > Re: 管理者ダッシュボード>「最近の動き」の表示内容をユーザーグループで分岐したい @ 2015/4/22 18:22
funi 様

お手数ですがあと一つ試していただいても良いですか?
以前の返信で提示したコードの下記の'fields' => '*', の行を削除したらどうなります?

$this->paginate = array(
			'fields' => '*',
			'conditions' => array('UserGroup.name' => $allowedGroups[$groupName]),
			'joins' => array(
				array(
					'table' => 'user_groups',
					'alias' => 'UserGroup',
					'conditions' => 'UserGroup.id = User.user_group_id',
				)
			),
			'order' => array('Dblog.created '=> 'DESC', 'Dblog.id' => 'DESC'),
			'limit' => $this->passedArgs['num']
		);

Twitter: @n_1215

funi > Re: 管理者ダッシュボード>「最近の動き」の表示内容をユーザーグループで分岐したい @ 2015/4/22 19:07
n1215さま

ご回答頂きありがとうございます。
引用:

以前の返信で提示したコードの下記の'fields' => '*', の行を削除したらどうなります?

上手くいきました。
ありがとうございました。

色々と自分でも試して、同じようにfieldsも消してみたりしたはずなのですが、他でミスがあったのかエラーが出ていました。
今回は、以前にご提示頂いた DashboardController.php と コアのindex_dblog_list.php のままで試したところ、上手く表示されました。

本当に最後までご回答頂きありがとうございました。
すっきりと解決出来たこと、心より感謝いたします。
<(_ _)>

■ BaserCMS Ver:3.0.6.1 〜 4.1.0.1
■ サーバー名:lolipop
■ スマートURLの利用:ON
■ 設置フォルダ:サブフォルダ、サブドメイン等
■ 利用しているDB:SQLite

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


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

検索

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

フォーラムガイド


関連リンク

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

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