Руководство: Как создать свой вид топика на 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
И добавляем туда в табличку после
{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 комментариев

avatar
С удовольствием выслушал бы комментарии создателя, правильно ли с точки зрения ООП выносить все методы доступа к информации в класс topic.entity или стоит подключать другой.
п.с. сам в ООП не разбираюсь!
avatar
хорошая статья, только для того чтоб новый вид топика заработал, необходимо в БД таблицу topic добавить дополнительный тип топика в поле topic_type.
topic.entity это сущность таблицы топиков, поэтому там и содержаться все методы доступа к свойствам топика
  • ort
  • 0
avatar
Это я написал:)
5. Редактируем структуру бд (Добавляем place в возможные варианты поля topic_type таблицы topic)
Вот только ща при релизе 0.2 придется эти общие файлы как-то мержить…
avatar
Я имею в виду topic.entity
avatar
упс, не заметил.
если код только добавлялся то при обновлении с SVN проблем не должно быть, изменения автоматом подхватятся
avatar
Надеюсь:)
avatar
Если честно, но немного «замученно»…
Я заметил, в LS есть проблемы (на уровне архитектуры) с изменением тем и шаблонов…
надо поработать.
avatar
поподробней пожалуйста
avatar
Мне, кажется, подобные действия должны выполняться на уровке администратора. Нажал на кнопку создать категорию (статьи, место и т.д)
avatar
«Идеальная система»))) Разбираться по-любому надо (как минимум в версии 0.x):)
avatar
это не категории, это типы, которые отличаться могут структурой содержания
avatar
Уважаемый benone,
вы создали тип материала «Мероприятие», которое по идее требует ввести дату и время начала мероприятия и в дальнейшем вывода списка мероприятий, сортированного по этой самой дате. Вопрос: где хранится эта самая дата? В extras? Как же делать по этому полю сортировку?
avatar
Да, разумеется данные должны будут использоваться впоследствии…
Но в табличке топиков мы можем их хранить только в поле extra в сжатом виде с другими данными.
Соответственно логично создать отдельную таблицу для такого рода данных (используемых не только при выводе топика), а адрес, к примеру, можно хранить и в extra.
Интересно как на livestreet будет устроен поиск по топикам в таком случае, ведь для этого придется раскодировать данные…
avatar
вообще прямой поиск по БД делать нельзя, иначе эта самая БД загнётся при активной аудитории. Нужно использовать поисковую машину, например, Сфинкс
avatar
Так получается что этот блоб будет сфинксом копироваться к себе в индексы… или ты планируешь менять структуру?
avatar
Но в табличке топиков мы можем их хранить только в поле extra в сжатом виде с другими данными.
на счет даты мероприятия: не проще ли добавить (кому очень нужно, не обязательно такое делать в дефолтной версии движка) еще одно поле типа topic_event_date индексированное в таблице *_topic_content?
avatar
Конечно же можно… Только не хотелось бы портить структуру дефолтной базы…
Это получается нелогично чтобы в таблице «топик» было поле topic_event_date:)
По всей видимости лучше действительно создавать дополнительные таблицы, так как по «экстра» поиска сделать не получится…
avatar
поиска по extra не будет, основные атрибуты топика(название, описание, содержание) содержаться в полях таблицы topic, из вполне достаточно для поиска
avatar
  • ort
  • +1
avatar
Работает на новой версии? :)
avatar
Всё должно работать:)
avatar
можно ли пример в личку, видимо что то не допонимаю((
avatar
Слууууушай, это так давно было!)))))
avatar
=) это плохо. =) ладно, попробую сам разобраться, если что-то будет непонятно, я спрошу :)
и спасибо за статью, действительно очень полезная
avatar
>>Можно просто скопировать класс ActionTopic, заменив названия переменных.
извините, не могли бы вы разъяснить, какие переменные все таки нужно поправить, а то с моими знаниями, боюсь, я такого могу наворотить((((
avatar
пиши в аську — помогу.
Сходу могу сказать, что надо поменять class Action%action_name%, ItemSelected'ы соответственно, тип топика в функции создания — topic_type. Примеры есть — могу скинуть.
avatar
Почему, когда делаешь ссылку:
<A href="{$DIR_WEB_ROOT}/place/{$sMenuSubItemSelect}/">Место</A>

Нужно прописывать: /place/
Почему выдает пустоту, если писать:
<A href="{$DIR_WEB_ROOT}/{$ROUTE_PAGE_PLACE}/{$sMenuSubItemSelect}/">Место</A>
avatar
Может, потому, что в config.route.php прописывается просто

'place' => 'ActionPlace',

а не
ROUTE_PAGE_PLACE => 'ActionPlace',

avatar
Забавно :)
Я эту тему не читал, но прошёл этот путь сам, и сейчас приятно следить за мыслю, и осознавать что мой мозг работал точно так же :)
avatar
Подскажите, пожалуйста, по какой причине для топика нового типа не получается определить коллективный блог, только в личный. Я администратор, у меня все права. Все исходные типы топиков попадают в коллективные без проблем, а с новым типом никак. Никак не могу понять откуда берется массив $aBlogsAllow для option Select-а в шаблоне add.tpl. В чем может быть проблема???
avatar
Подскажите, пожалуйста, по какой причине для топика нового типа не получается определить коллективный блог, только в личный. Я администратор, у меня все права. Все исходные типы топиков попадают в коллективные без проблем, а с новым типом никак. Никак не могу понять откуда берется массив $aBlogsAllow для option Select-а в шаблоне add.tpl. В чем может быть проблема??? Что-то видимо в коде шаблона для топика напутано, т.к. существуют еще и add1 add2, причем в экшене явно никой шаблон не прописан, значит по умолчанию add берется. Проблему я решил взяв часть кода из add1 для select-a, но хочется понять, как тады работает ActionTopic со стандартным типом???
avatar
Добрый День,

Скажите, а может быть можно как-то этот процесс успростить в LS 0.4+?
avatar
Доброго времени суток!

Возник вопрос, но не уверен, что там где надо спрашиваю.
На этом сайте есть блок со статьями (выводится под списком блогов). Он реализован как-то так, как описано в этом топике? Если нет, то как (ну или хотя бы где посмотреть как)? Мне надо просто что-то похожее сделать. Спасибо.
avatar
Хотелось бы такой же мануал для последней версии движка :)
avatar
делайте тоже самое — все отлично работает
avatar
вы пробовали?? ))
avatar
да, у меня все получилось
avatar
Для версии 0.5 такой мануал есть?
Через поиск ничего не нашел.
avatar
Подскажите пожалуйста, мне в посте нужно например просто вставить html код со стилями в нём, то есть код будет в нормальном виде выглядеть как пост. Это реально в LiveStreet сделать?
avatar
копать в сторону Jevix и разрешения тега div и т.п., но нужно продумать механизм ограничения вставки такого кода другими пользователями
avatar
Присоединяюсь к просьбе сделать мануал для версии 0.5


Хотелось бы сделать подобное меню
вместо такого

И ещё вопросик, если можно:
выделенное меню

его код

		{if $menu}
			{if in_array($menu,$aMenuContainers)}{$aMenuFetch.$menu}{else}{include file="menu.$menu.tpl"}{/if}
		{/if}

Но где именно можно его редактировать? Поскольку в шаблоне файла menu.tpl нет, я зашёл в тупик.
Я ещё новичок в Livestreet, прошу сильно не пинать если вопрос банален.
avatar
Сайт вообще кем нибудь администрируется ?????
avatar
Да. Наверное.

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

Они как я понимаю на этом и живут, что пилят платные дополнения, в том числе там где все могло быть по нативу.
avatar
а можете выслать пример в личку? спасибо за руководство!
avatar
А вот как удалить тип топика?
avatar
На ЛС 2.0 создание новых типов топиков идет по нативу) очередь за типами блогов. вот с типами блогов я надолго уйду походу.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.