我在试图建立一个形式的使用改变组件,但数量要素的不同而不同。信息对每个改变元素存储在一个数据库(姓名、选择,验证程序、过滤器、等等)。

用我的工作包括建立调查,其中包含不同数量的问题。每一个问题是相关联的不同阵列的答复。最终我的目标是建立阵列的无线电/框按钮,动态服务器的一侧。

我在寻找一个漂亮的方式产生我的形式,但是我不确定的最佳方式载荷的模型内的形式。该模型被装载在控制器然后通过了(某种程度上,通过一个参数?) 直接的形式,或是它最好载荷的模式内的种形式的初始化()方法?哪里是最佳的地方投入的逻辑,应该在形成阶级,或者在控制器,或在模型?

我的想法是获取的形式件的性质(名称、规则、过滤器等。) 在数据库中,再循环和最终呈现的形式。什么你认为这个方法?最终,要素将是动态的加入(client-side),此时,使用的AJAX和JavaScript库(例如jQuery).

这里有几个有用的链接我发现通过谷歌,但我认为他们都回答一个稍微不同的问题比我的:

在建立动态的形式,服务器的一面:

在建立动态的形式,客户方面,AJAX处理:

有帮助吗?

解决方案

你可以扩大改变。

Zend形式是不好的地方的逻辑,只有形式表示。

因此,载入所需的所有元素的使用模型在控制器,并将它们传递的形式在contructor作的参数。

其他提示

我想我找到一个可能的解决方案,它涉及通过一系列的 Zend形式的元素 来的 Zend形式::__构() 法。构造需要一系列选项,他们中的一个被称为"元素".看看源代码的内Zend框架库。

我编写一个新的私法内的控制器,称为buildSurveyForm().注:对象,通过了作为一个参数,是建立一个巨大的SQL query有半打的加入声明、获取数据的几个表中(调查的问题,答案,等等。) 在数据库内。一个公属性的这类由一系列问题,作为对象存储(与公共方法/属性,等等)。相同的答案。代码,用于建设这些课程是很琐碎并且出的话题。

这里的代码内的调查控制器。我复制、粘贴和编辑/掉几条线,使它更加清晰:

private function buildSurveyForm(MyApp_Object_Survey $survey)
{
    foreach ($survey->questions as $question)
    {
        $element = new Zend_Form_Element_MultiCheckbox($question->order);
        $element->addMultiOptions($question->getAnswersLabels());
        $element->setName($question->order);
        $element->setLabel($question->title);

        $elements[] = $element;
    }

    // Here's the trick :
    $formOptions = array('elements' => $elements);

    $surveyForm = new MyApp_Survey_Form($formOptions);

    $urlHelper = $this->_helper->getHelper('url');
    $surveyForm->setAction($urlHelper->url(array(
            'controller' => 'survey',
            'action' => 'vote'),
        'default'
    ));
    $surveyForm->setMethod('post');

    $this->_forms['survey'] = $surveyForm;

    return $this->_forms['survey'];
}

MyApp调查的形式 类中只包含一个提交按钮内init()方法。的动态生成的要素与以上代码被添加,在这之前提交按钮(这是意外,但是有用的)。这类简单地延伸改变。

然后,在调查控制器/视图行动:

public function viewAction()
{
    $surveyModel =    $this->_model['survey'];
    $survey =        $surveyModel->getFullSurvey($this->_getParam('id'));
    $survey =        new MyApp_Object_Survey($survey);
    // Calls above private method :
    $surveyForm =    $this->buildSurveyForm($survey);

    $this->view->assign(array(
         'surveyForm' => $surveyForm,
    ));
}

加入的过滤器,验证程序和装修以形成元素现在是微不足道的。我的建议是有点脏,但是我认为它得到完成工作。我将增加一个新的提议,如果我找到一些更多优雅。随后不同的答案/解决方案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top