Как можно использовать FCKeditor или любой другой WYSIWYG-редактор вместе с Zend_Form? Еще один относительно простой вопрос. Существует множество способов с помощью которых вы можете сделать это, но давайте взглянем на два наиболее подходящих, по моему мнению:
* Добавление некоторого JavaScript к вашему Виду (view).
* Создание Zend_Form_Decorator
Мы будем использовать FCKeditor, но вы можете применить показанную технику к другим, и к TinyMCE в том числе.
Настройка
Мы рассмотрим каждый метод для настройки FCKeditor с Zend_Form. Будем считать, что у вас есть какой-то контроллер с Видом (view), к которому вы добавляете какой-то простой класс формы как этот:
<?php class MyForm extends Zend_Form {
public function init() {
//Мы просто добавим простой элемент textarea на форму
$this->addElement('textarea', 'content', array(
'id' => 'txtContent',
'label' => 'Contents'
));
}
}
Заметьте, что мы указываем ID элементу формы — вам необходимо назначить элемент ID чтобы это работало, не забудьте об этом!
Метод 1: добавление JavaScript к Виду (view)
Это по всей видимости простейшее решение из этих двух, но не очень многоразовое и всегда требует ручной реализации этого шага.
Проще говоря, мы выведем форму в Виде (view) и затем включим некоторый код JavaScript, который будет заменять textarea вкладышем FCKeditor.
<?php echo $this->form; ?>
<script type="text/javascript">
var editor = new FCKeditor('txtContent') ;
editor.BasePath = 'fckeditor/'; // замените это на путь к файлам fckeditor
editor.ReplaceTextarea() ;
</script>
Когда страница загрузилась, запускается вышеуказанный код JavaScript и заменяет textarea на WYSIWYG-редактор. Учтите, что для работы кода JavaScript, вам необходимо включить скрипты FCKeditor в секцию head. Также, если вы хотите разместить блок скрипта в секцию head, помните что это следует вешать на window.onload, иначе просто не будет работать.
Метод 2: создание своего декоратора
Это решение требует свой класс декоратора. Это немного сложнее чем первый метод, но после того как мы создадим декоратор, это будет проще для многоразового использования.
Декоратор не будет изменять разметку элементов, вместо этого мы добавим некоторый код JavaScript к помощнику inlineScript.
Выгоды данного решения в том, что редактор будет работать, и даже если что-то пойдет не так — вы увидите простой textarea. Если бы мы использовали, скажем, библиотеку интеграции FCKeditor PHP, не выводилось бы вообще ничего.
<?php
class CU_Form_Decorator_FckEditor extends Zend_Form_Decorator_Abstract {
private $_basePath = 'fckeditor/';
public function setBasePath($path) {
$this->_basePath = $path;
}
public function render($content) {
$view = $this->getElement()->getView();
$view->inlineScript()->appendScript("
var editor = new FCKeditor('" . $this->getElement()->getId() . "');
editor.BasePath = '" . $this->_basePath . "';
editor.ReplaceTextarea();
");
return $content;
}
}
Как видите, декоратор относительно простой. Он просто добавляет JS-код необходимый inlineScript и возвращает не измененное содержимое. У нас также есть метод для установки базового пути FCKeditor, в случае если он другой.
Использовать этот декоратор очень просто:
<?php
// Добавим декоратор к нашему созданному классу формы
$form = new MyForm(); // имя textarea было content, значит мы можем получить доступ таким образом
$form->content->addDecorator(new CU_Form_Decorator_FckEditor());
Сейчас, когда мы сделали рендер формы в Виде (view) и рендер inlineScript в конце layout перед закрывающим body, мы получили отличный блок FCKeditor.
Выявление неисправностей
Если у вас возникли трудности с запуском FCKeditor, убедитесь в его доступности. Иногда, ваши правила rewrite, файла .htaccess, могут делать запрет, вам необходимо открыть доступ для файлов скрипта.
Наиболее простой путь убедиться, в данном случае, это попытаться открыть скрипт напрямую через браузер.
Выводы
Интеграция FCKeditor в Zend_Form является очень простой задачей. Мы даже можем сделать ее простой для повторного использования, создав собственный декоратор.