Zend根据一个控制器/动作中的请求创建表单

时间:2012-05-17 16:41:15

标签: zend-framework request zend-form

我真的不知道如何很好地说出这个标题,但这是我的问题。我决定不使用25个控制器来处理页面,我有一个PageController带有viewAction,其中包含:page参数 - 例如,http://localhost/website/page/about-us将指向PageController::viewAction() 1}}参数为page = about-us。所有页面都存储在templates文件夹中,因此viewrenderer设置为呈现application\templates\default\about-us.phtml

我这样做,所以我可以巩固,这似乎是一个更好的方法。我的问题如下:让我们说当页面请求为contact-us时,我需要在联系页面中使用Zend_Form。所以,我需要在PageController::viewAction()内部一种方法来识别页面需要构建一个表单,构建表单,并在提交时需要处理它(可能这应该在抽象的流程方法中处理 - 不确定)。

我不知道如何实现这一点。我想也许我可以存储一个包含表单名称和连接页面标识符的列。更好的是,为表单创建一对多的页面,然后在提交循环中通过表单并检查是否提交,如果是,则处理它(可能在zend_form中有一个isSubmitted()方法。我真的不喜欢我不知道如何处理这个问题,我正在寻找任何帮助。

谢谢!

1 个答案:

答案 0 :(得分:0)

这是我想到的一些可能有效或有助于指明适合您的方向的东西。

假设每页不超过一个表单,这可能效果很好,如果页面上需要多个表单,则必须执行自动表单处理以外的操作。

为附加到页面的表单(例如应用程序/表单/页面)创建标准位置。这是与页面关联的自动表单的保存位置。

viewAction中,您可以利用自动加载器查看该页面的表单是否存在。例如:

$page  = $this->getParam('page');
$page  = ucfirst(preg_replace('/-(\w)/ie', "strtoupper('$1')", $page)); // contact-us -> ContactUs
$class = 'Application_Form_Page_' . $page;

// class_exists will invoke the autoloader to map a class to a file
if (class_exists($class)) {
    // a form is defined for this page
    $form = new $class();

    // check if form was posted
    if ($this->getRequest()->isPost()) {
        if ($form->isValid($this->getRequest()->getPost()) {
            // form is valid - determine how to process it
        }
    }

    // assign the form to the view
    $this->view->pageForm = $form;
}

所有这一切都遗漏了你为处理特定表单所采取的行动。由于联系表单可能会生成一封电子邮件,而另一种表单可能会将数据插入数据库,因此您需要某种回调系统或者可能需要自动映射的另一个类,其中包含表单处理器代码。

无论如何,首先想到的是这些内容,我希望这有助于为您提供更多的想法。