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». Буду рад замечаниям и советам.

ссылка на оригинал статьи http://habrahabr.ru/post/216187/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *