Как вывести все треки на отдельной странице?

hoogo4

Зеленый
Клиент
Сообщения
14
Реакции
7
Баллы
3
Как создать отдельную страницу с выводом всех треков из базы с пагинацией так, как сделано на страницах с исполнителями и альбомами. Версия MSE 3.6.
 

MSE-Script

Developer
Команда форума
Сообщения
840
Реакции
292
Баллы
63
Для вывода всех треков на отдельной странице потребуется доработать штатный функционал работы с треками.

1. Первым делом потребуется сообщить CMS о новой странице, добавив в файл app/Config/RouterConfig.php строку ['tracks_all', '/tracks/', 'Track::list'], в которой '/tracks/' - относительный URL новой страницы, 'Track::list' - название метода, который займется выгрузкой данных.

2. Далее нужно выгрузить и обработать данные из БД. Открыть файл app/Controllers/Track.php и после:
PHP:
public function index ($params) {
    ....
}
добавить:

PHP:
public function list ()
{
      print('tracks');
}
Этот метод будет отвечать за обработку и вывод треков. Если все сделано правильно, на странице /tracks/ появится сообщение tracks.

3. Следующим этапом добавим выгрузку треков из базы. Добавляем в созданный метод:
PHP:
$output_tracks = TrackModel::getAllFromOutput(0, 50);
$tracks = Utils::prepareTracksBeforeOutput($output_tracks);

print_r($tracks);
На новой странице появится список сохраненных треков.

4. Прикрепим шаблон. Данные выводятся корректно, остается придать им презентабельный вид. Обновим созданный метод:
PHP:
$output_tracks = TrackModel::getAllFromOutput(0, 50);
$tracks = Utils::prepareTracksBeforeOutput($output_tracks);

$this->addSeoTags('title',         'Все треки');
$this->addSeoTags('description',   'Все треки');
$this->addBreadcrumbs(['link' => null, 'title' => 'Все треки']);

$this->addSeoTags('title',         'Все треки');
$this->addSeoTags('description',   'Все треки');
$this->addBreadcrumbs(['link' => null, 'title' => 'Все треки']);
$this->setResults('tracks', $tracks);
$data = [];
$this->loadViews($data, 'tracks');
За представление данных будет отвечать файл шаблона tracks.tpl. Его нужно создать в каталоге шаблона. Содержимое файла:

HTML:
{strip}
{include file="modules/header.tpl"}

<main class="soundapp__content pajax-content">
   <div class="content _has_breadcrumbs">
      {include file="modules/breadcrumbs.tpl"}
      <h1 class="content__title">Все треки</h1>
      {include file="track-list.tpl"}
   </div>
</main>

{include file="modules/footer.tpl"}
{/strip}
В примере используется дефолтный шаблон soundapp. В Вашем шаблоне структура данных может отличаться.
Результатом работы станет готовая страница со списком треков:
1622797355544.png

5. Остается настроить пагинацию списка треков. Вернемся с файлу app/Controllers/Track.php и обновим метод list:

PHP:
public function list ($params)
   {
     // Получение номера текущей страницы из URL
      $page = isset($params['page']) ? (intval($params['page'])) : 1;
      // Кол-во треков на 1 страницу
      $limit = 50;
      // Вычисление необходимого смещения пагинации
      $offset = $page ? $page * $limit - $limit : 0;
      // Выгрузка и обработка треков
      $output_tracks = TrackModel::getAllFromOutput($offset, $limit);
      $tracks = Utils::prepareTracksBeforeOutput($output_tracks);
      $count = TrackModel::counts();
      // Подготовка данных к выводу
      $this->addSeoTags('title',         'Все треки');
      $this->addSeoTags('description',   'Все треки');
      $this->addBreadcrumbs(['link' => null, 'title' => 'Все треки']);  
      $data = [
         'count'           => $count,
         'pagination'      => $this->makePagination($count, $limit, $page, 'tracks'),
         'results'         => [
            'tracks'       => $tracks,
            'hasNextPage'  => false
         ]
      ];
      $this->loadViews($data, 'tracks');
   }
Новые строки я обозначил комментарием. В них мы получаем номер текущей страницы из URL и генерируем данные пагинации.

Так же, вернемся в файл app/Config/RouterConfig.php и добавим строку ['tracks_page', '/tracks/(page:int)', 'Track::list'],. Эта строка подскажет скрипту как правильно работать с пагинацией.

Остается только подключить файл шаблона пагинации в файле tracks.tpl:

HTML:
{strip}
{include file="modules/header.tpl"}

<main class="soundapp__content pajax-content">
   <div class="content _has_breadcrumbs">

      {include file="modules/breadcrumbs.tpl"}

      <h1 class="content__title">Все треки</h1>
      {include file="track-list.tpl"}

      {include file="modules/pagination.tpl"}
   </div>
</main>

{include file="modules/footer.tpl"}
{/strip}
Готово! Результатом работ станет новая страница со списком всех треков и пагинацией. Данная инструкция универсальна и подходит для доработок любых других ресурсов.
 
Последнее редактирование:
Сверху