четверг, 24 ноября 2011 г.

Меню из категорий новостей (tt_news) с картинками и на разных языках

Казалось бы, tt_news имеет специальный тип вывода категорий - CATMENU. Но то ли скудно у него обстоят дела с картинками, то ли я с чем-то не до конца разобрался... Короче, решил сделать вывод списка категорий с помощью TypoScript. И пока не жалею.

Внешне все выглядит так:


Теперь по функционалу:

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


2. Клик по картинке или названию категории выводит записи новостей, относящиеся только к данной категории.
3. Т.к. сайт многоязычный, то при смене языка меняются и названия категорий. Это был самый трудный момент реализации, т.к. локализация категорий в новостях выполнена довольно странно и нетрадиционно для Typo3.



Вот готовый typoscript для решения данной задачи:

lib.catmenu >
lib.catmenu = COA
lib.catmenu {
10 = CONTENT
10 {
wrap = |
table = tt_news_cat
select {
# CONCAT(title,"|",title_lang_ol) - сливает все языки в одну строку
# разделителем служит символ палка - "|"
selectFields = uid, image, CONCAT(title,"|",title_lang_ol) AS catname
pidInList = {$news_folder_id}
orderBy = uid
where = parent_category={$parent_category} AND deleted=0 AND hidden=0
}
renderObj = COA
renderObj {
wrap = <div class="category">|</div>
10 = COA
10 {
# задаем id страницы которая будет отображать новости
# данной категории
stdWrap.typolink.parameter.dataWrap = {$view_page_id}
# чтобы наша следующая страница со списком новостей знала
# id категории с которой нужно работать передаем ей
# в качестве параметра - tx_ttnews[cat]={field:uid}
stdWrap.typolink.additionalParams.dataWrap = &no_cache=1&tx_ttnews[cat]={field:uid}
stdWrap.typolink.wrap = |
stdWrap.typolink.ATagParams =
# вывод картинки
10 = IMAGE
10{
required=1
wrap = |
file.import=uploads/pics/
file.import.field=image
file.width=235c
file.height=235c
}
# вывод названия категории
20 = COA
20 {
wrap = <h3>|</h3>
10 = TEXT
10 {
field = catname
# разбиваем поле catname на элементы массива
# за счет разделителя - | (char code = 124)
# и берем нужный элемент по коду языка сайта - GP:L
split {
token.char = 124
returnKey.data = GP:L
}
}
}
}
}
}
}

P.S. Как это выглядит в живую можно посмотреть здесь, в видео ролике или на действующем сайте.

P.S. (2) Не забудьте настроить RealUrl (realurlconf.php) для красивого отображения категорий в адресной строке браузера. Вот необходимые для этого строки:
// news categories
'category_name' => array (
array(
'GETvar' => 'tx_ttnews[cat]',
'lookUpTable' => array(
'table' => 'tt_news_cat',
'id_field' => 'uid',
'alias_field' => 'title',
'addWhereClause' => ' AND NOT deleted',
'useUniqueCache' => 1,
'useUniqueCache_conf' => array(
'strtolower' => 1,
'spaceCharacter' => '-',
),

),

),

),
пятница, 18 ноября 2011 г.

Линк для разлогинивания пользователя (logout link)

Простейший TypoScript для генерации ссылки позволяющей сделать пользователю логаут. На самом деле, в инете такого добра полно, но надоело каждый раз куда-то лазить и подглядывать, а так будет всегда под рукой:
lib.logout = TEXT
lib.logout {
wrap = <div id="logout"> | </div>
value= Logout
lang.fr = Déconnexion
typolink.parameter.data = page:uid
typolink.additionalParams.cObject = COA
typolink.additionalParams.cObject {
10 = TEXT
10.value = &logintype=logout
20 = TEXT
20.data = GP : L
20.wrap = &L=|
20.required = 1
}
}
вторник, 8 ноября 2011 г.

Алиасы для файлов в новостях или этот сумасшедший TypoScript

Думаю все знают, что к каждой новости в Typo3 можно приатачить какие-либо файлы.
Иногда такие файлы нужно вывести в специальном боксе или "киоске". Но что делать если имена файлов очень длинные, без пробелов и в отведенную для них область просто не помещаются?



Выход один - необходимо каждому файлу сопоставить алиас. Как это сделать? Это можно реализовать с помощью чумачечего TypoScript, причем без установки дополнительных расширений.
Для начала нужно определиться с полем, которое будет содержать в себе алиасы файлов. Т.к. у меня картинок в новостях не было, то я решил заюзать стандартное и родное для tt_news поле - imagecaption.


Теперь немного "интуитивно-понятного" скрипта, который мы размещаем в нашем шаблоне:
plugin.tt_news {
newsFiles {
labelStdWrap.cObject = COA
labelStdWrap.cObject {
10 = TEXT
10 {
field = imagecaption
split.token.char = 10
split.returnKey.data = register : FILE_NUM
}

20 = LOAD_REGISTER
20 {
FILE_NUM.cObject = TEXT
FILE_NUM.cObject.data = register:FILE_NUM
FILE_NUM.cObject.wrap = | +1
FILE_NUM.prioriCalc = intval
}
}
}
}

... и ву-а-ля



P.S. Спасибо немецкому форуму, который так красиво решил эту нетривиальную задачу!

О себе

Моя фотография
Вадим Гиркало
Фрилансер, веб-разработчик сайтов на базе бесплатной, мощнейшей и очень гибкой CMS системы - TYPO3.
Просмотреть профиль

Позвонить мне в Skype

TOP - 3