Виджет для вывода дерева Nested Set - vorst.ru

Виджет


выбор всех статей по рубрике

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

Виджет

выбор всех статей по рубрике

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

Первая из них - необходимо добавить поле rubric в таблицу post. С этой операцией связано и изменения в модели common/models/Post, которые очевидно касаются методов rules() и attributeLabels().

Кроме этого нужно добавить обработку выбранной пользователем рубрики в actionIndex() контроллера frontend/controllers/PostController.


Добавим дополнительное условие выбора статей. Конечно же нужно включить статьи не только выбранной рубрики, но и ее потомков.

public function actionIndex($tag = null, $rubric = null) {
  if($tag)
    $query->andWhere(['like', 'tags', $tag]); // tags LIKE "%$tag%"
  if($rubric) {
    // the selected rubric and all it's sub rubric
    $selectedRubric = Rubric::findOne(['id' => $rubric]);
    $a = []; $a[] = $rubric;
    foreach($selectedRubric->children()->all() as $child)
      $a[] = $child->id;
    $query->andWhere(['in', 'rubric', $a]); // rubric IN ($a)
  }
...

Теперь собственно виджет common/widgets/RubricTree.php. Виджет должен вывести дерево рубрик. Кроме названия будем выводить количество статей в рубрике. Вот тут и пригодилось поле $post_count модели common/models/Rubric упомянутое во второй статье данного цикла.

class RubricTree extends Widget {
  ...
  public function getBranches() {
    $rubrics = \common\models\Rubric::find()
      ->select('id, name, level')
      ->orderBy('lft asc')
      ->all();
    foreach($rubrics as $rubric)
      $rubric->post_count = \common\models\Post::find()
        ->where(['rubric' => $rubric->id])
        ->count();
    return $rubrics;
  }
  public function run() {
    echo $this->render('rubricTree', [
      'title' => $this->title,
      'rubrics' => $this->getBranches(),
    ]);
  }
}

Представление common/widgets/views/rubricTree.php должно вывести заголовок виджета и дерево рубрик используя метод getPrettyName() модели common/models/Rubric. Например так:

<?php foreach($rubrics as $rubric)
  echo Html::a($rubric->getPrettyName(),
    ['post/index', 'rubric' => $rubric->id]) .
    ($rubric->post_count ? ' ' . $rubric->post_count : '');
?>

Теперь можно проверять работоспособность рубрикатора, добавив новые рубрики и закрепив за ними статьи.

Заключение

Мы рассмотрели методы из расширения Nested Set, позволяющие управлять небольшими деревьями. При росте дерева могут понадобиться и другие методы. Например, перемещение узлов вместе с наследниками, но об этом будет написано, если появится такой опыт.

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

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