Магазин на Yii2, часть 35. Админка: загрузка картинок для страниц и страница 404

29.09.2019

Теги: Web-разработкаYii2ИзображениеИнтернетМагазинКаталогТоваровПанельУправленияПрактикаФреймворк

При редактировании с помощью WYSIWYG-редактора страницы сайта может возникнуть необходимость загрузки изображений, так что установим файловый менеджер ELFinder. Кроме того, создадим отдельную страницу 404 Not Found для панели управления, потому что сейчас используется страница 404 общедоступной части сайта, что не очень удобно.

> composer require --prefer-dist mihaildev/yii2-elfinder "*"
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 4 installs, 0 updates, 0 removals
  - Installing studio-42/elfinder (2.1.50): Downloading (100%)
  - Installing bower-asset/jquery-ui (1.12.1): Loading from cache
  - Installing yiisoft/yii2-jui (2.0.7): Loading from cache
  - Installing mihaildev/yii2-elfinder (1.3.0): Downloading (100%)
studio-42/elfinder suggests installing kunalvarma05/dropbox-php-sdk (VolumeDriver `Dropbox`2 require `kunalvarma05/dropbox-php-sdk.)
studio-42/elfinder suggests installing google/apiclient (VolumeDriver GoogleDrive require `google/apiclient:^2.0.)
studio-42/elfinder suggests installing barryvdh/elfinder-flysystem-driver (VolumeDriver for elFinder to use Flysystem as a root.)
studio-42/elfinder suggests installing nao-pon/flysystem-google-drive (require in GoogleDrive network volume mounting with Flysystem.)
Package phpunit/phpunit-mock-objects is abandoned, you should avoid using it. No replacement was suggested.
Writing lock file
Generating autoload files

Расширение установлено. Теперь подключим и настроим его согласно инструкции. Для начала откроем файл config/web.php и добавим в него следующий код:

/*...*/
$config = [
    /*...*/
    'components' => [
        /*...*/
    ],
    'controllerMap' => [
        'elfinder' => [
            'class' => 'mihaildev\elfinder\PathController',
            'access' => ['?'], // доступ для всех
            'root' => [
                'path' => 'images/pages', // директория внутри web
                'name' => 'Изображения'
            ],
        ]
    ],
    'params' => $params,
];
/*...*/

Создадим директорию web/images/pages, куда будут загружаться изображения и изменим код вызова WYSIWYG-редактора:

<?php
/*
 * Форма для добавления и редактирования страницы, файл modules/admin/views/page/_form.php
 */
use app\modules\admin\models\Page;
use mihaildev\ckeditor\CKEditor;
use mihaildev\elfinder\ElFinder;
use yii\helpers\Html;
use yii\widgets\ActiveForm;

/* @var $this yii\web\View */
/* @var $model app\modules\admin\models\Page */
/* @var $form yii\widgets\ActiveForm */
?>

<?php $form = ActiveForm::begin(); ?>
    <?= $form->field($model, 'name')->textInput(['maxlength' => true]); ?>
    <?= $form->field($model, 'slug')->textInput(['maxlength' => true]); ?>
    <?php
    // при редактировании существующей страницы нельзя допустить,
    // чтобы в качестве родителя была выбрана эта же страница
    $exclude = 0;
    if (!empty($model->id)) {
        $exclude = $model->id;
    }
    echo $form->field($model, 'parent_id')->dropDownList(Page::getRootPages($exclude));
    ?>
    <?=
    /*
    $form->field($model, 'content')->widget(
        CKEditor::class,
        [
            'editorOptions' => [
                // разработанны стандартные настройки basic, standard, full
                'preset' => 'basic',
                'inline' => false, // по умолчанию false
            ],
        ]
    );
    */
    $form->field($model, 'content')->widget(
        CKEditor::class,
        [
            'editorOptions' => ElFinder::ckeditorOptions(
                'elfinder',
                [
                    // разработанны стандартные настройки basic, standard, full
                    'preset' => 'basic',
                    'inline' => false, // по умолчанию false
                ]
            ),
        ]
    );
    ?>
    <?= $form->field($model, 'keywords')->textarea(['rows' => 2, 'maxlength' => true]); ?>
    <?= $form->field($model, 'description')->textarea(['rows' => 2, 'maxlength' => true]); ?>
    <div class="form-group">
        <?= Html::submitButton('Сохранить', ['class' => 'btn btn-success']) ?>
    </div>
<?php ActiveForm::end(); ?>

Теперь создаем страницу 404 Not Found для панели управления. Yii2 не поддерживает отдельную от приложения обработку ошибок в модулях, обработчик ошибок является глобальным. Поэтому нужно перезаписать компонент errorHandler в классе модуля, установить его для приложения и зарегистрировать как обработчик ошибок.

<?php
namespace app\modules\admin;

use Yii;
use yii\web\ErrorHandler;

class Module extends \yii\base\Module {

    public $controllerNamespace = 'app\modules\admin\controllers';

    public function init() {
        parent::init();
        Yii::configure($this, [
            'components' => [
                'errorHandler' => [
                    'class' => ErrorHandler::class,
                    'errorAction' => 'admin/admin/error'
                ]
            ],
        ]);
        $handler = $this->get('errorHandler');
        Yii::$app->set('errorHandler', $handler);
        $handler->register();
    }
}

Добавляем метод actions() в класс контроллера AdminController:

<?php
namespace app\modules\admin\controllers;

use Yii;
use yii\web\Controller;

class AdminController extends Controller {
    public function beforeAction($action) {
        $session = Yii::$app->session;
        $session->open();
        if (!$session->has('auth_site_admin')) {
            $this->redirect('/admin/auth/login');
            return false;
        }
        return parent::beforeAction($action);
    }

    public function actions() {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
        ];
    }
}

И создаем view-шаблон:

<?php
/*
 * Файл modules/admin/views/admin/error.php
 */

/* @var $this yii\web\View */
/* @var $name string */
/* @var $message string */
/* @var $exception Exception */

use yii\helpers\Html;

$this->title = $name;
?>

<h1><?= Html::encode($this->title) ?></h1>
<div class="alert alert-danger">
    <?= nl2br(Html::encode($message)) ?>
</div>

Поиск: Web-разработка • Yii2 • Изображение • Интернет магазин • Каталог товаров • Панель управления • Фреймворк

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.