web-dev-qa-db-ja.com

Joomla 4でビューの場所を設定する方法

私はJoomla 4用にDogWalkというコンポーネントを再構築しています。コアBannersコンポーネントが実行していることを正確に実行しようとしました。私は自分のファイルに名前を付けて名前空間を付け、ディレクトリにはBannersと同じように名前を付けましたが、BaseControllerを取得してビューファイルを見つけることができません。

$this->pathsからBaseController::createView配列をダンプしています。パスはBannersDogWalkで同じです。

array (size=1)
  'view' => 
    array (size=1)
      0 => string '/Users/mystuff/Sites/joomla4/administrator/components/com_dogwalk/views/'

しかし、私のコンポーネントはmycomponentViewviewnameというファイルを探していますが、Banners(および他のすべての管理コンポーネント)の実際のビュークラス名はHtmlViewだけです。さらに、Bannersビュークラスは、Viewではなくviewsにありますが、見つかります($config配列の内容にかかわらず)。

コントローラーがビューを見つける場所、およびコントローラーが使用する命名規則を定義するにはどうすればよいですか?

1
user101289

助けてくれたすべての人に感謝します。問題はservicesファイルであり、パスやネームスペースではないようです。 administrator/services/provider.phpにファイルを追加すると、すべてが自動的に機能し始めました。ファイルは次のようになります。

return new class implements ServiceProviderInterface
{
    /**
     * Registers the service provider with a DI container.
     *
     * @param   Container  $container  The DI container.
     *
     * @return  void
     *
     * @since   4.0.0
     */
    public function register(Container $container)
    {
        $container->registerServiceProvider(new MVCFactory('\\Mycompany\\Component\\Mycomponent'));
        $container->registerServiceProvider(new ComponentDispatcherFactory('\\Mycompany\\Component\\Mycomponent'));

        $container->set(
            ComponentInterface::class,
            function (Container $container)
            {
                $component = new CategoriesComponent($container->get(ComponentDispatcherFactoryInterface::class));

                $component->setMVCFactory($container->get(MVCFactoryInterface::class));
                $component->setRegistry($container->get(Registry::class));

                return $component;
            }
        );
    }
};

追加する必要があるもう1つのことは、adminディレクトリとsite DisplayControllerディレクトリの両方にあるジェネリックControllerです。

0
user101289

Joomla 3で使用されているコンポーネントがMycomponentViewViewnameを探しているビューファイルです。そのため、適切なコントローラークラスをコントローラーで拡張していることを確認してください(つまり、_Joomla\CMS\MVC\Controller\BaseController_またはそれを拡張するその他のクラス) AdminController)として。正しい名前空間からのものである場合は、setView()を追跡して、問題を引き起こす可能性のあるそのような変更がないか確認します。

これで問題が解決しない場合は、フロー全体をデバッグすることもできます。しかしその前に、デフォルトのパラメーターで他の新しいJoomla 4セットアップで拡張機能を実行することをお勧めします(コードの変更やプラグインのオーバーライドなど、いくつかの変更が影響を及ぼしている可能性があるため)。

解決策が見つからない場合は、必要に応じてコントローラーのsetView()メソッドをオーバーライドできます(これが最後のオプションです)。

これが役立つことを願っています。あなたがそれを見つけたら私たちに知らせてください。

1
Pratyush