intro
前回作成したカスタムフィルタを使用して、Zend_Formのselect要素(Zend_Form_Element_Select)での処理例を作成します。ソースコードはこちらからダウンロードできます。
また、デモサイトより動作を確認できます。
また、デモサイトより動作を確認できます。
1.bootstrap.phpとconfig.iniの作成
以下のように
環境に合わせて
以下のように
環境に合わせて
この記事では以下のSQLを使用しました(MySQL)。
application/bootstrap.php
ファイルを作成します。環境に合わせて
yourBaseUrl
を適切に設定してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php set_include_path('../library' . PATH_SEPARATOR . get_include_path()); define('APP_BASE', '../application'); define('CONFIG_PATH', APP_BASE . '/config.ini'); require_once 'Zend/Controller/Front.php'; require_once 'Zend/Layout.php'; require_once 'Zend/Db.php'; require_once 'Zend/Config/Ini.php'; require_once 'Zend/Db/Table/Abstract.php'; $layout = Zend_Layout::startMvc(); //$layout->getView()->baseUrl = '/yourBaseUrl'; $config = new Zend_Config_Ini(CONFIG_PATH, 'staging'); $params = $config->database->params->toArray(); $params['options'][Zend_Db::CASE_FOLDING] = Zend_Db::CASE_LOWER; $dbAdapter = Zend_Db::factory($config->database->adapter, $params); Zend_Db_Table_Abstract::setDefaultAdapter($dbAdapter); Zend_Controller_Front::run(APP_BASE . '/controllers'); |
以下のように
application/config.ini
ファイルを作成します。環境に合わせて
database.params
以下を変更してください。
1 2 3 4 5 6 |
[staging] database.adapter = pdo_mysql database.params.host = localhost database.params.username = db_user database.params.password = db_password database.params.dbname = db_name |
この記事では以下のSQLを使用しました(MySQL)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
CREATE TABLE members ( id integer auto_increment NOT NULL PRIMARY KEY, role_id integer NOT NULL, nick_name varchar(100) NOT NULL, email varchar(200) NOT NULL ); CREATE TABLE roles ( id integer auto_increment NOT NULL PRIMARY KEY, role_name varchar(20) NOT NULL, priviledges varchar(10) NOT NULL ); |
2.モデルの作成
以下のように
以下のように
次に以下のように
同様に
application/models/Members.php
ファイルを作成します。
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 |
<?php require_once 'Zend/Db/Table/Abstract.php'; require_once 'Zend/Filter.php'; require_once 'Zend/Filter/Input.php'; class Members extends Zend_Db_Table_Abstract { protected $_name = 'members'; protected $_referenceMap = array( 'Role' => array( 'columns' => array('role_id'), 'refTableClass' => 'Roles', 'refColumns' => array('id') ) ); public function getOutputFilter($data = null) { $roles = new Roles(); $role_options = $roles->getOptions(); // add other filters $filters = array( 'role_id' => array(array('ArrayValue', $role_options)) ); $of = new Zend_Filter_Input($filters, null, $data); $of->addFilterPrefixPath('My_Filter', 'My/Filter/'); return $of; } public function getOptions() { $select = $this->select() ->from($this->_name, array('id', 'nick_name')) ->order('id ASC'); $options = $this->getAdapter()->fetchPairs($select); return $options; } } |
以下のように
application/models/Roles.php
ファイルを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php require_once 'Zend/Db/Table/Abstract.php'; class Roles extends Zend_Db_Table_Abstract { protected $_name = 'roles'; public function getOptions() { $select = $this->select() ->from($this->_name, array('id', 'role_name')) ->order('id ASC'); $options = $this->getAdapter()->fetchPairs($select); return $options; } } |
次に以下のように
application/models/forms/MemberForm.php
ファイルを作成します。
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 |
<?php require_once 'Zend/Form.php'; require_once APP_BASE . '/models/Roles.php'; class MemberForm extends Zend_Form { public function __construct() { $roles = new Roles(); $role_options = $roles->getOptions(); parent::__construct(); $role_id = $this->createElement('select', 'role_id'); $role_id->setLabel('role_id') ->setMultiOptions($role_options) ->setRequired(true) ->addFilter('stringTrim') ->addValidator('int') ->addValidator('inArray', false, array(array_keys($role_options))); $nick_name = $this->createElement('text', 'nick_name'); $nick_name->setLabel('nick_name') ->setRequired(true) ->addFilter('stringTrim') ->addValidator('stringLength', false, array(1,100)); $email = $this->createElement('text', 'email'); $email->setLabel('email') ->setRequired(true) ->addFilter('stringTrim') ->addValidator('stringLength', false, array(1,200)) ->addValidator('emailAddress', false); $this->addElements(array( $nick_name, $email, $role_id )); } } |
同様に
application/models/forms/RoleForm.php
ファイルを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php require_once 'Zend/Form.php'; class RoleForm extends Zend_Form { public function __construct() { parent::__construct(); $role_name = $this->createElement('text', 'role_name'); $role_name->setLabel('role_name') ->setRequired(true) ->addFilter('stringTrim') ->addValidator('stringLength', false, array(1,20)); $priviledges = $this->createElement('text', 'priviledges'); $priviledges->setLabel('priviledges') ->setRequired(true) ->addFilter('stringTrim') ->addValidator('stringLength', false, array(1,10)); $this->addElements(array( $role_name, $priviledges )); } } |
3.コントローラの作成
以下のように
以前作成した
application/constorllers/MemberController.php
ファイルを作成します。以前作成した
My_Controller_Simple
クラスを継承しています。
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 |
<?php require_once 'My/Controller/Simple.php'; require_once APP_BASE . '/models/Members.php'; require_once APP_BASE . '/models/forms/MemberForm.php'; class MemberController extends My_Controller_Simple { protected $_session_name = "Member"; protected $_table_class = "Members"; protected $_form_class = "MemberForm"; protected function _getOutputFilter($data = null) { $members = new Members(); return $members->getOutputFilter($data); } public function preDispatch() { $this->view->name = "member"; $this->view->of = $this->_getOutputFilter(); } public function indexAction() { $this->_forward('list'); } } |
4.ビューの作成
以下のように
以下のようにループ内でデータをフィルタリングして、select要素で選択した値のラベルを表示しています。
以下のように
以下も同様にデータをフィルタリングして、select要素で選択した値のラベルを表示しています。
以下のように
以下のように
application/views/scripts/member/list.phtml
ファイルを作成します。
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 |
<h1><?= $this->translate($this->name . '.title.list') ?></h1> <?php if (!$this->list) : ?> <span><?= $this->translate($this->name . 'label.no_data') ?></span> <?php else : ?> <a href="<?=$this->url(array('action'=>'add'))?>"> <?= $this->translate($this->name . '.label.new') ?></a> <table> <?php $this->header = true; ?> <?php foreach($this->list as $row) : $values = $row->toArray(); $this->of->setData($values); if ($this->header) : ?> <tr> <?php foreach($values as $key => $value) : ?> <th><?= $this->translate($key) ?></th> <?php endforeach; ?> <th><?= $this->translate('detail') ?></th> <th><?= $this->translate('edit') ?></th> <th><?= $this->translate('delete') ?></th> <?php $this->header = false; ?> </tr> <?php endif; ?> <tr> <?php foreach($values as $key => $value) : ?> <td><?= $this->of->$key ?></td> <?php endforeach; ?> <td><a href="<?=$this->url(array('action'=>'detail'))?>?id=<?=$values['id']?>"> <?= $this->translate('detail') ?></a></td> <td><a href="<?=$this->url(array('action'=>'update'))?>?id=<?=$values['id']?>"> <?= $this->translate('edit') ?></a></td> <td><a href="<?=$this->url(array('action'=>'delete'))?>?id=<?=$values['id']?>"> <?= $this->translate('delete') ?></a></td> </tr> <?php endforeach; ?> </table> <span><?= $this->translate($this->name . '.label.max') ?></span> <?php endif; ?> |
以下のようにループ内でデータをフィルタリングして、select要素で選択した値のラベルを表示しています。
1 2 3 4 5 6 |
$values = $row->toArray(); $this->of->setData($values); //.... <?php foreach($values as $key => $value) : ?> <th><?= $this->translate($key) ?></th> <?php endforeach; ?> |
以下のように
application/views/scripts/member/detail.phtml
ファイルを作成します。以下も同様にデータをフィルタリングして、select要素で選択した値のラベルを表示しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<h1><?= $this->translate($this->name . '.title.detail') ?></h1> <?php if ($this->values) : ?> <?php $this->of->setData($this->values); ?> <dl> <?php foreach($this->values as $key => $value) : ?> <dt><?= $this->translate($key) ?></dt> <dd><?= $this->of->$key ?></dd> <?php endforeach; ?> </dl> <?php endif; ?> <?php if ($this->form) : ?> <?= $this->form ?> <?php endif; ?> |
以下のように
application/views/scripts/member/form.phtml
ファイルを作成します。
1 2 |
<h1><?= $this->translate($this->name . '.title.' . $this->action) ?></h1> <?= $this->form ?> |
以下のように
application/views/scripts/computer/finish.phtml
ファイルを作成します。
1 2 3 |
<h1><?= $this->translate($this->name . '.title.finish.' . $this->action) ?></h1> <a href="<?=$this->url(array('action'=>'list'))?>"> <?= $this->translate('back') ?></a> |
5.確認
Webサーバにアクセスしてselect要素の値の入力と表示を確認してみてください。