Skip to content
Permalink
master
Switch branches/tags
Go to file
 
 
Cannot retrieve contributors at this time
471 lines (356 sloc) 15.7 KB

FAQ

Разные вопросы

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

Как показать 404-страницу вместо редиректа на главную?

В данный момент в проекте если страница отсутствует, настроен редирект на главную страницу сайта. Это сделано для улучшения SEO-показателей. Но, если вы хотите отобразить 404 страницу, в config.php в настройках components необходимо добавить

'components' => [
    'seo' => [
        'isRedirectNotFoundHttpException' => false
    ]
]

Как правильно сделать resize изображений?

Вот так можно получить ссылку на resize изображения.

echo \Yii::$app->imaging->thumbnailUrlOnRequest($model->image ? $model->image->src : null,
     new \skeeks\cms\components\imaging\filters\Thumbnail([
         'w' => 0,
         'h' => 200,
     ]), $model->code
);

Как можно загрузить файл в хранилище?

Скачать с удаленного сервер и загрузить в хранилище

$imageUrl = 'http://test.ru/test.jpg';
$element = \skeeks\cms\models\CmsContentElement::find(10);

$file = \Yii::$app->storage->upload($imageUrl, [
    'name' => $element->name
]);

$element->link('image', $file);

Как правильно поймать событие отправки формы в конструкторе

Чаще всего, возниает необходимость отлавливать события успешной отправки формы, и сообщать о них в yandex или google метрику. Для этого предлагается использовать следующий код:

<?
\yii\bootstrap\Modal::begin([
      'header' => 'Обратная связь',
      'id' => 'sx-feedback',
      'toggleButton' => false,
      'size' => \yii\bootstrap\Modal::SIZE_DEFAULT
  ]);
?>
    <?= \skeeks\modules\cms\form2\cmsWidgets\form2\FormWidget::widget([
        'form_code' => 'feedback',
        'namespace' => 'FormWidget-feedback',
        'viewFile' => 'with-messages',
        'successJs' => new \yii\web\JsExpression(<<<JS
        console.log('successJs');
        //yaCounter17836507.reachGoal('btn-send');
JS
    ),
    'errorJs' => new \yii\web\JsExpression(<<<JS
        console.log('errorJs');
JS
    ),
        //'viewFile' => '@app/views/widgets/FormWidget/fiz-connect'
    ]); ?>
<?
    \yii\bootstrap\Modal::end();
?>

Как отметить обязательные поля в формах *

Для того чтобы добавить во все формы генерируемые стандартными средствами yii2, звездочки * обязтельных полей. Глобально на стринце можно подключить js и css.

$(function()
{
    $('.form-group.required label').each(function()
    {
        $(this).append($('<span class="sx-from-required">').text(' *'));
    });
});
.sx-from-required
{
    color: red;
    font-weight: bold;
}

Как изменить timeout pjax?

Для того, чтобы изменить timeout pjax, глобально во всех виджетах pjax проекта, можно добавить код javascript:

$(function()
{
    $.pjax.defaults.timeout = 30000;
});

Как вызвать событие в момент окончания работы pjax-скрипта с определенным id?

Для того, чтобы изменить вызвать событие в момент окончания работы pjax-скрипта, можно добавить код javascript:

$(document).on('pjax:complete', function (e) {
//любой pjax на странице закончился
   if (e.target.id == self.get('id')) {
   //pjax с конкретным id закончился $(e.target)
   }
});

Оптимальный robots.txt

User-agent: *
Disallow: /~*
Disallow: /search*
Disallow: *&SearchProductsModel*
Disallow: *?SearchProductsModel*
Disallow: *&SearchRelatedPropertiesModel*
Disallow: *?SearchRelatedPropertiesModel*
Disallow: *&ProductFilters*
Disallow: *?ProductFilters*
Clean-Param: from&_openstat&utm_source&utm_medium&utm_campaign&utm_content&utm_term&pm_source&pm_block&pm_position&clid&yclid&ymclid&frommarket&text
Host: https://your-site.com
Sitemap: https://your-site.com/sitemap.xml

Как включить js, css и html оптимизацию?

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

https://github.com/skeeks-cms/cms-assets-auto-compress

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

SkeekS CMS

Как подключить свой jquery в сайтовой части?

Одним из вариантов может быть следующий пример:

В конфиг файле проекта @frontend/config/main.php добавить:

'components' =>
[
    'view'    => [
        'on beforeRender' => function () {
            if (!\skeeks\cms\backend\BackendComponent::getCurrent()) {
                \Yii::$app->assetManager->bundles['yii\web\JqueryAsset'] = [
                    'class' => '\frontend\assets\YourJqueryAsset',
                ];
            }
        },
    ],
]

frontend\assets\YourJqueryAsset :

namespace frontend\assets;

/**
 * @author Semenov Alexander <semenov@skeeks.com>
 */
class DigiproJsPluginsAsset extends DigiproAsset
{
    public $sourcePath = '@webroot/';
    public $css = [];

    public $js = [
        'jquery-version.min.js',
    ];

    public $depends = [];
}

Как задать основной хост проекта?

'components' =>
[
    'seo' => [
        'canUrl' => [
            'host' => 'main-host.com',
            'scheme' => 'https'
        ]
    ],
]

Как отправить форму через ajax

<?php $form = \skeeks\cms\base\widgets\ActiveFormAjaxSubmit::begin([
                'action' => Url::to('/module/controller/action'),
                'validationUrl' => Url::to('/module/controller/validate-action'),
                'clientCallback' => <<<JS
    function(ActiveFormAjaxSubmit)
    {
        ActiveFormAjaxSubmit.on('error', function(e, data)
        {
            alert(data.message);
        });

        ActiveFormAjaxSubmit.on('success', function(e, data)
        {
            alert("Успешно отправлена");
        });
    }
JS

            ]); ?>
    <?= $form->field($model, 'email') ?>

    <div class="form-group">
        <?= Html::submitButton("<i class=\"glyphicon glyphicon-off\"></i> Зарегистрироваться", ['class' => 'btn btn-primary', 'name' => 'login-button']) ?>
    </div>

<?php \skeeks\cms\base\widgets\ActiveFormAjaxSubmit::end(); ?>

Как добавить нестандартный фильтр в BackendModelStandartController?

Часто требуется создать фильтры не по полям из указанной модели, а по полям из других моделей, связанных с указанной. Пример для поля поиск:

'filtersModel' => [
    'rules'            => [
        ['q' 'safe'],
    ],
    'attributeDefines' => [
        'q'
    ],
    'fields' => [
        'q' => [
            'label'          => 'Поиск',
            'elementOptions' => [
                'placeholder' => 'Поиск (Email, Название)',
            ],
            'on apply'       => function (QueryFiltersEvent $e) {
                /**
                 * @var $query ActiveQuery
                 */
                $query = $e->dataProvider->query;

                if ($e->field->value) {
                    $query->andWhere([
                        'or',
                        ['like', Model::tableName().'.name', $e->field->value],
                        ['like', Model::tableName().'.email', $e->field->value],
                    ]);
                }

            },
        ],
    ],
]

По определению новое поле будет создано как текстовое. Чтобы изменить отображение поля, необходимо происвоить полю нужный класс. Пример для поля с селектом по разным условиям:

'filtersModel' => [
    'rules'            => [
        ['custom_condition', 'safe'],
    ],
    'attributeDefines' => [
        'custom_condition'
    ],
    'fields' => [
        'custom_condition' => [
            'class' => SelectField::class,
            'label'          => 'Произвольное условие',
            'items' =>  function()
            {
                return  [
                    '--' => '--',
                    'condition' => 'Условие 1',
                    'condition2' => 'Условие 2',

                ];
            },

            'on apply'       => function (QueryFiltersEvent $e) {
                /**
                 * @var $query ActiveQuery
                **/
                $query = $e->dataProvider->query;

                    if ($e->field->value == 'condition') {
                        $query->andWhere(['IS NOT', Model::tableName().'.someCol', NULL]);

                    }
                    if ($e->field->value == 'condition2') {
                        $query->andWhere(['IS', Model::tableName().'.someCol', NULL]);

                    }

            },
        ],
    ],
]

Пример для поля с возможностью выбора вариантов условия из встроенного фильтра FilterMode

'filtersModel' => [
    'rules'            => [
        ['custom_condition', 'safe'],
    ],
    'attributeDefines' => [
        'custom_condition'
    ],
    'fields' => [
        'custom_condition' => [
            'class' => FilterField::class,
            'label'          => 'Поиск',
            'filterAttribute' => 'nameCol',
            'modes' => [
                FilterModeEq::class,
                FilterModeLike::class,
                FilterModeNe::class,
                FilterModeEmpty::class,
                FilterModeNotEmpty::class
            ],
        ],
    ],
]

Пример для поля с возможностью выбора вариантов условия из встроенного фильтра FilterMode с изменением текстового поля на селект с укзанными вариантами:

'filtersModel' => [
    'rules'            => [
        ['custom_condition', 'safe'],
    ],
    'attributeDefines' => [
        'custom_condition'
    ],
    'fields' => [
        'custom_condition' => [
            'class' => FilterField::class,
            'label'          => 'Поиск',
            'filterAttribute' => 'nameCol',
            'modes' => [
                FilterModeEq::class,
                FilterModeLike::class,
                FilterModeNe::class,
                FilterModeEmpty::class,
                FilterModeNotEmpty::class
            ],
            'field' => [
                'class' => SelectField::class,
                'items' => function() {
                    return  [
                        '--' => '--',
                        'condition' => 'Условие 1',
                        'condition2' => 'Условие 2',
                    ];
                }
            ],
        ],
    ],
]

В каждом случае обязательно указать название нового поля в rules и attributeDefines. Для FilterMode в filterAttribute обязательно указать связующее с моделью поле. В modes перечисляются возможные варианты условий. ВАЖНО! В поле items необходимо использовать function(), тогда отрабатывать функция будет только при отображениее фильтра. Это позволит съэкономить память и ресурсы сервера.

Перенос проекта на другой хостинг

Архивация

Создать актуальный архив базы данных

php yii dbDumper/mysql/dump

Создать архив вашего проекта

Восстановление

1. Скачать файлы проекта

Развернуть архив, или склонировать проект из git репозитория

2. Установка composer и зависимостей

# Download latest version of composer in project
curl -sS https://getcomposer.org/installer | COMPOSER_HOME=.composer php
# Download dependency
COMPOSER_HOME=.composer php composer.phar install -o

3. Configuring the database

Прописать коннект к базе данных common/config/db.php

4. Installation of migrations

#Installation of ready-dump
php yii dbDumper/mysql/restore