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

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 6

    0
    А такой видели? github.com/bmidget/kohana-formo
      0
      Конечно. Даже пытался пользоваться, но многие моменты меня не устроили и я таки сел писать свой.

      Простая мелочь которая меня оттолкнула от этого модуля — сгенерировав форму из модели, на месте поля с типом DateTime я увидел простой input, хотя логичнее было бы увидеть там datepicker.

      В общем kohana-formo безусловно прекрасный модуль, но мне он к сожалению не подошел.
        0
        Я так понимаю такой модуль форм удобно использовать в админке.
          0
          На самом деле да. Изначальная цель — повторить панель администрирования из джанго, но в ней практически 80% работы выполняет именно модуль форм, поэтому я решил пока сконцентрироваться на основном.
    • UFO just landed and posted this here
        0
        Над этим ведется работа. Уже готово поле Belongs To, связь подгружается через select. Работаю над has many.

      Only users with full accounts can post comments. Log in, please.