...

вторник, 18 марта 2014 г.

[Из песочницы] Kohana-form: модуль менеджмента и генерации форм

Здравствуйте. Этой статьей я хочу презентовать свой модуль форм для фреймворка Kohana, который написал вдохновившись аналогичным модулем для Django.

Я не буду глубоко вдаваться в предыстории и размышления, а перейду сразу к делу. Сначала опишем недостатки:



  • Модуль сырой. Это конечно же не значит что он ничего не умеет, и совершенно бесполезен, это значит лишь то что он требует масштабирования и небольшого рефакторинга. А так же работы над документацией.

  • Насчет рефакторинга. Я искренне старался держать код в чистоте, и чаще всего у меня даже получалось это сделать, однако никто не идеален, и небольшому количеству мест не помешала бы работа напильником.

  • Не хватает некоторого количества некритичного функционала.




Достоинства:

  • Сохранилась распределенная структура которую можно наблюдать в django forms. Форма состоит из экземпляров класса Field, которые в свою очередь связаны с классом Widget. Благодаря этому открываются богатые возможности для кастомизации.

  • Автоматическая генерация форм из ORM моделей с валидацией данных и автоматическим сохранением данных из POST.

  • Каждый виджет — это дефолтные кохановские view, что позволяет без особых проблем создавать новые темы для виджетов или быстро корректировать имеющиеся. И для этого не потребуется лезть в исходные коды самого модуля.


Подробности под катом.


Как пользоваться:


Создание формы



<?php
defined('SYSPATH') OR die('No direct access allowed.');

class Form_Login extends Form
{
public static function meta()
{
return array(
"fields" => array(
"login" => Field::factory("Varchar"),
"password" => Field::factory("Password"),
),

"options" => array( // заполняется по желанию. может быть пустым массивом.
"valid_messages_file" => "login", // файл в котором лежат сообщения валидации, должен находиться в папке messages
"theme" => "base" // тема формы. base - тема по умолчанию, из коробки есть 2 темы: base, nolabels. nolabels это таже тема base только без тегов label
),
);
}
}


Имеющиеся типы полей



  • Email

  • Hidden

  • Image

  • Int

  • Password

  • Text

  • Timestamp

  • Varchar

  • Int Unsigned


Как показать форму


Просто показать



<form>
<?php echo $form; ?>
<input type="submit" value="Add"/>
</form>


Показать с стилями bootstrap



<form method="POST" role="form">
<?php foreach ($form as $field): ?>
<div class="form-group">
<?php $field->css_class(array("form-control")); ?>
<?php foreach ($field->errors() as $error): ?>
<div class="alert alert-danger">
<?php echo $error; ?>
</div>
<?php endforeach; ?>
<?php echo $field; ?>
</div>
<? endforeach; ?>
<input type="submit" class="btn btn-primary" value="Add"/>
</form>


Создать модельную форму



class Form_Article extends ModelForm
{

public static function meta()
{
return array(
"fields" => array( //необязательно для заполнения. используется для переопределения полей, если это требуется.
"image" => Field::factory("Image")
),
"options" => array(
"model" => ORM::factory("Article"), //собственно модель из которой будем генерить форму
"display_fields" => array("title", "body", "image"), //отображаемые поля
"valid_messages_file" => "news", //используемый файл для сообщений валидации
"except_fields" => array() //какие поля скрыть и не показывать
),
);
}
}


Создать форму для определенной сущности в базе данных



Form::factory("Article", array(), $id);


Создать форму для определенного набора данных



Form::factory("Article", array("title" => "Hello, Habr!"));


Получить и сохранить модельную форму



public function action_add()
{
if ($this->request->method() == "POST") {

$form = Form::factory("Article", $this->request->post());

$form->add_field(
Field::factory("Hidden")
->name("user")
->value(Auth::instance()
->get_user())
);
if ($form->validate())
$form->save();
}
}


Создать formset



<?php
defined('SYSPATH') OR die('No direct access allowed.');

class Formset_News extends Formset
{

public static function meta()
{
return array(
"base_form" => "News",
"theme" => "bootstrap"
);
}
}


Формсеты так же имплементируют Iterator, поэтому можно легко получить доступ к каждому элементу.


Вкратце это весь функционал реализованный на данный момент. Естественно есть недостатки как в плане чистоты кода, так и в некоторых других аспектах. И публикуя этот модуль здесь я надеюсь, что open source сообщество откликнется, и совместными усилиями наконец то получится сделать достойный модуль для работы с формами под фреймворк Kohana.


Весь код доступен на github — kohana-form, можно делать форки, слать пулреквесты и писать в «Issues». Буду рад замечаниям и советам.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий