Zend framework2 Zend Framework 2-输出表单元素,对象作为HTML字段 介绍
我正在使用一个可重用的管理模块;负责处理身份验证和ACL。此模块附带一个基本控制器,任何其他实现的模块都可以继承该控制器。因此,此控制器是Zend framework2 Zend Framework 2-输出表单元素,对象作为HTML字段 介绍,zend-framework2,Zend Framework2,我正在使用一个可重用的管理模块;负责处理身份验证和ACL。此模块附带一个基本控制器,任何其他实现的模块都可以继承该控制器。因此,此控制器是Cp\AdminController,不可访问,但由所有其他控制器继承 问题 我有一个默认的/home controllerCp\home controller,它有几个动作;登录、注销和忘记/重置密码。目前我正在开发Cp\HomeController::indexAction。在此方法中,我只需执行以下操作: // ... controller logic
Cp\AdminController
,不可访问,但由所有其他控制器继承
问题
我有一个默认的/home controllerCp\home controller
,它有几个动作;登录、注销和忘记/重置密码。目前我正在开发Cp\HomeController::indexAction
。在此方法中,我只需执行以下操作:
// ... controller logic ...
public function indexAction()
{
if ($this->getAuth()->hasIdentity()) {
# XXX: This is the authorised view/dashboard.
} else {
# XXX: This is the unauthorised view; login page.
$loginForm = new Form\Login();
# XXX: validation, and login form handling here.
return array(
'form' => $loginForm
);
}
}
// ... controller logic ...
这里的问题是,Cp\HomeController
默认使用/module/Cp/view/Cp/home/index.phtml
模板;看起来:
<h1>Authorisation Required</h1>
<section id="admin-login">
<?= $form ?>
</section>
我继承这个表单类是为了创建我的登录表单,一个标准的电子邮件地址和密码字段,它可以在任何可能发生身份验证的地方重复使用
<?php
namespace Cp\Form;
use Zend\Form\Element;
class Login extends \Cp\Form
{
public function __construct($name = 'Login', $action)
{
// Parse the form name to our parent constructor.
parent::__construct($name);
// Override default template, defining our form view.
$this->setTemplatePath(MODULE_DIR . 'Cp/view/cp/form/login.phtml');
// Create our form elements, and validation requirements.
$email = new Element\Email('email');
$email->setLabel('E-mail Address');
$password = new Element\Password('password');
$password->setLabel('Password');
$submit = new Element\Submit('login');
$this->setAttribute('action', $action)
->setAttribute('method', 'post')
->setAttribute('autocomplete', 'autocomplete')
->add($email)
->add($password)
->add($submit);
}
}
希望这比以前更清楚。我不确定你的实际问题是什么。你能明确地指定它吗
Zend\Form
的设计使其不呈现自身,而是由视图帮助程序呈现:
<?php
echo $this->form()->openTag($this->form);
echo $this->formCollection($this->form);
echo $this->form()->closeTag($this->form);
<代码> < P>使用Rob的响应,我构建了自己的帮助器,将不同的字段呈现为文本(示例是基础5行):
名称空间MyApp\View\Helper;
使用Zend\Form\View\Helper\FormRow;
使用Zend\Form\ElementInterface;
类RenderForm扩展了AbstractHelper
{
公共函数调用(ElementInterface$element)
{
$html='';
$value='';
$attributes=$element->getAttributes();
$type=$attributes['type'];
$label=$element->getLabel();
如果($type=='text'或$type=='textarea'或$type=='datetime'或$type=='hidden'){
$value=$element->getValue();
}
如果($type=='select'){
$selectedValue=$element->getValue();
如果(是布尔($selectedValue)){
$selectedValue=(int)$selectedValue;
}
$options=$element->getValueOptions();
$values='';
foreach($value=>$option的选项){
如果(!empty($value)或$value==0)和$value==$selectedValue){
$values.=$option.“
”;
}
}
$value=$value;
}
如果($type=='multi_checkbox'){
$selectedOptions=$element->getValue();
$options=$element->getValueOptions();
$values='';
foreach($options作为$option){
$optionValue=$option['value'];
if(在数组中($optionValue,$selectedOptions)){
$values.=$option['label'].
;
}
}
$value=$value;
}
如果($value=''){
$value='不适用';
}
$html.='
“.$label。”
“.$value。”
';
返回$html;
}
}
我认为Ash正在寻求一种不使用辅助程序渲染表单的方法,例如将表单封装到自己的视图模型中(设置为使用其他渲染器的视图模型的子视图)哦!最简单的方法是让表单ServiceManager知道,然后在render()方法中检索PHPRenderer,并使用那里的视图帮助程序。对不起,伙计们,我已经写了我的文章,我希望它更清楚一点。我认为我最初的问题模棱两可@Ocramius——这正是我想要完成的。如果是在不知道表单是如何构建的情况下呈现表单,你可以简单地echo$this->form($form)代码>。你能澄清一下确切的问题是什么吗?我已经更新了问题,我希望我的问题和意图更清楚
<section class="authentication-form">
<h2>Authentication Required</h2>
<!-- How-to: Generate the <form> tag and all it's attributes. -->
<?= $form->openTag() ?>
<? if ($ipAllowed): ?>
<p>Please choose an account to log in through.</p>
<fieldset>
<?= $form->get('email') ?>
</fieldset>
<? else: ?>
<p>Please log in using your e-mail address and password.</p>
<fieldset>
<?= $form->get('email') ?>
<?= $form->get('password') ?>
</fieldset>
<? endif ?>
<div class="action">
<!-- How-To: Generate the <input type="submit" name="" ... attributes ... />
<?= $form->get('login') ?>
</div>
<!-- How-To: Generate the form close tag.
<?= $form->closeTag() ?>
</section>
<?php
echo $this->form()->openTag($this->form);
echo $this->formCollection($this->form);
echo $this->form()->closeTag($this->form);
<?php
namespace MyModule\View\Helper;
use Zend\View\Helper\AbstractHelper;
class RenderForm extends AbstractHelper
{
public function __invoke($fieldsToRender, $form)
{
$html = $this->view->form()->openTag($form) . PHP_EOL;
foreach ($fieldsToRender as $fieldName) {
$element = $form->get($fieldName);
$html .= $this->view->formRow($element) . PHP_EOL;
}
$html .= $this->view->form()->closeTag($form) . PHP_EOL;
return $html;
}
}
namespace MyApp\View\Helper;
use Zend\Form\View\Helper\FormRow;
use Zend\Form\ElementInterface;
class RenderForm extends AbstractHelper
{
public function __invoke( ElementInterface $element )
{
$html = '';
$value = '';
$attributes = $element->getAttributes();
$type = $attributes['type'];
$label = $element->getLabel();
if( $type == 'text' or $type == 'textarea' or $type == 'datetime' or $type == 'hidden'){
$value = $element->getValue();
}
if( $type == 'select' ){
$selectedValue = $element->getValue();
if( is_bool( $selectedValue ) ){
$selectedValue = (int) $selectedValue;
}
$options = $element->getValueOptions();
$values = '';
foreach( $options as $value => $option ){
if( (!empty($value) or $value == 0) and $value === $selectedValue ){
$values .= $option . '<br />';
}
}
$value = $values;
}
if( $type == 'multi_checkbox' ){
$selectedOptions = $element->getValue();
$options = $element->getValueOptions();
$values = '';
foreach( $options as $option ){
$optionValue = $option[ 'value' ];
if( in_array( $optionValue, $selectedOptions ) ){
$values .= $option[ 'label' ]. '<br />';
}
}
$value = $values;
}
if( $value == ''){
$value = 'N/A';
}
$html .= '<div class="row">
<div class="small-12 column">
<div class="row">
<div class="small-3 columns"><label class="right inline" for="tag_id">' . $label . '</label></div>
<div class="small-9 columns left" style="padding-top:10px">' . $value . '</div>
</div>
</div>
</div>';
return $html;
}
}