yiisoft / view

Yii view rendering library
https://www.yiiframework.com/
BSD 3-Clause "New" or "Revised" License
56 stars 44 forks source link

WebView in widgets #188

Closed Gerych1984 closed 3 years ago

Gerych1984 commented 3 years ago

Доброго дня. Столкнулся с такой проблемой/ошибкой. Сильно упрощенная версия моего виджета, который должен отрендерить форму:

<?php
declare(strict_types=1);

namespace App\Front\Source\Widget\Data;

use Yiisoft\View\ViewContextInterface;
use Yiisoft\View\WebView;
use Yiisoft\Assets\AssetManager;
use Yiisoft\Widget\Widget;

final class SearchFormWidget extends Widget implements ViewContextInterface
{
       private WebView $view;
       private AssetManager $assetManager;

       public function __construct(WebView $view, AssetManager $assetManager)
       {
              $this->view = $view;
              $this->assetManager = $assetManager;
       }

       public function getViewPath(): string
       {
              return __DIR__ . DIRECTORY_SEPARATOR . 'views'; //Вьюха лежит рядом с виджетом
       }

      protected function run(): string
      {
               return $this->view->withContext($this)->render('search-form');
      }

       protected function afterRun(string $result): string
       {
              // $this->assetManager->register([Какой-то-ассет::class]);
              $this->view->registerJs('Какой-то js код' . PHP_EOL);

              return parent::afterRun($result);
       }
}

Собственно проблема следующая:

  1. Если вызвать виджет так echo SearchFormWidget::widget(); (т.е. WebView попадает через DI), то форма рендерится нормально (метод run), но вызовы registerJs ничего не выводят в лэйауте
  2. Если принудительно вызвать с текущим WebView
    echo SearchFormWidget::widget([
    '__construct()' => [
        'view' => $this
    ]
    ]);

    то игнорируется указанный контекст и вью-файл ищется относительно директории указанной в настройках.

На данный момент закостылил таким образом

 public function __construct(WebView $view, WebView $innerView, AssetManager $assetManager)

соответственно

  1. $view - указываю я для вызовов registerJs
  2. $innerView - через DI, для рендера формы в указанном контексте.

Заранее благодарен

Gerych1984 commented 3 years ago

Прикладываю полную версию виджета. Закомментировал только неважный для теста параметр и поменял вью-файл

SearchForm.zip

samdark commented 3 years ago

Should be fixed in latest version. Going to tag it soon.