Принципы интеграции
Что необходимо
. В свою очередь, такая реализация накладывает одно ограничение на использование: все дополнительные страницы редактора должны быть объявлены ДО объявления основной страницы.
Приступим
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();
Послесловие
- генерировать формы;
- валидировать их (проверять введенные пользователем данные);
- выводить ошибки.
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 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | private function getLoginForm() { $translate = include(APP_DIR . DIRECTORY_SEPARATOR . 'translation.php'); $translator = new Zend_Translate_Adapter_Array($translate); $form = new Zend_Form(); $form->setAction('/auth/login') ->setMethod('post') ->setTranslator($translator); $form->addElements(array( new Zend_Form_Element_Text('email', array( 'required' => true, 'label' => 'Адрес e-mail:', 'description' => 'Е-меил используется в качестве логина для входа на сайт', 'validators' => array( array('NotEmpty', true), 'EmailAddress' ), 'decorators' => array( array('ViewHelper'), array('Errors'), array('HtmlTag', array('tag' => 'dd')), array('Label', array('tag' => 'dt','requiredSuffix' => ' (*)')), array('Description'), ) )), new Zend_Form_Element_Password('password',array( 'required' => true, 'label' => 'Пароль:', 'description' => 'Выберите себе пароль', 'validators' => array( array('NotEmpty', true), array('StringLength', true, array('min' => 6)), 'Alnum' ), 'decorators' => array( array('ViewHelper'), array('Errors'), array('HtmlTag', array('tag' => 'dd')), array('Label', array('tag' => 'dt','requiredSuffix' => ' (*)')), ) )), new Zend_Form_Element_Submit('Войти',array( 'decorators' => array( array('ViewHelper'), array('HtmlTag', array('tag' => 'center')), ) )) )); return $form; } private function getRegistrationForm() { $translate = include(APP_DIR . DIRECTORY_SEPARATOR . 'translation.php'); $translator = new Zend_Translate_Adapter_Array($translate); $form = new Zend_Form(); $form->setAction('/auth/registration') ->setMethod('post') ->setTranslator($translator); $form->addElements(array( new Zend_Form_Element_Text('email', array( 'required' => true, 'label' => 'Адрес e-mail:', 'description' => 'Е-меил используется в качестве логина для входа на сайт', 'validators' => array( array('NotEmpty', true), array(new My_Validate_Unique('users','email'), true), 'EmailAddress' ), 'decorators' => array( array('ViewHelper'), array('Errors'), array('HtmlTag', array('tag' => 'dd')), array('Label', array('tag' => 'dt','requiredSuffix' => ' (*)')), array('Description'), ) )), new Zend_Form_Element_Password('password',array( 'required' => true, 'label' => 'Пароль:', 'description' => 'Выберите себе пароль', 'validators' => array( array('NotEmpty', true), array('StringLength', true, array('min' => 6)), 'Alnum' ), 'decorators' => array( array('ViewHelper'), array('Errors'), array('HtmlTag', array('tag' => 'dd')), array('Label', array('tag' => 'dt','requiredSuffix' => ' (*)')), ) )), new Zend_Form_Element_Password('password_confirm',array( 'required' => true, 'label' => 'Повтор пароля', 'description' => 'Повторите ввод пароля', 'validators' => array( array(new My_Validate_Password(), true) ), 'decorators' => array( array('ViewHelper'), array('Errors'), array('HtmlTag', array('tag' => 'dd')), array('Label', array('tag' => 'dt','requiredSuffix' => ' (*)')), ) )), new Zend_Form_Element_Text('name', array( 'required' => false, 'label' => 'Ваше имя', 'validators' => array( 'Alnum' ), 'decorators' => array( array('ViewHelper'), array('Errors'), array('HtmlTag', array('tag' => 'dd')), array('Label', array('tag' => 'dt','requiredSuffix' => ' (*)')), ) )), new Zend_Form_Element_Submit('Зарегистрировать',array( 'decorators' => array( array('ViewHelper'), array('HtmlTag', array('tag' => 'center')), ) )) )); return $form; } |
![]()
Посмотрите, как выглядит действие registration:
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 | public function registrationAction() { // проверим, переданы скрипту данные по методу POST if (!$this->getRequest()->isPost()) { // если данные не переданы, просто передадим в скрипт вида форму return $this->view->form = $this->getRegistrationForm(); } else { $form = $this->getRegistrationForm(); // если данные переданы, проверим их на корректность if (!$form->isValid($_POST)) { // если данные не корректны, возвращаем форму в скрипт вида // Zend_Form сам отобразит сообщения об ошибках return $this->view->form = $form; } else { // если данные верны, сохраним их в БД /** @var Zend_Db_Adapter_Abstract */ $db = Zend_Registry::get('db'); if ($db->insert('users', array( 'name' => $_POST['name'], 'email' => $_POST['email'], 'passwd' => new Zend_Db_Expr("MD5('{$_POST['password']}')"), ))) { $this->view->success = true; } } } } |
1 | <?php echo $this->form; ?> |
1 | <?php echo $this->form->element; ?> |

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