Руководство: Как создать свой вид топика на LiveStreet
Данный проект очень интересен для меня, так что я хотел бы внести посильную лепту в его формирование.
Итак, у меня появилось желание написать руководство по созданию своего вида топика. Такая операция может быть очень полезной и открывает более широкие возможности размещения движка.
После прочтения данной статьи, читатель сможет добавлять свои виды топиков, включая в них произвольные поля.
Основным руководством может служить вот этот топик:
Техническая документация LiveStreet → Описание ядра LiveStreet
После ознакомления с руководством, можем разобрать как происходит создание обыкновенного топика:
1. Пользователь проходит по ссылке /topic/add
2. Урл парсится. Выполняются эвент EventAdd из класса экшена (classes/actions/ActionTopic.class.php), который указан в config/config.route.php
3. Вся информация, обрабатываемая в методе, передается с помощью переменных в шаблон /templates/папка_шаблона/actions/ActionTopic/add.tpl
4. Если метод EventAdd выполняется без переданных POST-параметров, происходит просто вывод данных в шаблон.
5. Если метод EventAdd или EventEdit получает POST-параметры, выполняется сохранение данных в базу.
6. Для получения данных из базы и их сохранения, в классе ActionTopic вызываются процедуры
сохранения вида setTitle, setText, getTitle, getText и пр., которые находятся в классе "classes/modules/topic/entity/Topic.entity.class.php".
Итак для создания своего вида топика нам необходимо:
1. Создать ссылку на создания топика в шаблоне smarty.
Например «Место» в общем меню блогов:
Для этого открываем файл шаблона /templates/папка_шаблона/menu.action.tpl
И добавляем туда в табличку после
ссылку на место:
2. У нас появилась ссылка, теперь надо прописать для нее путь к классу.
Открываем файл путей config/config.route.php и вставляем туда строчку:
Теперь у нас вызывается класс ActionPlace.
3. Создаем класс classes/actions/ActionPlace.class.php
Можно просто скопировать класс ActionTopic, заменив названия переменных.
Методом, устанавливающим тип топика является
4. Копируем шаблоны для нового вида топика
/templates/папка_шаблона/actions/ActionTopic в /templates/папка_шаблона/actions/ActionPlace
Заменяем имена переменных в шаблоне.
5. Редактируем структуру бд (Добавляем place в возможные варианты поля topic_type таблицы topic)
Теперь должен появиться вид топика, копия Topic
Для дальнейшего расширения нам понадобится редактировать: файл класса «ActionPlace», файл шаблона «места» и класс classes/modules/topic/entity/Topic.entity.class.php, куда мы можем добавлять новые функции для добавления и извлечения данных базы (а-ля getTitle и setTitle).
Хотелось бы отметить что расширенная информация о топиках в базе располагается в виде массива Extra типа блоб. (назваение Extra было в функции).
Так для добавления, например нашему месту адреса я создал 2 функции в файле Topic.entity.class.php:
и
Которые вызывал уже в классе «ActionPlace»
Для вывода разных топиков с указанем типа, нужно подправить шаблон topic_list.tpl b
И вывод будет такого вида:
Так же полезно посмотреть topic.tpl
Вроде как всё. Если кому интересен пример, могу послать в личку.
Надеюсь это кому-нибудь поможет создать свой «проект мечты»:)
Итак, у меня появилось желание написать руководство по созданию своего вида топика. Такая операция может быть очень полезной и открывает более широкие возможности размещения движка.
После прочтения данной статьи, читатель сможет добавлять свои виды топиков, включая в них произвольные поля.
Основным руководством может служить вот этот топик:
Техническая документация LiveStreet → Описание ядра LiveStreet
После ознакомления с руководством, можем разобрать как происходит создание обыкновенного топика:
1. Пользователь проходит по ссылке /topic/add
2. Урл парсится. Выполняются эвент EventAdd из класса экшена (classes/actions/ActionTopic.class.php), который указан в config/config.route.php
3. Вся информация, обрабатываемая в методе, передается с помощью переменных в шаблон /templates/папка_шаблона/actions/ActionTopic/add.tpl
4. Если метод EventAdd выполняется без переданных POST-параметров, происходит просто вывод данных в шаблон.
5. Если метод EventAdd или EventEdit получает POST-параметры, выполняется сохранение данных в базу.
6. Для получения данных из базы и их сохранения, в классе ActionTopic вызываются процедуры
сохранения вида setTitle, setText, getTitle, getText и пр., которые находятся в классе "classes/modules/topic/entity/Topic.entity.class.php".
Итак для создания своего вида топика нам необходимо:
1. Создать ссылку на создания топика в шаблоне smarty.
Например «Место» в общем меню блогов:
Для этого открываем файл шаблона /templates/папка_шаблона/menu.action.tpl
И добавляем туда в табличку после
{if $sMenuSubItemSelect=='add'}
ссылку на место:
<TD class="subitem2 three_columns{if $sMenuItemSelect=='place'} active_personal{/if}" noWrap align=middle> <IMG class=arrow_cc height=7 src="{$DIR_STATIC_SKIN}/img/{if $sMenuItemSelect=='place'}arrow_menu_main.gif{else}arrow_menu_main_un.gif{/if}" width=10><A href="{$DIR_WEB_ROOT}/place/{$sMenuSubItemSelect}/">Место</A> </TD>
2. У нас появилась ссылка, теперь надо прописать для нее путь к классу.
Открываем файл путей config/config.route.php и вставляем туда строчку:
'place' => 'ActionPlace',
Теперь у нас вызывается класс ActionPlace.
3. Создаем класс classes/actions/ActionPlace.class.php
Можно просто скопировать класс ActionTopic, заменив названия переменных.
Методом, устанавливающим тип топика является
<i>$oTopic->setType('place');</i>
4. Копируем шаблоны для нового вида топика
/templates/папка_шаблона/actions/ActionTopic в /templates/папка_шаблона/actions/ActionPlace
Заменяем имена переменных в шаблоне.
5. Редактируем структуру бд (Добавляем place в возможные варианты поля topic_type таблицы topic)
Теперь должен появиться вид топика, копия Topic
Для дальнейшего расширения нам понадобится редактировать: файл класса «ActionPlace», файл шаблона «места» и класс classes/modules/topic/entity/Topic.entity.class.php, куда мы можем добавлять новые функции для добавления и извлечения данных базы (а-ля getTitle и setTitle).
Хотелось бы отметить что расширенная информация о топиках в базе располагается в виде массива Extra типа блоб. (назваение Extra было в функции).
Так для добавления, например нашему месту адреса я создал 2 функции в файле Topic.entity.class.php:
public function getPlaceAddress() { if (($this->getType()!='place')&&($this->getType()!='event')) { return null; } $this->extractExtra(); if (isset($this->aExtra['address'])) { $sAddress=$this->aExtra['address']; return $sAddress; } return null; }
и
public function setPlaceAddress($data) { if (($this->getType()!='place')&&($this->getType()!='event')) { return; } $this->extractExtra(); $this->aExtra['address']=$data; $this->setExtra($this->aExtra); }
Которые вызывал уже в классе «ActionPlace»
Для вывода разных топиков с указанем типа, нужно подправить шаблон topic_list.tpl b
{if $oTopic->getType()=='place'} Место: {/if}
И вывод будет такого вида:
Так же полезно посмотреть topic.tpl
Вроде как всё. Если кому интересен пример, могу послать в личку.
Надеюсь это кому-нибудь поможет создать свой «проект мечты»:)
46 комментариев
п.с. сам в ООП не разбираюсь!
topic.entity это сущность таблицы топиков, поэтому там и содержаться все методы доступа к свойствам топика
5. Редактируем структуру бд (Добавляем place в возможные варианты поля topic_type таблицы topic)
Вот только ща при релизе 0.2 придется эти общие файлы как-то мержить…
если код только добавлялся то при обновлении с SVN проблем не должно быть, изменения автоматом подхватятся
Я заметил, в LS есть проблемы (на уровне архитектуры) с изменением тем и шаблонов…
надо поработать.
вы создали тип материала «Мероприятие», которое по идее требует ввести дату и время начала мероприятия и в дальнейшем вывода списка мероприятий, сортированного по этой самой дате. Вопрос: где хранится эта самая дата? В extras? Как же делать по этому полю сортировку?
Но в табличке топиков мы можем их хранить только в поле extra в сжатом виде с другими данными.
Соответственно логично создать отдельную таблицу для такого рода данных (используемых не только при выводе топика), а адрес, к примеру, можно хранить и в extra.
Интересно как на livestreet будет устроен поиск по топикам в таком случае, ведь для этого придется раскодировать данные…
на счет даты мероприятия: не проще ли добавить (кому очень нужно, не обязательно такое делать в дефолтной версии движка) еще одно поле типа topic_event_date индексированное в таблице *_topic_content?
Это получается нелогично чтобы в таблице «топик» было поле topic_event_date:)
По всей видимости лучше действительно создавать дополнительные таблицы, так как по «экстра» поиска сделать не получится…
и спасибо за статью, действительно очень полезная
извините, не могли бы вы разъяснить, какие переменные все таки нужно поправить, а то с моими знаниями, боюсь, я такого могу наворотить((((
Сходу могу сказать, что надо поменять class Action%action_name%, ItemSelected'ы соответственно, тип топика в функции создания — topic_type. Примеры есть — могу скинуть.
Нужно прописывать: /place/
Почему выдает пустоту, если писать:
а не
Я эту тему не читал, но прошёл этот путь сам, и сейчас приятно следить за мыслю, и осознавать что мой мозг работал точно так же :)
Скажите, а может быть можно как-то этот процесс успростить в LS 0.4+?
Возник вопрос, но не уверен, что там где надо спрашиваю.
На этом сайте есть блок со статьями (выводится под списком блогов). Он реализован как-то так, как описано в этом топике? Если нет, то как (ну или хотя бы где посмотреть как)? Мне надо просто что-то похожее сделать. Спасибо.
Через поиск ничего не нашел.
Хотелось бы сделать подобное меню
вместо такого
И ещё вопросик, если можно:
выделенное меню
его код
Но где именно можно его редактировать? Поскольку в шаблоне файла menu.tpl нет, я зашёл в тупик.
Я ещё новичок в Livestreet, прошу сильно не пинать если вопрос банален.
Но судя по всему, не многое делается для упрощения ввода новых пользователей с возможностью разработки ими под систему.
Они как я понимаю на этом и живут, что пилят платные дополнения, в том числе там где все могло быть по нативу.