Введение
Sprig - это ORM библиотека, написанная под вдохновением моделей в django. Здесь вы не найдете подробной документации по библиотеке, на самом деле ее просто нет, есть только немногочисленные написанные статьи. Хотя и справки по ней действительно мало, но тем не менее, я считаю ее новой ступенью, которая избавляет от многообразной рутинной работы.Sprig и ORM
Самое большое отличие от ORM - это то что каждое поле в sprig представлено СВОИМ классом, напобобие, как в базе данных. Например для текстового поля есть класс Sprig_Field_Char, который умеет сохранять текстовые поля, Sprig_Field_Integer - для числовых данных. Единственная проблема, это описывать эти поля и не забывать их синхронизировать при разработке(советую использовать модуль console). И еще не маловажное преимущество перед обычной ORM, каждый класс знает как себя отобразить. Например для текстового поля(Sprig_Field_Char) это будет обычный input, а для перечисления (Sprig_Field_Enum) - соответственно select. Это дает возможность создатьва свои типы полей со своими обработчиками.Преимущества
После 4-х месяцев использования я могу сказать, что набил много шишек на Sprig, и понял, что используемый подход очень правильный. Дальше будут идти преимущества с небольшими кусками кода, для подтверждения.1. Каждому полю свой класс. Благодаря ему можно автоматизировать формы, вывод данных в админке и очень многое другое.
Например привер модели и ее вывод:
defined('SYSPATH') or die('No direct script access.');
class Model_Content extends Sprig
{
protected $_title_key = 'title';
protected $_sorting = array('created'=>'desc');
protected function _init()
{
$this->_fields += array(
'id' => new Sprig_Field_Auto,
'title' => new Sprig_Field_Char(array(
'empty' => FALSE,
'max_length' => 255,
'label' => 'Заголовок',
)),
'url' => new Sprig_Field_Url(array(
'unique' => TRUE,
'empty' => FALSE,
'max_length' => 255,
'label' => 'ЧПУ',
)),
'content' => new Sprig_Field_Wysiwyg(array(
'empty' => TRUE,
'label' => 'Контент',
)),
'meta_keywords' => new Sprig_Field_Char(array(
'max_length' => 255,
'empty' => TRUE,
'label' => 'META Keywords',
)),
'meta_description' => new Sprig_Field_Char(array(
'max_length' => 255,
'empty' => TRUE,
'label' => 'META Description',
)),
'created' => new Sprig_Field_Date(array(
'format' => 'Y-m-d',
'label' => 'Дата создания',
'default' => time(),
)),
'published' => new Sprig_Field_Boolean(array(
'label' => 'Опубликован',
'default' => TRUE,
)),
);
}
} // End Model_Content
А это вывод модели content, причем такой код может использоваться для любой модели:
foreach ($content->fields() as $column=>$field):?>
text::alternate('odd', 'even')?>">
$field->empty ? '' : 'obli'?>">$field->label($column)?>
$field->input($column, $form[$column], array('class'=>'textField'))?>
endforeach ?>
2. Отсутствие count_last_query. Функция count_last_query генерит
очень не оптимальный sql, с помощью sprig и pagination это можно
упростить:$db = DB::select(); // любые какие захотим условия и фильтры $query = array( 'phrase' => arr::get($_GET, 'phrase', ''), 'visible' => arr::get($_GET, 'visible', 0), ); if ($query['phrase']) $db->where_open() ->where('content', 'LIKE', '%'.$query['phrase'].'%') ->or_where('title', 'LIKE', '%'.$query['phrase'].'%') ->where_close(); if ($query['visible']) $db->where('published', '=', ($query['visible'] == 1 ? TRUE : FALSE)); // создаем модель $content = Sprig::factory('content'); // считаем сколько записей удов. фильтру $count = $content->count(clone $db); // строим пейджер $pagination = new Pagination(array( 'items_per_page' => 10, 'total_items' => $count, 'view' => 'pager', 'current_page' => array('source' => 'query_string', 'key' => 'page'), )); // по пейджеру загружаем нужное кол-во записей со смещением $contents = $content->load($db->offset($pagination->offset), $pagination->items_per_page);3. Простая валидация:
$content = Sprig::factory('content'); // если редактируется конкретная статья, то предварительно загружаем её if ($id) $content->load(DB::select()->where('id', '=', $id)); $form = $content->as_array(); $errors = array(); if ($_POST) { $content->values($_POST); try { if ($content->loaded()) $content->update(); else $content->create(); $this->request->redirect('admin/content'); } catch (Validate_Exception $e) { $errors = $e->array->errors('validate'); $form = array_merge($form, $content->as_array()); } }4. Большой выбор типов полей:
- Sprig_Field_Auto
- Sprig_Field_Belongsto
- Sprig_Field_Boolean
- Sprig_Field_Char
- Sprig_Field_Country
- Sprig_Field_Email
- Sprig_Field_Enum
- Sprig_Field_Float
- Sprig_Field_Hasmany
- Sprig_Field_Hasone
- Sprig_Field_Integer
- Sprig_Field_Manytomany
- Sprig_Field_Password
- Sprig_Field_Text
- Sprig_Field_Timestamp
P.S. В следующих постах будет про создание загрузчиков картинок и файлов, чтобы навсегда избавиться от мороки с картинками :)
Комментариев нет:
Отправить комментарий