События ВИДЖЕТа SortableGridView не работаю. Pull request create

Уже исправленные репорты или принятые предложения
Ответить
vios
Сообщения: 2
Зарегистрирован: 2017.08.08, 12:43

События ВИДЖЕТа SortableGridView не работаю. Pull request create

Сообщение vios » 2017.08.08, 13:26

Попытаюсь объяснить сложившуюся ситуацию.
Для начала, стартовое состояния.
  • view*goods
в представлении товара, есть виджет SortableGridView, с настройками, внимания стоит поведения `as contextView`, которое вносит некоторый функционал при возникновении некоторых событий виджета, а именно EVENT_INIT, EVENT_BEFORE_RUN.

Код: Выделить всё

/**
 * @var $this \app\modules\bridge\infrastructure\AdminView
 */
use app\components\ViewBehavior;

...
echo SortableGridView::widget([
    'as contextView' => [ 'class' => ViewBehavior::className(), 'contextView' => $this],
    'dataProvider' => new ArrayDataProvider([..]),
    'showHeader' => false,
    'summary' => false,
    'columns' => [[..]],
    'orderUrl' => [..],
    'sortOptions' => [..],
]);
...
Запомнили, идем дальше.
  • view::class*AdminView
Существует класс для представления, пользовательский, создан для своих нужд на страницах админки, проверки, замена контекста и и т.д., это удобно в данном случае.
!! Следовательно, все виджеты должны подключать свои assets в данный контекст. Это делает поведения ViewBehavior
Пример:
vendor/sjaakp/yii2-sortable-behavior/SortableGridView.php:57

Код: Выделить всё

...
public function init()
    {
        parent::init();

        $classes = isset($this->options['class']) ? $this->options['class'] : '';
        $classes .= ' sortable';
        $this->options['class'] = trim($classes);

	// should be `\app\modules\bridge\infrastructure\AdminView` if call into `view/goods`
        $view = $this->getView();
        JuiAsset::register($view);
        ...
А теперь НО
  • behavior*ViewBehavior
Поведения которое устанавливает класс представления для виджетов.

Код: Выделить всё

<?php

namespace app\modules\bridge\submodules\admin\components;

use app\modules\bridge\infrastructure\AdminView;
use yii\base\Behavior;
use yii\base\View;
use yii\base\Widget;

/** Поведения виджета, без контекта вызова с админки */
class ViewBehavior extends Behavior
{
    /** @var  View */
    public $contextView;

    /** @inheritdoc */
    public function events() {
        return [
            Widget::EVENT_INIT => 'setContext',
            Widget::EVENT_BEFORE_RUN => 'setContext'
        ];
    }

    /**
     * Установка контекта
     */
    public function setContext() {
        /** @var Widget $oWidget */
        $oWidget = $this->owner;

        if (!($oWidget->getView() instanceof AdminView)){
            $oWidget->setView($this->contextView === null ? new AdminView() : $this->contextView);
        }
    }
}
В данном случае при инициализации виджета SortableGridView (который наследует GridView), не вызываются события, потому что класс родителя GridView теряет свое наследие (функционал вызовов (trigger) событий при инициализации) в функции своего родителя, абстрактном классе BaseListView

Код: Выделить всё

..
abstract class BaseListView extends Widget
{
	 /**
     	* Initializes the view.
     	*/
    	public function init()
    	{
        	//parent::init(); // here not call Widget init()
        	if ($this->dataProvider === null) {
SortableGridView->GridView->BaseListView*->Widget
Цепочка теряет inject events trigger в BaseListView

По данному поводу был создан запрос на слияния изменения
https://github.com/yiisoft/yii2/pull/14596

Надеюсь смог объяснить быстро, ситуацию, тест корректно затрудняюсь написать быстро. Это займет некоторое время.
Спасибо.

Аватара пользователя
samdark
Администратор
Сообщения: 9188
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: События ВИДЖЕТа SortableGridView не работаю. Pull request create

Сообщение samdark » 2017.08.17, 18:19

Доделал. Замёржил. Спасибо.

vios
Сообщения: 2
Зарегистрирован: 2017.08.08, 12:43

Re: События ВИДЖЕТа SortableGridView не работаю. Pull request create

Сообщение vios » 2017.08.17, 20:43

Очень признателен. И еще не скромный вопрос, а какой естимейт у мейлстона 2,0,13? Или определенных рамок нету, и будет закончен по закрытию всех открытых задач?

Ответить