Magento, wysiwyg и ошибка Uncaught ReferenceError: tinyMceWysiwygSetup is not defined

Magento, Баги, глюки, ошибки, недочеты

Метки (теги) : , , , ,

Автор: admin

Создавая модуль для cms движка интернет магазина под названием Magento, с первого раза не получилось подключить wysiwyg tinyMCE к контентному полю формы в админке. Пробовал многие рекомендации в интернете на форумах и блогах. Но все оно было либо не рабочим совсем, либо какой-то маленькой детали  всегда не хватало. Поэтому совместив все рекомендации по данному вопросу, вывел окончательную рабочую формулу для себя. Может и вам она будет полезна. И так начнем.

Первым делом договоримся, что namespace для модуля к примеру будет MyCompany, название самого модуля будет MyModule.

Если вы создавали скелет модуля через утилиту module creator, то у вас должен быть такой файл app/code/local/MyCompany/MyModule/Block/Adminhtml/MyModule/Edit.php

если вы вручную все делали, то у вас должен быть такой класс возможно не по такому пути, но его название такое примерно

class MyCompany_MyModule_Block_Adminhtml_MyModule_Edit extends Mage_Adminhtml_Block_Widget_Form_Container

В в этом классе  нужно добавить такой метод

protected function _prepareLayout()
    {
        parent::_prepareLayout();
        if (Mage::getSingleton('cms/wysiwyg_config')->isEnabled()) {
            $this->getLayout()->getBlock('head')->setCanLoadTinyMce(true);
        }
    }

А если у вас есть такой или подобный код в конструкторе __construct

$this->_formScripts[] = "
            function toggleEditor() {
                if (tinyMCE.getInstanceById('myModule_description') == null) {
                    tinyMCE.execCommand('mceAddControl', false, 'myModule_description');
                } else {
                    tinyMCE.execCommand('mceRemoveControl', false, 'myModule_description');
                }
            }
 
            function saveAndContinueEdit(){
                editForm.submit($('edit_form').action+'back/edit/');
            }
        ";

то лично я удалил вот эту его часть

            function toggleEditor() {
                if (tinyMCE.getInstanceById('myModule_description') == null) {
                    tinyMCE.execCommand('mceAddControl', false, 'myModule_description');
                } else {
                    tinyMCE.execCommand('mceRemoveControl', false, 'myModule_description');
                }
            }

, за ненадобностью. Его создала утилита module creator. И когда я его удалил у меня ничего не нарушилось.

В файле app/code/local/MyCompany/MyModule/Block/Adminhtml/MyModule/Edit/Tab/Form.php
Нужно добавить такие настройки

$wysiwygConfig = Mage::getSingleton('cms/wysiwyg_config')->getConfig(array(
'add_variables' => false, 
'add_widgets' => false, 
'files_browser_window_url' => $this->getBaseUrl() . 'admin/cms_wysiwyg_images/index/'
));

Также изменить или добавить, если еще нет такового, поле на которое навесим wysiwyg редактор.

$fieldset->addField('description', 'editor', array(
            'name' => 'description',
            'label' => Mage::helper('gallery')->__('Description'),
            'title' => Mage::helper('gallery')->__('Description'),
            'style' => 'width:700px; height:500px;',
            'config' => $wysiwygConfig,
            'wysiwyg' => true,
            'required' => false,
        ));

Хочу отметить одну особенность без учета которой редактор tinyMCE работать не будет. Вот собственно и она:
как видите в данной части

$fieldset->addField('description', 'editor', array(
            'name' => 'description',

у меня поле имеет имя поля тега и имя поля в таблице “description”, но если вы создавали модуль с помощью утилиты module creator, то эта утилита дала этому полю, скорее всего, название “content”. А с названием “content” tinyMCE в magento работать не будет. Он будет совсем неадекватно отображаться на странице. Все поля формы будут объектами редактирования.

И последний пункт который нужно выполнить для правильной работы wysiwyg редактора.
Необходимо в layout файле модуля app/design/adminhtml/default/default/layout/mymodule.xml добавить такой кодик

<mymodule_adminhtml_mymodule_edit>
        <update handle="editor"/>
    </mymodule_adminhtml_mymodule_edit>

Надеюсь вам подошло это решение.
Дон скорых встреч.

Комментарии:

Оставить комментарий