9 заметок с тегом

yii

Обернуть dump базы в миграцию Yii

На yii1 это делается следующим образом:

$this->executeSqlFile( __DIR__ . '/sql_query/' . 'example.sql');

В yii2 необходимо сделать так:

$this->execute( file_get_contents( __DIR__ . '/sql_query/' . 'example.sql'));
2016   dump   execute   executeSqlFile   yii   yii2
2016   comment   migrate   yii   yii2

Геокодирование от Яндекса, используя Yii

На Yii2 надо было мне реализовать обратное геокодирование. Я знаю город (населенный пункт), но не знаю координаты.

Лучший вариант — прикрутить гео от Яндекса или Гугла.
Прикручивать буду от Яндекса. Заглянул в github на готовые библиотеки для yii.
Есть отличный, я бы даже сказал, навороченный вариант от разработчиков Яндекса https://github.com/yandex-php/php-yandex-geo. По всем правилам ооп, написанный на хорошем php (еще бы:D). Но в нем куча ненужных мне функций (например работа с локалью, прямое гео и т. д.). Тащить лишнее в проект не хочется.

Порылся и нашел неплохой вариант https://github.com/vitalik74/yii2-geocode-yandex.
Реализован в виде отдельного класса, который можно подключить в любом месте проекта (я подключил его как модель). К тому же, данный класс позволяет работать только с обратным геокодированием.
В общем, я сэкономил добрые полчаса, котоые мне потребовались бы на написание обработчика с нуля.
Для удобства, я внес небольшие корректировки, которые учитывали специфику моей задачи:

Мне нужен только один ответ, а не массив ответов (т. к. название населенного пункта, район и страну я уже знаю):

public $results = 1;

У меня город, потому:

public $kind = 'locality';

В функции get массив $params я собираю сам, аттрибуты в функцию передаваться не будут:

...
public function get($geocode, array $params = [], $apiKey = '')
{
	$params = ['key' => $this->key, 'results' => $this->results, 'kind' => $this->kind ];
	...
}

Теперь, в нужном месте, мне достаточно определить класс:

$geo = new Geocode();
$result = $geo->get('Москва, Россия');

Соответственно переменная $result содержит все необходимые данные. В частности, необходимые мне координаты содержаться во вложенном массиве «Point»

2016   api   geo   yandex   yii   yii2   геокодер   Яндекс API

Создание Sitemap на Yii. Обновляем Sitemap по крону. Часть 2

Начало про Sitemap читаем здесь
Чтобы автоматизировать процесс обновления Sitemap, необходимо воспользоваться config/console.php.
Открываем этот файл на редактирование.
Здесь следует обратить внимание, чтобы UrlManager и подключение в Базе данных были настроены также, как и в главном config/main.php.
Далее, идем в protected/commands. Создаем файл CronCommand (ну или как вы сами захотите).

// Функция запускает обновление sitemap.xml
class CronCommand extends CConsoleCommand
{

    public function actionSitemapUpdate()
    {
        $priority = 0.7;
        $staticpages = array(  // статические страницы для sitemap
            '/', '/contacts'
        );
        
        Yii::import( 'application.extensions.Sitemap.*' );
        $assets = Yii::getPathOfAlias('application'). '/../assets/';
        $_SERVER['DOCUMENT_ROOT'] = $assets;
        
        $sitemap = new Sitemap($_SERVER['DOCUMENT_ROOT'].'sitemap.xml');
        
	// Сначала обработаем все статичные страницы, выставим им приоритет 1
        foreach ($staticpages as $staticpage) {
            $sitemap->addItem(Yii::app()->createAbsoluteUrl($staticpage), time(), Sitemap::DAILY, 1);
        }
        echo 'статика обновлена' . PHP_EOL;
        
        
        // Новости, статьи, любая другая динамически обновляемая информация (для них приоритет будет 0.7)
        $news = Yii::app()->db->createCommand()
                    ->select( array('type', 'alias') )
                    ->from( '{{news}}' )
                    ->where( ' state=2' )
                    ->queryAll();
        
        $types = array(
            1 => array('label'=>'Новости', 'alias'=>'news'),
            2 => array('label'=>'Статьи', 'alias'=>'articles'),
        );
        
        foreach ($news as $new) {
            $news_alias = Yii::app()->createAbsoluteUrl($types[ $new['type'] ]['alias'].DIRECTORY_SEPARATOR.$new['alias']);
            $sitemap->addItem($news_alias, time(), Sitemap::DAILY, $priority);
        }
        echo 'Новости, статьи обновлены' . PHP_EOL;
        
        // write it
        $sitemap->write();
        echo 'sitemap.xml обновлен' . PHP_EOL;
        
    }

}

Запускаемся командой в консоли:

./yiic cron sitemapUpdate
2015   cron   sitemap   yii

Указать title для вывода во view на Yii1 и Yii2

Работа во view с $this изменилась, и старыми методами в Yii2 теперь не получится работать.

Вывести title
В контроллере указать title:

$this->view->title = 'Заголовок, который будет выведен в H1';

После этого во view в нужном месте укажите:

<h1><?= $this->title; ?></h1>
2015   title   view   yii   yii2

Создание Sitemap на Yii. Часть 1

Данный пост навеян статьей Александра Макарова и его библиотеки для создания Sitemap https://github.com/samdark/sitemap
Создаем SitemapController.
Файл sitemap.xml можем сохранить в публичной директории, которая игнорируется git-ом, например в assets.
В Yii2 еще проще, есть настроенные неймспейсы, а в Yii1 можем сложить расширение в extensions:
/protected/extensions/Sitemap/Sitemap.php

Чтобы использовать в Yii1, закомментирйте:

// namespace samdark\sitemap;
// use XMLWriter;

Далее, сам контроллер:

class SitemapController extends SController
{
    public $priority = 0.7; // Начальный приоритет ссылки
    public $staticpage = array(  // статические страницы для sitemap
                '/', '/contacts', '/about'
            );
    
    public function actionIndex(  )
    {
        Yii::import( 'application.extensions.Sitemap.*' );
        $sitemap = new Sitemap(Yii::getPathOfAlias('webroot.assets') . '/sitemap.xml');
        
        foreach ($this->staticpage as $staticpage) {
            $sitemap->addItem(Yii::app()->createAbsoluteUrl($staticpage), time(), Sitemap::DAILY, 1);
        }
        
        // Подтянем модель, например, Новостей с сайта
        Yii::import( 'application.models.News' );
        $criteria=new CDbCriteria;
        $criteria->select=array('alias'); // Нам нужен только алиас Новости, чтобы собрать ссылку
        $news = News::model()->published()->findAll($criteria);
        foreach ($news as $item) {
            $news_alias = Yii::app()->createAbsoluteUrl($item->alias);
            $sitemap->addItem($news_alias, time(), Sitemap::DAILY, $this->priority);
        }
        
        // write ithttps://opotemkin.ru/all/sozdanie-sitemap-na-yii-obnovlyaem-sitemap-po-kronu-chast-2/
        $sitemap->write();

    }

}

В итоге xml будет доступна по адресу www.Ваш-сайт.ru/assets/sitemap.xml
Здесь читаем продолжение...

2015   php   sitemap   yii

Текущий контроллер/модель/экшн в Yii и Yii2

Очень часто необходимо знать, какой текущий Контроллер или, например, Модель. Такое пригодится, чтобы при определенных условиях действовало какое-либо правило. В качестве примера пусть будет следующее:
В экшне «actionIndex» Контроллера SiteController показывается статичный заголовок «Добро пожаловать, земляне!».
При этом, данное правило должно действовать в layout, т. к. Заголовок задается в нем:

if (Yii::$app->controller->id == 'site' && Yii::$app->controller->action->id == 'index')
{
	echo 'Добро пожаловать, земляне!';
}

Т. к. ситуации бывают разные, то я просто приведу примеры для Yii1 и Yii2:

текущий Контроллер:

Yii::$app->controller->id

получить Контроллер в качестве объекта:

Yii::$app->controller

текущий Экшн:

Yii::$app->controller->action->id

А если нужен полный путь, то можно так его получить:

Yii::$app->controller->route

или, ели обратиться внутри контроллера:

$this->route

А из представления так:

$this->context->route

Для Yii1 все практически идентично.
текущий Контроллер:

Yii::app()->controller->id

а можно и так:

Yii::app()->controller->getId()

текущий Экшн:

Yii::app()->controller->action->id

текущий Модуль:

Yii::app()->controller->module->id

Если надо получить текущий Контроллер и Экшн в формате «контроллер/экшн», то:

Yii::app()->controller->getRoute()
2015   php   yii   yii2

Для CHtml::activeCheckBox() отключить второй Input

Стандартно инпут имеет аттрибут value, значение которого передается на сервер, если выставлен флаг. Но иногда необходимо передать определенное значение, если флаг снят. Вот здесь и поможет аттрибут «uncheckValue».
Вы просто делаете так:

CHtml::activeCheckBox( $var, 'model_per', array('uncheckValue'=>'12333') );

Если данный параметр не задан, то по умолчанию будет создан еще один инпут. Т. е. по факту их будет формироваться два, только один из них будет иметь аттрибут type=«hidden»:

<input id="ytModel_name" type="hidden" value="0" name="Model[name]" />
<input name="Model[name]" id="Model_name" value="1" checked="checked" type="checkbox" />

Если вы хотите, чтобы при снятии флага на сервер не отправлялось значение, то выставите uncheckValue = NULL:

CHtml::activeCheckBox( $var, 'model_per', array('uncheckValue'=>null) );
2015   activeCheckBox   CHtml   php   yii

Быстро на Yii получить домен из поддомена

В принципе текущая ситуация может быть разрешена на любом фреймворке, либо непосредственно прямо на PHP, но данный пример на yii. Я увидел в одном из проектов, с которым работал, и к сожалению не знаю кто автор, но решил, что код будет интересен всем:

$host = substr( Yii::app()->getRequest()->getHostInfo(), strpos( Yii::app()->getRequest()->getHostInfo(), "." ) + 1 );

А далее просто добавляем http или https:

echo 'http://' . $host ;

код на gostash.it

2015   php   yii