суббота, 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]

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



            О себе

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

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

            TOP - 3