新規ドキュメントはこちら(http://ozaki.kyoichi.jp/content/blogsection/4/26/)に掲載しております。

QuickForm (pear) +Smartyを組み込む

pearのHTML_QuickFormを入手します。現時点(2005/01/21)では3.2.4pl1リリースとなっています(こちらから入手できます)。 今回はシステムのpearにインストールしますが、ホットデプロイを考えると、必要なpear関連のファイルだけまとめて、プロジェクトディレクトリに含めてしまうのが良いのではないかと思います。これについては、時間を見て追記したいと思います。

[k-ozaki@free15 ~]$ su -
[root@free15 ~]# pear  install HTML_QuickForm

このバージョンのHTML_QuickFormでは、PHP5で使用すると、いくつかのエラーが表示されます。どれも致命的なものはなく、「PHP5では推奨されない文法ですよ」的な警告がでます。そのため、Smartyを組み込んだとき同様に、HTML_QuickFormを読み込む際にエラー表示を消します。それを行ってくれるラッパー的なActionクラスとViewクラスをまず作成します。MyProject/webapp/lib/MyAction.class.phpを以下のように作ります

<?php
ini_set("display_errors", 0);
ini_set("error_reporting", false);
require_once('/usr/local/share/pear/HTML/QuickForm.php');
ini_restore("error_reporting");
ini_restore("display_errors");

abstract class MyAction extends Action
{
}
?>

QuickForm.phpのPATHについては、環境にあわせて修正を行ってください。次に、Viewについても同様なクラスを作成します。MyProject/webapp/lib/MySmartyQuickFormView.class.phpを以下のように作ります

<?php
ini_set("display_errors", 0);
ini_set("error_reporting", false);
require_once('/usr/local/share/pear/HTML/QuickForm/Renderer/ArraySmarty.php');
ini_restore("error_reporting");
ini_restore("display_errors");

abstract class MySmartyQuickFormView extends MySmartyView
{
}
?>

ArraySmarty.phpのPATHについては、環境にあわせて修正を行ってください。これらのファイルをrequireしないで使えるようにautoload.iniを編集します。MyProject/webapp/config/autoload.iniに以下の2行を追加します

    MyAction                           = "%MO_WEBAPP_DIR%/lib/MyAction.class.php"
MySmartyQuickFormView = "%MO_WEBAPP_DIR%/lib/MySmartyQuickFormView.class.php"

以上で準備は完了です。これらを使ったactionとviewを作りましょう。まずはactionをMyProject/webapp/modules/HelloWorld/actions/HelloWorldFormAction.class.phpを以下の内容のように作ります。

<?php
class HelloWorldFormAction extends MyAction
{
  public function execute ()
  {
    return View::INPUT;
  }
  
  function validate() {
    return $this->_buildForm();
  }

  function _buildForm() {

    $context    =& $this->getContext();
    $controller =& $context->getController();
    $request    =& $context->getRequest();
    $user       =& $context->getUser();

    $moduleName = $context->getModuleName();
    $actionName = $context->getActionName();

    $form = new HTML_QuickForm($action,
			       'POST',
			       'index.php',
			       '_self', null);

    $form->addElement('text', 'module');
    $form->addElement('text', 'action');

    $form->setDefaults(array(
			     'module' => $moduleName,
			     'action' => $actionName,
			     ));

    $request->setAttribute('form', $form);

    return TRUE;
  }
}
?>

次はviewの作成です。今回は入力フォームを想定して、View::INPUTを使用します。MyProject/webapp/modules/HelloWorld/views/HelloWorldFormInputView.class.phpを以下の内容で作ります

<?php
class HelloWorldFormInputView extends MySmartyQuickFormView
{
  public function execute ()
  {
    $context =& $this->getContext();
    $request =& $context->getRequest();

    $form =& $request->getAttribute('form');

    $quickformSmarty = new HTML_QuickForm_Renderer_ArraySmarty($this->getEngine());
    $form->accept($quickformSmarty);
    
    $this->setAttribute('form', $quickformSmarty->toArray());
    $this->setTemplate('HelloWorldFormInput.tpl');
  }
}
?>

最後にViewで指定したSmartyのテンプレートファイルを作成します。MyProject/webapp/modules/HelloWorld/templates/HelloWorldFormInput.tplを以下の内容で作成します

<html>
<body>
Hello World!<br>
This is a Smarty Template using HTML_QuickForm.<br>
<hr>
module:{$form.module.html}<br>
action:{$form.action.html}<br>
<hr>
</Body>
</html>

以上で終了です。http://localhost/MyProject/index.php?module=HelloWorld&action=HelloWorldFormからアクセスして確認してみましょう