Здравствуйте. Этой статьей я хочу презентовать свой модуль форм для фреймворка Kohana, который написал вдохновившись аналогичным модулем для Django.
Я не буду глубоко вдаваться в предыстории и размышления, а перейду сразу к делу. Сначала опишем недостатки:
Достоинства:
Подробности под катом.
Как пользоваться:
Создание формы
Имеющиеся типы полей
Как показать форму
Просто показать
Показать с стилями bootstrap
Создать модельную форму
Создать форму для определенной сущности в базе данных
Создать форму для определенного набора данных
Получить и сохранить модельную форму
Создать formset
Формсеты так же имплементируют Iterator, поэтому можно легко получить доступ к каждому элементу.
Вкратце это весь функционал реализованный на данный момент. Естественно есть недостатки как в плане чистоты кода, так и в некоторых других аспектах. И публикуя этот модуль здесь я надеюсь, что open source сообщество откликнется, и совместными усилиями наконец то получится сделать достойный модуль для работы с формами под фреймворк Kohana.
Весь код доступен на github — kohana-form, можно делать форки, слать пулреквесты и писать в «Issues». Буду рад замечаниям и советам.
Я не буду глубоко вдаваться в предыстории и размышления, а перейду сразу к делу. Сначала опишем недостатки:
- Модуль сырой. Это конечно же не значит что он ничего не умеет, и совершенно бесполезен, это значит лишь то что он требует масштабирования и небольшого рефакторинга. А так же работы над документацией.
- Насчет рефакторинга. Я искренне старался держать код в чистоте, и чаще всего у меня даже получалось это сделать, однако никто не идеален, и небольшому количеству мест не помешала бы работа напильником.
- Не хватает некоторого количества некритичного функционала.
Достоинства:
- Сохранилась распределенная структура которую можно наблюдать в 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». Буду рад замечаниям и советам.