Принципы интеграции
Что необходимо
. В свою очередь, такая реализация накладывает одно ограничение на использование: все дополнительные страницы редактора должны быть объявлены ДО объявления основной страницы.
Приступим
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
require_once $_SERVER['DOCUMENT_ROOT'] . '/spaw2/spaw.inc.php';
class My_Decorator_SpawPage extends Zend_Form_Decorator_Abstract
{
public function render($content)
{
$element = $this->getElement();
$element->setDisableLoadDefaultDecorators(true);
$page = new SpawEditorPage($element->getName(),
$element->getLabel(),
$element->getValue(),
$element->getAttrib('direction'));
My_Decorator_Spaw::addPage($page);
return NULL;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
require_once $_SERVER['DOCUMENT_ROOT'] . '/spaw2/spaw.inc.php';
class My_Decorator_Spaw extends Zend_Form_Decorator_Abstract
{
// объявим статическую переменную $pages - наше хранилище
static $pages = array();
// а это - статический метод для добавление объектов
// страниц редактора в хранилище
static function addPage($page) {
array_push(self::$pages,$page);
}
// метод render() вызывается автоматически в момент генерации
// кода элемента формы. Здесь и происходит перевоплощение обычной
// textarea в полноценный визуальный редактор
public function render($content)
{
// получим объект элемента формы для удобства доступа
// к его свойствам
$element = $this->getElement();
// на всякий случай отключим дефолтные декораторы
// для этого элемента
$element->setDisableLoadDefaultDecorators(true);
// создаем объект SpawEditor. В качестве параметров
// передаются свойства элемента.
$spaw = new SpawEditor($element->getName(),
$element->getValue(),
$element->getAttrib('language'),
$element->getAttrib('toolbarset'),
$element->getAttrib('theme'),
$element->getAttrib('width'),
$element->getAttrib('height'),
$element->getAttrib('stylesheet'),
$element->getLabel());
// А это - небольшая хитрость. Дело в том, что конструктору
// SpawEditor нельзя передать один параметр - направление письма.
// Поэтому мы создадим страницу редактора с тем же именем.
$page = new SpawEditorPage($element->getName(),
$element->getLabel(),
$element->getValue(),
$element->getAttrib('direction'));
$spaw->addPage($page);
// Дальше следует проверка наличия дополнительных свойств,
// и их установка для текущего объекта редактора
if ($element->getAttrib('hideModeStrip')) {
$spaw->hideModeStrip();
}
if ($element->getAttrib('hideStatusBar')) {
$spaw->hideStatusBar();
}
if ($element->getAttrib('setFloatingMode')) {
$spaw->setFloatingMode();
}
if (count($element->getAttrib('setStaticConfigValue')) > 0) {
foreach ($element->getAttrib('setStaticConfigValue') as $name => $value) {
SpawConfig::setStaticConfigValue($name,$value);
}
}
if (count($element->getAttrib('setConfigValue')) > 0) {
foreach ($element->getAttrib('setConfigValue') as $name => $value) {
$spaw->setConfigValue($name,$value);
}
}
if (is_array($element->getAttrib('toolbar'))) {
$toolbars = $element->getAttrib('toolbar');
$element->getAttrib('toolbar');
foreach ($toolbars as $toolbar) {
$spaw->addToolbar($toolbar);
}
}
// Настало время извлечь из хранилища объекты дополнительных
// страниц, и добавить объекту редактора
foreach (self::$pages as $page) {
$spaw->addPage($page);
}
// А дальше следует вывод. Комментарии, надеюсь, излишни.
$separator = $this->getSeparator();
$placement = $this->getPlacement();
$output = $spaw->getHtml();
switch ($placement) {
case (self::PREPEND):
return $output . $separator . $content;
case (self::APPEND):
default:
return $content . $separator . $output;
}
}
}
Пример использования
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
$form = new Zend_Form();
// Теперь нужно создать элемент для дополнительной страницы редактора.
// В этом элементе будет содержаться перевод статьи на иврит.
// Создадим новый экземпляр Zend_Form_Element_Textarea,
// в качестве параметра конструктора передадим имя элемента
// формы - 'article_hebrew'
$page = new Zend_Form_Element_Textarea('article_hebrew');
// Установим для этой страницы Label
$page->setLabel('Hebrew translation');
// Следующие 2 строки применяют к элементу созданный нами
// декоратор My_Decorator_SpawPage
$page->addPrefixPath('My_Decorator', 'My/Decorator/', 'decorator');
$page->setDecorators(array('SpawPage'));
// При необходимости - указываем текущее значение элемента
// $page->setValue('Hebrew text');
// А теперь укажем направление текста - справа на лево.
$page->setOptions(array('direction' => 'rtl'));
// Теперь создадим основную страницу редактора с именем 'article'
$element = new Zend_Form_Element_Textarea('article');
// Установим Label
$element->setLabel('English article');
// Следующие 2 строки применяют к элементу декоратор My_Decorator_Spaw
$element->addPrefixPath('My_Decorator', 'My/Decorator/', 'decorator');
$element->setDecorators(array('Spaw'));
// При необходимости - указываем текущее значение элемента
// $element->setValue('111');
// Метод setOptions() устанавливает массив параметров для элемента.
// Эти параметры будут использованы для настройки объекта редактора.
// Больше информации об этих параметрах можно найти в документации по SPAW.
$element->setOptions(array('direction' => 'ltr',
'language' => 'ru',
'width' => '600px',
'height' => '400px',
'toolbar' => array('edit','font'),
'theme' => 'spaw2',
'stylesheet' => 'cust.css',
'hideModeStrip' => TRUE,
'setFloatingMode' => FALSE,
'hideStatusBar' => TRUE,
'setStaticConfigValue' => array('default_height' => '200px',
'default_width' => '200px'),
'setConfigValue' => array('default_height' => '500px',
'default_width' => '500px')));
// Вначале добавим в форму все дополнительные страницы редактора
$form->addElement($page);
// И лишь затем - основную страницу. Это связано с тем, что
// рендеринг элементов происходит в порядке их добавления.
$form->addElement($element);
// Теперь можно вывести форму или передать ее в скрипт вида либо на обработку.
echo $form->render();
Послесловие
Как я уже недавно писал, мой любимый визуальній редактор – Spaw Editor от компании Solmetra.
А вот пример того, как можно написать плагин для Smarty для быстрой вставки редактора в тело страницы. Думаю, что комментировать код нет необходимости – тут и так все понятно. Кроме того, модифицировав всего пару строк, можно исключить Zend Framework, если ваш проект не использует его.
И еще: этот плагин писался под конкретный проект, поэтому в нем реализовано лишь то, что было необходимо мне. Вполне вероятно, что вам окажется недостаточно такой функциональности.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | <?php /** * Smarty plugin * @package Smarty * @subpackage plugins */ /** * Smarty {spaw} function plugin * * Type: function * Name: spaw * Date: Nov 11, 2007 * Purpose: automate creation Spaw Editor * Input: * - name = name of textarea, default - 'Text' * - value = default value * - lang = * - toolbarset * - theme * - width * - height * - stylesheet * - page_caption * Examples: * <pre> * {spaw} * {spaw name='Description' lang='en'} * * @version 1.0 * @author Kirill Pavliukov <kirill></kirill> * @param array * @param Smarty * @return string * @todo Spaw Pages */ function smarty_function_spaw($params, &$smarty) { if (!defined('WWW_DIR')) define('WWW_DIR',$_SERVER['DOCUMENT_ROOT']); $name = ((isset($params['name'])) ? $params['name'] : null); $value = ((isset($params['name'])) ? $params['value'] : ''); $lang = ((isset($params['lang'])) ? $params['lang'] : null); $toolbarset = ((isset($params['toolbarset'])) ? $params['toolbarset'] : ''); $theme = ((isset($params['theme'])) ? $params['theme'] : ''); $width = ((isset($params['width'])) ? $params['width'] : ''); $height = ((isset($params['height'])) ? $params['height'] : ''); $stylesheet = ((isset($params['stylesheet'])) ? $params['stylesheet'] : ''); $page_caption= ((isset($params['page_caption'])) ? $params['page_caption'] : ''); if ($name == null) $smarty->trigger_error('(SPAW) Parameter `Name` must be specified'); if ($lang == null) { $front = Zend_Controller_Front::getInstance(); $lang = $front->getRequest()->getParam('language'); } $pages = ((isset($params['pages'])) ? $params['pages'] : null); if ($name == '') $name = 'Text'; require_once(WWW_DIR . 'spaw2/spaw.inc.php'); $spaw = new SpawEditor($name, $value, $lang, $toolbarset, $theme, $width, $height, $stylesheet, $page_caption); if ($pages) { $pages = split(';',$pages); foreach ($pages as &$page) { $page = split('::',$page); if (!isset($page[0]) or empty($page[0])) $smarty->trigger_error('(SPAW) Page name myst be specified!'); if (!isset($page[1]) or empty($page[1])) $smarty->trigger_error('(SPAW) Page caption myst be specified!'); if (!isset($page[2])) $page[2] = ''; if (!isset($page[3])) $page[3] = 'ltr'; $spawPage = new SpawEditorPage($page[0],$page[1],$page[2],$page[3]); $spaw->addPage($spawPage); } } $spaw->show(); } ?> |
) произошло мое знакомство с наиболее, на мой взгляд, удобным редактором – SPAW Editor от компании Solmetra - http://www.spaweditor.com/. Этот редактор распространяется бесплатно, под GNU General Public License (GPL), но также можно приобрести и коммерческую лицензию.

Свежие комментарии