かゆいところに手が届くかも!concrete5 8系 地味カスタマイズ集
この記事は concrete5 Japan Advent Calendar 2017 の16日目の記事です。
前回はASUMIさんの「concrete5 “Meetup Tokyo”に参加してきました!」でした。
concrete5全然関係ない内容も満載の懐深いMeetup・・・!
今年の東京勉強会は面白そうな内容多かったなぁ〜。
今年の京都チームはというと「concrete5の日」を複数回開催したのみ!ということで
来年はもう少し動きを増やしていければなーと思ってます。
はい、というわけで今年もたくさんconcrete5のお仕事させていただきました。
本記事ではconcrete5でサイトを作る上でかゆ〜いところに手が届く(?)カスタマイズを幾つか紹介します。
とにかくかゆい、かゆいんだ!
かゆい1:「ページ」をクリックした時のパネルをカスタマイズ
ログイン時に表示される「ページ」をクリックした際に表示されるここ↓。
コンポーザーからページを作成したり、サイトマップや下書きを確認したりと
サイト制作時に非常によく目にすることになるこのエリアにもう少し色気を加えます。
まずはこのエリアを出力しているconcrete/views/panels/sitemap.phpをオーバーライド。
application/views/panels/sitemap.phpとしてコピーします。
これで準備はOK。
先ほどコピーしたsitemap.phpではこんな感じで各種情報が出力されています。
・6〜29行目あたり:よく利用される&他のページタイプ
・43〜61行目あたり:下書き
・64〜79行目あたり:サイトマップ
とりあえず下書きエリアをちょっと変更してみます。
下書きリストにはページタイプが表示されないのでページタイプを表示させてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//下書きを出力している箇所をカスタマイズ <ul class="ccm-panel-sitemap-list"> <?php foreach ($drafts as $dc) { $pt_name =$dc->getPageTypeName();//ページタイプ名称を取得 ?> <li><a href="<?php echo Loader::helper('navigation')->getLinkToCollection($dc)?>"><?php if ($dc->getCollectionName()) { echo $dc->getCollectionName() . ' ' . Core::make('date')->formatDateTime($dc->getCollectionDateAdded(), false).'<br>(ページタイプ:<span style="font-weight:700;">'.$pt_name.'</span>)'; } else { echo t('(Untitled)') . ' ' . Core::make('date')->formatDateTime($dc->getCollectionDateAdded(), false).'<br>(ページタイプ:<span style="font-weight:700;">'.$pt_name.'</span>)'; } ?></a></li> <?php } ?> </ul> |
いい感じです!
とりあえずこのファイルに記述した内容は出力されるのでサポート情報を掲載したりするのもいいかもですね。
かゆい2:あるページのあるエリアを指定してあるブロックを取得、そこからどう出力するか??
ページテンプレートなどで、あるページのあるブロックに登録された内容を出力したい時って結構あります。
例えば「Page Selector Attribute」を使ったページ属性である商品ページを選択、「関連する商品」としてそのページのブロック内の情報を出力したい!とか。
そんな時はこれ。
まずは指定されたページの狙いのエリアにある狙いのブロックを取得。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$page = Page::getByID($pageID);//取得したいブロックのあるページID; $areas = array(//取得したいエリアを配列で指定しておく 'area_01', 'area_02', 'area_03', 'area_04', 'area_05', 'area_06' ); foreach($areas as $area){ $blocks = $page->getBlocks($area); if(is_array($blocks)){ foreach($blocks as $block){ if($block->btHandle == 'target_block_type'){//target_block_typeは取得したいブロックタイプハンドルを指定 $_blocks[] = $block; } } } } |
$_blocksには狙いのブロックオブジェクトが入ります。
これを使ってこんな感じで出力できます。
1 2 3 4 5 6 7 8 9 10 11 12 |
//contoller内の処理を指定して登録内容を取り出す foreach($_blocks as $bo){ var_dump($bo->getInstance()->getEntries());//例:スライドショーブロックの場合は登録した画像データ配列を取得 } //controller内でsetした変数名で登録内容を取り出す foreach($_blocks as $bo){ $bc = $bo->getController(); $bc->view();//viewでセットした変数を $sets = $bc->getSets();//まるっと取得して var_dump($sets['variable']);//変数名指定で取り出し } |
controllerをカスタマイズして独自のメソッドを追加していたり、
独自の変数を登録している場合も上記の方法で自由に扱うことができます。
かゆい3:君にだけ通知を送りたいんだ・・・
(設定は非常に非常に面倒ですが使いこなせれば)強力なconcrete5デフォルト機能、「ワークフロー」。
皆さん使ってますか?
今年も幾つかのサイトでお世話になりました。
一般的なサイトだと大体「承認者グループ」「投稿者グループ」といった具合に
グループ向けにワークフローを設定することが多いと思うのですが
通知設定かけたグループに含まれるすべてのユーザーにメールが飛んでしまうんですよね。
当たり前といえば当たり前ですが。
ただ「投稿者グループ」に所属している「ワークフローに送信したユーザー」にだけ通知したい時、ありますよね?
まずはconcrete/src/Concrete/Workflow/BasicWorkflow.phpを
application/src/Concrete/Workflow/BasicWorkflow.phpとしてコピーします。
それからapplication/bootstrap/app.phpでオーバライド設定。
1 2 3 4 5 |
<?php // application/bootstrap/app.php $app->bind('\Concrete\Core\Workflow\BasicWorkflow', function($app, $params) { return new \Application\Concrete\Workflow\BasicWorkflow($params[0]); }); |
ワークフローの通知関連エリアをカスタマイズします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
<?php defined('C5_EXECUTE') or die("Access Denied."); namespace Application\Concrete\Workflow; use Concrete\Core\Permission\AssignableObjectInterface; use Concrete\Core\Permission\AssignableObjectTrait; use Concrete\Core\Permission\Key\Key; use Concrete\Core\Workflow\HistoryEntry\BasicHistoryEntry as BasicWorkflowHistoryEntry; use Concrete\Core\Workflow\Progress\Action\ApprovalAction as WorkflowProgressApprovalAction; use Concrete\Core\Workflow\Progress\Action\CancelAction as WorkflowProgressCancelAction; use Concrete\Core\Workflow\Progress\BasicData as BasicWorkflowProgressData; use Concrete\Core\Workflow\Progress\Progress as WorkflowProgress; use Core; use Concrete\Core\Permission\Access\Access as PermissionAccess; use PermissionKey; use User; use UserInfo; use Group; use Concrete\Core\Localization\Localization; class BasicWorkflow extends \Concrete\Core\Workflow\BasicWorkflow { protected function notify( WorkflowProgress $wp, $message, $permission = 'notify_on_basic_workflow_entry', $parameters = [] ) { $nk = PermissionKey::getByHandle($permission); $nk->setPermissionObject($this); $users = $nk->getCurrentlyActiveUsers($wp); $loc = Localization::getInstance(); $loc->pushActiveContext('email'); $dt = $wp->getWorkflowProgressDateAdded(); $dh = Core::make('helper/date'); //ワークフローの情報を取得 $req = $wp->getWorkflowRequestObject(); //ここでワークフローに送信したユーザーのIDを取得 $requID = $req->getRequesterUserID(); //ここでワークフローに送信したユーザー情報も取得 $requi = UserInfo::getByID($requID); //対象グループのユーザーに総当たりでアクセス開始 foreach ($users as $ui) { // Get user object of the receiver and set locale to their language $user = $ui->getUserObject(); $lan = $user->getUserLanguageToDisplay(); $loc->setLocale($lan); $mh = Core::make('helper/mail'); $mh->addParameter('uName', $ui->getUserName()); $mh->to($ui->getUserEmail()); $adminUser = UserInfo::getByID(USER_SUPER_ID); $mh->from($adminUser->getUserEmail(), t('Basic Workflow')); $date = $dh->formatDateTime($dt, true); // Call here to translate datetime into users language $translatedMessage = $this->getTranslatedMessage($message, $date); $mh->addParameter('message', $translatedMessage); foreach ($parameters as $key => $value) { $mh->addParameter($key, $value); } $mh->addParameter('siteName', \Core::make('site')->getSite()->getSiteName()); //メール文面を変更したい時はここでテンプレート変更できるよ $mh->load('basic_workflow_notification'); //通知送信対象のユーザー情報を取得 $u = User::getByUserID($ui->getUserID()); //リクエストしたユーザーと名前を比較して一致すれば通知を送信 if($ui->getUserName() == $requi->getUserName()){ $mh->sendMail(); } unset($mh); } $loc->popActiveContext(); } } |
これでうっかりテストサイトからたくさんのユーザーに通知が入って大目玉食らうことが防げるぞ!
(↑実際にありました。)
かゆいおまけ:「通知設定」やってるやってる〜??
デフォルト状態ではワークフローを設定した際「管理者」グループに属していないユーザーは「確認待ち」ページで承認リストが表示されません。
管理画面の下記ページで確認待ち情報を通知したいグループを追加しましょう。
/dashboard/system/registration/notification
これ地味に設定忘れる&この設定ページ自体を忘れるのでメモメモ。
今年もお世話になりました
今年も各方面の皆々様、大変お世話になりました。
来年もレッツエンジョイ concrete5!
ますます機能充実の3.0もリリースされてこれからも楽しみです。
加速して熱を帯び発光するconcrete5 アドベントカレンダー 2017、次回はtao-sさんの「8.3.0について何か」です!