Создаем модуль пустышку: QuickStart по созданию простенького функционала - часть1
Обдумав порядок публикации статей, я решил начать с ШАГА №2, ШАГ№1 скорее всего будет публиковаться либо после ШАГА№3, либо параллельно.
А чтобы не тратить время зря, решая абстрактные задачи, - будем писать "Модуль Личного кабинета". Данная публикация QuickStart является заготовкой для этого модуля.
Порядок создания у нас будет следующий:
- Создание иконок модуля для скина «Основной»
- Создание иконок модуля для скина «Butterfly»
- Создание рабочей папки модуля
- Создание файлов необходимых для работы модуля
- Создание инструкций для инсталлятора модуля
- Создание базовых функций (методов) клиентской части
- Создание базовых функций (методов) для административной части
- Создание шаблона дизайна для административной части
- Работа над правами для функций административной части
- Создание методов клиентской части
- Работа над правами для функций клиентской части
- Создание шаблонов дизайна для клиентской части
- Создаем иконки модуля для административной части для скина «Основной»
- /images/cms/admin/full/ico_s/ico_PrivateOffice.gif – (размер 16x16) – иконка модуля в меню модулей
- /images/cms/admin/full/ico_b/ico_PrivateOffice.gif – (размер 32x32) – иконка активного модуля
- /images/cms/admin/full/tree/ – здесь хранятся иконки используемые в мета контрол дереве – (размер 16x16)
- Создаем иконки модуля для административной части для скина «Butterfly»
- /images/cms/admin/mac/icons/big/PrivateOffice.png – (размер 95x95) – иконка активного модуля
- /images/cms/admin/mac/icons/medium/PrivateOffice.png – (размер 42x64) – иконка модуля в панели избранных модулей (док)
- /images/cms/admin/mac/icons/small/PrivateOffice.png – (размер 42x30) – иконка модуля в меню модулей
- /images/cms/admin/mac/tree/ – здесь хранятся иконки используемые в мета контрол дереве – (размер 16x16)
- Создаем рабочую папку модуля
- /classes/modules/PrivateOffice
- Внутри этой папкой создаем файлы (пока пустые)
- install.php - Инсталлятор модуля в систему, содержит массив $INFO[], ключи которого вносятся в реестр
- class.php - В этом файле содержатся методы (функции), используемые в клиентской части
- __admin.php - содержатся методы (функции), используемые в админке
- i18n.php - В этом файле хранятся все языковые константы, используемые в админке
- lang.php - В этом файле хранятся все языковые константы, используемые в клиентской части
- permissions.php - В этом файле хранятся подключи для прав к функциям модуля (он не нужен, если мы храним права в реестре – мне больше нравится реестр)
- __event_handlers – Здесь мы будем хранить обработчики событий
- events.php – В этом файле будут храниться перехватчики событий
- custom_events.php – В этом файле будут храниться пользовательские перехватчики событий
- __custom.php – Для кастомных макросов клиентской части модуля
- __custom_adm.php – Для кастомных макросов админкии
- Открываем install.php и пишем в нем следующее…
- Открываем class.php и пишем в нем следующее
- Модуль в UMI.CMS – это, по сути отдельный класс, являющийся дочерним по отношению к классу def_module
- Открываем модуль конфигурации
- Тыкаем по вкладке модули
- Прописываем путь до инсталляционного файла, в нашем случае это classes/modules/PrivateOffice/install.php
- Тыкаем кнопку установить
- Если мы все сделали правильно, наш модуль установится в систему
- Открываем адрес – moy-site.ru/PrivateOffice/ - мы должны увидеть страничку с просьбой авторизации, это произошло по тому, что у пользователя «Гость», пока нет прав на метод view
- Лезем в модуль пользователи, в пользователя «Гость» и ставим галочку напротив perms-PrivateOffice-view
- Обновляем страничку – moy-site.ru/PrivateOffice/ - мы должны увидеть результат работы метода view нашего модуля, а именно - Hallow World - Мы находимся в клиентской части нашего модуля
- Создание пустышки для административной части
<?php
$INFO = Array();
$INFO['name'] = "PrivateOffice"; // Имя модуля (латинское), должно совпадать с именем папки модуля
$INFO['filename'] = "modules/PrivateOffice/class.php"; // Путь до файла class.php
$INFO['config'] = "0"; // Если «1», то модуль будет настраиваемый, если «0», то нет
$INFO['ico'] = "ico_PrivateOffice"; // Базовое имя файла иконки модуля
$INFO['default_method'] = "view"; // Метод (функция) вызываемая, по умолчанию для клиентской части
$INFO['default_method_admin'] = "manage"; // Метод (функция), вызываемая, по умолчанию для админки
$INFO['func_perms'] = ""; // Массив, определяющий группы прав нашего модуля (появятся в настройках пользователя и будут влиять на доступ к методам (функциям) модуля), ключи массива вносятся в реестр иерархически.
// В данном случае мы предусмотрим, что «пользователь» сможет «админить» модуль (даем доступ к методу manage), а также просматривать его страницы (даем доступ к методу view)
$INFO['func_perms/view'] = "Просмотр страниц модуля"; //Собственно объявляем права для «клиентского метода»
$INFO['func_perms/manage'] = "Администрирование модуля"; // И для «административной части»
?>
<?php
class PrivateOffice extends def_module { //Модуль в UMI.CMS – это, по сути, отдельный класс, являющийся дочерним по отношению к классу def_module, в данном случае наш класс будет называться PrivateOffice
public function __construct() {
parent::__construct(); // Вызываем конструктор родительского класса def_module
if(cmsController::getInstance()->getCurrentMode() == "admin") { // данный "if" нужен для того чтобы не подгружать методы админ части, когда пользователь находится в клиентской и наоборот (позволяет экономить ресурсы)
$this->__loadLib("__admin.php"); // подгружаем файл __admin.php с абстрактным классом __PrivateOffice для админки, в принципе можно хранить все методы и в файле class.php, но данный подход позволяет сократить ресурсы и структурировать используемые методы
$this->__implement("__PrivateOffice_adm"); // подключаем методы класса __PrivateOffice_adm для расширения функционала админки
$this->__loadLib("__custom_adm.php"); // подгружаем файл __custom_adm.php с абстрактным классом __custom_adm_PrivateOffice
$this->__implement("__custom_adm_PrivateOffice"); // подключаем методы класса __custom_adm_PrivateOffice - нужен для кастомизации админки
} else {
$this->__loadLib("__custom.php"); // подгружаем файл __custom.php, содержащий абстрактный класс __PrivateOffice_custom для клиентской части - нужен для кастомизации клиентской части
$this->__implement("__PrivateOffice_custom"); // подключаем методы класса __PrivateOffice_custom
}
$this->__loadLib("__event_handlers.php"); // подгружаем файл __event_handlers.php и подключаем, хранящийся в нем методы абстрактного класса __PrivateOffice_handlers, в будущем это позволит нам более гибко использовать событийную модель, вынеся обработчик события в отдельный абстрактный класс
$this->__implement("__PrivateOffice_handlers");
// С конструктором покончено, все что мы хотели в него включить - включили
// Чуть позже покажу как работать с реестром, хранить в нем ключи и их значения, использовать возможности "конфигурирования модуля" посредством админки
}
// Теперь нам нужно создать метод, вызываемый по умолчанию в клиентской части модуля
public function view() { //Вспоминаем, что так мы его обозвали в инсталяторе (файл install.php), добавив вот эту строчку $INFO['default_method'] = "view";
return "Hallow World - Мы находимся в клиентской части нашего модуля";
}
};
?>
Произведенных нами действий достаточно, чтобы модуль заработал, теперь нужно его проинсталлировать:
Проверяем работу модуля:
- Создание базового метода manage
- Создание шаблона дизайна
- Вывод «Hallow Admin – Ты находишься в админке модуля»
Открываем __admin.php и пишем в него следующий код
<?php
class __PrivateOffice_adm extends baseModuleAdmin {
// Теперь нам нужно создать метод, вызываемый по умолчанию в админке модуля
public function manage() { //Вспоминаем что так мы его обозвали в инсталяторе (файл install.php), добавив вот эту строчку $INFO['default_method_admin''] = "manage";
$params['config']['string:Hallow'] = (string) "Admin";
$this->setDataType("settings");
$this->setActionType("view");
$data = $this->prepareData($params, "settings");
$this->setData($data);
return $this->doData();
}
}
?>
Продолжение следует...
Комментирование доступно только авторизованным пользователям.
Пожалуйста, зарегистрируйтесь или войдите на сайт.
Хотелось бы еще, чтобы в этой серии статей была рассмотрена реализация настраиваемого модуля.
новостей, статей, вакансий и резюме, фотографий, файлов. С возможностью администрирования на фронте.
С найлучшими пожеланиями ко всем участникам и особенно автору. Надеюсь быть услышаным.
- полный набор стандартных установок (данные о себе, о работе, резюме, фотки и пр)
- интеграция с внешними форумами такими как IPB, vBulletin, т.е. подписка на темы + уведомления + личные сообщения. Другими словами в определенной степени дублирование личного кабинета форума.
- импорт rss
- интеграция с социальной сетью, прикрученной к сайту, например такой http://e-xecutive.ru , но в части развития сообщества http://e-xecutive.ru/community/persons
- интеграция с блогами на сайте (чтение, уведомления)
Задача в том, чтобы страница личного кабинета была максимально информационно наполнена, таким образом обеспечить приличный уровень ее посещаемости.
Такую штуку планируем начать реализовывать где-то осенью. Если у кого-то будут наработки, с удовольствием приглашу принять участие в работе.
Надеюсь быть услышаным если будут вопросы с удовольствием отвечу.
Было бы не плохо ориентировать сроки по развитию этой темы.
Вопросы очень важные, как их реализовать на UMI не имею понятия, а вот благодоря этим урокам. Было бы намного проще разобраться.
Всего доброго, удачи. Жду с нетерпением продолжения. Если оно будет конечно)
Мне хотя бы понять саму схему написания доп.модулей ...
А мне бы очень хотелось сделать это!