Создаем форму в «Zend Framwork»

Создаем форму в «Zend Framwork»

Формирование

Здравствуйте, уважаемые читатели!

На этом уроке мы с вами научимся распознавать дату рождения пользователя с помощью «Zend_Form». Информация, которая вам пригодится находится здесь: codecaine.co.za/posts/compound-elements-with-zend-form

На этом уроке мы с вами научимся распознавать дату рождения пользователя с помощью «Zend_Form». Информация, которая вам пригодится находится здесь: codecaine.co.za/posts/compound-elements-with-zend-form

Попробуем создать нечто подобное, изображенное на этой картинке:

Элемент формы

Давайте напишем PHP-код и тем самым создадим части элемента и помощника вида:

<?php

class Application_Form_Details extends Zend_Form
{
public function init()
{
$this->addPrefixPath('App_Form', 'App/Form/');

// other elements before

$this->addElement('date', 'date_of_birth', array(
'label' => 'Date of birth:'
));

// other elements after

$this->addElement('submit', 'Go');
}
}

Нашу форму можете поместить в папку application/forms/Detail.php. Добавленный нами вызов addPrefixPath сообщает форме наши доп. элементы, находящиеся в папке library/App/Form.

А теперь «познакомимся» с файлом формы Date (library/App/Form/Element/Date.php).

class App_Form_Element_Date extends Zend_Form_Element_Xhtml
{
public $helper = 'formDate';

public function isValid ($value, $context = null)
{
if (is_array($value)) {
$value = $value['year'] . '-' .
$value['month'] . '-' .
$value['day'];

if($value == '--') {
$value = null;
}
}

return parent::isValid($value, $context);
}

public function getValue()
{
if(is_array($this->_value)) {
$value = $this->_value['year'] . '-' .
$this->_value['month'] . '-' .
$this->_value['day'];

if($value == '--') {
$value = null;
}
$this->setValue($value);
}

return parent::getValue();
}

}

На первый взгляд кажется, что здесь много непонятного. Давайте разберемся. Сначала мы определяем имя помощника для показа. Данный элемент содержит три «выборки»: день, месяц, год. Соответственно, для них нужно создать массивы.

Теперь нам нужен код для отображения нашего элемента. Код помещаем сюда library/App/View/Helpers/FormDate.php и добавляем соответствующую строку в application.ini:

autoloadernamespaces[] = "App_"
resources.view.helperPath.App_View_Helper = "App/View/Helper"

formDate (помощник вида) примет следующий вид:

<?php

class App_View_Helper_FormDate extends Zend_View_Helper_FormElement
{
public function formDate ($name, $value = null, $attribs = null)
{
$day = '';
$month = '';
$year = '';
if (is_array($value)) {
$day = $value['day'];
$month = $value['month'];
$year = $value['year'];
} elseif (strtotime($value)) {
list($year, $month, $day) = explode('-', date('Y-m-d', strtotime($value)));
}

$dayAttribs = isset($attribs['dayAttribs']) ? $attribs['dayAttribs'] : array();
$monthAttribs = isset($attribs['monthAttribs']) ? $attribs['monthAttribs'] : array();
$yearAttribs = isset($attribs['yearAttribs']) ? $attribs['yearAttribs'] : array();

$dayMultiOptions = array('' => '');
for ($i = 1; $i < 32; $i ++)
{
$index = str_pad($i, 2, '0', STR_PAD_LEFT);
$dayMultiOptions[$index] = str_pad($i, 2, '0', STR_PAD_LEFT);
}
$monthMultiOptions = array('' => '');
for ($i = 1; $i < 13; $i ++)
{
$index = str_pad($i, 2, '0', STR_PAD_LEFT);
$monthMultiOptions[$index] = date('F', mktime(null, null, null, $i, 01));
}

$startYear = date('Y');
if (isset($attribs['startYear'])) {
$startYear = $attribs['startYear'];
unset($attribs['startYear']);
}

$stopYear = $startYear + 10;
if (isset($attribs['stopYear'])) {
$stopYear = $attribs['stopYear'];
unset($attribs['stopYear']);
}

$yearMultiOptions = array('' => '');

if ($stopYear < $startYear) {
for ($i = $startYear; $i >= $stopYear; $i--) {
$yearMultiOptions[$i] = $i;
}
} else {
for ($i = $startYear; $i <= $stopYear; $i++) {
$yearMultiOptions[$i] = $i;
}
}

// возвращает 3 селекта, разделённых  
return
$this->view->formSelect(
$name . '[day]',
$day,
$dayAttribs,
$dayMultiOptions) . ' ' .
$this->view->formSelect(
$name . '[month]',
$month,
$monthAttribs,
$monthMultiOptions) . ' ' .
$this->view->formSelect(
$name . '[year]',
$year,
$yearAttribs,
$yearMultiOptions
);
}
}

Несмотря на большой размер, надеюсь, вы разобрались в коде formDate. На данном уроке нам пришлось поработать с массивами и настроить «выборки». Полученный опыт поможет вам с легкостью создавать свои собственные формы.

Дискуссия по теме