Symfony CMF 隐藏表单的父文档字段
Symfony CMF hide form's parent document field
如何在表单中隐藏父文档字段?我有一些块将被修复并且不想显示父文档字段。我尝试将 css class 或内联样式传递给该字段,但在呈现该字段后它没有出现。
尝试 1
示例代码:
->add(
'parentDocument',
'doctrine_phpcr_odm_tree',
array('attr' => ['style' => 'display:none !important'], 'root_node' => $this->getRootPath(), 'choice_list' => array(), 'select_root_node' => true)
)
尝试 2
我还尝试隐藏字段,在字段中传递一个字符串作为默认数据,设置一个预留事件以用需要的父文档覆盖字符串。虽然这对于未嵌入的块来说效果很好,但它也会对幻灯片块产生副作用,除非子块的父文档字段存在,否则我无法保存我的子块。
子块示例代码:
表格:
->with('form.group_general')
->add('parentDocument', 'hidden', ['required' => false, 'data' => 'filler'])
->add('name', 'hidden', ['required' => false, 'data' => 'filler'])
->end();
预坚持:
public function prePersist($document)
{
parent::prePersist($document);
$this->initialiseDocument($document);
}
private function initialiseDocument(&$document)
{
$documentManager = $this->getModelManager();
$parentDocument = $documentManager->find(null, $this->getRootPath());
$document->setParentDocument($parentDocument);
$slugifier = new Slugify();
$document->setName($slugifier->slugify($document->getTitle()));
}
错误:
ERROR -
Context: {"exception":"Object(Sonata\AdminBundle\Exception\ModelManagerException)","previous_exception_message":"Warning: get_class() expects parameter 1 to be object, string given"}
总而言之,尝试 2 时,当子项的父文档字段保留为默认值时,幻灯片块可以正常工作。但是我想隐藏那个字段!
这个可以忽略看下面编辑
我弄清楚了尝试 2 的问题所在。我认为 child 的 prepersist 事件会在 parent 块被持久化时触发,但事实证明这不是案子。只调用了 parent 的 prepersist 事件。
所以在我的例子中,我用文本 'filler' 填充了 child 的 parent 文档 属性,它没有被文档覆盖 object因为它的 prepersist 事件没有被调用。因此提到了错误。因此,我修改了 parent 的持续事件以循环到其 children 并设置正确的 parent 文档。
示例代码:
private function initialiseDocument(&$document)
{
$documentManager = $this->getModelManager();
$parentDocument = $documentManager->find(null, $this->getRootPath());
$document->setParentDocument($parentDocument);
$slugifier = new Slugify();
if ($document->getName() == null || $document->getName() == 'filler') {
$document->setName($slugifier->slugify($document->getTitle()));
}
foreach ($document->getChildren() as $child) {
$child->setParentDocument($document);
if ($child->getName() == null || $child->getName() == 'filler') {
$child->setName($slugifier->slugify($child->getLabel()));
}
}
}
编辑:最后我干脆把ParentDocument字段的模板改写成这样(最后一个if语句)在:
app\Resources\SonataAdminBundle\views\Form\form_admin_fields.html.twig
<div class="form-group{% if errors|length > 0%} has-error{%endif%}" id="sonata-ba-field-container-{{ id }}"{% if 'parentDocument' in id %} style="display: none"{% endif %}>
并且 Name 字段从表单中删除,在 Document 的构造函数中初始化。无需任何复杂代码即可正常工作。
如何在表单中隐藏父文档字段?我有一些块将被修复并且不想显示父文档字段。我尝试将 css class 或内联样式传递给该字段,但在呈现该字段后它没有出现。
尝试 1
示例代码:
->add(
'parentDocument',
'doctrine_phpcr_odm_tree',
array('attr' => ['style' => 'display:none !important'], 'root_node' => $this->getRootPath(), 'choice_list' => array(), 'select_root_node' => true)
)
尝试 2
我还尝试隐藏字段,在字段中传递一个字符串作为默认数据,设置一个预留事件以用需要的父文档覆盖字符串。虽然这对于未嵌入的块来说效果很好,但它也会对幻灯片块产生副作用,除非子块的父文档字段存在,否则我无法保存我的子块。
子块示例代码:
表格:
->with('form.group_general')
->add('parentDocument', 'hidden', ['required' => false, 'data' => 'filler'])
->add('name', 'hidden', ['required' => false, 'data' => 'filler'])
->end();
预坚持:
public function prePersist($document)
{
parent::prePersist($document);
$this->initialiseDocument($document);
}
private function initialiseDocument(&$document)
{
$documentManager = $this->getModelManager();
$parentDocument = $documentManager->find(null, $this->getRootPath());
$document->setParentDocument($parentDocument);
$slugifier = new Slugify();
$document->setName($slugifier->slugify($document->getTitle()));
}
错误:
ERROR -
Context: {"exception":"Object(Sonata\AdminBundle\Exception\ModelManagerException)","previous_exception_message":"Warning: get_class() expects parameter 1 to be object, string given"}
总而言之,尝试 2 时,当子项的父文档字段保留为默认值时,幻灯片块可以正常工作。但是我想隐藏那个字段!
这个可以忽略看下面编辑
我弄清楚了尝试 2 的问题所在。我认为 child 的 prepersist 事件会在 parent 块被持久化时触发,但事实证明这不是案子。只调用了 parent 的 prepersist 事件。
所以在我的例子中,我用文本 'filler' 填充了 child 的 parent 文档 属性,它没有被文档覆盖 object因为它的 prepersist 事件没有被调用。因此提到了错误。因此,我修改了 parent 的持续事件以循环到其 children 并设置正确的 parent 文档。
示例代码:
private function initialiseDocument(&$document)
{
$documentManager = $this->getModelManager();
$parentDocument = $documentManager->find(null, $this->getRootPath());
$document->setParentDocument($parentDocument);
$slugifier = new Slugify();
if ($document->getName() == null || $document->getName() == 'filler') {
$document->setName($slugifier->slugify($document->getTitle()));
}
foreach ($document->getChildren() as $child) {
$child->setParentDocument($document);
if ($child->getName() == null || $child->getName() == 'filler') {
$child->setName($slugifier->slugify($child->getLabel()));
}
}
}
编辑:最后我干脆把ParentDocument字段的模板改写成这样(最后一个if语句)在:
app\Resources\SonataAdminBundle\views\Form\form_admin_fields.html.twig
<div class="form-group{% if errors|length > 0%} has-error{%endif%}" id="sonata-ba-field-container-{{ id }}"{% if 'parentDocument' in id %} style="display: none"{% endif %}>
并且 Name 字段从表单中删除,在 Document 的构造函数中初始化。无需任何复杂代码即可正常工作。