Symfony表单使用ivoryckedorbundle提交CKEditor字段的空值


Symfony Form Submits Empty Value for CKEditor Field using IvoryCKEditorBundle

我使用一个标准的Symfony 2.4表单类,与IvoryCKEditorBundle。配置为:

ivory_ck_editor:
    default_config: cms
    configs:
        cms:
            toolbar: standard

作为参考,我有一个$view实体,有一个相关的$viewVersion实体,其中CKeditor位于$view->getVersion()->getContent()。(就提交数据而言,实体的结构应该没有任何区别,但如果你问的话)。

My Form在我的控制器中像任何普通表单一样创建,调用预定义的类型:

$form = $this->createForm(new ViewType(), $view);

ViewType中,该字段使用默认配置创建:

$builder
    ->add('content', 'ckeditor', array(
    'label' => false,
    'required' => false
    ));

CKeditor显示在浏览器中为我的表单的content字段(哈!),但当我提交表单,在内容字段的数据没有提交。内容字段保持空…它不在原始的$_POST或经过处理的$request->request->all()或表单数据$form->getData()->getContent()中。

Array (
    [view] => Array (
        [status] => 1
        [version] => Array (
            [title] => My Title
            [content] => 
        )
        [lockVersion] => 1
        [save] => 
        [_token] => xxxxxxxxxxx
    )
)

似乎也许CKEditor的javascript应该更新表单的隐藏textarea这个字段(如提到这个AJAX相关的问题),但这不是发生,所以它提交空。如果我用内容字段的值预污染我的实体,例如$view->getVersion()->setContent('默认内容'),这是持久化到数据库的内容,即使我在CKEditor中输入了另一个字符串。

我认为这个包应该只是"工作"开箱,虽然,所以我不确定我做错了什么。

那么CKEditor在这个bundle中是如何工作的呢?是否应该通过javascript动态更新隐藏的文本区域字段?因为那不是发生的…

我已经创建了一个简化的演示表单,只有两个ckeditor字段,如果你想看到它的作用:[链接不再有效]

查看为textarea生成的HTML。<textarea>被包装在一个div元素中,该元素与textarea本身具有相同的ID。这使编辑器不知道该更新哪个元素。

我的猜测是你正在使用bootstrap和bootstrap bundle for symfony覆盖表单模板来添加类,这就是冲突的地方。

根据您的代码,我会添加如下内容:

{% block widget_container_attributes %}
    {% if id is not empty %}
       {% set id = id ~ '_container' %}
    {% endif %}
    {% set attr = attr|merge({'class': (attr.class|default('') ~ ' form-group')|trim}) %}
    {{ parent() }}
{% endblock widget_container_attributes %}
如果你要大量使用bootstrap的话,不妨考虑使用这个bundle。

我在后端使用了这个bundle。您是否在config.yml文件中配置了这个包?这是我的配置。

ivory_ck_editor:
    default_config: cke_config
    configs:
        cke_config:
            filebrowserBrowseRoute: admin_sonata_media_media_browser
            filebrowserImageBrowseRoute: admin_sonata_media_media_browser
            # Display images by default when clicking the image dialog browse button
            filebrowserImageBrowseRouteParameters:
                provider: sonata.media.provider.image
            filebrowserUploadRoute: admin_sonata_media_media_upload
            filebrowserUploadRouteParameters:
                provider: sonata.media.provider.file
            # Upload file as image when sending a file from the image dialog
            filebrowserImageUploadRoute: admin_sonata_media_media_upload
            filebrowserImageUploadRouteParameters:
                provider: sonata.media.provider.image
                context: default-context # Optional, to upload in a custom context
            allowedContent : true

bundle有选项allowedContent : true。我想这会对你有帮助。