vorst.ru - Как организовать статьи в связанный список
Статьи из рубрики posts-chains

Какую статью выбрать следующей или предыдущей

Как выбрать все статьи в цепочке

В предыдущей статье речь шла о несколько необычном подходе к организации контента в блоге. Суть его в том, что не обязательно все мысли излагать в одной статье, можно это делать постепенно от статьи к статье. В промежутках рассуждая о других вещах и размещая статьи по другим темам.

Обычно для связывания таких статей используются рубрики и метки. Даже с присвоением меток возникают проблемы, а с рубриками еще сложнее. Им надо давать названия, придумывать иерархию. И даже это, в результате, не всегда помогает.


Цепочки статей в блоге

Можно ли сделать блог удобнее?

Ну, во-первых, удобнее по отношению к чему? К WordPress, например. Некоторое время назад я использовал эту программу для ведения блога.

Для группировки статей в WordPress существует возможность помечать статьи метками или прикреплять к наперед заданной рубрике. Кроме того, в конце статьи есть навигация - предыдущая, следующая статья, ну и меню конечно. Вроде все удобно.



Поиск



Цепочки статей в блоге

Можно ли сделать блог удобнее?

Ну, во-первых, удобнее по отношению к чему? К WordPress, например. Некоторое время назад я использовал эту программу для ведения блога.

Для группировки статей в WordPress существует возможность помечать статьи метками или прикреплять к наперед заданной рубрике. Кроме того, в конце статьи есть навигация - предыдущая, следующая статья, ну и меню конечно. Вроде все удобно.


    Поделиться

Но, в одну рубрику могут входить статьи, посвященные разным темам. Да и с метками та-же неопределенность.

Вы выбираете конкретную рубрику или метку и получаете список статей вроде связанных между собой, но степень связанности разная. В результате читатель выбирая рубрику получает список статей не отвечающих ожиданиям.

Навигация - предыдущая, следующая то же огорчает. Выполнена она по датам. То есть, чтобы получить нужную последовательность статей, надо не забывать проставлять верные даты. Не очень удобно.

Можно ли улучшить положение?

WordPress vs Yii

Используя WordPress я делал собственную навигацию. В начале каждой статьи в ручную размещал ссылки на предыдущие статьи по теме. Читателю уже не нужно было обращаться к рубрикатору, раз напав на нужную статью. По ссылкам можно было пролистать все связанные статьи.

Стало возможным отвлекаться на другие темы, не оставляя еще не совсем завершенный материал в черновиках.

Это дает и еще одно, существенное, преимущество. Статьи можно дробить на любое количество кусков или глав. Статей становится больше, а значит и индексация сайта улучшается. Как следствие, найти ваши статьи в океане интернета становится легче. Но в ручную размещать ссылки на предыдущие и последующие статьи хлопотно.

Менять WordPress настолько глубоко нет смысла, легче поменять инструмент. Например, отказаться от WordPress в пользу Yii, переняв самые главные положительные качества.

View

Для связывания статей в цепочку можно добавить в стандартную таблицу post поле previous. Это обычный идентификатор статьи.

При добавлении в блог очередной статьи, нужно выбрать из выпадающего списка предыдущую статью. И это, собственно, все, что необходимо сделать блоггеру.

В представлении frontend/views/post/view.php нужно вывести заголовки всех предыдущих и следующих статей. Сделать это достаточно просто имея поле previous. Например, для предыдущих статей:

<?php if($titles = $data->Previous()): ?>
  <?php foreach($titles as $id => $title): ?>
    <p>
      <?php echo Html::a($title, [
        'post/view', 
        'id'=>$id
      ]); ?>
    </p>
  <?php endforeach; ?>
<?php endif; ?>

Model

Для поиска предыдущих статей нужно в модели common/models/Post.php последовательно "пройтись" по всем статьям начиная с просматриваемой, пока previous имеет заполненное значение.

public function Previous()
{
  $a = [];
  $previous = $this->previous;
  while($previous)
  {
    $post = $this->findOne($previous);
    $a[$post->id] = $post->getTitle();
    $previous = $post->previous;
  }
  return $a;
}

Для поиска следующих статей нужно "пройтись" по всем статьям у которых previous равно post.id статьи начиная с текущей, просматриваемой.

public function Next()
{
  $a = [];
  $next = $this->id;
  while($post = static::find()
    ->where('status=' . self::STATUS_PUBLISHED . ' and previous=' . $next)
    ->one()
  )
  {
    $a[$post->id] = $post->getTitle();
    $next = $post->id;
  }
  return $a;
}

Вывод списка такой же, как и у предыдущих статей.

Если массив $a окажется пустым, можно использовать обычный механизм - возвращать заголовок предыдущей или следующей статьи по дате. Но об этом в следующей статье :)

Заключение

Добавление поля previous позволяет организовать статьи в группы или цепочки не создавая рубрик. Выбрав нужную метку и просмотрев статью, Вы уже точно знаете, какие еще статьи относятся к теме.

Комментарии

  • I do trust all of the ideas you have introduced for your post. They're really convincing and can definitely work. Still, the posts are too quick for novices. May you please prolong them a bit from subsequent time? Thanks for the post. Lettie
  • -- I will try. Thanks a lot for the comment. SergeyMorozov

Оставить комментарий

Только авторизованные пользователи могут оставлять комментарии. Пожалуйста авторизуйтесь или пройдите регистрацию.