Страница 1 из 1

Widget yii2

Добавлено: 2017.02.09, 11:31
Jettecs
Вывожу вот такой код

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

 <?php Portlet::begin()?>
потом вывожу свои данные и затем

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

 <?php Portlet::end()?>
Begin and End должны выводить часть разметки которая мне необходима. Но по итогу ничего не выводит. Begin и End я переопределил, через var_dump выводится все так как мне надо. Как добиться необходимого вывода

Re: Widget yii2

Добавлено: 2017.02.09, 12:10
Alexum
Jettecs писал(а):
2017.02.09, 11:31
Begin и End я переопределил...
"Я тут поломал виджет, почему он не работает?". Как минимум покажите код своих методов.

Re: Widget yii2

Добавлено: 2017.02.09, 12:18
Jettecs
Alexum писал(а):
2017.02.09, 12:10
Jettecs писал(а):
2017.02.09, 11:31
Begin и End я переопределил...
"Я тут поломал виджет, почему он не работает?". Как минимум покажите код своих методов.

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

 public static function begin($config = [])
    {
        $config['class'] = get_called_class();
        /* @var $widget Widget */
        $widget = Yii::createObject($config);
        static::$stack[] = $widget;
            $test="<div class='portlet'><br />";

        return $test;
    }

    public static function end()
    {
        if (!empty(static::$stack)) {
            $widget = array_pop(static::$stack);
            if (get_class($widget) === get_called_class()) {
                echo $widget->run();
                $test2="</div>";
                return $test2;
            } else {
                throw new InvalidCallException('Expecting end() of ' . get_class($widget) . ', found ' . get_called_class());
            }
        } else {
            throw new InvalidCallException('Unexpected ' . get_called_class() . '::end() call. A matching begin() is not found.');
        }
    }

Re: Widget yii2

Добавлено: 2017.02.09, 12:37
satoved
Begin и end должны возвращать сам объект виджета, а вывод осуществляется обычным echo сразу.

У вас же выводится только:

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

echo $widget->run();
А по умолчанию run() пустой.

Re: Widget yii2

Добавлено: 2017.02.09, 12:40
Jettecs
satoved писал(а):
2017.02.09, 12:37
Begin и end должны возвращать сам объект виджета, а вывод осуществляется обычным echo сразу.

У вас же выводится только:

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

echo $widget->run();
А по умолчанию run() пустой.
нет не каких echo. Вывод должен происходить после инициализации. Вот после этого должна вывестись первая часть разметки <?Portlet::begin() ?> а после этого <?Portlet::end() ?> вторая

Re: Widget yii2

Добавлено: 2017.02.09, 12:41
satoved
Соответственно должно работать:

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

 public static function begin($config = [])
    {
        $config['class'] = get_called_class();
        /* @var $widget Widget */
        $widget = Yii::createObject($config);
        static::$stack[] = $widget;
        
        echo "<div class='portlet'><br />";

        return $widget;
    }

    public static function end()
    {
        if (!empty(static::$stack)) {
            $widget = array_pop(static::$stack);
            if (get_class($widget) === get_called_class()) {
                echo $widget->run();
                echo "</div>";
                return $widget;
            } else {
                throw new InvalidCallException('Expecting end() of ' . get_class($widget) . ', found ' . get_called_class());
            }
        } else {
            throw new InvalidCallException('Unexpected ' . get_called_class() . '::end() call. A matching begin() is not found.');
        }
    }

Re: Widget yii2

Добавлено: 2017.02.09, 12:44
satoved
Окей, если вам так нравится, тогда сделайте так:

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

<?= Portlet::begin() ?>
<?= Portlet::end() ?>

Re: Widget yii2

Добавлено: 2017.02.09, 12:51
zelenin
в yii2 же нет portlet. поэтому непонятно как работает оригинальный переопределенный виджет.