bootstrap – Блог Stafox'a https://stafox.cc О программировании и веб-разработке Sun, 29 Nov 2015 09:37:59 +0000 en-US hourly 1 https://wordpress.org/?v=5.8.2 Zend Framework форма с использованием Bootstrap https://stafox.cc/zend-framework-form-using-bootstrap/ https://stafox.cc/zend-framework-form-using-bootstrap/#respond Wed, 26 Feb 2014 20:01:20 +0000 http://stafox.ru/?p=2226 Для того, чтобы показать как работают стандартные декораторы формы на примере, я решил реализовать вполне реальную задачу: стилизировать форму используя Bootstrap. Что такое Bootstrap? Если Вы еще не знаете, что такое Bootstrap, попробую объяснить в двух словах. Bootstrap – это простой и легко настраиваемый HTML, CSS и Javascript фреймворк для более быстрой и удобной Web-разработки.

Сообщение Zend Framework форма с использованием Bootstrap появились сначала на Блог Stafox'a.

]]>
Zend Framework форма с использованием Bootstrap
Для того, чтобы показать как работают стандартные декораторы формы на примере, я решил реализовать вполне реальную задачу: стилизировать форму используя Bootstrap.

Что такое Bootstrap?

Если Вы еще не знаете, что такое Bootstrap, попробую объяснить в двух словах. Bootstrap – это простой и легко настраиваемый HTML, CSS и Javascript фреймворк для более быстрой и удобной Web-разработки. Он содержит большое число компонентов, которые могут быть быть использованы почти в любом проекте. Bootstrap можно использовать как каркас для разработки фронтэнд части приложения. Подробнее читайте на официальном сайте Bootstrap.

Для начала создадим класс формы, в котором опишем основные элементы горизонтальной формы: поле ввода логина (email), поле ввода пароля, чекбокс Remember me и submit-кнопка.

[codegroup] [php tab=”Класс формы”] class Default_Form_Bootstrap extends Zend_Form
{

public function init()
{

$login = new Zend_Form_Element_Text(‘login’);
$login->setRequired(‘true’)
->setLabel(‘Email:’);

$password = new Zend_Form_Element_Password(‘password’);
$password->setRequired(‘true’)
->setLabel(‘Password:’);

$rememberMe = new Zend_Form_Element_Checkbox(‘remember_me’);
$rememberMe->setLabel(‘Remember me’);

$submit = new Zend_Form_Element_Submit(‘sign_in’);
$submit->setLabel(‘Sign In’);

$this->addElements(array($login, $password, $rememberMe, $submit));
}

}
[/php] [html tab=”Генерируемый контент”]

 
[/html] [/codegroup]

Теперь разберемся с формой. Избавимся от оборачивания содержимого формы в тег dl. Т.к. за это отвечает декоратор HtmlTag, необходимо отказаться от его использования. Поэтому зададим форме два декоратора FormElements и Form. А еще необходимо задать класс .form-horizontal форме и установить атрибут

role="form"

.

[codegroup] [php tab=”Класс формы”] class Default_Form_Bootstrap extends Zend_Form
{

public function init()
{
$this->setAttribs(array(‘class’ => ‘form-horizontal’, ‘role’ => ‘form’))
->setDecorators(array(‘FormElements’, ‘Form’));

$login = new Zend_Form_Element_Text(‘login’);
$login->setRequired(‘true’)
->setLabel(‘Email:’);

$password = new Zend_Form_Element_Password(‘password’);
$password->setRequired(‘true’)
->setLabel(‘Password:’);

$rememberMe = new Zend_Form_Element_Checkbox(‘remember_me’);
$rememberMe->setLabel(‘Remember me’);

$submit = new Zend_Form_Element_Submit(‘sign_in’);
$submit->setLabel(‘Sign In’);

$this->addElements(array($login, $password, $rememberMe, $submit));
}

}
[/php] [html tab=”Генерируемый контент”]


 
[/html] [/codegroup]

Зададим базовые декораторы, которые необходимы для всех элементов формы: ViewHelper и HtmlTag, причем как видно в примере, HtmlTag должен оборачивать контент в тег div с классом .form-group. Также, присвоим класс .form-control полям ввода.

[codegroup] [php tab=”Класс формы”] ‘div’, ‘class’ => ‘form-group’))
);

public function init()
{
$this->setAttribs(array(‘class’ => ‘form-horizontal’, ‘role’ => ‘form’))
->setDecorators(array(‘FormElements’, ‘Form’));

$login = new Zend_Form_Element_Text(‘login’);
$login->setRequired(‘true’)
->setAttrib(‘class’, ‘form-control’)
->setLabel(‘Email:’)
->setDecorators($this->baseElementDecorators);

$password = new Zend_Form_Element_Password(‘password’);
$password->setRequired(‘true’)
->setAttrib(‘class’, ‘form-control’)
->setLabel(‘Password:’)
->setDecorators($this->baseElementDecorators);

$rememberMe = new Zend_Form_Element_Checkbox(‘remember_me’);
$rememberMe->setLabel(‘Remember me’)
->setDecorators($this->baseElementDecorators);

$submit = new Zend_Form_Element_Submit(‘sign_in’);
$submit->setLabel(‘Sign In’)
->setDecorators($this->baseElementDecorators);

$this->addElements(array($login, $password, $rememberMe, $submit));
}

}
[/php] [html tab=”Генерируемый контент”]

[/html] [/codegroup]

Теперь оотбразим лэйблы для полей ввода. Для этого воспользуемся декоратором Label. Также сразу определим необходимые классы для него. Обратите внимание на теги, которые оборачивают поля ввода. Для того, чтобы добиться такого порядка вложенности тегов, необходимо последовательно применить декораторы: ViewHelper, Label, HtmlTag.

[codegroup] [php tab=”Класс формы”] ‘div’, ‘class’ => ‘form-group’)));
private $inputDecorators = array(
array(
‘Label’,
array(‘class’ => ‘col-sm-2 control-label’)
)
);

public function init()
{
$this->setAttribs(array(‘class’ => ‘form-horizontal’, ‘role’ => ‘form’))
->setDecorators(array(‘FormElements’, ‘Form’));

$login = new Zend_Form_Element_Text(‘login’);
$login->setRequired(‘true’)
->setAttrib(‘class’, ‘form-control’)
->setLabel(‘Email:’)
->setDecorators($this->baseElementDecorators)
->addDecorators($this->inputDecorators)
->addDecorators($this->htmlTagBaseDecorator);

$password = new Zend_Form_Element_Password(‘password’);
$password->setRequired(‘true’)
->setAttrib(‘class’, ‘form-control’)
->setLabel(‘Password:’)
->setDecorators($this->baseElementDecorators)
->addDecorators($this->inputDecorators)
->addDecorators($this->htmlTagBaseDecorator);

$rememberMe = new Zend_Form_Element_Checkbox(‘remember_me’);
$rememberMe->setLabel(‘Remember me’)
->setDecorators($this->baseElementDecorators)
->addDecorators($this->htmlTagBaseDecorator);

$submit = new Zend_Form_Element_Submit(‘sign_in’);
$submit->setLabel(‘Sign In’)
->setDecorators($this->baseElementDecorators)
->addDecorators($this->htmlTagBaseDecorator);

$this->addElements(array($login, $password, $rememberMe, $submit));
}

}
[/php] [html tab=”Генерируемый контент”]



[/html] [/codegroup]

Поля ввода необходимо отдельно обернуть в div c классом col-sm-10. Для этого необходимо применить декоратор HtmlTag. Т.к. HtmlTag оборачивает весь контент элемента, применим декоратор в тот момент, когда сгенерируется только контент
[html] [/html] т.е. после декоратора ViewHelper.

[codegroup] [php tab=”Класс формы”] class Default_Form_Bootstrap extends Zend_Form
{

private $baseElementDecorators = array(
‘ViewHelper’
);
private $htmlTagBaseDecorator = array(array(‘HtmlTag’, array(‘tag’ => ‘div’, ‘class’ => ‘form-group’)));
private $inputDecorators = array(
array(
array(‘data’ => ‘HtmlTag’), array(‘tag’ => ‘div’, ‘class’ => ‘col-sm-10’)
),
array(
‘Label’,
array(‘class’ => ‘col-sm-2 control-label’)
)
);

public function init()
{
$this->setAttribs(array(‘class’ => ‘form-horizontal’, ‘role’ => ‘form’))
->setDecorators(array(‘FormElements’, ‘Form’));

$login = new Zend_Form_Element_Text(‘login’);
$login->setRequired(‘true’)
->setAttrib(‘class’, ‘form-control’)
->setLabel(‘Email:’)
->setDecorators($this->baseElementDecorators)
->addDecorators($this->inputDecorators)
->addDecorators($this->htmlTagBaseDecorator);

$password = new Zend_Form_Element_Password(‘password’);
$password->setRequired(‘true’)
->setAttrib(‘class’, ‘form-control’)
->setLabel(‘Password:’)
->setDecorators($this->baseElementDecorators)
->addDecorators($this->inputDecorators)
->addDecorators($this->htmlTagBaseDecorator);

$rememberMe = new Zend_Form_Element_Checkbox(‘remember_me’);
$rememberMe->setLabel(‘Remember me’)
->setDecorators($this->baseElementDecorators)
->addDecorators($this->htmlTagBaseDecorator);

$submit = new Zend_Form_Element_Submit(‘sign_in’);
$submit->setLabel(‘Sign In’)
->setDecorators($this->baseElementDecorators)
->addDecorators($this->htmlTagBaseDecorator);

$this->addElements(array($login, $password, $rememberMe, $submit));
}

}
[/php] [html tab=”Генерируемый контент”]

[/html] [/codegroup]

Теперь займемся декорированием чекбокса. Т.к. поместить input внутри label не выйдет, придется заменить метод setLabel на setDescription и убрать оборачивание в тег описания, задав опцию tag=false. Оборачивания чекбокса добиваемся при помощи декоратора HtmlTag, у которого опция

tag="label"

. По аналогии с полями ввода, применяем еще два декоратора типа HtmlTag.

[codegroup] [php tab=”Класс формы”] class Default_Form_Bootstrap extends Zend_Form
{

private $baseElementDecorators = array(
‘ViewHelper’
);
private $htmlTagBaseDecorator = array(array(‘HtmlTag’, array(‘tag’ => ‘div’, ‘class’ => ‘form-group’)));
private $inputDecorators = array(
array(
array(‘data’ => ‘HtmlTag’), array(‘tag’ => ‘div’, ‘class’ => ‘col-sm-10’)
),
array(
‘Label’,
array(‘class’ => ‘col-sm-2 control-label’)
)
);

public function init()
{
$this->setAttribs(array(‘class’ => ‘form-horizontal’, ‘role’ => ‘form’))
->setDecorators(array(‘FormElements’, ‘Form’));

$login = new Zend_Form_Element_Text(‘login’);
$login->setRequired(‘true’)
->setAttrib(‘class’, ‘form-control’)
->setLabel(‘Email:’)
->setDecorators($this->baseElementDecorators)
->addDecorators($this->inputDecorators)
->addDecorators($this->htmlTagBaseDecorator);

$password = new Zend_Form_Element_Password(‘password’);
$password->setRequired(‘true’)
->setAttrib(‘class’, ‘form-control’)
->setLabel(‘Password:’)
->setDecorators($this->baseElementDecorators)
->addDecorators($this->inputDecorators)
->addDecorators($this->htmlTagBaseDecorator);

$rememberMe = new Zend_Form_Element_Checkbox(‘remember_me’);
$rememberMe->setDescription(‘Remember me’)
->setDecorators($this->baseElementDecorators)
->addDecorators(array(
array(‘Description’, array(‘tag’ => false)),
array(array(‘Input’ => ‘HtmlTag’), array(‘tag’ => ‘label’)),
array(array(‘Checkbox’ => ‘HtmlTag’), array(‘tag’ => ‘div’, ‘class’ => ‘checkbox’)),
array(array(‘Data’ => ‘HtmlTag’), array(‘tag’ => ‘div’, ‘class’ => ‘col-sm-offset-2 col-sm-10’))
))
->addDecorators($this->htmlTagBaseDecorator);

$submit = new Zend_Form_Element_Submit(‘sign_in’);
$submit->setLabel(‘Sign In’)
->setDecorators($this->baseElementDecorators)
->addDecorators($this->htmlTagBaseDecorator);

$this->addElements(array($login, $password, $rememberMe, $submit));
}

}
[/php] [html tab=”Генерируемый контент”]

[/html] [/codegroup]

Ну, и остается последний штрих – кнопка. Добавляем ей класс, а также применяем два декоратора HtmlTag, чтобы обернуть кнопку в div‘ы.

[codegroup] [php tab=”Класс формы”] class Default_Form_Bootstrap extends Zend_Form
{

private $baseElementDecorators = array(
‘ViewHelper’
);
private $htmlTagBaseDecorator = array(array(‘HtmlTag’, array(‘tag’ => ‘div’, ‘class’ => ‘form-group’)));
private $inputDecorators = array(
array(
array(‘data’ => ‘HtmlTag’), array(‘tag’ => ‘div’, ‘class’ => ‘col-sm-10’)
),
array(
‘Label’,
array(‘class’ => ‘col-sm-2 control-label’)
)
);

public function init()
{
$this->setAttribs(array(‘class’ => ‘form-horizontal’, ‘role’ => ‘form’))
->setDecorators(array(‘FormElements’, ‘Form’));

$login = new Zend_Form_Element_Text(‘login’);
$login->setRequired(‘true’)
->setAttrib(‘class’, ‘form-control’)
->setLabel(‘Email:’)
->setDecorators($this->baseElementDecorators)
->addDecorators($this->inputDecorators)
->addDecorators($this->htmlTagBaseDecorator);

$password = new Zend_Form_Element_Password(‘password’);
$password->setRequired(‘true’)
->setAttrib(‘class’, ‘form-control’)
->setLabel(‘Password:’)
->setDecorators($this->baseElementDecorators)
->addDecorators($this->inputDecorators)
->addDecorators($this->htmlTagBaseDecorator);

$rememberMe = new Zend_Form_Element_Checkbox(‘remember_me’);
$rememberMe->setDescription(‘Remember me’)
->setDecorators($this->baseElementDecorators)
->addDecorators(array(
array(‘Description’, array(‘tag’ => false)),
array(array(‘Input’ => ‘HtmlTag’), array(‘tag’ => ‘label’)),
array(array(‘Checkbox’ => ‘HtmlTag’), array(‘tag’ => ‘div’, ‘class’ => ‘checkbox’)),
array(array(‘Data’ => ‘HtmlTag’), array(‘tag’ => ‘div’, ‘class’ => ‘col-sm-offset-2 col-sm-10’))
))
->addDecorators($this->htmlTagBaseDecorator);

$submit = new Zend_Form_Element_Submit(‘sign_in’);
$submit->setLabel(‘Sign In’)
->setAttrib(‘class’, ‘btn btn-default’)
->setDecorators($this->baseElementDecorators)
->addDecorator(array(‘Button’ => ‘HtmlTag’), array(‘tag’ => ‘div’, ‘class’ => ‘col-sm-offset-2 col-sm-10’))
->addDecorators($this->htmlTagBaseDecorator);

$this->addElements(array($login, $password, $rememberMe, $submit));
}

}
[/php] [html tab=”Генерируемый контент”]

[/html] [/codegroup]

А вот и результат.
bootstrap-zend-form
По желанию добавляем недостающие атрибуты (id, placeholder и прочие параметры) и на этом все.

Сообщение Zend Framework форма с использованием Bootstrap появились сначала на Блог Stafox'a.

]]>
https://stafox.cc/zend-framework-form-using-bootstrap/feed/ 0
Zend Framework: где хранить свои классы? https://stafox.cc/zend-framework-gde-hranit-svoi-klassyi/ https://stafox.cc/zend-framework-gde-hranit-svoi-klassyi/#comments Sat, 12 Jan 2013 12:50:44 +0000 http://stafox.ru/?p=1734 При разработке своего веб-приложения, Вам наверняка приходилось использовать свои классы. И Вы, скорее всего, уже задавались вопросом “Где же их хранить?”, ну а если это и не так, то в ближайшее время Вас наверняка постигнет этот вопрос. Можно их конечно положить в controllers и все будет работать, но это как-то не эстетично. Рыба должна лежать

Сообщение Zend Framework: где хранить свои классы? появились сначала на Блог Stafox'a.

]]>
Zend Framework
При разработке своего веб-приложения, Вам наверняка приходилось использовать свои классы. И Вы, скорее всего, уже задавались вопросом “Где же их хранить?”, ну а если это и не так, то в ближайшее время Вас наверняка постигнет этот вопрос. Можно их конечно положить в controllers и все будет работать, но это как-то не эстетично. Рыба должна лежать отдельно от мяса 🙂

Поэтому я решил хранить их в отдельной директории classes. Ну а для того, чтобы Zend Framework самостоятельно подгрузил наши классы, нужно добавить в Bootstrap.php следующий код.
[php] protected function _initAutoload() {
$this->bootstrap("frontController");
$front = $this->frontController;

$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);

$modules = $front->getControllerDirectory();
$default = $front->getDefaultModule();

foreach (array_keys($modules) as $module) {
if ($module === $default) {
continue;
}
}
$autoloader->pushAutoloader(new Zend_Application_Module_Autoloader(array(
"namespace" => ucwords($module),
"basePath" => $front->getModuleDirectory($module),
)));
$loader = new Zend_Loader_Autoloader_Resource(array(
‘namespace’ => ”,
‘basePath’ => $front->getModuleDirectory($module),
));
$loader->addResourceType(‘classes_type’, ‘classes’, $module.’_Class’);
return $autoloader;
}
[/php]

Хочу обратить ваше внимание на строку
[php]$loader->addResourceType(‘classes_type’, ‘classes’, $module.’_Class’);[/php] Первый аргумент указывает тип Ваших классов.
Второй аргумент – имя директории, в которой они будут располагаться.
Третий – префикс имени класса.

Таким образом Вы подгрузите все классы для текущего модуля.
Ну и небольшой пример класса:
[php title=”application/modules/default/classes/Geo.php”] <?php
class Default_Class_Geo
{
private $radius;
private $coordinatesType;

public function __construct() {
//…
}
public function convertCoordinates($point, $from, $to) {
//…
}
}
[/php]

Если Вам нужна уникальная программа программа под ваши нужды, Вы можете заказать программу у профессионалов, эти ребята знают свое дело: сделают все качественно и в кратчайшие строки.

Сообщение Zend Framework: где хранить свои классы? появились сначала на Блог Stafox'a.

]]>
https://stafox.cc/zend-framework-gde-hranit-svoi-klassyi/feed/ 4
Zend Framework: проблема с моделями. https://stafox.cc/zend-framework-problema-s-modelyami/ https://stafox.cc/zend-framework-problema-s-modelyami/#comments Thu, 03 Jan 2013 19:33:25 +0000 http://stafox.ru/?p=1717 Недавно столкнулся со следующей проблемой: при создании объекта класса модели или вызове методов описанных в модели возникала ошибка, которая полностью роняла приложение на пол. Причина этого явления была в том, что конструктор не мог создать объект класса. [php] $userModel = new Default_Model_User(); $userModel->getUserByName($name); [/php] Если Вы используете модули (module) и ваше приложение имеет схожую структуру

Сообщение Zend Framework: проблема с моделями. появились сначала на Блог Stafox'a.

]]>
Zend Framework: проблемы с моделями
Недавно столкнулся со следующей проблемой: при создании объекта класса модели или вызове методов описанных в модели возникала ошибка, которая полностью роняла приложение на пол.

Причина этого явления была в том, что конструктор не мог создать объект класса.
[php] $userModel = new Default_Model_User();
$userModel->getUserByName($name);
[/php] Если Вы используете модули (module) и ваше приложение имеет схожую структуру
[raw] application/
configs/
application.ini
layouts/
modules/
default/
controllers/
models/
views/
Bootstrap.php
Bootstrap.php
library/
public/
tests/
[/raw]

Тогда достаточно добавить в Bootstrap.php следующий код.
[php] protected function _initAutoload() {
$this->bootstrap("frontController");
$front = $this->frontController;

$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);

$modules = $front->getControllerDirectory();
$default = $front->getDefaultModule();

foreach (array_keys($modules) as $module) {
if ($module === $default) {
continue;
}
}
$autoloader->pushAutoloader(new Zend_Application_Module_Autoloader(array(
"namespace" => ucwords($module),
"basePath" => $front->getModuleDirectory($module),
)));
return $autoloader;
}
[/php]

Сообщение Zend Framework: проблема с моделями. появились сначала на Блог Stafox'a.

]]>
https://stafox.cc/zend-framework-problema-s-modelyami/feed/ 11