Blog

concrete5ブロック開発(2)データを保存する

Posted by admin at 12:04 日時 2014/12/19

前回の記事で、入力オプションのないシンプルな「ページトップへ戻る」ブロックタイプを開発しました。今回は、ブロックの編集画面を作成し、オプションのあるブロックにしてみたいと思います。作成するのはこのようなシンプルな画面です。

作成するブロックの編集画面

db.xml の作成

オプションを保存するには、データベーステーブルが必要です。concrete5 では、既存のテーブルを流用せず、ブロックタイプごとに独自のテーブル定義を持つ決まりになっています。テーブル定義はXMLファイルを作成すると、ブロックタイプのインストール時に定義に従って concrete5 が自動でテーブルを作成します。XMLの書き方については、日本語公式サイトの「db.xmlの作成と挙動について」ページをご覧ください。5.6系の時に作成された記事ですが、5.7系でも同じ形式になっています。

<?xml version="1.0"?>  <schema version="0.3">  	<table name="btBackToTop">  		<field name="bID" type="I">  			<key />  			<unsigned />  		</field>  		<field name="labelText" type="C" size="255"></field>  	</table>  </schema>

bID フィールドは必須で、ブロックタイプの場合は必ずこの形式で必要になります。labelText の方が今回データを保存するためのフィールドで、テキスト型を指定しています。

controller.php の変更

データを保存するテーブル名を、$btTable プロパティで定義します。もちろん、XMLファイルの記述とあわせる必要があります。

<?php  namespace Application\Block\BackToTop;    use \Concrete\Core\Block\BlockController;    class Controller extends BlockController {        protected $btCacheBlockRecord = true;      protected $btCacheBlockOutput = true;      protected $btCacheBlockOutputOnPost = true;      protected $btCacheBlockOutputForRegisteredUsers = true;      protected $btTable = 'btBackToTop';        public function getBlockTypeDescription()      {          return t("Adds a Back to Top button to the page.");      }        public function getBlockTypeName()      {          return t("Back to Top");      }    }

add.php / edit.php の作成

add.php はブロックを初めてページ内に配置した際に表示される画面、edit.php は配置済みのブロックを編集する際に表示される画面になります。多くの場合この2つは同じですので、どちらのファイルからも別のファイルを呼び出すようにすることが多いです。今回もそのようにしましたので、add.php と edit.php は同じ内容になります。

<?php  defined('C5_EXECUTE') or die("Access Denied.");  $this->inc('form_add_edit.php');

form_add_edit.php の作成

add.php, edit.php から呼び出させるファイルです。こちらが、実際のブロックの編集画面になります。$form 変数にはフォーム・ヘルパーが格納されていて、labelタグやinputタグをこのようにかんたんに出力できます。フォームヘルパーについては、公式サイトをご覧ください。と言いたいところだが、まだページがなかった…。

<?php defined('C5_EXECUTE') or die("Access Denied."); ?>    <div class="form-group">      <?php echo $form->label('labelText', t('Label Text'))?>      <?php echo $form->text('labelText', $labelText); ?>  </div>

こうなります

$labelText という名前に注目してください。データベース定義のフィールド名と同名にしておくことで、このフォームの入力値が自動でデータベースに保存され、編集の際は同名のの変数に代入されます。とても便利です。

view.php の更新

<?php  defined('C5_EXECUTE') or die("Access Denied."); ?>  <p class="text-right">      <a href="#top"><?php echo h($labelText); ?></a>      <i class="fa fa-arrow-circle-up" aria-hidden="true"></i>  </p>

表示テンプレートにも、データベース定義のフィールド名と同名の変数に、保存された値が渡されますので、そのまま echo で出力すればOKです。ただし、セキュリティのため、画面に出力するものはすべてエスケープする必要があります。単純に h() 関数で囲めばOKです。

ブロックタイプの更新

以上の修正をアップすると、ブロックを配置済みのページでエラーが出ますが、気にせずに管理画面にアクセスしてください。

テーブルが無いと言うエラーになる

ブロックタイプ一覧からBack to Topを選択し、更新ボタンをクリックしましょう。このボタンをクリックすると、db.xml の定義に従ってconcrete5が自動でデータベーステーブルを作成します。db.xml に変更を加えた際も、この画面で更新ボタンをクリックするとconcrete5が自動でデータベースをマイグレーションします。

ブロックタイプのデータベース構造をアップデートする

以上でデータベースに値を保存するブロックタイプの基本形ができましたね!

テキストを変更する機能ができた

次回はパッケージ化してみます。


Share this entry