如何为单个 属性 自定义原型小部件模板?
How can I customize prototype widget templates for a single property?
在我的应用程序中,我有 classes A 和 B。class A 的对象拥有许多 class B 的对象。
要编辑这些对象,我有一个复合表单。外部表单编辑对象 A 的属性,内部表单编辑 B 的所有拥有实例。该子表单应该将其条目显示为 table 行。 table 本身由外部形式定义。
我的项目正在使用 PHP 模板引擎。到目前为止,我已经设法覆盖模板小部件以编辑 B 类型的对象。持有 B 的所有实例的 A 的 属性 在表单中呈现为 collection
。这意味着呈现以下模板:collection_widget.html.php -> form_widget_compound.html.php -> form_rows.html.php -> form_row.html.php ->
my_custom_template_widget.html.php
但是,其中一些模板添加了标签以包围它们正在呈现的模板,这破坏了我的 table 布局。我已经设法通过创建 _formForA_propertyB_widget.html.php 并在其中手动呈现所有内容来覆盖此 属性 的模板来解决此问题。
我现在遇到的问题是应该可以向这个集合中添加对象。我想使用 Symfony 提供的原型功能来做到这一点。然而,原型似乎不是使用我覆盖的模板创建的(当然不是,因为这是一个集合而不是单个行)而是使用 form_row.html.php 创建的。我尝试通过创建 _formForA_propertyB_form.html.php 来覆盖它,但这没有任何区别。
如何覆盖这个特定 属性 的原型模板?
本质上这个问题与 How to customize the data-prototype attribute in Symfony 2 forms 非常相似,但这个问题是关于使用 PHP 作为模板引擎。其他问题的答案使用了 TWIG 模板引擎的功能,这些功能在 PHP 引擎中不可用。
示例代码来说明问题:
Views/EditA.html.php:
<table data-prototype="<?php echo $view->escape($view['form']->row($form['collectionOfB']->vars['prototype'])) ?>">
<thead>
<tr>
<th>Description</th>
<th>Prop1</th>
<th>Prop2</th>
</tr>
</thead>
<tbody>
<?php echo $view['form']->widget($form['collectionOfB']) ?>
</tbody>
</table>
Views/Form/_objectA_collectionOfB_widget.html.php:
<?php foreach ($form as $child) : ?>
<?php echo $view['form']->widget($child) ?>
<?php endforeach; ?>
Views/Form/objectB_widget.html.php:
<tr>
<td><?php echo $view['form']->widget($form['description']) ?>
<?php echo $view['form']->errors($form['description']) ?></td>
<td><?php echo $view['form']->widget($form['prop1']) ?>
<?php echo $view['form']->errors($form['prop1']) ?></td>
<td><?php echo $view['form']->widget($form['prop2']) ?>
<?php echo $view['form']->errors($form['prop2']) ?></td>
</tr>
正如我所说,表单呈现正确,但这是原型:
<div>
<label class="required" >__name__label__</label>
<tr>
<!-- snip more code here -->
</tr>
</div>
你可以看到这包含 label
和一个 div
,这两个我都不想要,因为它会破坏 table。
事实证明,答案比我想象的要简单得多。我不需要渲染整行(从而渲染包含 div
的 form_row.html.php 模板),我只需要渲染小部件。
基本上你需要做的就是更换
$view->escape($view['form']->row($form['collectionOfB']->vars['prototype']))
与
$view->escape($view['form']->widget($form['collectionOfB']->vars['prototype']))
在我的应用程序中,我有 classes A 和 B。class A 的对象拥有许多 class B 的对象。
要编辑这些对象,我有一个复合表单。外部表单编辑对象 A 的属性,内部表单编辑 B 的所有拥有实例。该子表单应该将其条目显示为 table 行。 table 本身由外部形式定义。
我的项目正在使用 PHP 模板引擎。到目前为止,我已经设法覆盖模板小部件以编辑 B 类型的对象。持有 B 的所有实例的 A 的 属性 在表单中呈现为 collection
。这意味着呈现以下模板:collection_widget.html.php -> form_widget_compound.html.php -> form_rows.html.php -> form_row.html.php ->
my_custom_template_widget.html.php
但是,其中一些模板添加了标签以包围它们正在呈现的模板,这破坏了我的 table 布局。我已经设法通过创建 _formForA_propertyB_widget.html.php 并在其中手动呈现所有内容来覆盖此 属性 的模板来解决此问题。
我现在遇到的问题是应该可以向这个集合中添加对象。我想使用 Symfony 提供的原型功能来做到这一点。然而,原型似乎不是使用我覆盖的模板创建的(当然不是,因为这是一个集合而不是单个行)而是使用 form_row.html.php 创建的。我尝试通过创建 _formForA_propertyB_form.html.php 来覆盖它,但这没有任何区别。
如何覆盖这个特定 属性 的原型模板?
本质上这个问题与 How to customize the data-prototype attribute in Symfony 2 forms 非常相似,但这个问题是关于使用 PHP 作为模板引擎。其他问题的答案使用了 TWIG 模板引擎的功能,这些功能在 PHP 引擎中不可用。
示例代码来说明问题:
Views/EditA.html.php:
<table data-prototype="<?php echo $view->escape($view['form']->row($form['collectionOfB']->vars['prototype'])) ?>">
<thead>
<tr>
<th>Description</th>
<th>Prop1</th>
<th>Prop2</th>
</tr>
</thead>
<tbody>
<?php echo $view['form']->widget($form['collectionOfB']) ?>
</tbody>
</table>
Views/Form/_objectA_collectionOfB_widget.html.php:
<?php foreach ($form as $child) : ?>
<?php echo $view['form']->widget($child) ?>
<?php endforeach; ?>
Views/Form/objectB_widget.html.php:
<tr>
<td><?php echo $view['form']->widget($form['description']) ?>
<?php echo $view['form']->errors($form['description']) ?></td>
<td><?php echo $view['form']->widget($form['prop1']) ?>
<?php echo $view['form']->errors($form['prop1']) ?></td>
<td><?php echo $view['form']->widget($form['prop2']) ?>
<?php echo $view['form']->errors($form['prop2']) ?></td>
</tr>
正如我所说,表单呈现正确,但这是原型:
<div>
<label class="required" >__name__label__</label>
<tr>
<!-- snip more code here -->
</tr>
</div>
你可以看到这包含 label
和一个 div
,这两个我都不想要,因为它会破坏 table。
事实证明,答案比我想象的要简单得多。我不需要渲染整行(从而渲染包含 div
的 form_row.html.php 模板),我只需要渲染小部件。
基本上你需要做的就是更换
$view->escape($view['form']->row($form['collectionOfB']->vars['prototype']))
与
$view->escape($view['form']->widget($form['collectionOfB']->vars['prototype']))