オリジナルのカラムを追加する2【要PHP】で作成しましたカスタムカラム(CustomColumn)を基にして仕様を更に確認してみます。
今回触れたいのは、
一つのカラムで複数の入力フォームを設置する事です。
/CMSインストールディレクトリ/app/webapp/inquiry/src/columns/CustomColumn.class.php
で公開側のフォームの出力に関与するgetFormメソッドを下記のようにします。
<?php class CustomColumn extends SOYInquiry_ColumnBase{ /** * ユーザに表示するようのフォーム * @param array * @return string */ function getForm(array $attrs=array()){ // 入力した内容 $values = $this->getValue(); if(!is_array($values)) $values = array("", ""); $html = array(); $html[] = "<input type=\"text\" name=\"data[".$this->getColumnId()."][]\" value=\"".htmlspecialchars($values[0], ENT_QUOTES, "UTF-8")."\">"; $html[] = "<input type=\"text\" name=\"data[".$this->getColumnId()."][]\" value=\"".htmlspecialchars($values[1], ENT_QUOTES, "UTF-8")."\">"; return implode("\n", $html); } /** 以下省略 **/ }
注目すべき点は
$values = $this->getValue(); if(!is_array($values)) $values = array("", "");
でgetValueで得られる値が配列になることです。
※上記のサンプルコードではフォームから送信する値が
name=\"data[".$this->getColumnId()."][]\"
で配列になるようにしていますが、連想配列にすることも可能です。
続いて、
のように、validate(入力内容のチェック)も複数の入力フォームに合うように書き換えます。
<?php class CustomColumn extends SOYInquiry_ColumnBase{ /** 途中省略 **/ function validate(){ $values = $this->getValue(); if(!is_array($values)) $values = array("", ""); if(!strlen($values[0]) || !strlen($values[1])){ $this->setErrorMessage("値が入力されていません。"); return false; } return true; } /** 以下省略 **/ }
validateメソッドでもgetValueから得られる値を配列だとして処理を進めます。
最後に
入力内容の確認や自動送信メールへの文字列の挿入ですが、
<?php class CustomColumn extends SOYInquiry_ColumnBase{ /** 途中省略 **/ /** * 確認画面で呼び出す * @return string */ function getView(){ $values = $this->getValue(); if(!is_array($values)) $values = array("", ""); return $values[0].$values[1]; } /** * データ投入用 * @return string */ function getContent(){ $values = $this->getValue(); if(!is_array($values)) $values = array("", ""); return $values[0].$values[1]; } /** 以下省略 **/ }
getValueから得られる値を配列として捉えて処理を進めます。
追記
カスタムカラムの親クラスのSOYInquiry_ColumnBaseのコードは下記のリンク先ページで確認できます。