Молниеносная разработка с grocery CRUD

Молниеносная разработка с grocery CRUD

Если для разработки сайтов используется фреймворк CodeIgniter, то стоит обратить внимание на библиотеку grocery CRUD. Из названия понятно, что она реализует стандартные операции создания-чтения-редактирования-удаления записей БД.
Главная ценность grocery CRUD в том, что с ее помощью можно очень быстро, буквально за считанные минуты собрать удобную админку для сайта средней сложности. Причем, рутиные операции редактирования записей она полностью берет на себя. В том числе настройку выпадающего календарика на поле выбора даты, закачку картинок, валидацию данных.
Вам остается только спроектировать таблицу и привязать к ней библиотеку.

Официально заявленный список возможностей grocery CRUD выглядит так:

  • разбивка списка записей на страницы, сортировка, поиск по списку записей (все функции реализованы на ajax)
  • автоматическая генерация полей input в соответствии с типом поля БД
  • при необходимости, переопределение типов полей
  • реализация зависимостей 1-1, 1-n и n-n всего одной строкой кода
  • быстрый выбор тем оформления (сейчас их реализовано две: datatables и flexigrid)
  • валидация вводимых значений на стороне клиента и на стороне сервера, согласно заданным правилам валидации
  • гибкий выбор полей, которые будут отображаться и редактироваться
  • блокировка операций удаления, редактирования и добавления записей
  • реализованы вызовы callbacks для самостоятельной настройки дополнительных действий послевыполнения стандартной операции
  • расширяемость базовой модели grocery CRUD
  • мультиязычный функционал (русский язык включен)

От себя добавлю:

  • реализована очень удобная ajax — закачка файлов на хостинг, которая реализуется буквально одной строкой кода.
  • настраивается сортировка связанных записей по приоритету
  • библиотека сама определяет и возвращает Id записи, с которой работает

От слов к делу.

По принципу «лучше один раз увидеть», привожу пример.
Возьмем табличку news, куда будут записываться новости.

CREATE TABLE `news` (
`Id_news` int(11) NOT NULL AUTO_INCREMENT,
`header` mediumtext,
`txt` text CHARACTER,
`ndate` date ,
`picture` varchar(200) ,
PRIMARY KEY (`Id_news`)
)

В стандартный CI контроллер welcome.php добавим функцию news и вспомогательную pic_show.

class Welcome extends CI_Controller {
public function __construct() {
        parent::__construct();
        /* дополняем конструктор нужными библиотеками */
        $this->load->database();
        $this->load->helper('url');
        $this->load->library('grocery_CRUD');
     }
 public function index()
 {
     /* здесь ваша главная страница */
 }
 function news() {
     /* создали экземпляр CRUD */
     $crud = new grocery_CRUD();
     /* Сообщили, что работаем с таблицей news */
     $crud->set_table('news');
     /* в списке записей будем выводить поля, перечисленные ниже */
     $crud->columns('Id_news', 'ndate', 'header', 'picture');
     /* Но вместо адреса картинки покажем саму картинку */
     $crud->callback_column('picture', array($this, 'pic_show'));
     /* Тут опишем, как озаглавить поля таблицы, чтобы клиент тоже понимал,*/
     /*о чем тут речь */
     $crud->display_as('Id_news', 'Id')
          ->display_as('ndate', 'Дата новости')
          ->display_as('header', 'Заголовок')
          ->display_as('txt', 'Текст новости')
          ->display_as('picture', 'Картинка');
     /* Этой строкой указали, что в поле picture - картинка,*/
     /*которую необходимо предварительно закачать в папку pic/news/. */
     /*В поле picture записывается имя файла, которое gC*/
     /*сгенерирует при сохранении картинки */
     $crud->set_field_upload('picture', 'pic/news/');
     /* Указанный ниже сабжект используется везде, где даются */
     /* комментарии типа, "добавить новость", "удалить новость" и т.п. */
     $crud->set_subject('новость');
     /* сортировка по умолчанию. Обратите внимание, там где возможно,*/
     /* grocery CRUD использует конструкции, принятые в CI */
     $crud->order_by('ndate', 'desc');
     /* Поля, обязательные для заполнения */
     $crud->required_fields('header', 'ndate', 'txt');
     /* Единственная обязательная строчка. В $output уже сгенерированый html*/
     /* cо списком записей или формой ввода/редактирования */
     $output = $crud->render();
     /* Выведем, вставив в наше представление */
     $this->load->view('main', $output);
 }
 /* Показываем картинку */
 function pic_show($primary_key, $row) {
     if (is_file("pic/news/" . $row->picture)) {
         return '<img src="'."pic/news/" . $row->picture.'" />';
     }
    return "";
 }
}

Как это будет выглядеть:

Список записей grocery CRUD

Список записей grocery CRUD

Редактирование записи grocery CRUD

Редактирование записи grocery CRUD

Минусы?

Они скорее связаны не с общей идеей библиотеки, а с наличием неотлаженных пока багов:

  • загрузка файлов не работает в опере и ранних версиях IE (если будете собирать админку на grocery CRUD для клиента — поинтересуйтесь, не яляется ли опера его любимым браузером :) )
  • не срабатывают вызовы callbacks после удаления и загрузки файлов.

В минусы можно добавить слабую документацию. Некоторые функции вообще не сопровождены каким-либо описанием или примерами. Правда примеры могут найтись в описании других функций. Но библиотека постоянно обновляется и, надеюсь, в будущем этот недостаток будет потихоньку исправляться.

При использовании необходимо помнить о целостности данных, и если вы удаляете запись, то не забудьте оформить вызов функции, удаляющей связанные записи из других таблиц.

Авторы не рекомендуют использовать функцию index в контроллерах.

Вот и все. Осталось только дать ссылку на официальный сайт библиотеки: http://www.grocerycrud.com/

****

UPD.

В новой версии grocery CRUD 1.2, автор обещает, что загрузчик файлов работает корректно в том числе и с Оперой.
Еще не проверяла, но на днях проверю.

UPD2.

Проверено. Загрузка файлов в Опере работает! :)

18.03.2012 Автор: Ссылка
8 комментариев на Молниеносная разработка с grocery CRUD
  1. Игорь:

    Спасибо за статью, очень помогла и облегчила жизнь!)
    Может знаете, есть ли возможность фильтрации, к примеру, поля select в зависимости от другого поля тоже select, или надо допиливать?
    Точнее, например, есть марка машины в зависимости от выбора будет выпадать список моделей данной марки.

    • Albina:

      Не совсем поняла вопрос, но возможно вам поможет то, что в grocery CRUD можно применять стандартные выборки от CI, например:

      $crud->where( 'models_combinations.type',$type);

      сформирует табличку, где будут машины только типа $type,

      или так, при задании relation 1-n:

      $crud->set_relation('model_id','models','modelname',array('manufacturer_id' => $manufacturer_id));

      А вообще, конечно, документация — слабое место GC, но, потихоньку ситуация выправляется. Судя. по активности на форуме автора, интерес к библиотеке большой.

  2. luckywalrus:

    Действительно, очень интересная библиотека. Довольно просто все реализуется, при некотором опыте освоение ее не составляет большого труда, а готовый результат можно показать уж совсем быстро и красиво.

    Правда, наткнулся на такую вещь: разбиение на страницы таблиц, похоже, происходит на стороне браузера, средствами JavaScript. Т.е. таблица, фактически, сперва полностью закачивается на сторону клиента и формирует документ, а он уж потом разбивается на страницы. Если таблица невелика (например, справочник, структура меню и т.д.) то это нормально и почти не сказывается на скорости. Если же таблица содержит большое число записей, загрузка будет происходить долго, а разбиение на страницы может вообще не отработать.

    • Albina:

      Думаю, Ваши опасения напрасны.
      вот скрин реального проекта. Обратите внимание на количество записей в таблице :) , время загрузки страницы и «Limit 25″ в запросе

      grocery crud

  3. luckywalrus:

    Поверьте, я бы не стал писать, если б сам не проверил — таблица из 5 тысяч коротких записей у меня грузилась чуть больше минуты с локального сервера!.. При этом, на сервере она занимала чуть больше 300 кБ, а загружалось в виде текста много больше!..

    Разобрался я в чем дело. Натолкнуло меня на мысль то, что на Вашей картинке CRUD отображен в теме «flexigrid», я же свои эксперименты ставил на объекте с темой «datatables». Т.е. эти темы решают вопрос разбиения на страницы по-разному! А причина — в файле config.php, который можно найти в каждой теме (например, assets\grocery_crud\themes\datatables\config.php). Там есть такой параметр:

    $config['crud_paging'] = true;

    В зависимости от его установки, CRUD либо грузит базу целиком и сразу (при этом загрузка происходит дольше, но зато переключение на страницы — мгновенно!), либо использует разбиение на страницы с помощью функций самой MySQL limit, что правильнее при больших БД.

    • Albina:

      Здорово! Спасибо, что рассказали.
      Действительно, я предпочитаю тему flexigrid и никогда не использовала в бою другую, поэтому была совершенно не в курсе проблемы.

      • luckywalrus:

        На форуме CRUDовском об этом как-то вскользь написано:

        Actually for now on the two themes are: flexigrid that it’s only ajax(server-side sripting) and datatables that it’s only javascript (client-side scripting).

        Т.е. Вы используете более прогрессивную «server-side» модель с и это правильно. ;-)

        • Albina:

          самое главное, что благодаря grocery CRUD скорость разработки сайта невероятно возросла. И всем прекрасно: клиент получает удобную, заточенную свои нужды админку, а я не теряю на нее время и могу сосредоточиться на фронт-энде. :)