vorst.ru - Статьи о задачах возникающих при создании сайта и их решении
Статьи из рубрики posts chains

Кто за кем

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

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

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

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

Но есть одно "но".


Цепочки статей

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

Ну, во-первых, удобнее по отношению к чему?

К WordPress, например. Некоторое время назад я использовал эту программу для ведения блога.

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

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

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

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

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



Поиск



Кто за кем

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

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

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

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

Но есть одно "но".


    Поделиться

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

Найти такие статьи не сложно. Изменим немного метод Previous() в модели common\models\Post.

public function Previous()
{
  $a = [];
  $previous = $this->previous;
  while($previous)
  {
    $post = static::findOne($previous);
    $a[] = $post->getTitleLink();
    $previous = $post->previous;
  }
  if($a)
    return $a;
  elseif($post = static::find()
    ->where('status=' . self::STATUS_PUBLISHED . ' AND id<>' . $this->id)
    ->orderBy('created_at DESC')
    ->one()
  )
    return $post->getTitleLink();
  return '';
}

Теперь будем возвращать массив ссылок на заголовки статей, если это статьи по теме и просто ссылку (строку) на статью, если это предыдущая статья из блога.

Тогда и во frontend/views/post/view.php нужно добавить сравнение и обработку вывода ссылки на просто статью.

<?php if($links = $data->Previous() && is_array($links)): ?>
  <?php foreach($links as $link): ?>
    <p><?php echo $link; ?></p>
  <?php endforeach; ?>
<?php elseif($link = $links): ?>
  <p><?php echo $link; ?></p>
<?php endif; ?>

Очевидно, что аналогичные действия нужно выполнить и для следующих статей.

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

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

Добавим в модель common/modelsPost валидатор, который будет предотвращать возникновение этой проблемы.

public function already_selected($attribute, $params)
{
  if($this->$attribute && $this->find($attribute . '=' . $this->$attribute . 
    ($this->id ? ' and id<>' . $this->id : '')
  ))
    $this->addError($attribute, $params['message']);
}

И дополним правила проверки для модели.

public function rules()
{
  return array(
    ...
    [['previous', 'rubric'], 'integer'],
    ['previous', 'already_selected', 'message' => 'This article is already selected as the previous one.'],
    ...

Заключение

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

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

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