Регистрация Главная Сообщество
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Ответ
 
Опции темы
Старый 11.06.2011, 20:53   #1
Заблокирован
 Разведчик
Аватар для Я убью:Frost:DD
 
Я убью:Frost:DD на правильном пути
Регистрация: 06.06.2011
Сообщений: 20
Популярность: 74
Сказал(а) спасибо: 65
Поблагодарили 32 раз(а) в 22 сообщениях
 
По умолчанию Создание собственного элемента формы в Zend Framwork

Недавно у меня возникла необходимость получить дату рождения пользователя используя Zend_Form. Для этого мне необходимо было создать свой собственный элемент.

Идея была в том, чтобы создать что-то подобное:



После небольшого поиска я нашёл следующую информацию, которая мне очень помогла.

Для удобства я решил создать свой собственный элемент Zend Form, который будет использовать встроенные элементы формы. Далее создаём объект элемента и объект помощника вида. Использование:01 <?php
02
03 class Application_Form_Details extends Zend_Form
04 {
05 public function init()
06 {
07 $this->addPrefixPath('App_Form', 'App/Form/');
08
09 // other elements before
10
11 $this->addElement('date', 'date_of_birth', array(
12 'label' => 'Date of birth:'
13 ));
14
15 // other elements after
16
17 $this->addElement('submit', 'Go');
18 }
19 }


В моём случае данная форма расположена в application/forms/Detail.php и отображена в скрипте вида. При определении формы, мы создали элемент 'date'. Благодаря добавлению вызова addPrefixPath мы сообщаем форме, что у нас есть ещё дополнительные элементы (наши собственные), которые расположены в library/App/Form.

Файлы формы расположены в library/App/Form/Element/Date.php. Элемет Date выглядит следующим образом:01 // Основано на
02 // [Ссылки могут видеть только зарегистрированные пользователи. ]
03 class App_Form_Element_Date extends Zend_Form_Element_Xhtml
04 {
05 public $helper = 'formDate';
06
07 public function isValid ($value, $context = null)
08 {
09 if (is_array($value)) {
10 $value = $value['year'] . '-' .
11 $value['month'] . '-' .
12 $value['day'];
13
14 if($value == '--') {
15 $value = null;
16 }
17 }
18
19 return parent::isValid($value, $context);
20 }
21
22 public function getValue()
23 {
24 if(is_array($this->_value)) {
25 $value = $this->_value['year'] . '-' .
26 $this->_value['month'] . '-' .
27 $this->_value['day'];
28
29 if($value == '--') {
30 $value = null;
31 }
32 $this->setValue($value);
33 }
34
35 return parent::getValue();
36 }
37
38 }


Тут мы много чего наворотили. В первую очередь мы определили имя помощника вида. Так же мы знаем, что этот элемент будет содержать три селект бокса, так что для их значений, нам лучше создать массивы для дня, месяца и года. В результате, нам необходимо переопределить метод isValid() для обеспечения валидации элемента. Так же необходимо переопределить метод getValue(), который будет возвращать строку.

Для элемента у нас всё готово. Теперь нам необходимо создать помощник вида для того, чтобы отобразить элемент. Расположим его в library/App/View/Helpers/FormDate.php и зарегестрируем его в application.ini:1 autoloadernamespaces[] = "App_"
2 resources.view.helperPath.App_View_Helper = "App/View/Helper"


Помощник вида formDate будет выглядеть следующим образом:
view source

print
?01 <?php
02
03 // основано на
04 // [Ссылки могут видеть только зарегистрированные пользователи. ]
05
06 class App_View_Helper_FormDate extends Zend_View_Helper_FormElement
07 {
08 public function formDate ($name, $value = null, $attribs = null)
09 {
10 $day = '';
11 $month = '';
12 $year = '';
13 if (is_array($value)) {
14 $day = $value['day'];
15 $month = $value['month'];
16 $year = $value['year'];
17 } elseif (strtotime($value)) {
18 list($year, $month, $day) = explode('-', date('Y-m-d', strtotime($value)));
19 }
20
21 $dayAttribs = isset($attribs['dayAttribs']) ? $attribs['dayAttribs'] : array();
22 $monthAttribs = isset($attribs['monthAttribs']) ? $attribs['monthAttribs'] : array();
23 $yearAttribs = isset($attribs['yearAttribs']) ? $attribs['yearAttribs'] : array();
24
25 $dayMultiOptions = array('' => '');
26 for ($i = 1; $i < 32; $i ++)
27 {
28 $index = str_pad($i, 2, '0', STR_PAD_LEFT);
29 $dayMultiOptions[$index] = str_pad($i, 2, '0', STR_PAD_LEFT);
30 }
31 $monthMultiOptions = array('' => '');
32 for ($i = 1; $i < 13; $i ++)
33 {
34 $index = str_pad($i, 2, '0', STR_PAD_LEFT);
35 $monthMultiOptions[$index] = date('F', mktime(null, null, null, $i, 01));
36 }
37
38 $startYear = date('Y');
39 if (isset($attribs['startYear'])) {
40 $startYear = $attribs['startYear'];
41 unset($attribs['startYear']);
42 }
43
44 $stopYear = $startYear + 10;
45 if (isset($attribs['stopYear'])) {
46 $stopYear = $attribs['stopYear'];
47 unset($attribs['stopYear']);
48 }
49
50 $yearMultiOptions = array('' => '');
51
52 if ($stopYear < $startYear) {
53 for ($i = $startYear; $i >= $stopYear; $i--) {
54 $yearMultiOptions[$i] = $i;
55 }
56 } else {
57 for ($i = $startYear; $i <= $stopYear; $i++) {
58 $yearMultiOptions[$i] = $i;
59 }
60 }
61
62 // возвращает 3 селекта, разделённых
63 return
64 $this->view->formSelect(
65 $name . '[day]',
66 $day,
67 $dayAttribs,
68 $dayMultiOptions) . ' ' .
69 $this->view->formSelect(
70 $name . '[month]',
71 $month,
72 $monthAttribs,
73 $monthMultiOptions) . ' ' .
74 $this->view->formSelect(
75 $name . '[year]',
76 $year,
77 $yearAttribs,
78 $yearMultiOptions
79 );
80 }
81 }


Да.. это конечно немалый кусок кода, но я надеюсь, что он вам понятен. Мы провели много операций для настройки трёх селект боксов; для дня, месяца и года. Я предпочёл использовать имена месяцев, но их быстро можно исправить на номера. Так же вам необходимо определить начальный и конечный год.

На этом всё. Для того, чтобы создать свой элемент Zend_Form вам понадобилось два отдельных файла. Так что теперь перед вами нет преград в том, чтобы создавать свои собственные элементы форм для Zend Framework.
  Ответить с цитированием
Пользователь сказал cпасибо:
ПодпольщикPB (12.06.2011)
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Статья] Создание логин-бара без замены формы Mephistopheles Тюнинг клиента Cross Fire 11 22.06.2011 16:12
[Пакеты] Щит у элемента и закла seerega Баги и читы для Aion 8 17.03.2011 04:34
Создание собственного моба malixa123 Perfect World 1 19.01.2011 22:02
Создание собственного рецепта FFForever Lineage 2 0 17.03.2009 17:56

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 16:02.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net