Создание и сопровождение сайтов

Блог. Yii. Подсказки по yii. Глава восемнадцатая.

Поиск

Подсказки по Yii. Глава восемнадцатая.

  1. "cookie" на поддоменах.

    Если сайт имеет поддомены, то целесообразно хранить авторизацию пользователя как на основном домене, так и на поддоменах.

    Например: основной домен http://domain_site.ru. Есть поддомены http://msk.domain_site.ru, http://spb.domain_site.ru.

    Пользователь авторизировался на http://domain_site.ru, но на http://msk.domain_site.ru он уже будет "гостем", а не "авторизированным пользователем".

    Дабы избежать такого досадного недоразумения необходимо добавить в конфигурационный файл (например: protected\config\main.php) в секцию 'components' следующий код:

    1. 'session' => array(  
    2.     'cookieParams' => array('domain' => '.domain_site.ru'),  
    3. ),  

    и

    1. 'user'=>array(  
    2.     // enable cookie-based authentication  
    3.     'allowAutoLogin'=>true,  
    4.     'identityCookie' => array('domain' => '.domain_site.ru'),  
    5. ),  

    В итоге должно получиться так:

    1. ...  
    2. // application components  
    3. 'components'=>array(  
    4.     ...  
    5.     'session' => array(  
    6.         'cookieParams' => array('domain' => '.domain_site.ru'),  
    7.     ),  
    8.     ...  
    9.     'user'=>array(  
    10.         // enable cookie-based authentication  
    11.         'allowAutoLogin'=>true,  
    12.         'identityCookie' => array('domain' => '.domain_site.ru'),  
    13.     ),  
    14.     ...  
    15. ),  
    16. ...  

    После этих изменений необходимо очистить cookie в браузере + очистить кэш скрипта.

    Обычно, кэш самого скрипта хранится в protected/runtime/cache.

    Однако, можно задать и свою папку для хранения кэша. Это делается в конфигурационном файле.

    После:

    1. 'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',  

    Пропишите:

    1. 'runtimePath' => Yii::getPathOfAlias('system') . '/../my_cache_folder/',  

    После этого кэш будет храниться от "корня" сайта (где находится index.php) в папке "my_cache_folder".

     

  2. Сортировка по удалённости от текущего объекта.

    Задача: на примере Open Real Estate CMS при просмотре объявления вывести "Похожие объявления" в порядке возрастания расстояния от текущего местоположения объекта.

    Решение:

    В таблице {prefix}_apartment хранятся координаты местоположения каждого объекта (объявления). Это поля lat и lng.

    За формирование условия ($criteria) похожих объявлений отвечает метод viewSimilarAds в файле protected\modules\similarads\components\SimilarAdsWidget.php.

    В этом файле вместо:

    1. $criteria->order = 't.id ASC';  

    Пропишите:

    1. $tmp[] = '*';  
    2. $tmp[] = new CDbExpression('( 6371 * acos( cos( radians('.$data->lat.') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('.$data->lng.') ) + sin( radians('.$data->lat.') ) * sin( radians( lat ) ) ) ) AS distance');  
    3. $criteria->select = $tmp;  
    4. $criteria->having = 'distance < 40';  
    5. $criteria->order = 'distance';  

    , где: "6371" - радиус земли в километрах, а "40" - максимальная удалённость в километрах

     

    Также можно вывести расстояние от просматриваемого объекта.

    Для этого в файле protected\modules\apartments\models\Apartment.php после:

    1. public $title;  

    необходимо добавить:

    1. public $distance;  

    Затем в файле protected\modules\similarads\views\widgetSimilarAds_list.php после:

    1. echo '<div class="similar-price">'.tt('Price from''apartments').': '.$item->getPrettyPrice().'</div>';  

    добавить:

    1. echo '<div class="similar-descr">От данного объекта: '.round($item->distance, 1).' километров</div>';  

     

  3. Вывод даты в родительном падеже.

    Часто спрашивают "Как вывести дату в родительном падеже?".

    Например: в таблице БД хранится дата добавления ( объявления, новости, статьи и т.п) в виде: "2014-03-01 10:45:50".

    Необходимо вывести "1 марта 2014 г." вместо "2014-03-01 10:45:50".

    Однако, не стоит забывать, что на разных языках разный формат вывода. На помощь придёт dateFormatter.

    Всё, что необходимо - это одна строка кода:

    1. echo Yii::app()->dateFormatter->format(Yii::app()->locale->getDateFormat('long'), CDateTimeParser::parse("2014-03-01 10:45:50"'yyyy-MM-dd hh:mm:ss'));  

    Здесь используется формат 'long', который уже задан в файле framework/i18n/data/ru_ru.php фреймворка Yii. Откройте этот файл и ознакомьтесь с заданными в нём значениями.

    1. ...  
    2. 'dateFormats' =>   
    3.   array (  
    4.     'full' => 'EEEE, d MMMM y \'г\'.',  
    5.     'long' => 'd MMMM y \'г\'.',  
    6.     'medium' => 'dd.MM.yyyy',  
    7.     'short' => 'dd.MM.yy',  
    8.   ),  
    9.   'timeFormats' =>   
    10.   array (  
    11.     'full' => 'H:mm:ss zzzz',  
    12.     'long' => 'H:mm:ss z',  
    13.     'medium' => 'H:mm:ss',  
    14.     'short' => 'H:mm',  
    15.   ),  
    16. ...  

    т.е вместо Yii::app()->locale->getDateFormat('long'), если на сайте только русский язык, то достаточно прописать:

    1. echo Yii::app()->dateFormatter->format('d MMMM y \'г\'.', CDateTimeParser::parse("2014-03-01 10:45:50"'yyyy-MM-dd hh:mm:ss'));      

     

Обсудить статью на форуме