0

如何在表单中隐藏父文档字段?我有一些块将被修复并且不想显示父文档字段。我尝试将 css 类或内联样式传递给该字段,但在呈现该字段后它不会出现。

尝试 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

我还尝试隐藏该字段,将字符串作为默认数据传递给该字段,设置一个 prepersist 事件以使用所需的父文档覆盖该字符串。虽然这适用于未嵌入的块,但它也触发了幻灯片块的副作用,除非存在孩子的父文档字段,否则我无法保存我的子块。

子块示例代码:

形式:

->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,当子文档的父文档字段保留为默认值时,幻灯片块可以正常工作。但我想隐藏那个领域!

4

1 回答 1

0

这个可以忽略,看下面的编辑

我弄清楚了尝试 2 的问题所在。我认为当父块被持久化时会触发孩子的 prepersist 事件,但事实证明并非如此。仅调用了父级的 prepersist 事件。

所以在我的例子中,我用文本'filler'填充了孩子的 parentDocument 属性,它没有被覆盖到文档对象,因为它的 prepersist 事件没有被调用。因此提到了错误。因此,我修改了我父母的 perpersist 事件以循环到它的孩子并设置正确的父文档。

示例代码:

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

于 2015-06-19T08:20:37.367 回答