vorst.ru - Редактирование Nested Set
Статьи из рубрики nested-set

Виджет

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

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

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

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


Контроллер

элементарные, но достаточные действия над деревом Nested Set

Все необходимые методы, для управления деревом Nested Set уже определены в расширении.

Поэтому изменения в стандартном контроллере совсем небольшие. Нужно, например, вместо стандартного метода save() модели использовать метод prependTo() расширения, а вместо delete(), deleteWithChildren().

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

Но, по порядку.


Ввод рубрики

Редактирование, удаление узлов в дереве Nested Set

Мы, в общих чертах, разобрались с деревьями Nested Set и создали модель для хранения дерева. В модели определили пару простых методов.

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

Для добавления рубрики нужно определить, в какую родительскую рубрику будет входить новая рубрика. Этой цели служит поле $parent_node модели.

Посмотрим, как будет выглядеть добавление.


Nested Set

Подключение расширения

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

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

Наши задачи проще и сводятся к следующему:

  1. Управление рубрикатором - добавление и удаление рубрик, редактирование, отображение списка рубрик для визуального контроля.
  2. Закрепление статьи за рубрикой.
  3. Вывод списка рубрик для выбора нужной рубрики.

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


Рубрикатор

как устроена структура данных Nested Set

Рубрикатор, как средство поиска интересных статей, имеет свои недостатки - трудно придумать иерархию, названия рубрик, трудно потом решить к какой конкретно рубрике относится статья. "Но, так принято" - скажите вы и будете правы.

Поэтому, давайте делать рубрикатор.

У нас есть рубрики записанные в правой колонке:

id lft rgt level name
1 1 12 1 Root
2 2 5 2 --- Data structures
3 3 4 3 ------ Nested Set
4 6 9 2 --- Searching
5 7 8 3 ------ Posts chains
6 10 11 2 --- About sites

И нужна структура данных, которая помогла бы нам:

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


Поиск



Ввод рубрики

Редактирование, удаление узлов в дереве Nested Set

Мы, в общих чертах, разобрались с деревьями Nested Set и создали модель для хранения дерева. В модели определили пару простых методов.

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

Для добавления рубрики нужно определить, в какую родительскую рубрику будет входить новая рубрика. Этой цели служит поле $parent_node модели.

Посмотрим, как будет выглядеть добавление.


    Поделиться

В представлении backend/views/rubric/_form.php вставим выпадающий список уже существующих рубрик.

<?= $form->field($model, 'parent_node')->dropdownList($model->items(), [
  'prompt' => \Yii::t('app', 'Select'),
  'disabled' => !$model->isNewRecord,
]); ?>

И поле для ввода названия рубрики.

<?= $form->field($model, 'name')
  ->textInput(['maxlength' => true])
?>

Представления create.php и update.php вполне обычные.

Для управления рубриками служит представление index.php текст которого приведен почти полностью.

<?= GridView::widget([
  'dataProvider' => $dataProvider,
  'layout' => "{items}\n{summary}\n{pager}",
  'columns' => [
    [
      'attribute' => 'name',
      'format' => 'html',
      'value' => function($data) {
        return $data->getPrettyName(true);
      }
    ],
    [
      'class' => 'yii\grid\ActionColumn',
      'template' => '{update}{delete}', 
      'options' => ['style' => 'width:60px;'],
    ],
  ],
]); ?>

Так как представление view.php не используется, мы отключаем его. Оставляем только возможность редактирования и удаления.

Усилий, как видно, не много и теперь можно переходить к контроллеру.

Заключение

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

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

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