Делаем свой модуль, часть 1

+29
3.66K
Здравствуйте.
Этим постом мы начнем серию публикаций о том, как делаются собственные модули и
компоненты для InstantCMS. От читателя требуется базовое знание PHP и MySQL.

Ставим цели

В качестве примера создадим компонент "Гостевая книга" и модуль
"Последние записи" для него. В конечном итоге мы хотим получить:

— Таблицы в БД для хранения записей гостевой книги
— Возможность вывода случайных записей через модуль
— Возможность для зарегистрированных пользователей добавлять и просматривать записи гостевой книги через компонент

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

Внимание: Во всех примерах кода нужно заменить косые кавычки на апострофы.
Или проще скачать весь пример одним архивом (ссылка в конце поста).

Создаем таблицу в БД

Чтобы было проще, давайте сразу создадим таблицу с несколькими сообщениями гостевой книги.
Для каждой записи нам потребуется 4 поля — ID, дата, автор и текст сообщения.

SQL-запрос создаст нужную нам таблицу:

  1.  
  2. CREATE TABLE `cms_guestbook` (
  3. `id` INT NOT NULL AUTO_INCREMENT ,
  4. `pubdate` DATETIME NOT NULL ,
  5. `user_id` INT NOT NULL ,
  6. `content` VARCHAR( 255 ) NOT NULL ,
  7. PRIMARY KEY ( `id` )
  8. );
  9.  

Таблицу называем "cms_guestbook", по аналогии с другими таблицами в БД InstantCMS.
Поле id создаем с флагом AUTO_INCREMENT, чтобы при вставке записей их порядковые
номера вычислялись автоматически базой данных.

Обратите внимание, что поле user_id мы делаем с типом INT, т.е.
хранить авторов сообщений мы будем в виде чисел. Каждое такое число будет указывать
на номер пользователя в системной таблице cms_users.

Теперь давайте заполним таблицу несколькими записями. Будем считать, что все эти
записи оставил администратор (т.е. пользователь с номером 1):

  1.  
  2. INSERT INTO
  3. `cms_guestbook` (`pubdate`, `user_id`, `content`)
  4. VALUES
  5. (NOW(), 1, 'Первое сообщение гостевой книги'),
  6. (NOW(), 1, 'Второе сообщение гостевой книги'),
  7. (NOW(), 1, 'Третье сообщение гостевой книги');
  8.  

Поле id при вставке не передаем, оно будет присвоено автоматически
(1, 2 и 3 соответственно). В качестве даты подставляем функцию NOW(),
которая будет заменена на текущую дату сервера.

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

Пишем модуль

Пусть наш модуль будет называться "Случайное в гостевой" и
иметь краткое название mod_guestbook.

Каждый системный модуль InstantCMS находится в отдельном файле внутри собственной папки.

Перейдите в папку modules в корне сайта и создайте в ней папку mod_guestbook.
В папке mod_guestbook создайте файл module.php.

В файл module.php помещаем код модуля:

  1.  
  2. <?php
  3. function mod_guestbook($module_id){
  4.  
  5. //Формируем запрос:
  6. $sql = "SELECT DATE_FORMAT(g.pubdate, '%d/%m/%Y') as pubdate,
  7. g.content as content,
  8. u.id as author_id,
  9. u.nickname as author_name
  10. FROM cms_guestbook g, cms_users u
  11. WHERE g.user_id = u.id
  12. ORDER BY RAND()";
  13.  
  14. //Выполняем запрос:
  15. $result = @mysql_query($sql);
  16.  
  17. //Если не произошла ошибка:
  18. if(!mysql_error()){
  19.  
  20. //Получаем данные из ответа БД:
  21. $record = mysql_fetch_assoc($result);
  22.  
  23. //Выводим текст сообщения:
  24. echo '<p>'.$record['content'].'</p>';
  25.  
  26. //Формируем ссылку на автора:
  27. $author_link = '<a href="/users/0/'.$record['author_id'].'/profile.html">'.$record['author_name'].'</a>';
  28.  
  29. //Выводим дату и ссылку на автора:
  30. echo '<p>'.$record['pubdate'].' - '.$author_link.'</p>';
  31.  
  32. //Разрешаем показать модуль:
  33. return true;
  34.  
  35. } else {
  36.  
  37. //Если данные из БД не были получены,
  38. //то запрещаем показывать модуль:
  39. return false;
  40.  
  41. }
  42.  
  43. }
  44. ?>
  45.  

Модули InstantCMS оформляются в виде функций, название которых совпадает
с названием модуля (mod_guestbook в нашем случае).

Внутри функции происходит вся работа модуля. Сначала мы составляем запрос
к двум таблицам: cms_guestbook и cms_users. Из первой мы хотим получить текст и дату
сообщения, а из второй — никнейм автора. Для связи этих таблиц нам и нужно поле user_id
в таблице с записями гостевой.

В запрос добавлена строка ORDER BY RAND() для того, чтобы получить случайную запись из таблицы cms_guestbook.

Если запрос к базе происходит успешно, модуль выводит сообщение на экран.

Добавляем модуль в систему

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

Выполните SQL-запрос:

  1.  
  2. INSERT INTO `cms_modules` ( `id` , `position` , `name` , `title` , `is_external` , `content` , `ordering` , `showtitle` , `published` , `user` , `config` , `original` , `css_prefix` , `allow_group` , `cache` , `cachetime` , `cacheint` )
  3. VALUES
  4. ('', 'right', 'Случайное в гостевой', 'Случайное в гостевой', '1', 'mod_guestbook', '1', '1', '1', '0', '', '1', '', '-1', '', '1', 'HOUR');
  5.  

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

Учтите, что если вы захотите установить этот модуль на другую систему вам
потребуется выполнить все приведенные SQL-запросы и там.
Одного копирования файлов будет недостаточно.

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

В следующих статьях мы усложним созданный нами сегодня модуль, добавив к нему
возможность настройки через админку и вывод на экран через шаблонизатор Smarty.

Скачать архив с примером
0
Madmax Madmax 15 лет назад #
УРА! Заработало - то - чего так не хватало!
-1
Suslik Suslik 14 лет назад #
странно что функции работы с базой не вынесены в API ядра, а есть хелп по API CMS?
+1
Fuze Fuze 14 лет назад #
Опубликовано: 645 дней назад (28-02-2009 13:08)

как вы считаете, многое изменилось с того времени???

загляните в код текущей версии для начала.
0
15 лет назад #
Очень полезная публикация! :)
0
15 лет назад #
Очень важная статья для всех пользователей InstantCMS!
0
15 лет назад #
Так-то всё понял, только не понял, а как попасть в саму гостевую? scratch
0
lezginka.ru lezginka.ru 15 лет назад #
как сказал один мой знакомы : "...да что тут не понять и ребенку все ясно", как прослушал вводную часть "Теоремы Элера", потом добавил: "только объясните мне ... как в карамель повидло попадает, никак не могу понять".
вывод:
приводить примеры нужных модулей , к примеру: модуль "профиль пользователя" - с возможность администрирования полей и т.д.
--------------
хотя и на том спасибо.
0
InstantCMS InstantCMS 15 лет назад #
2 lezginka.ru

Обратите внимание на слова "часть 1" в заголовке поста...
И мы не ставим задачу описать создание "нужного" модуля или компонента, т.к.
понятия о нужности у каждого свои. Наша задача - только показать суть технологии.
0
15 лет назад #
А есть гостевая для Instant ? выложите плизики
0
15 лет назад #
Не плохо было бы включить в след. версию эту гостевую книгу, как компонент, ну и модуль соответственно!
0
15 лет назад #
Спасибо, толковая статья!

Но неплохо бы еще объяснить как добавляются записи в базу из комментариев.
0
15 лет назад #
Спасибо за статью! Но больше интересует статьи о компонентах. Будет ли допустим продолжение "делаем компонент гостевая книга"?
0
15 лет назад #
А почему не отображается в админке? Как его запустить?
0
Fuze Fuze 15 лет назад #
esterny, будь внимательна,
Администратор:
Наша задача - только показать суть технологии.
+1
15 лет назад #
Даешь вторую часть!

Еще от автора

Каталог специалистов на instantcms.ru
Всем привет. Спешим сообщить что начиная с сегодняшнего дня на этом сайте заработал новый раздел - Каталог специалистов.
Важно! Обновление безопасности
Один внимательный человек, имя которого мне, к сожалению, не известно обнаружил уязвимость, позволяющую залить и использовать шелл на сайте.
Обновляем jQuery до 1.5.2
В дистрибутиве InstantCMS достаточно старая версия jQuery 1.2.5. Это доставляет множество неудобств при использовании новых плагинов.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.