Home > Zend_Db > Zend_Db_Tableによるデータの保存

Zend_Db_Tableによるデータの保存

intro
Zend_Db_Table_RowとZend_Formを利用してデータベースにフォームデータを保存します。ソースコードはこちらからダウンロードできます。

1.bootstrap.phpとconfig.iniの作成
以下のようにapplication/bootstrap.phpファイルを作成します。

<?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 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.Zend_Db_TableによるDAOの作成
以下のように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';
 
    public function getForm()
    {
        $form = new Zend_Form();
 
        $first_name = $form->createElement('text', 'first_name');
        $first_name->setLabel('First Name')
                   ->setRequired(true)
                   ->addFilter('stringTrim')
                   ->addValidator('stringLength', false, array(1,100));
        $last_name = $form->createElement('text', 'last_name');
        $last_name->setLabel('Last Name')
                   ->setRequired(true)
                   ->addFilter('stringTrim')
                   ->addValidator('stringLength', false, array(1,100));
        $email = $form->createElement('text', 'email');
        $email->setLabel('E-Mail')
              ->setRequired(true)
              ->addFilter('stringTrim')
              ->addValidator('emailAddress', false)
            ->addValidator('stringLength', false, array(1,200));
        $url = $form->createElement('text', 'url');
        $url->setLabel('URL')
            ->setRequired(false)
            ->addFilter('stringTrim')
            ->addValidator('stringLength', false, array(1,200));
 
        $form->addElements(array(
            $first_name, $last_name, $email, $url
        ));
 
        return $form;
    }
 
    public function findByUserId($user_id)
    {
        $select = $this->select()->where('user_id = ?', $user_id);
        return $this->fetchAll($select);
    }
}
3.コントローラの作成
以下のようにapplication/constorllers/IndexController.phpファイルを作成します。

<?php
require_once 'Zend/Controller/Action.php';
require_once APP_BASE . '/models/Profiles.php';
 
class IndexController extends Zend_Controller_Action
{
    protected $_user_id = 1;
 
    protected function prepareForm($form)
    {
        $form->setAction($this->_request->getBaseUrl() . '/index/index')
             ->setMethod('post');
        $submit = $form->createElement('submit', 'save');
        $submit->setLabel('Save');
        $form->addElement($submit);
        return $form;
    }
 
    public function indexAction()
    {
        $profiles = new Profiles();
        $row =$profiles->findByUserId($this->_user_id)->current();
        if (!$row)
        {
            $row = $profiles->createRow(array('user_id' => $this->_user_id));
        }
 
        $form = $profiles->getForm();
        if ($this->getRequest()->isPost()) {
            if ($form->isValid($_POST)) {
                // save profile
                $row->setFromArray($form->getValues());
                $row->save();
            }
        }
        else
        {
            // set default values
            $form->setDefaults($row->toArray());
        }
 
        $this->view->form = $this->prepareForm($form);
    }
}
4.ビューの作成
以下のようにapplication/views/scripts/index/index.phtmlファイルを作成します。

 
<h1><?= $this->translate('Your Profile') ?></h1>
 
<?= $this->form ?>

5.確認
Webサーバにアクセスしてフォームに入力したデータがデータベースに保存されることを確認してみてください。
参考
テーブル情報からのZend_Formの生成に関しては以下に関連情報があります。

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://www.oplabo.jp/article/19/trackback
Listed below are links to weblogs that reference
Zend_Db_Tableによるデータの保存 from Open Programming Laboratory

Home > Zend_Db > Zend_Db_Tableによるデータの保存

English
Search
Feeds

Return to page top