Я не буду глубоко вдаваться в предыстории и размышления, а перейду сразу к делу. Сначала опишем недостатки:
- Модуль сырой. Это конечно же не значит что он ничего не умеет, и совершенно бесполезен, это значит лишь то что он требует масштабирования и небольшого рефакторинга. А так же работы над документацией.
- Насчет рефакторинга. Я искренне старался держать код в чистоте, и чаще всего у меня даже получалось это сделать, однако никто не идеален, и небольшому количеству мест не помешала бы работа напильником.
- Не хватает некоторого количества некритичного функционала.
Достоинства:
- Сохранилась распределенная структура которую можно наблюдать в 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 ), ); } }
Имеющиеся типы полей
- 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». Буду рад замечаниям и советам.
ссылка на оригинал статьи http://habrahabr.ru/post/216187/
Добавить комментарий