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

时间:2016-01-07 10:42:34

标签: forms zend-framework2

我有一个表格在几个不同的模块上重复。

我想避免一遍又一遍地重复相同的过程,并希望渲染表单一次(在我的应用程序模块中)然后只需使用部分视图脚本来调用它,就像我希望的那样;

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

遵循建议here如果我只是在部分脚本中创建一个HTML表单然后调用它,那么这样做非常简单。

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

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

2 个答案:

答案 0 :(得分:0)

我使用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'
    )
),

答案 1 :(得分:0)

这是一个常见的问题!使用ZF2,表单确实会变慢。

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

这是我在几乎所有地方使用的一个这样的模板:

<强> horizo​​ntal_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 );

最后它只是一场游戏:

  • 在动作中实例化/加载表单
  • 将表单设置为ViewModel中的变量
  • 包含该动作的实际模板中的“通用表单模板”

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

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

祝你好运!