我使用一个标准的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 %}
我在后端使用了这个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
。我想这会对你有帮助。