[英]Zend framework 2 access to Form class from added elements
問題:是否可以從添加的元素訪問Form類?
注意:此示例本身沒有任何意義,但這並不是我要嘗試做的事情:只是為了使事情保持簡單
假設有一個自定義視圖助手,它將一個元素包裝到div中。 就像是:
public function render(ElementInterface $element = NULL) {
return '<div class="myclass">'.$this->view->formElement($element).'<div>';
}
我想從元素本身中檢索“ myclass”類,並且僅在提交表單后才將其添加到div中。 就像是:
public function render(ElementInterface $element = NULL) {
$class='default';
if(isset($_POST['submit'])){
$class=$element->getOption('wrapper_class');
}
return'<div class="'.$class.'">'.$this->view->formElement($element).'<div>';
}
可行(如果'submit'是提交按鈕的名稱),但是,如果我在同一頁面中有兩個表單,則第二個表單提交將觸發上述條件,並且將應用該類。
解決方法可能是:
class MyForm extends Form {
public function __construct($name = null){
parent::__construct($name);
$this->add([
'name' => 'myElement',
'type' => MyCustomElement::class,
'options' => [
'triggered_by' => $this->getName(),
'wrapper_class'=>'myClass',
],
]);
$this->add([
'name' => $this->getName(),
'type' => 'submit',
'attributes' => [
'value' => 'Go',
'id' => 'submitbutton',
'class'=>'btn btn-success',
],
]);
}
}
然后: if(isset($_POST[$element->getOption('triggered_by')])){ ... }
但這僅在將custom元素直接添加到表單中時才有效。 如果將其添加到字段集中,則$this->getName()
將返回該字段集的名稱。 顯然,該名稱可以作為字符串添加,但是我想避免使用它(typos)。
最佳解決方案是從所有子元素訪問主表單的選項/屬性,但元素不擴展Form(myElement-> extend Element,Form-> extend Fieldset-> extend Element)。
...然后...?
簡單的答案:不,你不能。 元素也可以是字段集的一部分,因此它們不會直接耦合到表單元素。
您可以使用viewhelper采取其他方法。 如: $myHelper::__invoke(Form $form)
或$myHelper::setForm(Form $form)
,它設置表單。 從該方法中,您可以檢查$form::hasValidated()
表單是否存在,因為這告訴我們表單已過帳。 然后從$myHelper::render(ElementInterface $element)
,您可以像在示例中那樣添加一些邏輯來添加wrapper類。 在您的示例中,合並類,以便包裝器不會替換所有表單元素(css)類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.