我有一个表格在几个不同的模块上重复。
我想避免一遍又一遍地重复相同的过程,并希望渲染表单一次(在我的应用程序模块中)然后只需使用部分视图脚本来调用它,就像我希望的那样;
<?php echo $this->partial('partialLayout/advertForm'); ?>
遵循建议here如果我只是在部分脚本中创建一个HTML表单然后调用它,那么这样做非常简单。
但是,我想使用Zend Forms。请记住,通过控制器将zend表单加载到页面上 - 我该如何解决这个问题。
我猜问题的症结在于 - 如何使用部分视图脚本在另一个模块中调用Zend Form。
答案 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模板中。
这是我在几乎所有地方使用的一个这样的模板:
<强> 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 );
最后它只是一场游戏:
关于主题,如果你像我一样讨厌操纵表格,我在这里制作了一个小工具来节省时间:https://github.com/Saeven/zf2-circlical-formtool
其次,如果你在你的应用程序中使用Bootstrap,这个表单帮助替换确实让事情看起来很棒:https://github.com/neilime/zf2-twb-bundle
祝你好运!