装载的模式在改变使用Zend框架
-
05-07-2019 - |
题
我在试图建立一个形式的使用改变组件,但数量要素的不同而不同。信息对每个改变元素存储在一个数据库(姓名、选择,验证程序、过滤器、等等)。
用我的工作包括建立调查,其中包含不同数量的问题。每一个问题是相关联的不同阵列的答复。最终我的目标是建立阵列的无线电/框按钮,动态服务器的一侧。
我在寻找一个漂亮的方式产生我的形式,但是我不确定的最佳方式载荷的模型内的形式。该模型被装载在控制器然后通过了(某种程度上,通过一个参数?) 直接的形式,或是它最好载荷的模式内的种形式的初始化()方法?哪里是最佳的地方投入的逻辑,应该在形成阶级,或者在控制器,或在模型?
我的想法是获取的形式件的性质(名称、规则、过滤器等。) 在数据库中,再循环和最终呈现的形式。什么你认为这个方法?最终,要素将是动态的加入(client-side),此时,使用的AJAX和JavaScript库(例如jQuery).
这里有几个有用的链接我发现通过谷歌,但我认为他们都回答一个稍微不同的问题比我的:
在建立动态的形式,服务器的一面:
- http://framework.zend.com/wiki/display/ZFPROP/Zend_Form+generation+from+models+-+Jani+Hartikainen
- http://weierophinney.net/matthew/archives/200-Using-Zend_Form-in-Your-Models.html
- http://codeutopia.net/blog/2009/01/07/another-idea-for-using-models-with-forms/
在建立动态的形式,客户方面,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,
));
}
加入的过滤器,验证程序和装修以形成元素现在是微不足道的。我的建议是有点脏,但是我认为它得到完成工作。我将增加一个新的提议,如果我找到一些更多优雅。随后不同的答案/解决方案。