«Шаблоны основного сайта shgpi.edu.ru. Пояснения» О шаблонах в TYPO3 ................................................................................................................1 Управление шаблонами ............................................................................................................1 Анализ шаблонов основного сайта shgpi.edu.ru .....................................................................3 Код шаблона shgpi_main .......................................................................................................3 Код шаблона defTemplate1-2 ................................................................................................7 Код шаблона defTemplate1-3-1 (раздел - Абитуриенту) ....................................................8 Код шаблона phpContent: (страница погоды) .....................................................................9 О шаблонах в TYPO3 В CMS TYPO3, как и во почти всех CMS есть четкое разделение на содержание сайта и визуальное отображение сайта – есть контент, есть шаблон (или шаблоны) его отображения. Шаблон в TYPO3 очень похож общим принципом на xml файлы, но с большим количеством возможностей – по определенному принципу (с помощью TypoScript) описывается какая-либо структура. Возможностей управления сайтом или порталом в этом языке масса – но, чтоб его эффективно использовать, надо много знать (в этом вам помогут документы rus_manual-doc_core_tsref_4-0-0.sxw – (далее в тексте TSR) и Modern_template_building__Part_1.sxw). Шаблоны – это очень гибкая возможность управления видом сайта – есть возможность определять шаблон в зависимости от внешних условий (ipадреса, браузера клиента, наличия на странице плагина, времени суток и т.д.), есть возможность создавать динамические элементы контента, подгружать файлы и управлять модулями CMS. Шаблоны в TYPO3, благодаря иерархичности страниц наследуемые. То есть – если странице не задан шаблон – она наследует шаблон страницыродителя. Для подразделов или особых страниц можно задать полностью оригинальный шаблон – по желанию администратора сайта. Управление шаблонами Шаблоны можно создавать для каждой страницы с помощью пункта WEB>Template или WEB>List добавляя их там в виде элемента контента страницы. Редактировать шаблон полностью можно с помощью пункта WEB>Template и нажав Edit the whole template record или WEB>List, нажав на карандаш у элемента template данной страницы. Рассмотрим появившуюся форму управления шаблоном. 681449347 1 1) Вкладка General – на ней определяется название шаблона, заголовок сайта и собственно его отображение и описание шаблона. Самые важные поля на данной вкладке – Constants и Setup. Constants -собственно, раздел объявления констант, которые можно использовать в поле Setup. Setup – здесь и задаются все настройки отображения сайта( Различные условия, параметры, файлы и т.д.) 2) Вкладка Options – здесь определяются параметры наследования у данного шаблона. Раздел Clear – поставленная галочка уберет все унаследованные от старницы родителя опции в разделах Setup или Constants, ну и заодно определяется – будет ли этот шаблон считаться «корневым» - «rootlevel» (если да, то меню будет состоять только из страниц этого раздела). 3) Вкладка Includes – здесь подключаются, так называемые «статические шаблоны» - шаблоны CMS или модулей в которых заданы их параметры отображения. В корневом шаблоне сайта необходимо обязательно добавить – в разделе Include static - content(default), и в разделе Include static (from extensions) - CSS Styled Content TYPO3 (css_styled_content). Если эти статические шаблоны не подключить никакой контент в самодельных шаблонах выводиться не будет. 4) Также, для корректной работы модуля tt_news необходимо подключить один из его шаблонов отображения (в данном случае table-based tmpl(tt_news)). Иначе, опять же, новости выводиться не будут. 681449347 2 Остальные вкладки не столь значительны и не будут рассматриваться здесь (подробней о них можно прочитать в встроенной помощи TYPO3) Анализ шаблонов основного сайта shgpi.edu.ru Код шаблона shgpi_main (General>Setup): В TypoScript (TS) знак комментария обозначается как # # CMS не будет автоматически формировать title страницы config.noPageTitle = true # Данные 3 строчки обеспечивают работу расширения CoolURI, которое создает читаемые # адреса страниц. Также для корректной работы данного расширения необходимы # некоторые опции в файле .htaccess (указаны в документе aboutCoolURI.doc) config.baseURL = http://www.shgpi.edu.ru/ config.tx_cooluri_enable = 1 config.redirectOldLinksToNew = 1 # Здесь задан набор свойств конфигурации – в основном, задана только правильная # кодировка – подробнее можно почитать в TSR config { sys_language_uid = 0 language = ru locale_all = ru_RU.UTF-8 forceCharset = utf-8 metaCharset = utf-8 renderCharset = utf-8 } # Создание объекта типа PAGE. Это необходимый объект – подробнее в TSR page = PAGE page.typeNum = 0 # Создание объекта типа COA. С помощью этого объекта я создаю заголовки/ # Создание под-объекта под номером 1 типа TEXT page.headerData.1 = COA page.headerData.1.1 = TEXT # Вытаскивание из БД заголовка первой страницы сайта page.headerData.1.1.data = fullRootLine : 0, title # Заключение этого значения в теги title, вертикальная черта – зарезервированный знак в # TS обозначающий текущее значение объекта page.headerData.1.1.wrap = <title> | </title> # Создание под-объекта под номером 2 типа TEXT # Следующей строкой подключаются стили. page.headerData.2 = TEXT 681449347 3 page.headerData.2.value = <link rel="stylesheet" type="text/css" href="fileadmin/template/style/style_all.css"><link rel="stylesheet" type="text/css" href="fileadmin/template/style/style_menu.css"><link rel="stylesheet" type="text/css" href="fileadmin/template/style/style_main.css"><link rel="stylesheet" type="text/css" href="fileadmin/template/style/style_top.css"><link rel="shortcut icon" href="fileadmin/template/images/favicon.ico"> # Создание под-объекта под номером 5 типа FILE # Указание пути к файлу. Содержимое файла будет # выведенно. Php файлы так подключать нельзя – не будут работать. page.5 = FILE page.5.file = fileadmin/template/s1.txt # Здесь вставляется картинка и ссылка из левого верхнего угла сайта. В последующих # шаблонах она будет заменяться названием раздела и ссылкой на его первую страницу. page.6 = TEXT page.6.value = <img src="fileadmin/template/images/shgpi.gif" border=0 alt="ШГПИ" onclick="location.href='./index.php'"><p id='p1' style="display: block;"><a href="http://shgpi.edu.ru">shgpi.edu.ru</a></p> # закрытие тегов для корректного отображения названия раздела (или ссылки на главную) page.6.wrap = | </td></tr></table></div> # HMENU (hierarchical menu) спец объект через который отображаются все меню сайта, т.е. данный объект отображает какое то количество уровней дерева страниц. page.7 = HMENU # TMENU (text menu) – спец объект для отображения одного уровня дерева страниц. В данном случае отображается первый подуровень от корня дерева страниц (от страницы с заголовком ШГПИ) page.7.1 = TMENU # Свойства page.7.1 = TMENU page.7.1 { # noBlur = 1 – убирает подсветку с «текущего» пункта noBlur = 1 # expAll = 0 – свойство, которое определяет отображать ли в меню подстраницы текущих # страниц в виде подменю (если для них задано отображение) сразу развернутыми (если # expAll = 1) или подменю отображаются только у «текущего» пункта. Для отображения # подменю необходимо, чтобы существовало отображение данного подменю. (т.е. в # данном случае, существовал бы page.7.2 = TMENU с какими либо свойствами). # Подробнее в TSR expAll = 0 # collapse = 0 – свойство, с помощью которого устанавливается - сворачивать ли # развернутые подменю по нажатию «предка» этих подстраниц (если collapse = 1) или не # сворачивать (если collapse = 0). В данном шаблоне, значение задано для дефолта. collapse = 0 681449347 4 # заключает неактивные пункты меню в <p> </p> NO.linkWrap = <p> | </p> # включает отображение разделителей (spacers) SPC = 1 # заключает их в <p> </p> (для выравнивания в меню). SPC.allWrap = <p> | </p> } # заключает все меню в css теги menu. page.7.wrap = <div class="menu"> | </div></div> # Секция, срабатывающая по условию – если клиент заходит со КПК, смартфона и т.д. # разберем только новые ключи. # в квадратных скобках записывается условие – в данном случае – срабатывает # php-функция, записаная в localconf.php [userFunc = user_isMobile()] page.5 = TEXT page.5.value = <div class="menu23"> page.6 = TEXT page.6.value = <img src="fileadmin/template/images/shgpi.gif" border=0 alt="ШГПИ" onclick="location.href='./index.php'"> page.6.wrap = | page.7 = HMENU page.7.1 = TMENU page.7.1 { noBlur = 1 expAll = 0 collapse = 0 SPC = 0 # Очистка wrap’ов переопределением NO.allWrap = | CUR.allWrap = | NO { # Не создавать ссылку этому пункту автоматически – я создам её вручную, потому что # она будет одним из пунктов select’а doNotLinkIt = 1 stdWrap.cObject = COA stdWrap.cObject { 10 = TEXT 10.value = <option value=" 20 = TEXT # Задаю параметры ссылки 20.typolink { # Вытаскиваю из БД uid текущей страницы parameter.field = uid 681449347 5 # Вытаскиваю из БД последний URL по которому обращались к данной странице returnLast = url } # Дописываю к ссылке ./ , чтобы корректно работали переходы на главную. 20.wrap = ./ | 30 = TEXT # Вытаскиваю из БД заголовок страницы и окончательно создаю пункт select'а 30.dataWrap = ">{field:title}</option> } } # Все делается аналогично для текущего пункта меню, только он еще выбирается при этом CUR = 1 CUR { doNotLinkIt = 1 stdWrap.cObject = COA stdWrap.cObject { 10 = TEXT 10.value = <option value=" 20 = TEXT 20.typolink { parameter.field = uid returnLast = url } 30 = TEXT 30.dataWrap = " selected>{field:title}</option> } } } # создается select и функция перехода page.7.wrap = <center>Навигация: <br /><select onChange="location = this.value;"> | </select></center></div> [end] # создается select и функция перехода – добавляется пункт сервисы (телефоны и т.д.) [userFunc = user_isMobile()] && [treeLevel = 1] page.7.wrap = <center>Навигация: <br /><select onChange="location = this.value;"><option value="./index.php?id=1000">Сервисы</option> | </select></center></div> [end] # Создание объекта типа CONTENT который будет отображать содержимое страницы page.10 = CONTENT # опция (функция), которая отображает весь контент страницы page.10.table = tt_content page.10.wrap = <div class="main23"> | </div> # задание свойств «виду отображения» list в модуле новостей tt_news 681449347 6 plugin.tt_news.displayList { # формирование даты новостей. date_stdWrap.strftime= %d.%m.%Y: # стирание обычных для tt_news тегов обрамляющих вывод title_stdWrap > # обрезка после 512 символов title новости и замена последующих на … # Это сделано из-за того, что tt_news расширении версии 2.5.2 максимальная длинна title # при добавлении новости ограничена. title_stdWrap.crop = 512 | ... | 1 } На этом анализ основного шаблона закончен – далее рассмотрим дополнительные шаблоны сайта – шаблоны подразделов и шаблон с интегрированным php-скриптом. Шаблоны для подразделов рассмотрим на примере самого простого – все они отличаются лишь тем, что title строится из разного количества уровней (кроме шаблона для раздела Абитуриенту – он особенный). Код шаблона defTemplate1-2 Основные отличия данного шаблона: 1) Он неполный – он наследует корневой шаблон и перегружает несколько его объектов. 2) Поставлена галочка у свойства rootlevel – таким образом, меню строится для текущего подраздела # Переопределение секции, которая находится над меню – замена ссылки на главную, # текстовой ссылкой на главную страницу данного раздела. page.6 = TEXT page.6 { # Свойство data – позволяет вытаскивать с помощью спец аргументов различные значения # из БД. В данном случае вытаскивается заголовок страницы 0го для данного раздела # уровня (т.е. той страницы, которой принадлежат текущие подстраницы). data = leveltitle : 0 typolink { # ссылка на главную страницу данного раздела parameter.data = leveluid : 0 # по названию думаю понятно. Подробней в TSR ATagBeforeWrap = 1 wrap = <font color="black"> | </font> } } # Переопределение отображения свойства headerData page.headerData.1 = COA # Формирование заголовка из заголовков страниц от корня до текущей. 681449347 7 # Вытаскивается заголовок страницы на 2 уровня выше, затем на 1, затем текущий page.headerData.1.1 = TEXT page.headerData.1.1.data = fullRootLine : -1, title page.headerData.1.1.wrap = <title> | > page.headerData.1.2 = TEXT page.headerData.1.2.data = fullRootLine : 0, title page.headerData.1.2.wrap = | > page.headerData.1.3 = TEXT page.headerData.1.3.data = fullRootLine : 1, title page.headerData.1.3.wrap = | </title> Код шаблона defTemplate1-3-1 (раздел - Абитуриенту) # рассмотрим только отличия от базового. # Переопределение отображения меню page.7 = HMENU page.7.1 = TMENU page.7.1 { noBlur = 1 expAll = 0 # данное свойство означает, что подменю будут сворачиваться. collapse = 1 # IFSUB = 1 – указание, что для страниц имеющих подстраницы будут использованы # отдельные свойства. # linkWrap – обрамление ссылки в меню. В данном случае подгружается изображение # плюсика. IFSUB = 1 IFSUB { linkWrap = <p> <img src="fileadmin/template/images/plus.gif" alt = "Развернуть" style="vertical-align:bottom;border:0;"> | </p> ATagBeforeWrap = 1 } # ACTIFSUB = 1 – указание, что для страницы имеющей подстраницы и являющейся # «текущей» будут использованы отдельные свойства. # linkWrap – обрамление ссылки в меню. В данном случае подгружается изображение # минуса. ACTIFSUB = 1 ACTIFSUB { linkWrap = <p> <img src="fileadmin/template/images/minus.gif" alt = "Развернуть" style="vertical-align:bottom;border:0;"> | </p> ATagBeforeWrap = 1 } NO.linkWrap = <p> | </p> SPC = 1 SPC.allwrap = <p> | </p> } 681449347 8 # Создание объекта для отображения 2го уровня меню. И задание стиля для ссылок # данного подменю page.7.2 = TMENU page.7.2.noBlur = 1 page.7.2.NO.linkWrap = <div style="margin-left: 20px; margin-top: 5px; font-size:11px;"> | </div> Код шаблона phpContent: (страница погоды) # Страница не кешируется. Необходимо для функ-ия # данного способа подключения php скриптов. config.no_cache = 1 # Убираем отображение контента для данной страницы. page.10 = TEXT page.10.value = &nbsp; page.28 = TEXT page.28.value = <div class="main23"> # Создаем объект типа PHP_SCRIPT – подробнее в TSR page.30 = PHP_SCRIPT # подключение скрипта. *.php должны быть заменены на *.inc или *.txt page.30.file = fileadmin/informers/meteo/cm.inc # wrap не работает для такого объекта page.38 = TEXT page.38.value = </div> . Сам php-скрипт для корректной работы должен быть приведен к виду. <?php Class ClassName { function func1() { …………….. return $result; } } $content = ClassName:: func1(); ?> Если обобщить: 1) Должен быть класс и функция в нем, которая выводит что либо с помощью return. 2) Должна быть определена переменная $content, которая и будет выводиться. 3) Расширение файла должно быть .inc(.txt) 681449347 9