concrete5.7 のブロック作り方です。標準でたくさんブロックが用意されていますが、オリジナルブロックを作ると、ホームページの更新作業が楽になることがあります。※PHPの基礎を習得済みの前提です。
作るブロック
今回作るブロックは、「電話番号、メールアドレス、URLを表示するテーブル」です。テーブルのHTML出力は開発側で決めておき、表示するデータをブロック編集画面で入れていく、という形です。
データベースの定義
ブロックに入れたデータは、データベースに保存されます。「データベースに保存されるデータがどんなものなのか」を設定する必要があります。db.xmlというファイルで設定します。
<?xml version="1.0"?> <schema version="0.3"> <table name="btInfotable"> テーブル名 <field name="bID" type="I"> 主キー <key /> <unsigned /> </field> <field name="tel" type="C" size="20"></field> 項目(電話番号) <field name="mail" type="C" size="50"></field> 項目(メールアドレス) <field name="url" type="C" size="50"></field> 項目(URL) </table> </schema>
標準で用意されているブロックのどれかから、コピーしてきて、テーブル名と、項目は必要におうじて書き換えて使う、というのが一番簡単でしょう。電話番号は20字まで、メールアドレスとURLは50字までにしています。メールアドレスはもう少し長い文字を許容してもよいかもしれません。長い文字数を保存したい場合は
controller.phpの定義
ここが一番やっかいかもしれません。
<?php namespace Application\Block\Infotable; 「名前空間。最後のInfotableの部分は、各自で命名する」 use \Concrete\Core\Block\BlockController; ここは決まり文句 class Controller extends BlockController { ここは決まり文句 protected $btInterfaceWidth = 400; ブロック編集画面の幅 protected $btInterfaceHeight = 400; ブロック編集画面の高さ protected $btTable = 'btInfotable'; ブロックのテーブル名(db.xmlのテーブル名と同じにする) protected $btCacheBlockRecord = true; キャッシュの設定 protected $btCacheBlockOutput = true; キャッシュの設定 protected $btCacheBlockOutputOnPost = true; キャッシュの設定 protected $btCacheBlockOutputForRegisteredUsers = false; キャッシュの設定 protected $btCacheBlockOutputLifetime = 0; キャッシュの設定 public function getBlockTypeDescription() { return "連絡先等を記入"; ブロックの説明を記入 } public function getBlockTypeName() { return "連絡先"; ブロック名を記入 } public function view(){ $this->set('tel', $this->tel); ビュー(view.php)に渡すデータの名前/内容を設定する $this->set('mail', $this->mail); ビュー(view.php)に渡すデータの名前/内容を設定する $this->set('url', $this->url); ビュー(view.php)に渡すデータの名前/内容を設定する } public function save($data) { $args['tel'] = $this->telcheck($data['tel']) ? $data['tel'] : ''; データ保存前にチェックする $args['mail'] = filter_var($data['mail'], FILTER_VALIDATE_EMAIL) ? $data['mail'] : ''; データ保存前にチェックする $args['url'] = filter_var($data['url'], FILTER_VALIDATE_URL) ? $data['url'] : ''; データ保存前にチェックする parent::save($args); データ保存処理 } protected function telcheck($tel) { return strlen($tel) === strspn($tel, '0123456789-'); 電話番号のチェック(今回は簡易的に、「半角数字とハイフンのみ」かどうかで判定)。 } }
先頭の名前空間は、PHP5.3で導入されたものです。フォルダ名みたいなもの、と考えてください。(オリジナルブロックなどをパッケージ化して配布したい方は、名前空間について、きちんと学んでください。)
Controllerクラスのプロパティで、様々な設定ができます。「ブロックのテーブル名」は、db.xmlで指定した名前と同じものを設定してください。
キャッシュは、「プロパティでキャッシュ可にする」&「管理画面でキャッシュ有効にする」でキャッシュされます。
viewメソッドでは、view.phpに渡すデータを設定します。$this->set(変数名, 渡すデータ)
saveメソッドでは、データを保存する前に、データを検証してから保存します。電話番号、メール、URLとして適切な場合は許可し、そうでない場合は空文字列にしています。(なお、電話番号は、簡易的なチェックのみ実装しています。)
ビューの作成
ビュー(view.php)は、ブロックを表示する内容を設定します。
<?php defined('C5_EXECUTE') or die("Access Denied."); ?> <table class="table table-condensed"> <?php if ($tel) :?> $tel に値があるときのみ <tr><th>TEL</th><td><?= h($tel) ?></td></tr> <?php endif;?> <?php if ($mail) :?> $mail に値があるときのみ <tr><th>MAIL</th><td><?= h($mail) ?></td></tr> <?php endif;?> <?php if ($url) :?> $url に値があるときのみ <tr><th>URL</th><td><?= h($url) ?></td></tr> <?php endif;?> <?php $c = Page::getCurrentPage(); if ($c->isEditMode()) :?> 編集モードでのみ表示 <tr><th></th><td>電話番号、メール、URLが入力できます</td></tr> <?php endif;?> </table>
h()は、出力時のHTMLエスケープ処理を行う関数です。出力時には原則としてこの関数で処理します。
テーブルの出力は、電話番号、メール、URLに値があるときのみ、その行を出力するようにしています。(※もし、値として「0」がありえる場合は、if の判定に注意が必要です。)
isEditModeメソッドを使うと、「編集モード」かどうかを判定できます。「編集モード」のときに説明文を表示したい、といった場合に使えます。
add.phpとedit.php
ブロック編集画面のコードがadd.phpとedit.phpです。add.phpはブロックを追加するとき、edit.phpは既存のブロックを編集するとき、に使います。
<?php defined('C5_EXECUTE') or die("Access Denied."); ?> <table class="table"> <tr><th>TEL</th><td><?php echo $form->text('tel', $controller->tel);?></td></tr> <tr><th>MAIL</th><td><?php echo $form->text('mail', $controller->mail);?></td></tr> <tr><th>URL</th><td><?php echo $form->text('url', $controller->url);?></td></tr> </table>
$form->text()メソッドを使うと、フォームを出力するのが楽になります。
view.cssとview.js
今回のブロックでは使用していませんが、ブロックのビューにはcssやjsを追加できます。それぞれview.css、view.jsという名前にしておけば、ブロックを表示するページで読み込みされます。
もちろん標準の記事ブロックなどでも、データを入れることができます。しかし、オリジナルブロックにすることで、「入力する項目を明快にする(更新担当者は、HTMLテーブルを意識しなくて良い)」「項目がある場合のみ表示する」といったメリットが得られます。ブロック自作は少し手間がかかりますが、こうしておけば運用しやすくなると思います。
ソースコードはgithubでも公開しています。https://github.com/ounziw/infotable_c57 です。上のコードは、「ブロックの説明を記入」といったコメントを追加していて文法が崩れているので、そのままでは使えません。なのでコードはgithubから取得することをお勧めします。
db.xmlのデータベーススキーマから、コントローラ、編集画面、表示画面の雛形を作成するウェブサービスもご利用ください。