私はJoomla 4用にDogWalk
というコンポーネントを再構築しています。コアBanners
コンポーネントが実行していることを正確に実行しようとしました。私は自分のファイルに名前を付けて名前空間を付け、ディレクトリにはBanners
と同じように名前を付けましたが、BaseController
を取得してビューファイルを見つけることができません。
$this->paths
からBaseController::createView
配列をダンプしています。パスはBanners
とDogWalk
で同じです。
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
配列の内容にかかわらず)。
コントローラーがビューを見つける場所、およびコントローラーが使用する命名規則を定義するにはどうすればよいですか?
助けてくれたすべての人に感謝します。問題は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
です。
Joomla 3で使用されているコンポーネントがMycomponentViewViewname
を探しているビューファイルです。そのため、適切なコントローラークラスをコントローラーで拡張していることを確認してください(つまり、_Joomla\CMS\MVC\Controller\BaseController
_またはそれを拡張するその他のクラス) AdminController
)として。正しい名前空間からのものである場合は、setView()
を追跡して、問題を引き起こす可能性のあるそのような変更がないか確認します。
これで問題が解決しない場合は、フロー全体をデバッグすることもできます。しかしその前に、デフォルトのパラメーターで他の新しいJoomla 4セットアップで拡張機能を実行することをお勧めします(コードの変更やプラグインのオーバーライドなど、いくつかの変更が影響を及ぼしている可能性があるため)。
解決策が見つからない場合は、必要に応じてコントローラーのsetView()
メソッドをオーバーライドできます(これが最後のオプションです)。
これが役立つことを願っています。あなたがそれを見つけたら私たちに知らせてください。