zend 2 - 在局部视图助手中使用 Zend Forms

zend 2 -using Zend Forms in partial view helper

我有一个在多个不同模块中重复的表单。

我想避免一遍又一遍地重复相同的过程,并希望呈现一次表单(在我的应用程序模块中),然后简单地使用局部视图脚本在我希望的任何地方调用它;

<?php echo $this->partial('partialLayout/advertForm'); ?>

按照建议 here 如果我只是在部分脚本中创建一个 HTML 表单然后调用它,那么执行此操作将非常简单。

不过,我想使用 Zend Forms。请记住,zend 表单是通过控制器加载到页面上的——我该如何解决这个问题。

我想问题的症结在于——如何使用局部视图脚本在另一个模块中调用 Zend Form。

我用 ViewHelper 做了类似的事情。我的解决方案 is posted here,在 Zend 论坛中。

就是它了。

ViewHelper代码:

<?php
/**
* View helper to return the HTML code of the login form. 
*
* @filesource LoginForm.php
* @encodage UTF-8
* @author DAFAP Informatique - Alain Pomirol
* @date 10 nov. 2015
* @version 2015-1
*/
namespace Login\View\Helper;

use Zend\View\Helper\AbstractHelper;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\View\Model\ViewModel;
use Login\Form\LoginForm as Formulaire;

class LoginForm extends AbstractHelper implements ServiceLocatorAwareInterface
{

  protected $sm;

  public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
  {
    $this->sm = $serviceLocator;
    return $this;
  }

  public function getServiceLocator()
  {
    return $this->sm;
  }

  public function __invoke()
  {
    $form = new Formulaire();
    $layout = new ViewModel(array(
        'form' => $form
    ));
    $viewRender = $this->getServiceLocator()->getServiceLocator()->get('ViewRenderer');
    $layout->setTemplate('login/index/index.phtml');
    return $viewRender->render($layout);
  }
}

登录模块module.config.php中的语句:

'view_helpers' => array(
    'invokables' => array(
        'loginForm' => 'Login\View\Helper\LoginForm'
    )
),

针对应用模块的使用:

'view_helpers' => array(
    'invokables' => array(
        'loginForm' => 'Login\View\Helper\LoginForm'
    )
),

这是一个普遍的问题! 表格真的可以是slow-down与ZF2.

我使用 Twig(推荐),但您也可以将此方法移植到普通的旧 ZF2 模板。

这是我几乎在任何地方都使用的一个模板:

horizontal_form.twig

{# render rows only, not the form tag #}
{% do form.prepare() %}
{% for f in form %}
    {% do f.setOption( 'twb-layout', 'horizontal' ) %}
    {{  formRow( f ) }}
{% endfor %}

我有第二次使用稍微不同的方法来支持我的代码中的特定 IdentifiableForm:

identifiable_form.twig

<form id="{{ form.getAttribute('name') }}" name="{{ form.getAttribute('name') }}" action="{{ form.getAttribute('action') }}" class="form-horizontal" role="form">
    <input type="hidden" name="class" value="{{ form.getAttribute('class') }}">
    {% for f in form %}
        {% do f.setOption( 'twb-layout', 'horizontal' ) %}
        {% do f.setOption( 'twb-form-group-size', 'form-group-sm' ) %}
        {{ formRow( f ) }}
    {% endfor %}
    <div class="hr-line-dashed"></div>
    <button type="submit" class="btn btn-primary ladda-button" data-style="expand-right">Save</button>
</form>

把这两个放在口袋里,我的用法是这样的:

在应该使用表单的树枝模板中

...包含其他模板:

<div class="panel-body">

    {% set form = general_config_form %}
    {% do form.prepare() %}
    {% include 'application/generic/identifiable_form' %}

</div>

操作该模板的控制器操作如下所示:

$vm = new ViewModel();
$vm->setTerminal( true );
$vm->setTemplate( 'application/admin/config/index' );

$sm = $this->getServiceLocator();
$fm = $sm->get( 'FormElementManager' );

$country = $config_mapper->get('general.country', true );
$general_config_form = $fm->get( GeneralConfigForm::class, [ 'country' => $country ] );
$general_config_form->setAttribute('action', '/admin-config/form-save' );
$vm->setVariable( 'general_config_form', $general_config_form );

最后只是一场游戏:

  • instantiating/loading动作中的表格
  • 将表单设置为 ViewModel 中的变量
  • 包括该操作的实际模板中的 "generic form template"

关于主题,如果你像我一样讨厌操纵表格,我在这里做了一个小工具来节省时间:https://github.com/Saeven/zf2-circlical-formtool

其次,如果您在您的应用程序中使用 Bootstrap,这个表单助手替换确实让事情看起来不错:https://github.com/neilime/zf2-twb-bundle

祝你好运!