Унификация представления (View) для быстрого отображения любых данных веб-приложения (на примере Codeigniter)

view-unufication
view-unufication

Концепция

Обычная структура проекта, написанного с использованием MVC подхода подразумевает наличие (как правило) трех файлов для каждого модуля:

  • модели (работа с базой данных);
  • контроллера (обработка полученной информации, логика приложения);
  • вида, в котором происходит отображение данных, пришедших из модели через логику контроллера.

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

К счастью основной код Вида можно организовать так, чтобы его не нужно было вообще менять. В результате основную часть — html-верстку — удобней разместить сразу после шаблона хедера страницы. Теперь она доступна для любой части приложения. Но отображать будет те данные и таким образом, как нам необходимо.

Реализация

Вносим коррективы в контроллер

Чтобы вид «знал» что и как ему отображать, он должен получить эту информацию (помимо обработанных данных) от контроллера. Для наглядности поставим себе три задачи, решение которых необходимо в 99% случаях разработки веб-приложения, а именно, формирование «на лету»:

  1. Кнопок действий с текущей записью (просмотр, редактирование, удаление).
  2. Заголовков таблиц и форм, а также их данных.
  3. Url для ajax запросов к БД, посредством которых будет делаться выборка данных или их изменение.

Пример файла котроллера, учитывающего эти три момента:

Итак, по кнопкам (отображать или нет) передаем 1/0.

Названия столбцов таблицы и элементов форм, сопоставленные с соответствующими полями БД заносятся в два ассоциативных массива. При этом ключи массива form_el в первых 7 символах содержат кодировку типа элемента формы (текстовое поле или выпадающий список), а также их атрибуты (hidden/visibility, enabled/disabled).

Наконец, в переменную data[‘ajax_url’] заносим ссылку на контроллер, который будет обрабатывать аякс-запросы. Конкретную функцию (save, update…) добавим потом в конце строки параметра url ajax запроса.

По контроллеру все. Идем дальше.

Унифицируем html-верстку вида

Чтобы это сделать, обработаем в цикле массив с именами полей для отображения на странице и на формах.

Часть верстки вида, отвечающая за вывод формы редактирования:

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

  • Просмотр — _browse;
  • Редактирование — _edit;
  • Добавление — _add.

В результате для поля id формы просмотра записи получаем код:

Для формы редактирования:

Все это было сформировано конструкцией типа:

Адаптируем скрипты

Приведу пример скрипта, отвечающего за вывод формы редактирования записи:

Обратите внимание на конструкцию:

Здесь мы в переменную скрипта получили из контроллера в json-представлении массив с именами полей форм. Далее в цикле for…key обрабатываем селекты формы, очищая их от данных. Наконец получаем данные по текущей записи из базы, отправляя запрос на функцию data_by_id контроллера, имя которого перед этим получено через переменную ajaxurl:

Вывод

Таким способом легко переписать любой модуль приложения. Меняется код модели и контроллера. Что касается отображения — скрипты и html-верстка остаются одинаковыми. Работы с полями форм осуществляется через переменные, через них же получается url для ajax запроса на вывод.

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

Если есть вопросы по поводу применения описанного способа, обращайтесь в комментарии.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

*

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.