Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Список в панели управления

Записи блога пока можно добавить только через 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.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.