【问题标题】:understanding grid layout in zend了解zend中的网格布局
【发布时间】:2019-08-05 10:00:32
【问题描述】:

我对在 zend 中设计表单有点困惑。 我知道我的表单类中有字段,并且应该在视图中完成外观。

在几乎是纯 html 的索引视图中,我没有问题,但在显示我的表单的添加和编辑视图中,我无法更改外观。

我有一个如下视图脚本:

 <?php
$title = 'AVB ändern';        
$this->headTitle($title);
?>
<h1><?= $this->escapeHtml($title) ?></h1>
<?php

$id= $form->get('id');
$id->setAttribute('class', 'form-control');
$id->setAttribute('placeholder', 'id');

$avbname= $form->get('avbname');
$avbname->setAttribute('class', 'form-control');
$avbname->setAttribute('placeholder', 'avbname');

$vbedingungen= $form->get('vbedingungen');
$vbedingungen->setAttribute('class', 'form-control');
$vbedingungen->setAttribute('placeholder', 'vbedingungen');

$versichererid= $form->get('versichererid');
$versichererid->setAttribute('class', 'form-control');
$versichererid->setAttribute('placeholder', 'versichererid');

$aktiv= $form->get('aktiv');
$aktiv->setAttribute('class', 'form-control');
$aktiv->setAttribute('placeholder', 'aktiv');

$submit = $form->get('submit');
$submit->setAttribute('class', 'btn btn-primary');


$form->prepare();

echo $this->form()->openTag($form);
?>
<div class="form-group">
    <?= $this->formElement($id) ?>
    <?= $this->formElementErrors()->render($id, ['class' => 'help-block']) ?>
</div>

<div class="form-group">
    <?= $this->formLabel($avbname) ?>
    <?= $this->formElement($avbname) ?>
    <?= $this->formElementErrors()->render($avbname, ['class' => 'help-block']) ?>
</div>

<div class="form-group">
    <?= $this->formLabel($vbedingungen) ?>
    <?= $this->formElement($vbedingungen) ?>
    <?= $this->formElementErrors()->render($vbedingungen, ['class' => 'help-block']) ?>
</div>

<div class="form-group">
    <?= $this->formLabel($versichererid) ?>
    <?= $this->formElement($versichererid) ?>
    <?= $this->formElementErrors()->render($versichererid, ['class' => 'help-block']) ?>
</div>

<div class="form-group">
    <?= $this->formLabel($aktiv) ?>
    <?= $this->formElement($aktiv) ?>
    <?= $this->formElementErrors()->render($aktiv, s['class' => 'help-block']) ?>
</div>

<?php
echo $this->formSubmit($submit);
echo $this->formHidden($form->get('id'));      
$form->setAttribute('action', $this->url('typavb', ['action' => 'edit']));    
echo $this->form()->closeTag();

当然,它显示一个字段在另一个字段之下。 如何连续显示两个字段(带有标签)? 我真的很感激一个好的教程的例子或提示,它展示了如何使用这个 zend3 概念正确地做到这一点。

它甚至是在视图中执行此操作的正确位置还是我需要一个新的 layout.phtml 来处理这种情况?

【问题讨论】:

  • $this-&gt;formRow 而不是 -&gt;formLabel & -&gt;formElement
  • 此外,如果您在 *Form 类中定义了所有这些类等,那么您可以(从技术上讲)只需执行 &lt;?= $this-&gt;form($form) ?&gt; 即可打印整个表单1 行 ;)
  • 请发布您真正有用的 cmets 作为答案,以便我接受!

标签: zend-framework zend-form zend-framework3 zend-view


【解决方案1】:

要单独打印元素的一部分,ZF 中预定义了几个函数。您可以在\Zend\Form\ConfigProvider-&gt;getViewHelperConfig() 中找到所有这些,请参阅here on Github

就您而言,您已经在使用formLabelformElementformElementErrors

如果你有货币之类的东西,这些很方便单独使用,你希望用户既填写金额又选择货币但只使用一个标签,例如:

$this->formLabel($form->get('amount'));
$this->formElement($form->get('amount'));
$this->formElementErrors($form->get('amount'));
$this->formElement($form->get('currency'));
$this->formElementErrors($form->get('currency'));

整个“表单行”由以下各项组成:

  • 标签(可选)
  • 元素
  • ElementErrors(如果在服务器端验证后出现)

因此,在本例中,您需要整个“金额”位,您可以将上述内容缩短为:

$this->formRow($form->get('amount'));             // prints all elements for the row
$this->formElement($form->get('currency'));
$this->formElementErrors($form->get('currency'));

如果您仔细查看“zendframework/zend-form”的链接ConfigProvider,您可能已经注意到还有一个form ViewHelper。这可用于一次性打印整个表单,如下所示:

文件:add-foo.phtml

    <?= $this->form($form) ?>

就是这样。它打印整个表格。当然,它使用 ZF 定义的 ViewHelpers,因此也应用了该布局和类。

如果您愿意,可以采用该配置并在您自己的项目中覆盖它。

例如,您的问题代码显示您在每一行周围添加&lt;div class="form-group"&gt;&lt;/div&gt;。大概是 Bootstrap 4。要神奇地做到这一点,所以你不需要这样做:

    <div class="form-group">
        <?= $this->formRow($form->get('foo')) ?>
    </div>

我们可以调整formRow ViewHelper。只需按照以下步骤操作:

  1. 在您自己的项目中创建FormRow.php,例如module/Foo/src/View/Helper/FormRow.phtml
  2. 确保从 ZF 的 FormRow 扩展它并复制到原始 (ZF) render 函数中,如下所示:
    use Zend\Form\View\Helper\FormRow as ZendFormRow;

    class FormRow extends ZendFormRow
    {
        public function render(ElementInterface $element, $labelPosition = null)
        {
            // its content
        }
    }
  1. 我们要添加一个包装器(form-group class div),所以在类中定义它,如下所示:
    class FormRow extends ZendFormRow
    {
        protected $inputRow = '<div class="form-group">%s</div>';
        // the other stuff
    }
  1. render 函数的底部,您会发现以下代码(在else 之前):
    if ($this->renderErrors) {
        $markup .= $elementErrors;
    }

放在上面:

    $markup = sprintf(
        $this->inputRow,
        $markup,
    );
  1. 注册您的新 ViewHelper,使用与 ZF 相同的别名以覆盖值:
    'view_helpers'    => [
        'aliases'    => [
            'formrow'             => FormRow::class,
            'form_row'            => FormRow::class,
            'formRow'             => FormRow::class,
            'FormRow'             => FormRow::class,
        ],
        'factories'  => [
            FormRow::class           => InvokableFactory::class,
        ],
    ],

完成。

现在,当您执行 $this-&gt;form($form) 时,来自 ZendFramework 的 FormElement ViewHelper 将在其 Factory 执行 -&gt;get('formRow') 时收到您的自定义 formRow ViewHelper,因为配置被覆盖为您自己的。因此,所有行现在将自动具有周围的 div。


比你要求的多一点,但玩得开心;)我现在要停止逃避工作了 O:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 2011-10-28
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多