Standing on the Shoulder of Linus

Home / 2014 / 12月 / 01 / concrete5.7 のブロック作り方サンプル

concrete5.7 のブロック作り方サンプル

concrete5.7 のブロック作り方です。標準でたくさんブロックが用意されていますが、オリジナルブロックを作ると、ホームページの更新作業が楽になることがあります。※PHPの基礎を習得済みの前提です。

作るブロック

今回作るブロックは、「電話番号、メールアドレス、URLを表示するテーブル」です。テーブルのHTML出力は開発側で決めておき、表示するデータをブロック編集画面で入れていく、という形です。

infotableinfotable_edit

データベースの定義

ブロックに入れたデータは、データベースに保存されます。「データベースに保存されるデータがどんなものなのか」を設定する必要があります。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字までにしています。メールアドレスはもう少し長い文字を許容してもよいかもしれません。長い文字数を保存したい場合は のように、typeをX2にしてください。

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のデータベーススキーマから、コントローラ、編集画面、表示画面の雛形を作成するウェブサービスもご利用ください。

Posted in concrete5 | Tagged PHP, テーマ
← concrete5.7の記事ブロックのツールバーを非表示にする ウェブ制作者はCMSに関わることで就職活動になる話 →

アーカイブ

人気の投稿とページ

  • キンドル本を印刷する(PDFに変換する)方法
  • 名古屋駅から国際センターまでの道のり(徒歩)
  • AGPL ライセンス(GPLとは似ているが違いもある)
  • 6年使ったイーモバイル(Y!mobile)を解約手続。店頭でSIM返却
  • JP-Secure SiteGuard WP Pluginは不正ログイン防止に役立つか

プロフィール

水野史土:月70万PVホームページ制作会社のレスキューワーク株式会社で、PHPソフトウェアのサポートを行っている。concrete5コミュニティリーダー、Novius OSコアコード貢献者でもある。 詳しくは管理者詳細参照。
大好評WordPress書籍「WordPressユーザーのためのPHP入門 はじめから、ていねいに。」サポートページ

Copyright © 2015 Standing on the Shoulder of Linus.