Как ограничить количество узлов, отправленных пользователем узлу, привязанным к объекту?

Я создал контент-тип с именем «Reviews». Я ссылаюсь на другой тип контента «Книги», используя модуль ссылки Entity Reference. Как ограничить количество отзывов, отправленных по каждой книге, на 1 пользователя? Есть ли модуль для этого?

Я уже экспериментировал с модулем node_limit, но это не работает в этом конкретном контексте. Он запрещает пользователю публиковать контент для каждого типа контента, но не для каждого узла.

6 голосов | спросил af_dig 12 32014vEurope/Moscow11bEurope/MoscowWed, 12 Nov 2014 18:33:09 +0300 2014, 18:33:09

4 ответа


1

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

  

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

Это может вам помочь.

ответил Amirtha Rajan 18 ThuEurope/Moscow2014-12-18T11:32:07+03:00Europe/Moscow12bEurope/MoscowThu, 18 Dec 2014 11:32:07 +0300 2014, 11:32:07
4

Я не думаю, что для этого есть модуль («пока», может быть). Однако это можно сделать легко с помощью перебора и проверки правильности формы.

<?php 
function MYMODULE_form_node_form_alter(&$form, &$form_state) {
  if ($form['#node']->type == 'article') {
    $validate = TRUE;
  }
  // You can also use field existence like following:
  if (isset($form['field_name_that_you_want_to_validate'])) {
    $validate = TRUE;
  }

  if (!empty($validate = TRUE;)) {
    $form['#validate'][] = 'MYMODULE_node_validate_only_one_review';
    form_load_include($form_state, 'inc', 'MYMODULE', 'FILE_THAT_CONTAINS_THE_VALIDATE_FUNCTION');
  }
}
?>

Затем определите функцию проверки:

<?php 
function MYMODULE_node_validate_only_one_review($form, &$form_state) {
  if (!empty($form_state['field_name_that_you_want_to_validate'])) {
    $nids = array();
    foreach ($form_state['field_name_that_you_want_to_validate'] as $language => $items) {
      foreach ($items as $delta => $item) {
        if (!empty($item['target_id'])) {
          $nids[$item['target_id']] = array($language, $delta);
        }
      }
    }
    if (!empty($nids)) {
      $query = new EntityFieldQuery();
      $query->entityCondition('entity_type', 'node')
        ->entityCondition('bundle', 'article')
        ->propertyCondition('uid', $GLOBALS['user']->uid)
        ->fieldCondition('field_name_that_you_want_to_validate', 'target_id', $nids);

      $matches = $query->execute();
      if (isset($matches['node'])) {
        foreach ($nids as $nid => $pack) {
          if (isset($matches['node'][$nid])) {
            list($language, $delta) = $pack;
            form_set_error('field_name_that_you_want_to_validate][' . $language . '][' . $delta, 
              t('You have already submitted a review for this content.');
            );
          }
        }
      }
    }
  }
}
?>

Есть 4 предположения:

  • Тип узла: article. Измените все экземпляры article с правильным именем машины.
  • Ваше имя поля field_name_that_you_want_to_validate. Измените его соответствующим образом.
  • Вы используете модуль ссылок Entity для ссылки на узел (следовательно, клавиша target_id). Это будет nid, если вы используете модуль литературы)
  • Эта награда дала вам шляпу;)

Есть один факт:

  • Я отправил этот ответ на шляпу.

Есть надежда:

  • Я получу эту шляпу.
ответил AyeshK 17 WedEurope/Moscow2014-12-17T02:54:32+03:00Europe/Moscow12bEurope/MoscowWed, 17 Dec 2014 02:54:32 +0300 2014, 02:54:32
3

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

Обобщенный подход :

  

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

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

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

Основные инструкции:

  1. Создать новый вид . Для этого потребуется тип отображения «Ссылка на объект». Но сейчас я предлагаю отобразить страницу, чтобы вы могли протестировать.
  2. Присоединить ссылки ed и referenc ing . Добавить ссылку на Entity Reference: Referencing (примечание Referenc ing , а не Referenc ed )
  3. Только возврат статей . В соответствии с критериями фильтрации создайте фильтр для Content Type = Article
  4. Фильтр на основе пользователя . В контекстных фильтрах создайте контекстный фильтр для Content: Author uid:
    1. Если значение фильтра не в URL : укажите значение по умолчанию = Идентификатор пользователя из зарегистрированного пользователя
    2. Отменить выражение . В разделе «Дополнительно» выберите «Исключить» (Exclude по существу отрицает фильтр [и может быть неправильно назван как таковой] - мы хотим вернуть все ссылочные узлы, которые не были , созданный текущим пользователем).
  5. Проверить, добавить отображение показа и прибыль . На этом этапе вы сможете посетить URL-адрес представления, созданного вами как разные пользователи. Там вы можете проверить, что отображаются только те узлы Book, которые не были просмотрены текущим пользователем (или те, которые не были просмотрены вообще). После того, как вы протестировали и проверили, что он работает, добавьте экран в вид типа «Ссылка на объект». Затем вернитесь в свой тип контента «Рецензия», установите для параметра «Режим сущности» значение «Просмотры» и выберите только что созданный вид.
ответил Adam Balsam 18 ThuEurope/Moscow2014-12-18T00:41:39+03:00Europe/Moscow12bEurope/MoscowThu, 18 Dec 2014 00:41:39 +0300 2014, 00:41:39
1

Вы можете использовать модуль Node Review для проверки функциональности узлов.

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

function hook_node_validate($node, $form, &$form_state) {
  if ($node->type == 'review') {
    // check if review node exists for the selected referenced field value display for same uid.
  }
}
ответил Sumit Madan 16 TueEurope/Moscow2014-12-16T12:13:40+03:00Europe/Moscow12bEurope/MoscowTue, 16 Dec 2014 12:13:40 +0300 2014, 12:13:40

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132