Показаны сообщения с ярлыком typo3. Показать все сообщения
Показаны сообщения с ярлыком typo3. Показать все сообщения
четверг, 23 июля 2015 г.

Разворачиваем TYPO3 на Windows 8

Ох, как давно я не писал сюда. Уже некоторые даже звонят и спрашивают - занимаюсь ли я TYPO3 ещё? На всякий случай всем хочу сказать, что TYPO3 - это любовь на всю жизнь! В блог я могу и не писать по разным причинам, но TYPO3 занимался, занимаюсь и заниматься буду.
Теперь по теме. По различным причинам, но назрел у меня вопрос развертывания TYPO3 на моей локальном компьютере, а конкретнее - на Windows 8. В принципе ничего военного, но, как обычно, есть свои нюансы.

Выбираем инсталлер (Installer)

Идем на http://typo3.org/download/ и видим такой список:


Почему-то, для себя я выбрал первый вариант - Bitnami и потом не пожалел. Очень обрадовался когда увидел там почти свеженькие сборки 7.3.0 и 6.2.13



Установка и настройка инсталлера

Процесс установки не вызвал никаких проблем. По ходу дела я выбрал также установку phpmyadmin, что позже стало даже полезным.

Итак, после установки в директорию C:\Bitnami\typo3\ увидим такую структуру:
23.07.2015  10:31    <DIR>          apache2
23.07.2015  14:56    <DIR>          apps
23.07.2015  10:27    <DIR>          common
23.07.2015  18:08    <DIR>          imagemagick
23.07.2015  10:27    <DIR>          img
23.07.2015  10:30    <DIR>          licenses
23.07.2015  10:26    <DIR>          mysql
23.07.2015  10:31    <DIR>          php
23.07.2015  10:30    <DIR>          scripts
23.07.2015  10:27    <DIR>          sqlite
26.06.2015  12:58    manager-windows.exe <= это запускалка мускула и апача!

Самое интересное происходит в папке apps. Там есть еще 2 папки - phpmyadmin и typo3. Вот тут-то я и понял, что каждый сайт в данном инсталлере играет роль приложения (application). Чтобы каждый сайт имел приятный url, я полез C:\Bitnami\typo3\apache2\conf\bitnami\bitnami-apps-vhosts.conf  и добавил следующие строки:

Include "C:/Bitnami/typo3/apps/typo3/conf/httpd-vhosts.conf"
Include "C:/Bitnami/typo3/apps/phpmyadmin/conf/httpd-vhosts.conf"

а в файлах httpd-vhosts.conf описал виртуальные хосты, например для phpmyadmin:

<VirtualHost *:80>
    ServerName phpmyadmin.example.com
    ServerAlias www.phpmyadmin.example.com
    DocumentRoot "C:\Bitnami\typo3/apps/phpmyadmin/htdocs"
    Include "C:\Bitnami\typo3/apps/phpmyadmin/conf/httpd-app.conf"
</VirtualHost>

и для TYPO3:

<VirtualHost *:80>
    ServerName typo3_7.com
    ServerAlias www.typo3_7.com
    DocumentRoot "C:\Bitnami\typo3/apps/typo3/htdocs"
    Include "C:\Bitnami\typo3/apps/typo3/conf/httpd-app.conf"
</VirtualHost>

Думаю, что само-собой понятно, что домены phpmyadmin.example.com и typo3_7.com я добавил в hosts:

127.0.0.1 phpmyadmin.example.com
127.0.0.1 typo3_7.com

После перезапуска apache мои локальные сайты заработали под именами phpmyadmin.example.com и typo3_7.com.

После этого я сразу задался вопросом, а что если мне нужно будет поднять еще одну TYPO3, но только уже другой версии, например 6.3.14.

Я сделал всё по аналогии. В директории app создал еще одну папку - typo3test, залил в неё содержимое папки apps/typo3, удалил всё содержимое htdocs и typo3_src, исправил все пути в конфигурационных файлах директории typo3test/conf и проделал установку TYPO3 с нуля по всем правилам. Т.е. в typo3_src распаковал ядро от 6.3.14, а в htdocs сделал симлинки на typo3_src. Windows 8 позволяет делать симлинки специальной командой - mklink. Вот эти команды:

mklink /D typo3_src "C:/Bitnami/typo3/apps/typo3test/typo3_src"
mklink /D typo3 "C:/Bitnami/typo3/apps/typo3test/typo3_src/typo3"
mklink index.php "C:/Bitnami/typo3/apps/typo3test/typo3_src/index.php"

Про создание БД я не пишу, там всё понятно. Паролем root-а от mysql, будет тот пароль который вы вводили на этапе установки Bitnami.

В целом установка проходит гладко. Но...

Настройка ImageMagick

Когда я пошел в InstallTool/Test setup, чтобы проверить работу ImageMagick, который исправно работает для директории apps/typo3, я с удивлением обнаружил что тут, в папке apps/typo3test он уже не работает, хотя пути к IM я прописал точно такие же как и для первого экземпляра TYPO3. И тут началось...

Для начала я поставил IM как отдельное приложение. Скачал ImageMagick-6.9.1-9-Q16-x86-dll.exe с родного сайта и установил его. Это проблему не решило, хотя convert.exe запускался из командной строки на раз.

После нескольких часов изысканий я обнаружил интересный факт. Когда выполняешь команду: convert.exe -verbose pic-1.jpg pic-1.png от лица администратора компьютера - утилита работает, а если от обычного пользователя, то выдает ошибку: convert.exe: no decode delegate for this image format...

Но, что интересно, так было с convert.exe от Bitnami (C:\Bitnami\typo3\imagemagick\convert.exe), но не с convert.exe от IM, который в любой ситуации отрабатывал без проблем.

Поскольку я не являюсь знаком Windows, то я не стал искать причину такого странного поведения, а поступил очень просто - прописал в TYPO3 пути к другой версии IM. А именно, в файле typo3conf\LocalConfiguration.php сделал такие настройки:

'GFX' => array(
'colorspace' => 'RGB',
'im' => 1,
'im_mask_temp_ext_gif' => 1,
//'im_path' => 'C:/Bitnami/typo3/imagemagick/',
//'im_path_lzw' => 'C:/Bitnami/typo3/imagemagick/',
'im_path' => 'C:/Program Files (x86)/ImageMagick-6.9.1-Q16/',
  'im_path_lzw' => 'C:/Program Files (x86)/ImageMagick-6.9.1-Q16/',
'im_v5effects' => 1,
'im_version_5' => 'im6',
'image_processing' => 1,
'jpg_quality' => '80',
),

И, о чудо! Всё заработало! Теперь я могу иметь сколько угодно локальных TYPO3! Даже у себя на даче, где пока нет интернета, я смогу иногда поработать.

четверг, 17 октября 2013 г.

Если картинки на сайте темнее оригинала


Впервые столкнулся с необычным явлением - картинки на TYPO3-сайте выглядят несколько темнее, чем те оригиналы, которые я загружал. Поспешу сказать, что сама TYPO3 тут абсолютно ни при чём. Она "виновата" лишь в том, что для всех манипуляций с картинками использует графические библиотеки IM (ImageMagick) или GM (GraphicsMagick). В моём случае это был ImageMagick. Вначале я решил исследовать на эту тему все настройки TYPO3 в разделе Install/All Configuration. Там меня заинтересовал параметр - colorspace, значение которого было - RGB, а коментарий к параметру:

  1. String: Specifiy the colorspace to use. Some ImageMagick versions (like 6.7.0 and above) use the sRGB colorspace, so all images are darker then the original
  1. Possible Values: CMY, CMYK, Grey, HCL, HSB, HSL, HWB, Lab, LCH, LMS, Log, Luv, OHTA, Rec601Luma, Rec601YCbCr, Rec709Luma, Rec709YCbCr, RGB, sRGB, Transparent, XYZ, YCbCr, YCC, YIQ, YCbCr, YUV

До конца не поверив, что решение так быстро найдено, я почитал мануал по IM и наткнулся на такой текст:

...In the above example, the result is darker than the original, because the channels were separate as linear gray and subsequently combined as linear color. In order to return the channels back to sRGB, one must change the colorspace from RGB back to sRGB after the -combine step.

Т.е. все пути вели к значению sRGB. После того, как я поменял RGB на sRGB в файле конфигурации (typo3conf/LocalConfiguration.php)  появилась такая строка:
'GFX' => array(
'colorspace' => 'sRGB', 'gdlib_png' => 1,
'im_combine_filename' => 'composite',
'jpg_quality' => '80',
),
 И о чудо! Картинки стали светлее!

p.s. После смены значения параметра colorspace, TYPO3 может какое-то время заниматься переконвертацией всех картинок в соответствии с новыми графическими настройками, поэтому сайт может вести себя не совсем адекватно. В моем случае это был абсолютно белый экран, который пропал минут через 5.


вторник, 1 октября 2013 г.

Константы TYPO3 в шаблоне FLUID


При формировании меню с помощью FLUID, а точнее вьюхелпером - page.menu из пакета VHS, столкнулся с задачей передачи значения константы TYPO3 в качестве одного из параметров вьюхелпера.

Вот как выглядел viewhelper изначально:

<v:page.menu showHidden="1" doktypes="3" classCurrent="" classActive="" classFirst="" classLast="last" pageUid="26">
<ul class="socicons-container">
<f:for each="{menu}" as="menuLink" iteration="menuIterator">
<li {f:if(condition: menuIterator.isLast, then: 'class="last"')}>
<a href="{menuLink.link}" title="{menuLink.title}" target="{menuLink.target}">
<img src="fileadmin/tmpl/florian/Resources/Public/images/icons/{menuLink.subtitle}" width="30" height="30" alt="{menuLink.title}" />
</a>
</li>
</f:for>
</ul>
</v:page.menu>

тут меню формируется на основании страниц, которые содержатся в системной папке с id=26.

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

Итак, создаем TYPO3-константу:

socialIcons = 26


Как же ее значение использовать вьюхелпером? Для этого нужен промежуточный этап. Сначала значение данной константы помещаем в объект lib:

lib.constants.socialIcons.id = {$socialIcons}

А вот значение параметра lib внутри вьюхелпера можно получить с помощью другого вьюхелпера - var.typoscript. В итоге получаем следующую конструкцию:

<v:page.menu showHidden="1" doktypes="3" classCurrent="" classActive="" classFirst="" classLast="last" pageUid="{v:var.typoscript(path: 'lib.constants.socialIcons.id')}">
<ul class="socicons-container">
<f:for each="{menu}" as="menuLink" iteration="menuIterator">
<li {f:if(condition: menuIterator.isLast, then: 'class="last"')}>
<a href="{menuLink.link}" title="{menuLink.title}" target="{menuLink.target}">
<img src="fileadmin/tmpl/florian/Resources/Public/images/icons/{menuLink.subtitle}" width="30" height="30" alt="{menuLink.title}" />
</a>
</li>
</f:for>
</ul>
</v:page.menu>


P.S. Т.к. в примере используется пакет VHS, то не забывайте подключать его с помощью - {namespace v=Tx_Vhs_ViewHelpers} в начале html-шаблона.



суббота, 21 сентября 2013 г.

RealURL. Установка и настройка.


Практически ни один TYPO3 проект не обходится без использования плагина - RealURL, который предназначен для генерации ЧПУ ("ЧеловекоПонятных Урлов"). Т.е. благодаря ему мы имеем на сайте "красивые" ссылки в виде http://www.domain.com/downloads/page/1/, а не в уродливом формате - http://www.domain.com?index.php=123&page=1.

Несмотря на то, что RealURL довольно прост в установке и конфигурации, тем не менее, многие мои друзья и знакомые испытывают определенные трудности при его использовании и стараются заменить его другим аналогичным плагином, например - CoolUri, или же обращаются ко мне за помощью.

Вот поэтому я и решил написать эту статью, целью которой является снять максимальное количество вопросов при использования этого замечательного плагина.

Итак, по пунктам:

1. Установка плагина RealURL

Для установки RealURL, как и для установки любого другого плагина TYPO3, нужно проделать следующие шаги, о которых лучше расскажут картинки:





2. TypoScript

В главном TYPO3 шаблоне или в разделе Setup корневой страницы размещаем несколько дополнительных строк typoscript:
config {
simulateStaticDocuments = 0
tx_realurl_enable = 1
typolinkCheckRootline = 1
uniqueLinkVars = 1
baseURL = http://www.domain.com/
# или через переменную - domain, которая определена в разделе констант страницы
# baseURL = http://{$domain}/
}

3. .htaccess

RealURL работает не сам по себе. Его работа основана на апачевском модуле "mod_rewrite". Его наличие - обязательное условие и без него никак! Поэтому обязательно проверьте установлен ли он на вашем сервере. Для этого можно использовать функцию phpinfo(). Если же mod_rewrite присутствует в системе, то следующим шагом будет переименование файла в корневой директории сайта - "_.htaccess" в ".htaccess". Нужно заглянуть в этот файл и проверить не закоментированны ли такие строки:

# Enable URL rewriting
RewriteEngine On
# Change this path, if your TYPO3 installation is located in a subdirectory of the website root.
RewriteBase /
Маленький нюанс. Помню, что когда-то работал с сайтом, который был расположен в подпапке "new", а не в корневой директории. Это заставило меня немного напрячься при настройке RealURL. А дело было в малом, нужно было изменить параметр RewriteBase:
# Прошу прощения если я не так поставил слэш. Уже не помню как правильно :).
# Попробуйте разные варианты и напишите!
RewriteBase /new

4. Базовая настрока RealURL

После того как плагин установлен, о чем говорит зеленая пиктограммка, нужно его сконфигурировать.





В принципе, RealURL начинает работать сразу же после его установки в режиме автоконфигурации. Но я этот режим никогда не использую, ибо люблю, чтобы все настройки зависили только от меня. Автоконфигурацию я оставляю только в случае очень простого сайта - с одним языком, без плагинов и других наворотов. Во всех остальных случаях я использую только ручную настройку RealURL. Думаю, что именно этот этап и отпугивает всех желающих установить этот плагин на своем сайте. И напрасно, не так страшен чёрт как его малюют.

Итак, для ручной настройки RealURL направляемся в папку typo3conf. Удаляем или переименовываем файл автоматической конфигурации - realurl_autoconf.php. Создаем новый файл конфигурации - realurl_conf.php. Скопируем в этот файл базовые настройки:

<?php
$TYPO3_CONF_VARS['EXTCONF']['realurl']['_DEFAULT'] = array(
        'init' => array(
            'enableCHashCache' => 1,
            'appendMissingSlash' => 'ifNotFile',
            'enableUrlDecodeCache' => 1,
            'enableUrlEncodeCache' => 1,
            'respectSimulateStaticURLs' => 0,
            'postVarSet_failureMode'=>'', // необходимо для работы error 404        ),
    'redirects_regex' => array (
 
    ),
    'preVars' => array(
                        array(
                                'GETvar' => 'no_cache',
                                'valueMap' => array(
                                    'no_cache' => 0,
                                ),
                                'noMatch' => 'bypass',
                        ),
                         array(
                             'GETvar' => 'L',
                             'valueMap' => array(// необходимо для мультиязычных сайтов
                                                'ua' => '0', 'ru' => '1',  /*'en' => '2', 'de' => '3',*/                                        ),
                                'noMatch' => 'bypass',
                        ),
                ),
     'pagePath' => array(
            'type' => 'user',
            'userFunc' => 'EXT:realurl/class.tx_realurl_advanced.php:&tx_realurl_advanced->main',
            'spaceCharacter' => '-',
            'languageGetVar' => 'L', // необходимо для мультиязычных сайтов            'expireDays' => 7,
    //'segTitleFieldList'    => 'name,username,tx_realurl_pathsegment,alias,nav_title,title',
            'rootpage_id' => 1, // необходимо установить значение uid рутовой страницы сайта!        ),

      'postVarSets' => array(
            '_DEFAULT' => array(
                // tt_news archive parameters
                'archive' => array(
                    array(
                        'GETvar' => 'tx_ttnews[year]' ,
                        ),
                    array(
                        'GETvar' => 'tx_ttnews[month]' ,
                            'valueMap' => array(
                            'january' => '01',
                            'february' => '02',
                            'march' => '03',
                            'april' => '04',
                            'may' => '05',
                            'june' => '06',
                            'july' => '07',
                            'august' => '08',
                            'september' => '09',
                            'october' => '10',
                            'november' => '11',
                            'december' => '12',
                            )
                        ),
                ),                 // tt_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' => '-',
),
), ),                 ),
                // tt_news articles and searchwords
                'article' => array(
                    array(
                        'GETvar' => 'tx_ttnews[tt_news]',
                        'lookUpTable' => array(
                            'table' => 'tt_news',
                            'id_field' => 'uid',
                            'alias_field' => 'title',
                            'addWhereClause' => ' AND NOT deleted',
                            'useUniqueCache' => 1,
                            'useUniqueCache_conf' => array(
                                'strtolower' => 1,
                                'spaceCharacter' => '-',
                                ),
                            ),
                        ),

                    array(
                        'GETvar' => 'tx_ttnews[swords]',
                        ),
                    ),
                ),          
            ),
      'fileName' => array(
            'defaultToHTMLsuffixOnPrev'=>0, // сделайте 1, чтобы все страницы заканчивались суффиксом .html            'index' => array(
                'rss.xml' => array(
                    'keyValues' => array(
                        'type' => 100,
                    ),
                ),
                'rss091.xml' => array(
                    'keyValues' => array(
                        'type' => 101,
                    ),
                ),
                'rdf.xml' => array(
                    'keyValues' => array(
                        'type' => 102,
                    ),
                ),
                'atom.xml' => array(
                    'keyValues' => array(
                        'type' => 103,
                    ),
                ),
            ),
        ),
 );
?>
Здесь я жирным выделил наиболее важные параметры которые нужно менять каждый раз, в зависимости от потребностей проекта. Выделенное красным цветом рассматривается ниже. Все что касается мультиязычных параметров, то они подробно описаны тут, а об особенностях настройки 404-й страницы можно почитать в этой статье.

Хочу обратить внимание на параметр 'rootpage_id'. Не всегда корневая страница сайта имеет id равный 1! Поэтому обязательно проверяйте этот момент и устанавливайте верное значение. Для тех, кто еще не знает как узнать id страницы TYPO3 скажу, что есть несколько способов. Один из них - просто навести курсор мышки на иконку страницы или её название. Другой - заглянуть в свойства страницы:


5. Дополнительные настройки RealURL

Остановлюсь более подробно на 3-х моментах, требующих более "тонкой" настройки RealURL
  • Настройки для нескольких доменов
    TYPO3 позволяет содержать несколько сайтов, а соответственно и несколько доменов, в рамках одной админки. Например, организация имеет свои филиалы, которые находятся в разных странах, каждый из которых имеет свой отдельный сайт. Скажем, украинский филиал имеет сайт - www.domain.ua, а немецкий  - www.domain.de.
    В таком случае realurl_conf.php будет иметь 2 ветки настроек.
    Для начала, обратите внимание, что первая строка конфигурационного файла сейчас выглядит так:

    $TYPO3_CONF_VARS['EXTCONF']['realurl']['_DEFAULT'] = array(...

    Но мы можем заменить её на эквивалентную строку:

    $TYPO3_CONF_VARS['EXTCONF']['realurl']['domain.ua'] = array(...

    Аналогично, для другого домена просто создаем дополнительный блок настроек, который будет начинаться со строки:

    $TYPO3_CONF_VARS['EXTCONF']['realurl']['domain.de'] = array(...

    Таким образом, результирующий файл будет выглядеть примерно так:

    $TYPO3_CONF_VARS['EXTCONF']['realurl']['domain.ua'] = array(... параметры ...);
    $TYPO3_CONF_VARS['EXTCONF']['realurl']['domain.de'] = array(... параметры ...);

    или так:

    $TYPO3_CONF_VARS['EXTCONF']['realurl'] = array (
    'domain.ua' => array (
                      ........
            )
    'domain.de' => array (
                      ........
            )
    );
  • Настройки для sitemap.xml
    Для sitemap.xml в TYPO3, как правило, создают отдельный тип страниц, например type=200. Т.е. содержимое sitemap.xml можно увидеть по адресу - http://www.domain.com?type=200. Для того, чтобы карту сайта можно было получить по традиционному урлу - http://www.domain.com/sitemap.xml необходимо внести небольшие изменения в секцию 'fileName' файла realurl_conf.php (после секции "atom.xml", например):
'sitemap.xml' => array(
                    'keyValues' => array(
                        'type' => 200,
                    ),
                ),
            • Настройки под конкретный плагин

              Теперь самое интересное. Все видели какие урлы генерируют плагины. Ну, например:
              http://www.domain.com/downloads?tx_myplugin_pi1[feusersUsername]=2
              Сегмент урла - tx_myplugin_pi1[feusersUsername]=2 выглядит ужасно. Допустим, что его задача указать плагину на какого-то зарегистрированного на сайте пользователя, имеющего в таблице fe_users uid=2. Приведем url к "нормальному" формату:
              http://www.domain.com/downloads/username/stepan/
              Для этого в realurl_conf.php в секции 'postVarSets', внутри '_DEFAULT', добавим следующие строки:
            'username' => array (
            array (
            'GETvar' => 'tx_myplugin_pi1[feusersUsername]' ,
            'lookUpTable' => array (
            'table' => 'fe_users',
            'id_field' => 'uid',
            'alias_field' => 'name',
            'addWhereClause' => ' AND NOT deleted AND NOT hidden',
            'useUniqueCache' => 1,
            'useUniqueCache_conf' => array (
            'strtolower' => 1,
            'spaceCharacter' => '-',
            ),
            ),
            ),
            ),

            • Если вдумчиво поглядеть в эти "магические" строки, то можно понять как RealURL выполняет замену и подстановку параметров. Правильно! Он делает запрос к таблице fe_users, ищет строку с uid=2, и берет значение поля name. После выборки имени пользователя его имя переводится в нижний регистр, а все пробелы заменяются знаком '-'. Вот и всё!
              Если вы посмотрите на мои базовые настройки RealURL, то увидите аналогичный блок, который я выделил курсивом -  'article' => array(... Эти директивы делают абсолютно тоже самое, что и вышеприведенный пример. Только запрос делается к таблице базы данных - tt_news, а для алиаса используется значение поля - title.

              Один из вариантов готового конфигурационного файла можно скачать с моего сайта - realurl_conf.

            P.S. Для более детального знакомства с RealURL читайте мануал и также статью Дмитрия Дулепова.


            пятница, 6 сентября 2013 г.

            Поиск в админке TYPO3


            У TYPO3 есть свой поиск в админке, который помогает быстро находить местоположение того или иного контента в структуре сайта.


            Однако, не всегда тут можно найти искомые данные, например записи какого-нибудь плагина. Дело в том, что TYPO3 производит внутренний поиск лишь в тех полях которые описаны в TCA и находятся в списке 'searchFields'.

            Чтобы было понятнее о чем идет речь, загляните в файл ext_tables.php любого плагина (см. typo3conf/ext/). В этом файле описаны дополнительные таблицы расширения и их поля. Вот, например, фрагмент данного файла для плагина - NEWS (news system) у которого есть таблица под названием - tx_news_domain_model_news:

            $TCA['tx_news_domain_model_news'] = array(
            'ctrl' => array(
            'title'     => 'LLL:EXT:news/Resources/Private/Language/locallang_db.xml:tx_news_domain_model_news',
            'label'     => 'title',
            'prependAtCopy' => $configuration->getPrependAtCopy() ? 'LLL:EXT:lang/locallang_general.xml:LGL.prependAtCopy' : '',
            'hideAtCopy' => TRUE,
            'tstamp'    => 'tstamp',
            'crdate'    => 'crdate',
            'cruser_id' => 'cruser_id',
            'versioningWS' => TRUE,
            'origUid' => 't3_origuid',
            'editlock' => 'editlock',
            'type' => 'type',
            'typeicon_column' => 'type',
            'typeicons' => array (
            '1' => t3lib_extMgm::extRelPath($_EXTKEY) . 'Resources/Public/Icons/news_domain_model_news_internal.gif',
            '2' => t3lib_extMgm::extRelPath($_EXTKEY) . 'Resources/Public/Icons/news_domain_model_news_external.gif',
            ),
            'dividers2tabs' => TRUE,
            'useColumnsForDefaultValues' => 'type',
            'languageField'            => 'sys_language_uid',
            'transOrigPointerField'    => 'l10n_parent',
            'transOrigDiffSourceField' => 'l10n_diffsource',
            'default_sortby' => 'ORDER BY datetime DESC',
            'sortby' => ($configuration->getManualSorting() ? 'sorting' : ''),
            'delete' => 'deleted',
            'enablecolumns' => array(
            'disabled' => 'hidden',
            'starttime' => 'starttime',
            'endtime' => 'endtime',
            'fe_group' => 'fe_group',
            ),
            'dynamicConfigFile' => t3lib_extMgm::extPath($_EXTKEY) . 'Configuration/Tca/news.php',
            'iconfile'          => t3lib_extMgm::extRelPath($_EXTKEY) . 'Resources/Public/Icons/news_domain_model_news.gif',
            'searchFields' => 'uid,title',...
            Как видим, автор побеспокоился о том, чтобы записи новостей можно было находить в админке по двум полям - uid и title.

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

            Решение есть. Для этого не нужно курочить плагин и добавлять новые поля в список searchFields. Можно поступить гораздо проще. В каждой директории typo3conf лежит файл - extTables.php, который подключается из localconf.php или LocalConfiguration.php. Вот в этот файл и нужно внести все необходимые предпочтения для поиска.

            Добавим туда такую строку:

            $TCA['tx_news_domain_model_news']['ctrl']['searchFields'] = 'uid,title,teaser,bodytext';


            В результате наших изменений поиск в админке будет искать записи новостей не только по полям uid и title, но и по полям - teaser и bodytext.



            четверг, 5 сентября 2013 г.

            О GeoIP в TYPO3

            Многим известна популярная библиотека PHP - GeoIP, с помощью которой по IP адресу клиента можно узнать его местоположение - континент, страну и пр. Как же её подключить и использовать в TYPO3?

            Подключить GeoIP к TYPO3 довольно легко. Для этого я взял из репозитория плагин - ml_geoip. Несмотря на то, что я работал с версией TYPO3 - 6.1.1, а этот плагин последний раз обновлялся в марте 2009 (4 года назад!), он прекрасно установился и заработал.

            Теперь, для чего я его поставил и как я его использовал?

            Во-первых, есть замечательный экст - rlmp_language_detection, который умеет автоматически направлять пользователя на определенную языковую версию сайта в зависимости от локализации его браузера или географического местоположения. Географию клиента определяет, как вы догадались, именно ml_geoip.

            Во-вторых, иногда требуется видоизменять сайт в зависимости от страны клиента. Как это делается? С помощью userfunc! Рассказываю...

            1. Создаём директорию внутри fileadmin, например - user_funcs.
            2. Создаём файл - fileadmin\user_funcs\tools.php :
            <?php
            // Подключаем библиотеку GeoIP из директории плагина ml_geoip
            require_once(t3lib_extMgm::extPath('ml_geoip').'class.tx_mlgeoip.php');
            class user_tools {
                   function isEnglishVersion(){
            $ip_address = $_SERVER['REMOTE_ADDR'];
            $my_geoip = t3lib_div::makeInstance('tx_mlgeoip');
            $gi_country_name = $my_geoip->getCountryNameByAddress($ip_address);
            if (($gi_country_name==='Russia')||($gi_country_name==='Ukraine')){
            return 0;
            }
            return 1; }}?>
            3. Итак, наш userfunc возвращает "1" если клиент не из Украины или России, и возвращает "0" в противном случае. Теперь об этом должна "узнать" TYPO3. Делается это так:
            includeLibs.tools = fileadmin/user_funcs/tools.php
            lib.isEnglishVersion = USER
            lib.isEnglishVersion {
              userFunc = user_tools->isEnglishVersion
            }
            4. Теперь можно использовать наш объект -lib.isEnglishVersion либо в шаблоне fluid, либо в typoscript. Например:

            <f:if condition="{f:cObject(typoscriptObjectPath: 'lib.isEnglishVersion')} != 1">
            <f:render partial="header/mypartial"/>
            </f:if>

            пример для typoscript:

            [userFunc = isEnglishVersion()]
            ...
            [else]
            ...
            [global]

            Ну вот и всё! Юзайте себе на здоровье!



            суббота, 10 августа 2013 г.

            Настройки TYPO3-сайта для браузера определенной версии

            Казалось бы, простая вещь - настройки сайта в зависимости от типа браузера и(или) его версии. Чаще всего разработчикам приходится по-особенному настраивать сайт для различных версий IE. Как это сделать описано в документации TYPO3, но когда дело доходит до практики всё выходит не так гладко.

            Вот пример из документации как проанализировать тип браузера:
            [browser = netscape, opera]
            А это описание того, как определить нужную версию браузера:
            [version = value1, >value2, =value3, <value4, ...]
            Это теория. Теперь практический пример. Например, нам нужна отдельная ветка настроек для всех IE 7 и более ранних версий.

            Для решения напрашивается следующая строка:
            [browser = msie] && [version < 7] || [browser = msie] && [version = 7]
            ... ну или что-то в этом роде.

            Короче это - неверное понимание документации. И думаю, что не я один такой.
            Вот верный код:
            [browser = msie] && [version= <4, <5, <6, =7]
            Основная моя ошибка была в том, что после слова version обязательно должен быть знак равенства, а варианты версий браузера необходимо перечислять в списке разделенном запятыми. Народ, поверьте, перепробовал всевозможные варианты, но заработал только этот.
            Если у кого-то есть другие варианты решения  - напишите.
            Надеюсь кому-то помог и уложил раньше спать :).

            пятница, 15 февраля 2013 г.

            SAPE на TYPO3


            Многие знают, что существует такая биржа по покупке и продаже ссылок - SAPE.RU, или просто Сапа.

            Для того, чтобы отобразить на своем сайте саповские ссылки необходимо на страницу внедрить примерно следующий PHP код:

            <?php
                 if (!defined('_SAPE_USER')){
                    define('_SAPE_USER', '8asdfsg78675sdfg567huyt565v654654a');
                 }
                 require_once(realpath($_SERVER['DOCUMENT_ROOT'].'/'._SAPE_USER.'/sape.php'));
                 $sape = new SAPE_client();
                 echo $sape->return_links()
            ?>
            Казалось бы все просто, но на самом деле не так. TYPO3 из соображений безопасности запрещает нам внедрять такой код на свои страницы, даже если мы выбираем тип контента - Plain HTML (HTML код). Поэтому, возникает вопрос - что же делать? 

            Рассказываю:

            1. Необходимо зарегистрировать на SAPE новую площадку


            2. В процессе регистрации новой площадки нужно скачать саповский архив, в котором лежит PHP-файл - sape.php...


            ... а также внимательно читаем инструкцию по установке данного php-файла на нашем веб-сервере.

            3. После установки sape.php, наша TYPO3 директория выглядит примерно так:



            4. Теперь нужно позаботиться о том как подключить саповскую библиотеку - sape.php, и вывести ссылки с помощью функции return_links().

            Чтобы подключить сапу на каждую страницу сайта можно использовать конфигурационный файл - typo3conf/localconf.php. Добавляем в этот файл следующие строки:

            global $sape;
            if (!defined('_SAPE_USER')){
                define('_SAPE_USER', '8asdfsg78675sdfg567huyt565v654654a');
            }
            require_once(realpath($_SERVER['DOCUMENT_ROOT'].'/'._SAPE_USER.'/sape.php'));
            $sape = new SAPE_client();

            Обратите внимание, мы создали глобальную переменную $sape и присвоили ей экземпляр класса.

            Далее создаем в директории fileadmin новый php-файл - sape-links.inc  (где вам удобно, например fileadmin/sape/sape-links.inc, расширение файла именно INC!), который  будет содержать следующие строки для вывода списка или блока ссылок:
            <?php
            global $sape;
            echo "<div class='sape'>";
            //$output = $sape->return_links();
            $output = $sape->return_block_links();
            $output = iconv('windows-1251','utf-8',$output); // перекодировку в utf8 можно сделать и саповскими параметрами, см. документацию
            echo $output;
            echo "</div>";
            ?>

            Файл который будет выводить саповские ссылки - готов. Осталось последнее - вставка этого файла в контент. Для этого используем плагин - lumophpinclude.

            Этот экст легко устанавливается, однако в связи с тем, что lumophpinclude уже давно не обновлялся, он не устанавливается на последние версии TYPO3, ругаясь на несоответствие версии системы. Причина в следующем. Если заглянуть в файл ext_emconf.php плагина (путь - typo3conf/ext/lumophpinclude/ext_emconf.php), то мы там сможем увидеть такие строки:
            'depends' => array(
            'php' => '4.4.0-5.2.99',
            'typo3' => '4.0.0-4.2.99',
            )
            Как видим, когда экст последний раз обновлялся, то автор предполагал, что он будет работать на всех версиях TYPO3 вплоть до версии - 4.2.99. Расширим этот интервал и заменим 4.2.99 на 6.2.99, например. Теперь в менеджере расширений (Extension Manager) можно нормально активировать данный плагин (нажать плюсик). К фатальным последствиям этот "хак" меня еще никогда не приводил, но на всякий случай поглядывайте в deprication.log.

            Теперь можно подключить этот плагин и к TYPO3 шаблону:


            Чтобы разместить lumophpinclude на странице сайта - выбирайте вставку плагина и настраивайте его. Вот так, можно подключить наш sape-links.inc на отдельной странице:


            Хочу обратить внимание, что если вы внесете какие-либо изменения в исходный код файла sape-links.inc, то эти изменения не вступят в силу. И если не разобраться, то это может поставить в тупик. Дело в том, что после выбора php-файла, как это показано на рисунке выше, плагин копирует его в свою служебную директорию - uploads/tx_lumophpinclude/sape-links.inc, после чего работает именно с данной копией файла. Лично я переименовывал тот файл который находился в папке fileadmin и заново выбирал его в настройках плагина.

            Если вам нужно разместить ссылки на большом количестве страниц, то вставка плагина lumophpinclude на каждую страницу может занять много времени. Для быстрого размещения sape-links.inc на всех страницах сайта одновременно нужно поступить следующим образом:
            • В любой из системых папок создать запись контента с типом - Plugin->Lumophpinclude
            • Создать новый тайповский lib объект в TYPO3 шаблоне, например:
            # SAPE
            lib.sape = RECORDS
            lib.sape.tables = tt_content
            lib.sape.source = 902 # где 902 - номер контентной записи
            • Закрепить (подмапить) lib объект к какому-то html фрагменту страницы. Как это выполнить - это уже на ваше усмотрение. Тут все зависит от вашего шаблонизатора.

            суббота, 9 февраля 2013 г.

            Константы TYPO3 в условиях IF


            Как известно, шаблон TYPO3 состоит из двух основных блоков - константы и тело typoscript:


            Иногда возникает вопрос - как в зависимости от значения константы выполнить тот или иной фрагмент скрипта? Все очень просто.

            Допустим, у нас есть константа - addThis, которой присвоено значение - 1. Другими словами в блоке Constants имеется следующая запись:
            addThis = 1

            Пусть значение 1 означает, что на сайте нужно показывать кнопки, довольно популярного , сервиса - AddThis, а значение 0 - означает обратное, т.е. кнопки AddThis показывать не нужно.

            Реализовать сравнение нашей константы addThis с каким-либо значением можно с помощью следующей конструкции typoscript :

            [globalVar = LIT:0<{$addThis}]
            # Константа больше нуля - показывать AddThis
            lib.addThis = HTML
            lib.addThis.value(
            <!-- AddThis Button BEGIN -->
            <div class="addthis_toolbox addthis_default_style ">
            <a class="addthis_button_preferred_1"></a>
            <a class="addthis_button_preferred_2"></a>
            <a class="addthis_button_preferred_3"></a>
            <a class="addthis_button_preferred_4"></a>
            <a class="addthis_button_compact"></a>
            <a class="addthis_counter addthis_bubble_style"></a>
            </div>
            <script type="text/javascript" src="http://s7.addthis.com/js/250/addthis_widget.js#pubid=ra-4f0789fdfhs432acc001c493f73"></script>
            <!-- AddThis Button END -->
            )
            [else]
            # Константа 0 или меньше нуля - не показывать AddThis
            lib.addThis >
            [global]

            суббота, 2 февраля 2013 г.

            Как показать ID страниц в админке TYPO3


            Порой, на сайтах задалбывает находить страницу с нужным ID (uid).
            Облегчить себе жизнь можно следующим typoscript:

            options {
              pageTree.showPageIdWithTitle = 1
            }
            Куда этот скрипт вставить (User Admin, выбор пользователя, закладка Options):





            Что получаем на выходе:

            вторник, 2 октября 2012 г.

            Fluid или изучаем новое шаблонирование в Typo3


            Так что же такое Fluid? 100%, что многие, наверняка, слышали это словечко, но до конца не понимали, о чем идет речь. Не знаю почему, но чаще всего люди думают, что fluid это нечто необходимое для написания современных экстеншенов (плагинов) для Typo3. Но это не так. Это нечто вовсе не флюид, а - extbase. А fluid это, всего-навсего, новый механизм шаблонирования или шаблонизатор, как я часто выражаюсь, такой же как automaketemplate и templavoila. Расширения написанные с помощью extbase используют fluid для шаблонизации вывода.

            Чем же хорош флюид и почему перейдя на него я не хочу ничего другого? Отвечаю, флюид лишен всех тех недостатков, которыми обладают automaketemplate и templavoila. Я бы сказал, что fluid это симбиоз этих двух шаблонизаторов, который, к тому же, наделён и множеством дополнительных возможностей о которых я как-нибудь расскажу.

            Чтобы лучше понять, что я имею ввиду, рассмотрим пример, который будет полезен не только тем кому интересен fluid, но и тем кто установил Typo3 и не знает что дальше с ней делать.

            Итак, превратим сверстанные html файлы в шаблоны Typo3 при помощи fluid.

            1. Создаем необходимую структуру директорий. 

            Считаем, что мы только что установили Typo3 и папка fileadmin - пуста. Переходим в fileadmin и создаем в ней следующие директории:
            templates, а внутри templates поддиректории - css, js, images - это стандартное хранилище тех файлов, которые создал верстальщик. Если есть желание или необходимость то сами html файлы можно скопировать в корень fileadmin\templates\. Но я этого не делаю, чтобы они не мозолили глаза. 
            Теперь создаем более интересные директории, которые напрямую связаны с работой fluid:
            layouts, pages и partials. 

            Объясню назначение каждой из них. 

            Папка layouts.

            Каким бы ни был дизайн наших страниц (двух-, трех-колоночный или еще что-то) у всех страниц есть общие блоки - header, content, footer и т.д. После того как общие блоки выявлены, на базе наших сверстанных файлов в папке layouts создаем 1 файл - default.html, который может выглядеть примерно так:
            <header>
            <div id="header" class="header-bg">
            <div class="wrap">
            <!-- Здесь будет лого --><f:cObject typoscriptObjectPath="lib.logo" />
            <!-- Место для меню сайта --><f:cObject typoscriptObjectPath="lib.sitemenu" />
            </div>
            </div>
            </header>
            <!--end header-->
                <div id="main">
            <div class="wrap">
            <!-- Бредкрамб будет тут --><f:cObject typoscriptObjectPath="lib.breadcrumb" />
            <div class="clear"></div>
            <!-- Область контента --><f:render section="Body" />
            </div>
            </div>
            <!-- end content -->
            <footer>
            <!-- Копирайт --><f:render partial="site_footer" />
            </footer>  
            <!--end footer-->
            Как видим, содержимое данного файла представляет собой кастрированную версию исходного html-файла. Идея такой кастрации такова, что вместо динамического контента мы подставляем либо имена  объектов Typo3 (например, lib.sitemenu или lib.copyright), либо имена html-секций (например, section="Body"), которые описываются файлами из директории pages, либо имена html-партиалсов (например, partial="site_footer"),  которые описываются файлами из директории partials. Я думаю, что истинные любители Typo3 глядя на этот маленький кусочек html-шаблона уже поняли всю прелесть fluid.

            Папка pages

            Т.к. наш layout содержит секцию Body - <f:render section="Body" />, то мы должны описать её.
            Однако тут не все так просто. По-сути, данная секция отвечает за отображение основного контента сайта, а контент как известно бывает разный. Рассмотрим случай когда контент размещается на странице в одной или двух колонках. Для этого в данной директории создаем 2 файла: 1Columns.html и 2Columns.html.

            Содержимое 1Columns.html:
            <f:layout name="default" />
            <f:section name="Body">
            <div class="col">
            {content -> f:format.raw()}
            </div>
            <!--end col-->
            </f:section> 
            Содержимое 2Columns.html:
            <f:layout name="default" />
            <f:section name="Body">
            <div class="left-col">
            {content -> f:format.raw()}
            </div>
            <!--end left-col-->
            <div class="right-col">
            {content_right -> f:format.raw()}
            </div>
            <!--end right-col-->
            </f:section>
            Что означает {content -> f:format.raw()} я опишу ниже. А сейчас хочу обратить внимание на некоторые очень важные вещи. Все настройки fluid чувствительны к регистру! Если в файле layouts\default.html написано section="Body", то в файлах 1Columns.html и 2Columns.html имя этой секции тоже должно начинаться с большой буквы. Следующий важный момент. Обратите внимание на первую строку для 1Columns.html и 2Columns.html. Она одинаковая для обоих файлов и может даже показаться магической - почему именно layout name="default"? Да потому, что слово "default" не что иное как своеобразная ссылка на файл layouts\default.html.

            Папка partials

            Напомню, что наш файл шаблона - layouts\default.html вместо футера содержит ссылку на html-фрагмент (partials) при помощи тега - <f:render partial="site_footer" />. Как вы уже догадались - партиалы описываются здесь, в этой директории. Но происходит это несколько иначе чем с секциями (см. выше). Достаточно создать файл partials\site_footer.html и его содержимое сразу же попадет в основной шаблон. Вот пример партиала:
            <div class="copyright">
                    <div class="f-left">
                      <address>
                      <f:cObject typoscriptObjectPath="lib.copyright" />
                      </address>
                    </div>
                    <div class="f-right">
                      <address>
                      <f:cObject typoscriptObjectPath="lib.company" />
                      </address>
                    </div>
            </div>
            Как видим, партиалы это тоже не статический фрагмент html-кода, и он также может содержать ссылки на объекты Typo3, которые создаются с помощью typoscript.

            Ну вот и все, наша страница разбита на элементарные составляющие или иными словами она - размэплена. Первая часть марлизонского балета закончена - html-шаблон готов.

            2. Настройка backend_layout  

            Для того, чтобы администратору или редактору в админке (BE) было проще и удобнее редактировать контент, в Typo3 придумали backend_layout-ы. Т.к. мы имеем дело с двумя вариантами дизайна (в 1 или в 2 колонки), то подготовим соответственно две записи backend_layout в системной папке - SF Global layout, которую я создал ранее.


            Режим редактирования backend_layout имеет 2 режима работы - графический и текстовый:


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

            Так или иначе, но в итоге, для одно-колоночного дизайна поле Config должно содержать:
            backend_layout {
            colCount = 1
            rowCount = 1
            rows {
            1 {
            columns {
            1 {
            name = Main content
            colPos = 0
            }
            }
            }
            }
            }
            а для двух-колоночного дизайна:
            backend_layout {
            colCount = 3
            rowCount = 1
            rows {
            1 {
            columns {
            1 {
            name = Main content
            colspan = 2
            colPos = 0
            }
            2 {
            name = Right content
            colPos = 1
            }
            }
            }
            }
            Если вы внимательно посмотрите на последнее определение бэкенд-лайаута, то можете удивиться и задать себе вопрос - зачем же нужно ставить colCount = 3, если колонок то всего две? Но посмотрите ниже и вы увидите, что для первой (левой) колонки имеется параметр - colspan = 2 (прям как в html-таблицах). Таким образом, мы получаем 2 колонки как и планировали, но ширина левой будет в 2 раза шире, чем ширина правой колонки. Я это сделал для того, чтобы бэкенд мне сильнее напоминал внешний вид FE-страниц.


            После создания каждого backend_layout записывайте сразу id каждой новой записи, т.к. это нам скоро пригодится.

            Чтобы присвоить странице любой из этих лайаутов необходимо перейти в свойства страницы и на закладке Appearence найти параметр Backend Layout (this page only) и выбрать из выпадающего списка нужную строку.


            В результате, двух-колоночная страница  в BE примет следующий вид:


            Я думаю, что вы согласитесь с тем, что данный вид более приятен и реалистичен чем те 4 колонки, которые нам даются по-умолчанию:



            3. Создаем Typo3-шаблон

            Теперь, когда практически все готово, остался один-единственный вопрос - как контент из левой и правой колонки редактора попадает соответственно в левую и правую колонку html-шаблона?

            Для этого нужно создать еще один шаблон, так называемый - Typo3-шаблон сайта. Ни один сайт на Typo3 не может без него обойтись! Если такого шаблона нет, то ваш сайт будет выглядеть примерно так:


            Чтобы создать Typo3-шаблон для нашего сайта мы должны перейти в режим Template, выбрать корневую страницу дерева и нажать кнопку Create template...


            После того, как Typo3-шаблон создан мы должны увидеть следующий экран:


            Теперь в разделах Constants и Setup мы можем вводить наш typoscript. У меня эти разделы, как правило содержат по одной строке. 
            Для Constants:
            <INCLUDE_TYPOSCRIPT: source="FILE: fileadmin/templates/ts/constants.ts">
            Для Setup:
            <INCLUDE_TYPOSCRIPT: source="FILE: fileadmin/templates/ts/setup.ts"> 

            Существует много причин почему лучше делать именно так, но мне с текстовыми файлами constants.ts и setup.ts работать в обычном текстовом редакторе, например notepad++, намного приятнее. Естественно, что constants.ts и setup.ts нужно создать в папке fileadmin/templates/ts/ самостоятельно, а не ждать чуда от typo3. Но это уже на усмотрение каждого.

            Открываем файл constants.ts и создаем две константы с помощью таких строк:
            domain = http://www.domain.com/
            PathToFiles = fileadmin/templates/

            И наконец, добавляем typoscript в setup.ts - самый главный конфигурационный файл сайта.
            Я приведу минимум строк необходимых для начала работы.
            page = PAGE
            page {
            typeNum = 0
            config {
            baseURL = {$domain}
                    }
            includeCSS {
            file = {$PathToFiles}css/style.css
            }
            includeJSFooter {
            file10 = {$PathToFiles}js/jquery-1.7.1.min.js
            file20 = {$PathToFiles}js/script.js
            }
                    # Настройки Fluid
            10 = FLUIDTEMPLATE
            10 {
              # Указываем пути к layout-ам и partial-ам
            partialRootPath = {$PathToFiles}partials/
            layoutRootPath = {$PathToFiles}layouts/
              # Делаем привязку backend_layout к html-шаблонам
            file.stdWrap.cObject = CASE
            file.stdWrap.cObject {
            key.data = levelfield:-1, backend_layout_next_level, slide
            key.override.field = backend_layout
            # Двух-колоночный html-шаблон привязываем к backend_layout с id=1
            1 = TEXT
            1.value = {$PathToFiles}pages/2Columns.html # Одно-колоночный html-шаблон привязываем к backend_layout с id=2
            2 = TEXT
            2.value = {$PathToFiles}pages/1Columns.html # Установка дефолтного html-шаблона (двух-колоночный)
            default = TEXT
            default.value = {$PathToFiles}pages/2Columns.html
            }
              # Загоняем контент из колонок в переменные
            variables {  
              # Содержимой главной колонки (её номер = 0) соответствует переменная - content
            content < styles.content.get
            content {
            select.where = colPos = 0
            wrap = <!--TYPO3SEARCH_begin-->|<!--TYPO3SEARCH_end-->
            }
               # Содержимой правой колонки (её номер = 1) соответствует переменная - content_right
            content_right < styles.content.get
            content_right {
            select.where = colPos = 1
            wrap = <!--TYPO3SEARCH_begin-->|<!--TYPO3SEARCH_end-->
            }
               # Содержимой левой колонки (её номер = 2) соответствует переменная - content_left (добавил ее на всякий случай)
            content_left < styles.content.get
              content_gray {
              select.where = colPos = 2
              wrap = <!--TYPO3SEARCH_begin-->|<!--TYPO3SEARCH_end-->
            }
            }
            }
            }

            Помните содержимое файлов 1Columns.html и 2Columns.html? Оба файла содержат такое вхождение: {content -> f:format.raw()}, а файл 2Columns.html еще и {content_right -> f:format.raw()}. Только что мы указали откуда будет браться контент для данных переменных.

            И таких переменных может быть сколько угодно. По умолчанию Typo3 позволяет иметь 4 столбца для ввода контента, но на самом деле их может быть сколько угодно. Мой личный рекорд - 16. И только благодаря backend_layout-ам эти 16 колонок выглядят как мозайка, а не как полосатый матрац.

            Теперь по поводу непонятной конструкции f:format.raw() , которая могла некоторых удивить. Это так называемый флюидовский ViewHelper (помощник, что ли). Привыкайте к данному термину, т.к. fluid имеет большое количество таких помощников. Именно этот - format.raw, выводит контент без всяких преобразований, как есть. Подробнее о всех ViewHelper-сах можно почитать тут.

            Ну вот и все. Если что-то забыл - допишу, если где-то ошибся - поправьте меня. И переходите на fluid, не пожалеете!!!

            О себе

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

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

            TOP - 3