Список в панели управления
Записи блога пока можно добавить только через phpMyAdmin. Управлять ими должен администратор из панели — для этого у компонента есть административная часть. Устроена она так же, как часть для сайта, но у экрана есть панель инструментов с кнопками. Сделаем первый экран — список записей.
Файлы
Создайте вручную четыре файла:
administrator/components/com_hello/
├── hello.xml
├── services/provider.php
├── src/
│ ├── Controller/
│ │ └── DisplayController.php
│ ├── Model/
│ │ └── PostsModel.php
│ └── View/
│ └── Posts/
│ └── HtmlView.php
└── tmpl/
└── posts/
└── default.phpОбратите внимание на пространство имён: вместо Site здесь Administrator.
Контроллер
// administrator/components/com_hello/src/Controller/DisplayController.php
namespace My\Component\Hello\Administrator\Controller;
defined('_JEXEC') or die;
use Joomla\CMS\MVC\Controller\BaseController;
class DisplayController extends BaseController
{
protected $default_view = 'posts';
}Модель
// administrator/components/com_hello/src/Model/PostsModel.php
namespace My\Component\Hello\Administrator\Model;
defined('_JEXEC') or die;
use Joomla\CMS\MVC\Model\ListModel;
use Joomla\Database\QueryInterface;
class PostsModel extends ListModel
{
protected function getListQuery(): QueryInterface
{
$db = $this->getDatabase();
return $db->getQuery(true)
->select($db->quoteName(['id', 'title', 'published', 'created']))
->from($db->quoteName('#__hello_posts'))
->order($db->quoteName('id') . ' DESC');
}
}В отличие от модели сайта, здесь нет условия published = 1: администратор видит и скрытые записи.
Представление с панелью инструментов
// administrator/components/com_hello/src/View/Posts/HtmlView.php
namespace My\Component\Hello\Administrator\View\Posts;
defined('_JEXEC') or die;
use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView;
use Joomla\CMS\Toolbar\ToolbarHelper;
class HtmlView extends BaseHtmlView
{
public array $items = [];
public function display($tpl = null): void
{
$this->items = $this->getModel()->getItems();
ToolbarHelper::title('Hello: записи');
ToolbarHelper::addNew('post.add');
parent::display($tpl);
}
}ToolbarHelper::title() задаёт заголовок экрана, addNew() добавляет кнопку «Создать». Аргумент post.add — действие, которое кнопка отправит: метод add() контроллера PostController. Он появится в следующем уроке.
Макет
<?php
// administrator/components/com_hello/tmpl/posts/default.php
defined('_JEXEC') or die;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Router\Route;
?>
<form action="<?php echo Route::_('index.php?option=com_hello&view=posts'); ?>"
method="post" name="adminForm" id="adminForm">
<table class="table">
<thead>
<tr>
<th>Заголовок</th>
<th>Опубликовано</th>
<th>ID</th>
</tr>
</thead>
<tbody>
<?php foreach ($this->items as $item) : ?>
<tr>
<td>
<a href="<?php echo Route::_('index.php?option=com_hello&task=post.edit&id=' . (int) $item->id); ?>">
<?php echo $this->escape($item->title); ?>
</a>
</td>
<td><?php echo $item->published ? 'Да' : 'Нет'; ?></td>
<td><?php echo (int) $item->id; ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<input type="hidden" name="task" value="">
<?php echo HTMLHelper::_('form.token'); ?>
</form>Список в панели всегда обёрнут в форму с именем adminForm. Кнопки панели инструментов не имеют собственных форм: при нажатии они записывают своё действие в скрытое поле task и отправляют эту форму. HTMLHelper::_('form.token') добавляет скрытое поле с токеном защиты.
Результат
Откройте в панели «Компоненты → Hello». Вместо ошибки показан экран «Hello: записи» с таблицей из двух записей и кнопкой «Создать». Кнопка и ссылки на записи пока ведут к ошибке — контроллера PostController ещё нет.
Кнопки панели инструментов
| Вызов | Кнопка |
|---|---|
ToolbarHelper::addNew('post.add') | Создать |
ToolbarHelper::save('post.save') | Сохранить и закрыть |
ToolbarHelper::apply('post.apply') | Сохранить |
ToolbarHelper::cancel('post.cancel') | Закрыть |
ToolbarHelper::deleteList('', 'posts.delete') | Удалить отмеченные |
ToolbarHelper::preferences('com_hello') | Настройки компонента |
Действия над отмеченными строками — posts.delete, posts.publish — выполняет контроллер списка. Его наследуют от готового класса AdminController, а в таблицу добавляют столбец с флажками.
Частая ошибка
Форму в макете называют по-своему или забывают скрытое поле task. Кнопки панели инструментов ищут именно форму adminForm и поле task в ней — без них нажатие на «Создать» ничего не делает, а в консоли браузера появляется ошибка JavaScript.