PrestaShop 1.7.8.8中TranslatableType自定义字段的WYSIWYG编辑器异常
PrestaShop 1.7.8.8 分类多语言字段WYSIWYG编辑器修复方案
问题背景
在搭配Elementor插件的PrestaShop 1.7.8.8系统中,为分类新增名为「页脚描述(Description footer)」的多语言字段后,字段无法正常加载WYSIWYG编辑器,当前站点启用4种语言。原实现代码如下:
use PrestaShopBundle\Form\Admin\Type\FormattedTextareaType; use PrestaShopBundle\Form\Admin\Type\TranslatableType; use Symfony\Component\Form\Extension\Core\Type\TextareaType; public function hookActionCategoryFormBuilderModifier(array $params) { /** @var \Symfony\Component\Form\FormBuilder $formBuilder */ $formBuilder = $params['form_builder']; $locales = $this->get('prestashop.adapter.legacy.context')->getLanguages(); $formBuilder->add('description_footer', TranslatableType::class, [ 'label' => $this->l('Description footer'), 'type' => FormattedTextareaType::class, 'required' => false, 'locales' => $locales ] ); $category = new Category((int)$params['id']); $params['data']['description_footer'] = $category->description_footer; $formBuilder->setData($params['data']); }
实际效果:字段仅显示普通文本框,无WYSIWYG编辑器界面。
问题原因
原代码未给FormattedTextareaType传递WYSIWYG启用参数,数据赋值逻辑存在潜在冲突,且使用了不推荐的legacy方式获取语言列表,导致编辑器无法初始化。
修复方案
1. 修改表单构建代码
替换为以下代码,补充编辑器初始化参数并优化逻辑:
use PrestaShopBundle\Form\Admin\Type\FormattedTextareaType; use PrestaShopBundle\Form\Admin\Type\TranslatableType; use PrestaShop\PrestaShop\Core\Locale\LocaleRetrieverInterface; public function hookActionCategoryFormBuilderModifier(array $params) { /** @var \Symfony\Component\Form\FormBuilderInterface $formBuilder */ $formBuilder = $params['form_builder']; /** @var LocaleRetrieverInterface $localeRetriever */ $localeRetriever = $this->get('prestashop.core.locale.locale_retriever'); $locales = $localeRetriever->getLocales(); // 添加多语言WYSIWYG字段 $formBuilder->add('description_footer', TranslatableType::class, [ 'label' => $this->l('页脚描述'), 'type' => FormattedTextareaType::class, 'required' => false, 'locales' => $locales, 'options' => [ 'wysiwyg' => true, 'editor' => 'tinymce', 'attr' => [ 'class' => 'autoload_rte', ], ], ]); // 安全赋值现有数据 $category = new Category((int)$params['id']); $formData = $formBuilder->getData(); $formData['description_footer'] = $category->description_footer; $formBuilder->setData($formData); }
2. 确保数据库字段存在
多语言字段需存储在ps_category_lang表中,执行以下SQL(替换ps_为你的数据库前缀):
ALTER TABLE `ps_category_lang` ADD `description_footer` TEXT NULL DEFAULT NULL AFTER `description`;
关键修复点说明
- 通过
options参数给FormattedTextareaType传递wysiwyg: true和autoload_rte类,强制初始化TinyMCE编辑器。 - 使用官方推荐的
LocaleRetrieverInterface获取语言列表,替代legacy context调用,提升版本兼容性。 - 优化数据赋值逻辑,先获取原有表单数据再修改,避免覆盖其他字段的默认值。
内容的提问来源于stack exchange,提问作者Augusto Murri
相关产品推荐
相关产品推荐

