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 的构造函数中初始化。无需任何复杂代码即可正常工作。