Codeigniter

Создание движка на CodeIgniter 3 + HMVC. Часть 2 - пишем модули settings и common.

Создание движка на CodeIgniter 3 + HMVC. Пишем модули settings и common.

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

Модуль settings. База данных настроек и контроллер выборки значений настроек

  • Создаем папку settings в папке modules
  • Создаем в папке common каталог - controllers
  • В папке с контроллером(controllers) создадим новый файл файл settings.php
  • Открываем phpMyAdmin и созданную ранее базу CI3
  • Добавляем таблицу settings со следующей структурой
    CREATE TABLE IF NOT EXISTS `settings` (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(64) NOT NULL DEFAULT '',
      `value` text NOT NULL,
      `description` tinytext NOT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `name` (`name`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=18 ;
    
    
  • Далее наполняем таблицу данными(настройками и описанием сайта)
  • INSERT INTO `settings` (`id`, `name`, `value`, `description`) VALUES
    (1, 'sitename', 'CodeIgniter 3 HMVC Site', 'Название сайта'),
    (2, 'email', '[email protected]', 'Email'),
    (3, 'email_sender', '', 'Email отправителя'),
    (5, 'tel1', '+123456-78-90', 'Телефон 1'),
    (6, 'tel2', '', 'Телефон 2'),
    (7, 'adress', 'Украина', 'Адрес'),
    (8, 'yandex_metrika', '', 'Код Yandex.Metrika'),
    (9, 'google_analytics', '', 'Код google-analytics'),
    (4, 'email_order', '', 'Email для заявок'),
    (10, 'captcha', '0', 'Защита форм от ботов'),
    (11, 'title_suffix', '', 'Суффикс к title'),
    (12, 'send_mail', '0', 'Отправлять на почту');
    

Давайте немного разберемся что мы сделали с таблицей. Структура следующая: в одной строке - одна настройка для сайта, следовательно можно расширять настройки всего сайта а не использовать отдельные ячейки для отдельных настроек. У нас будет name - название настройки на латинице, value - значение ячейки и description - описание настройки(данная ячейка не обязательна)

В дампе таблицы выше я уже добавил заготовленные за ранее настройки для будущего проекта. И так что мы имеем:

  • Sitename - название сайта. Можно выводить как название сайта в шаблоне, или указывать данное значение в роли отправителя письма с сайта.
  • email - указываем email на сайте, что бы вывести в контактах например.
  • email_sender - указываем ящик отправителя писем с сайта(понадобится при настройке отправки писем с сервера, нужно будет указывать реальный ящик созданный на хостинге и прикрепленный к домену)
  • tel1 - телефон для контактной информации
  • tel2 - еще один телефон для контактной информации
  • adress -адрес для контактной информации
  • yandex_metrika - код счетчика яндекс метрики или любой другой
  • google_analytics - код аналитики гугл
  • email_order - в этом поле указываем почтовые ящики получателей системных писем сайта и заявок
  • Captcha - устанавливаем использовать ли на сайте капчу или нет
  • title_suffix - задаем суффикс ко всем заголовкам страниц сайта
  • send_mail - отправляем заявки с сайта на указанные почтовые ящики или нет
image description

Как видим ни чего сложного - минимум настроек необходимый для любого приложения. Теперь стоит написать функцию выборки всех данных настроек для удобной передачи и работы с ними на всем сайте. Открываем файл /modules/settings/controllers/Settings.php

class Settings extends MX_Controller {

	function __construct()
	{
		parent::__construct();
		$this->load->library('common/main_lib');
	}
    
    // массив нужных для всех остальных страниц настроек
	function get_settings()
	{
        $settings = $this->db->get('settings')->result_array();
		$data = array();
		foreach ($settings as $key => $value)
		{
			$data[$value['name']] = $value['value'];
		}
		return $data;
	}

	// выбор одной настройки сайта
	function get_one_setting($name)
	{
		$this->db->where("name", $name);
		$query = $this->db->get('settings');
		$data = $query->row_array();
		return $data['value'];
	}

}

В конструкторе мы подключаем еще не созданную библиотеку main_lib чуть ниже рассмотрим код и создадим и ее. Две функции - одна для выборки всех настроек, вторая для выборки настройки сайта по ее названию. function get_settings() выбирает все строки из таблицы settings. Создаем пустой массив $data. По выбранным данным из базы мы проходим циклом foreach и записываем в новый массив все данные по типу имя => значение. Зачем нам так делать? Во первых что бы можно было обращаться к настройкам с любого модуля проверяя наличие элемента в массиве по имени самой настройки и выводя лишь его значение. Возвращаем собранный массив. Теперь можно обратиться и вызвать любую настройку сайта просто - echo $data['sitename']. C функцией выборки единственного параметра вы разберетесь сами, ничего сложного.

Модуль common и библиотека main_lib

  • Создаем папку common в папке modules
  • Создаем в папке common каталог - libraries
  • В папке с библиотеками(libraries) файл main_lib.php

Открываем файл main_lib.php и создаем класс с именем Main_lib. В конструкторе включим встроенный бенчмарк codeigniter

class Main_lib {

	function __construct()
	{
        $this->CI =& get_instance();
        //отладка и оптимизация
        $this->CI->output->enable_profiler(TRUE);
	}
}

Теперь создадим несколько жизненно важных для будущего проекта методов(функций), которые помогут нам работать со всеми модулями движка. Поехали: функция render_main_page($data)

	function render_main_page($data)
	{
        $data += Modules::run('settings/get_settings');
        $this->CI->parser->parse("site/index.tpl", $data);
	}

Необычный код для человека, впервые столкнувшимся с иерархической структурой модели-вид-контроллер. Функция уже принимает и обрабатывает данные при вызове. $data - это массив с содержанием всех данных для последнего шага - рендера и отображения главного шаблона со всеми данными. Так что принимаем наш массив и добавляем в него элементы - переданные, недавно созданной функции - выбрать все настройки. Выборку всех настроек мы повесим на наше расширение HMVC. Подробнее о работе функций echo modules::run('module/controller/method', $var_1, ...$var_n) или $this->load->module('module') вы можете почитать на странице разработчика по ссылке указанной в первой статье либо на этом сайте на русском языке Вызвав метод класса settings модуля setttings - мы вернули массив со всеми значениями настроек и объединили его с массивом, который передал нам модуль вызвавший функцию render_main_page - в нашем уроке это будет модуль Page.

image description

Далее с помощью встроенного парсера codeigniter выведем наш шаблон из папки /themes/site/index.tpl передав весь массив с данными.

Для данного урока и всех последующих статей данного цикла мы создадим простенький шаблон на основе бутстрапа. Возьмем уже имеющуюся заготовку блога на сайте http://bootstrap-3.ru/examples/blog/

Описывать код верстки мы не будем. А обратим внимание на то, как изящно мы выводим наши данные. В тело шаблона выводим переменную $content - простым заключением в фигурные скобки. Для примера так же выведем несколько настроек - информацию о сайте в футер, так же заключив название переменных в фигурные скобки. Codeigniter парсит название переменных и выводит содержание. {content} - аналогично можно вызвать echo $content. Позже мы будем записывать в эту переменную всю верстку сгенерированную нашими модулями.

Вызов библиотеки и функции render_main_page из модуля welcome.

Итак мы перешли к главному - тестированию наших новых функций. Давайте сперва зададим несколько настроек в конфигурации нашего codeigniter для дальнейшей полноценной работы движка.

Открываем файл /application/config/autoload.php из названия вы наверное догадались что речь пойдет о библиотеках и помощниках, которые загружается в нашем приложении автоматически при работе любого контроллера. Добавляем библиотек session parser и database в строке 61 заменим значение<br?> $autoload['libraries'] = array();
на наше:
$autoload['libraries'] = array('session', 'parser', 'database');

Они понадобятся нам для работы с базой данных, и вывода шаблона.

Настало время подключить уже все библиотеки и запустить рендер страницы, передав некоторые данные нашей функции. Правим файл /modules/welcome/controllers/welcome.php

 function __construct()
    {
        parent::__construct();
        $this->load->library('common/Main_lib');
    }

    public function hmvc()
    {
        $data = array();
        $data['content'] = ' Welcome page with new controllers';
        $this->main_lib->render_main_page($data);
    }

Как вы видите - мы подключаем в конструкторе класса библиотеку main_lib из модуля common, передавая в с именем content данные для вывода. Запускаем...

image description

Обратите внимание: наша библиотека и функция генерации страницы:передали данные с содержанием страницы и вывели ее с помощью парсера {content} и таким же методом вывели название сайта в футер. Кому лень с нуля писать и создавать все модули - можете скачать исходники данного урока. Codeigniter3_hmvc_common_settings.rar База в комплекте. В следующем уроке создадим модуль Page - отвечающий за полную генерацию страниц, вывода мета данных,работы с ЧПУ и т.д.

15088 Просмотров Комментариев: 26

Євген

Ответить

Коли буде продовження?

Евгений П.

Ответить

Скоро ;) Будем стараться на этой неделе написать продолжение.

Євген

Ответить

Спасибо! Жду с нетерпением.

Павел

Ответить

Спасибо.. Жду продолжение ))

Victor

Ответить

Здравствуйте. При попытке запуска на сервере (локальном) выдается ошибка "Cannot redeclare class CI in test.dev/application/third_party/MX/Base.php on line 0". Посмотрел файл Base и поменял там название класса "CI" на "Base". И все заработало. По идее опечатка была.

Поляков Е.

Ответить

Добрый день, VICTOR, если распаковывали исходный архив целиком, то данная ошибка не возникала, очень странно. Обычно данная ошибка означает что вы не правильно наследовали свой класс в контроллере. Обратите внимание что создавая новый контроллер, ваш класс должен расширять родительский контроллер - MX_Controller а не стандартный CI_Controller. Изменять название класса не нужно. Ошибка кроется в другом месте. Кстати сам модуль HMVC еще на стадии разработки и постоянно обновляется. Я пока заметил некоторые сложности с роутингом, но вот в последней версии много багов уже профиксили ;)

Влад

Ответить

В статье есть ошибка - не mail_lib а main_lib

Евгений П.

Ответить

Спасибо, поправил.

Эдуард

Ответить

Скачал ваш архив, загрузил все на сервер, но появилась ошибка "Unable to load the requested class: Main_lib".

Поляков Е.

Ответить

Добрый день, Эдуард переименуйте файл main_lib.php в Main_lib.php
Что бы имя файла было с заглавной буквы и все должно заработать на сервере.

Обновил архив и ссылку на проверенные на сервере исходники.

Эдуард

Ответить

Сделал это в первую очередь, еще помню что был не правильно путь(вместо "modules\common\libraries" было "modules\common".

Эдуард

Ответить

UPD. Похоже что я по своей невнимательности все таки забыл переименовать. Еще хотел узнать каким редактором вы пользуйтесь(например на этом скриншоте http://polyakov.co.ua/assets/blog/codeigniter/ci3/2/1.png)?

Поляков Е.

Ответить

Это наверное самая лучшая IDE - phpStorm от jetBrains. Вот здесь можно скачать phpStorm 9.0

Николай

Ответить

Спасибо полезно. Но пришлось этот шаг пропустить - как-то сложновато и непонятно - если несложно обьясните подробнее этот отрывок "Модуль common и библиотека main_lib" - для чего и как этот код работает. Спасибо ещё раз, ваш блог очень мне пригодился.

Поляков Е.

Ответить

Николай, что значит пришлось пропустить этот шаг? ))))
Это основной модуль и самая главная библиотека для всего движка! Функция render_main_page() - отвечает за вывод и рендинг всех страниц на сайте. Во все модули без исключения (интернет-магазин, галерея, страницы, категории и т.д.) подключаем библиотеку main_lib и используем необходимые системные функции. К примеру: метод view класса page при вызове функции render_main_page наследует родительский конструктор библиотеки main_lib - и это дает нам безграничные возможности для управления вывода любого модуля.

Кажется, что все очень сложно, или так объяснил ;)
Простыми словами = вас попросили сделать сайт мультиязычным... Мы не будем изменять код каждого модуля, а сделаем проще - в конструкторе главной библиотеки подключим помощник language и в шаблонах будем использовать функцию языкового помощника codeigniter - вот так < ?= lang('message') ? >

Уловили смысл?

Николай

Ответить

Спасибо за разьяснение, начинаю понимать :)

ОЛЕГ

Ответить

Спасибо за статьи. Очень ценная информация. Если не возражаете небольшие пожелания. Просьба укажите путь создаваемых каталогов полностью, например: www\modules\common\libraries. В статье поправьте пожалуйста названия модулей settings.php, main_lib.php. Насколько я понял из документации к CI3 они должны называться с большой буквы.

pavel

Ответить

А у меня почему то сие чудо заработало после изменения в route.php c $route['default_controller'] = 'welcome'; на $route['default_controller'] = 'welcome/hmvc'; я что делаю не так ? не подскажите почему так ?

Ybror

Ответить

А не проще ли было использовать хелперы?

dasdasadidas

Ответить

Создаем папку settings в папке modules Создаем в папке common каталог - controller здесь я так понял опечатка в место комон ситингс

Денис

Ответить

Все равно выкидывает старый шаблон "Welcome to CodeIgniter! The page you are looking at is being generated dynamically by CodeIgniter. If you would like to edit this page you'll find it located at: application/views/welcome_message.php" ...

Alex

Ответить

Извините, не по теме, как настроит phpStorm IDE на Codeigniter 3 HMVC. дело в том что в папке модулей(modules) в контреллере и в целом в этой папке не работает autocomplete, а на application/controllers/ autocomplete отлично работает. Есть какие нибудь решения??? помогите плзззз.

Федот

Ответить

долго не мог понять, нужно указывать адрес http://ci3.local/welcome/hmvc и все работает

Дмитрий

Ответить

Уважаемый Евгений, объясните, пожалуйста, читателям блога хотя бы в нескольких словах , почему всё заработало только после ввода в адресной строке браузера http://ci3.ru/welcome/hmvc , а при загрузке адреса http://ci3.ru на экран выводится стандартный шаблон "Welcome to CodeIgniter!" ?

Санек

Ответить

Я когда столкнулся с этим - в конфигурации codeigniter - routes.php в папке application/config нужно указывать контроллер и метод по умолчанию $route['default_controller'] = "welcome/hmvc"; - указать и будет при обращении ci3.ru - открываться метод по умолчанию. Еще у кого не работают внутренние страницы - нужно проверить .htaccess - тоже долго не мог понять - оказалось файла нет в папке D:

Дмитрий

Ответить

Спасибо! Попробую ещё раз пройтись по всему коду с самого начала.

« Предыдущая статьяСоздание движка на CodeIgniter 3 + HMVC. Часть 1. Знакомство, установка и настройка Следующая статья »Создание движка на CodeIgniter 3 + HMVC. Часть 3. Пишем модуль page