понедельник, 10 декабря 2012 г.

Sprig. Начало, обо всем по немногу

Введение 

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. Большой выбор типов полей:
  1. Sprig_Field_Auto
  2. Sprig_Field_Belongsto
  3. Sprig_Field_Boolean
  4. Sprig_Field_Char
  5. Sprig_Field_Country
  6. Sprig_Field_Email
  7. Sprig_Field_Enum
  8. Sprig_Field_Float
  9. Sprig_Field_Hasmany
  10. Sprig_Field_Hasone
  11. Sprig_Field_Integer
  12. Sprig_Field_Manytomany
  13. Sprig_Field_Password
  14. Sprig_Field_Text
  15. Sprig_Field_Timestamp
В общем есть из чего выбрать...
P.S. В следующих постах будет про создание загрузчиков картинок и файлов, чтобы навсегда избавиться от мороки с картинками :)

Комментариев нет:

Отправить комментарий