Home > Zend_Form > 複数ページフォーム対応の追加/更新/削除/閲覧画面の作成例

複数ページフォーム対応の追加/更新/削除/閲覧画面の作成例

intro
前回作成した複数ページ対応の追加/更新/削除/閲覧コントローラを使用して実際に画面を作成します。ソースコードはこちらからダウンロードできます。
また、デモサイトより動作を確認できます。

1.bootstrap.phpとconfig.iniの作成
以下のようにapplication/bootstrap.phpファイルを作成します。
環境に合わせてyourBaseUrlを適切に設定してください。

<?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以下を変更してください。

[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)。

CREATE TABLE users
(
    id integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    username varchar(20) NOT NULL,
    password varchar(20) NOT NULL
);
 
CREATE TABLE profiles
(
    id integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    user_id integer         NOT NULL,
    first_name varchar(100) NOT NULL,
    last_name varchar(100)  NOT NULL,
    email varchar(200)      NOT NULL,
    url varchar(200)        NOT NULL
);
2.モデルの作成
以下のようにapplication/models/Users.phpファイルを作成します。

<?php
require_once 'Zend/Db/Table/Abstract.php';
require_once 'Zend/Form.php';
 
class Users extends Zend_Db_Table_Abstract
{
    protected $_name = 'users';
    protected $_dependentTables = array('Profiles');
}

以下のようにapplication/models/forms/UserForm.phpファイルを作成します。

<?php
require_once 'Zend/Form.php';
 
class UserForm extends Zend_Form
{
    public function __construct()
    {
        parent::__construct();
        $username = $this->createElement('text', 'username');
        $username->setLabel('Account Name')
                 ->setRequired(true)
                 ->addFilter('stringTrim')
                 ->addValidator('stringLength', false, array(1,20));
        $password = $this->createElement('password', 'password');
        $password->setLabel('Password')
                  ->setRequired(true)
                  ->addFilter('stringTrim')
                  ->addValidator('stringLength', false, array(1,20));
 
        $this->addElements(array(
            $username, $password
        ));
    }
}

次に以下のようにapplication/models/Profiles.phpファイルを作成します。

<?php
require_once 'Zend/Db/Table/Abstract.php';
require_once 'Zend/Form.php';
 
class Profiles extends Zend_Db_Table_Abstract
{
    protected $_name = 'profiles';
    protected $_referenceMap = array(
        'Account' => array(
            'columns'           => 'user_id',
            'refTableClass'     => 'Users',
            'refColumns'        => 'id'
        )
    );
}

次に以下のようにapplication/models/forms/ProfileForm.phpファイルを作成します。

<?php
require_once 'Zend/Form.php';
 
class ProfileForm extends Zend_Form
{
    public function __construct()
    {
        parent::__construct();
        $first_name = $this->createElement('text', 'first_name');
        $first_name->setLabel('First Name')
                   ->setRequired(true)
                   ->addFilter('stringTrim')
                   ->addValidator('stringLength', false, array(1,100));
        $last_name = $this->createElement('text', 'last_name');
        $last_name->setLabel('Last Name')
                   ->setRequired(true)
                   ->addFilter('stringTrim')
                   ->addValidator('stringLength', false, array(1,100));
        $email = $this->createElement('text', 'email');
        $email->setLabel('E-Mail')
              ->setRequired(true)
              ->addFilter('stringTrim')
              ->addValidator('emailAddress', false)
            ->addValidator('stringLength', false, array(1,200));
        $url = $this->createElement('text', 'url');
        $url->setLabel('URL')
            ->setRequired(false)
            ->addFilter('stringTrim')
            ->addValidator('stringLength', false, array(1,200));
 
        $this->addElements(array(
            $first_name, $last_name, $email, $url
        ));
    }
}
3.コントローラの作成
以下のようにapplication/constorllers/UserController.phpファイルを作成します。
前回作成したMy_Controller_MultiPageクラスを継承しています。

<?php
require_once 'My/Controller/MultiPage.php';
require_once APP_BASE . '/models/Users.php';
require_once APP_BASE . '/models/Profiles.php';
require_once APP_BASE . '/models/forms/UserForm.php';
require_once APP_BASE . '/models/forms/ProfileForm.php';
 
class UserController extends My_Controller_MultiPage
{
    protected $_session_name = "User";
    protected $_table_form_classes = array(
        'Users' => 'UserForm',
        'Profiles' => 'ProfileForm'
    );
 
    public function preDispatch()
    {
        $this->view->name = "user";
    }
 
    public function indexAction()
    {
        $this->_forward('list');
    }
}
4.ビューの作成
以下のようにapplication/views/scripts/computer/list.phtmlファイルを作成します。

 
<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) : ?>
<?php     $values = $row->toArray(); ?>
<?php     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->escape($value) ?></td>
 
<?php       endforeach; ?>
<td><a href="<?=$this->url(array('action'=>'detail'))?>?id=<?=$row->id?>">
  <?= $this->translate('detail') ?></a></td>
<td><a href="<?=$this->url(array('action'=>'update'))?>?id=<?=$row->id?>">
  <?= $this->translate('edit') ?></a></td>
<td><a href="<?=$this->url(array('action'=>'delete'))?>?id=<?=$row->id?>">
  <?= $this->translate('delete') ?></a></td>
</tr>
 
<?php   endforeach; ?>
</table>
 
<span><?= $this->translate($this->name . '.label.max') ?></span>
<?php endif; ?>

以下のようにapplication/views/scripts/computer/detail.phtmlファイルを作成します。

 
<h1><?= $this->translate($this->name . '.title.detail') ?></h1>
 
<?php if ($this->values) : ?>
<?php foreach($this->values as $table_name => $table_values) : ?>
<h2><?=$this->translate($table_name . '.title.detail')?></h2>
<dl>
<?php   foreach($table_values as $key => $value) : ?>
<dt><?= $this->translate($key) ?></dt>
<dd><?= $this->escape($value) ?></dd>
 
<?php   endforeach; ?>
</dl>
 
<?php endforeach; ?>
<?php endif; ?>
<?php if ($this->form) : ?>
<?= $this->form ?>
<?php endif; ?>

以下のようにapplication/views/scripts/computer/form.phtmlファイルを作成します。

 
<h1><?= $this->translate($this->name . '.title.' . $this->action) ?></h1>
 
<?= $this->form ?>

以下のようにapplication/views/scripts/computer/finish.phtmlファイルを作成します。

 
<h1><?= $this->translate($this->name . '.title.finish.' . $this->action) ?></h1>
 
<a href="<?=$this->url(array('action'=>'list'))?>">
<?= $this->translate('back') ?></a>

5.確認
Webサーバにアクセスして複数ページフォーム対応の追加/更新/削除/閲覧機能が実装されていることを確認してみてください。
履歴
日付 内容
2008/4/21 公開
2008/4/26 ビューのURLの記述方法を変更しました。

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://www.oplabo.jp/article/29/trackback
Listed below are links to weblogs that reference
複数ページフォーム対応の追加/更新/削除/閲覧画面の作成例 from Open Programming Laboratory

Home > Zend_Form > 複数ページフォーム対応の追加/更新/削除/閲覧画面の作成例

English
Search
Feeds

Return to page top