在我的应用程序中,我有类A和B.类A的对象拥有许多B类对象。
要编辑这些对象,我有一个复合形式。外部表单编辑对象A的属性,内部表单编辑B的所有拥有实例。该子表单应该将其条目显示为表行。表本身由外部表单定义。
我的项目正在使用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
但是,其中一些模板添加标签以围绕它们呈现的模板,这会破坏我的表格布局。我设法通过创建_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引擎中是不可用的。
用于说明问题的示例代码:
查看/ 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>
浏览/形式/ _objectA_collectionOfB_widget.html.php:
<?php foreach ($form as $child) : ?>
<?php echo $view['form']->widget($child) ?>
<?php endforeach; ?>
浏览/形式/ 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
,我不想要这两个,因为它会破坏表格。
答案 0 :(得分:0)
事实证明,答案比我想象的要简单得多。我不需要渲染整行(从而渲染包含div
的form_row.html.php模板),而只需渲染小部件。
基本上你需要做的就是替换
$view->escape($view['form']->row($form['collectionOfB']->vars['prototype']))
与
$view->escape($view['form']->widget($form['collectionOfB']->vars['prototype']))