Программирование, веб-кодинг, Расширения, виджеты

Модуль статичных страниц для Yii2 (bupy7/yii2-pages)

Удобный модуль для управления содержимым статичных страниц.

Модуль статичных страниц для Yii2 (bupy7/yii2-pages)

Потрясающий модуль - https://github.com/bupy7/yii2-pages. Использует Imperavi Redactor для текстового поля. Устанавливаем через composer.


Настройка модуля yii2-pages

Приведу свою настройку модуля в конфиге config/web.php. Так как использую ещё расширение yii2-users, поэтому прописал ruleConfig.

'modules' => [
        ...
        'pages' => [
            'class' => 'bupy7\pages\Module',
            'controllerMap' => [
                'manager' => [
                    'class' => 'bupy7\pages\controllers\ManagerController',
                    'as access' => [
                        'class' => yii\filters\AccessControl::className(),
                        'ruleConfig' => [
                            'class' => yii\filters\AccessRule::className(),
                        ],
                        'rules' => [
                            [
                                'allow' => true,
                                'roles' => ['admin'],
                            ],
                        ],
                    ],
                ],
            ],
            'pathToImages' => '@webroot/images',
            'urlToImages' => '@web/images',
            'pathToFiles' => '@webroot/files',
            'urlToFiles' => '@web/files',
            'uploadImage' => true,
            'uploadFile' => true,
            'addImage' => true,
            'addFile' => true,
        ],
    ],


По пути - /pages/manager/index открывается менеджер страниц

Сами страницы, например - /pages/about - где 'about' это значение поля Алиас для конкретной страницы.


Свой вид (или шаблон) для разных статических страниц в yii2-pages

Возникла необходимость сделать редактируемым текст на странице контакты. Но там уже есть своя структура страницы, в частности присутствует и работает форма отправки письма обратной связи. То есть нужно для этой страницы другой вид, не такой как для всех остальных статичных страниц. Хорошо бы подошло для таких вещей расширение yii2-block, но там нет визуального редактора для оформление текста (там aceeditor, который больше подходит программистам, кто только кодом работает, а менеджеру сайта, не понимающему теги html тот редактор не годится). В yii2-pages же - обычный Imperavi Redactor.

Соответственно в контроллере SiteController есть метод actionContact(). Сразу замечу, что для капчи я использую гугловскую рекапчу, которая подключаемся в виде, поэтому мне не понадобится стандартную капчу прописывать в actions() в новом DefaultController перекрывающем оригинальный DefaultController в расширении yii2-pages.

Итак, через controllerMap перекрываю контроллер своим

В конфиге

'modules' => [
        ...
        'pages' => [
            'class' => 'bupy7\pages\Module',
            'controllerMap' => [
                'manager' => [
                    'class' => 'app\controllers\ManagerController',
                    'as access' => [
                        'class' => yii\filters\AccessControl::className(),
                        /*'ruleConfig' => [
                            'class' => yii\filters\AccessRule::className(),
                        ],*/
                        'rules' => [
                            // allow authenticated users
                            [
                                'allow' => true,
                                'roles' => ['@']
                            ],
                        ],
                    ],
                ],
                'default' => [
                    'class' => 'app\controllers\DefaultController',
                    /*'on beforeAction' => function($event) {
                            // see content of $event
                            $event->action->controller->layout = '/contacts';
                    }*/
                ],
            ],
            'pathToImages' => '@webroot/images/static-pages',
            'urlToImages' => '@web/images/static-pages',
            'pathToFiles' => '@webroot/files/static-pages',
            'urlToFiles' => '@web/files/static-pages',
            'uploadImage' => true,
            'uploadFile' => true,
            'addImage' => true,
            'addFile' => true,
        ],
        'block' => [
            'class' => 'wolfguard\block\Module',
        ],
    ],

Сам мой перекрывающий контроллер (изменил только actionIndex и унаследовал его от базового) app/controllers/DefaultController.php

<?php

namespace app\controllers;

use Yii;
use yii\web\Controller;
use bupy7\pages\models\Page;
use yii\web\NotFoundHttpException;
use bupy7\pages\Module;
use bupy7\pages\controllers\DefaultController as BaseDefaultController;
use app\models\ContactForm;

/**
 * View pages of module.
 * 
 * @author Belosludcev Vasilij <a href="http://mihaly4.ru">http://mihaly4.ru</a>
 * @since 1.0.0
 */
class DefaultController extends BaseDefaultController
{
    
    /**
     * View of page by alias.
     * @param string $page Alias of page.
     * @see Page::$alias
     */
    public function actionIndex($page, $view = 'index')
    {
        $model = $this->findModel($page);
        
        if($page=='contacts') { 
            $view='contacts';
            
            $model2 = new ContactForm();
        
            $model2->subject = Yii::$app->getRequest()->getQueryParam('subject'); 
            if ($model2->load(Yii::$app->request->post()) && $model2->contact(Yii::$app->params['adminEmail'])) {
                Yii::$app->session->setFlash('contactFormSubmitted');

                return $this->refresh();
            } else {
                return $this->render('contacts', [
                    'model' => $model,
                    'model2' => $model2,
                ]);
            }
        
        }else{
            return $this->render($view, [
                'model' => $model,
            ]);
        }
    }
    
}

И добавил вид для страницы Контакты views/default/contacts.php

<?php
use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
//use yii\captcha\Captcha;

/* @var $this yii\web\View */
/* @var $model bupy7\pages\models\Page */

if (empty($model->title_browser)) {
    $this->title = $model->title;
} else {
    $this->title = $model->title_browser;
}
if (!empty($model->meta_description)) {
    $this->registerMetaTag(['content' => Html::encode($model->meta_description), 'name' => 'description']);
}
if (!empty($model->meta_keywords)) {
    $this->registerMetaTag(['content' => Html::encode($model->meta_keywords), 'name' => 'keywords']);
}
?>

<div class="row">
    <div class="col-md-12">
        <h1><?= Html::encode($model->title); ?></h1>
    </div>
</div>

<?php if (Yii::$app->session->hasFlash('contactFormSubmitted')): ?>

    <div class="alert alert-success">
        Спасибо за сообщение! Мы скоро ответим.
    </div>
    <?php else: ?>

    <div class="row">
        <div class="col-md-7">    
            <?= $model->content; ?>
        </div>
        
        <div class="col-md-5">
            <div class="panel panel-default">
            <div class="panel-body">
            <?php $form = ActiveForm::begin([
                    'id' => 'contact-form'
                ]); ?>
                <?= $form->field($model2, 'name') ?>
                <?= $form->field($model2, 'email') ?>
                <?= $form->field($model2, 'subject') ?>
                <?= $form->field($model2, 'body')->textArea(['rows' => 6]) ?>
                <?= $form->field($model2, 'reCaptcha', ['template' => '{input}'])->widget(
                    \himiklab\yii2\recaptcha\ReCaptcha::className()
                    //['widgetOptions'=>['class'=>'text-right']]
                ) ?>
                <?/*= $form->field($model, 'verifyCode')->widget(Captcha::className(), [
                    'template' => '<div class="row"><div class="col-lg-6">{image}</div><div class="col-lg-6">{input}</div></div>',
                ]) */?>
                <div class="form-group">
                    <?= Html::submitButton('Отправить', ['class' => 'btn btn-primary btn-lg', 'name' => 'contact-button']) ?>
                </div>
            <?php ActiveForm::end(); ?>
            </div>
            </div>
        </div>
            
    </div>

    <?php endif; ?>




По мотивам – http://mihaly4.ru/blog/yii2/post/modul-statichnyh-stranic-dlya-yii2