Учусь делать компоненты.
https://mb4.ru/cms/joomla4/724-developing-a-basic-component-for-joomla-4.htmlschooltechcontent.xml
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" method="upgrade">
<!-- атрибут 'version' для тега расширения больше не используется -->
<name>SchoolTechContent</name>
<!-- Следующие элементы являются необязательными и не содержат ограничений на форматирование -->
<creationDate>Janiary 2022</creationDate>
<!-- Фиктивный автор, не стесняйтесь заменять его в любом месте, где вы его видите -->
<author></author>
<authorUrl></authorUrl>
<copyright></copyright>
<license></license>
<!-- Строка 'version' записывается в таблицу компонентов -->
<version>0.0.1</version>
<!-- Описание является необязательным и по умолчанию используется имя сомпонента -->
<description>
Schootech content
</description>
<!-- Это пространство имен PHP, в котором организован
код расширения. Он должен следовать этому формату:
Vendor\Component\ComponentName
"Vendor" может быть названией компании или вашим собственным именем
Раздел "ComponentName" ДОЛЖЕН соответствовать имени, используемому
везде для вашего компонента. Каким бы ни было имя этого XML-файла,
пространство имен должно совпадать (заглавные/прописные буквы не учитываются).
-->
<namespace path="src/">MuCompani\Component\schooltechcontent</namespace>
<administration>
<!-- Ссылка, которая появится в меню админки Joomla "Components" -->
<menu link="index.php?option=com_schooltechcontent">SchoolTech</menu>
<!-- Список файлов и папок для копирования.
Обратите внимание на атрибут "folder".
Это имя папки в пакете компонентов для копирования в CMS Joomla 4. -->
<files folder="admin/">
<folder>services</folder>
<folder>src</folder>
<folder>tmpl</folder>
</files>
</administration>
</extension>
admin/services/provider.php
<?php
defined('_JEXEC') or die;
use Joomla\CMS\Dispatcher\ComponentDispatcherFactoryInterface;
use Joomla\CMS\Extension\ComponentInterface;
use Joomla\CMS\Extension\MVCComponent;
use Joomla\CMS\Extension\Service\Provider\ComponentDispatcherFactory;
use Joomla\CMS\Extension\Service\Provider\MVCFactory;
use Joomla\CMS\MVC\Factory\MVCFactoryInterface;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
return new class implements ServiceProviderInterface {
public function register(Container $container): void {
$container->registerServiceProvider(new MVCFactory('\\MuCompani\\Component\\SchoolTechContent'));
$container->registerServiceProvider(new ComponentDispatcherFactory('\\MuCompani\\Component\\SchoolTechContent'));
$container->set(
ComponentInterface::class,
function (Container $container) {
$component = new MVCComponent($container->get(ComponentDispatcherFactoryInterface::class));
$component->setMVCFactory($container->get(MVCFactoryInterface::class));
return $component;
}
);
}
};
admin/src/Controller/DisplayController.php
<?php
namespace MuCompani\Component\schooltechcontent\Administrator\Controller;
defined('_JEXEC') or die;
use Joomla\CMS\MVC\Controller\BaseController;
/**
* Контроллер по умолчанию компонента SchoolTechContent
*
* @package Joomla.Administrator
* @subpackage com_schooltechcontent
*/
class DisplayController extends BaseController {
/**
* Представление по умолчанию для метода отображения.
*
* @var string
*/
protected $default_view = 'schoolcontent';
public function display($cachable = false, $urlparams = array()) {
return parent::display($cachable, $urlparams);
}
}
admin/src/View/SchoolContent/HtmlView.php
<?php
namespace MuCompani\Component\schooltechcontent\Administrator\Controller;
defined('_JEXEC') or die;
use Joomla\CMS\MVC\Controller\BaseController;
/**
* Контроллер по умолчанию компонента SchoolTechContent
*
* @package Joomla.Administrator
* @subpackage com_schooltechcontent
*/
class DisplayController extends BaseController {
/**
* Представление по умолчанию для метода отображения.
*
* @var string
*/
protected $default_view = 'schoolcontent';
public function display($cachable = false, $urlparams = array()) {
return parent::display($cachable, $urlparams);
}
}
admin/tmpl/schoolcontent/default.php
<?php
namespace MuCompani\Component\schooltechcontent\Administrator\View\SchoolContent;
defined('_JEXEC') or die;
use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView;
/**
* @package Joomla.Administrator
* @subpackage com_schooltechcontent
*
* [member=126442]copyright[/member] Copyright (C) 2021 John Smith. All rights reserved.
* @license GNU General Public License version 3; see LICENSE
*/
/**
* Основной вид в админке "SchoolTechContent"
*/
class HtmlView extends BaseHtmlView {
/**
* Отображение основного вида "SchoolTechContent"
*
* @param string $tpl Имя файла шаблона для анализа; автоматический поиск путей к шаблону.
* @return void
*/
function display($tpl = null) {
parent::display($tpl);
}
}
Собираю все это в архив com_schooltechcontent.zip и устанавливаю. В итоге, в меню компонента выводится
Некорректный класс контроллера: display
При копипасте из примера все работает нормально.
Где я ошибся (подозреваю, что где-то в admin/src/View/SchoolContent/HtmlView.php)?