Как скрыть поле рейтинга Fivestar программно после первого комментария?

Я хотел бы скрыть поле рейтинга Fivestar (называемое 'field_stars') в форме комментариев, когда пользователь комментирует узел, который он / она уже прокомментировал. У меня есть флаг под названием Commented на моем сайте и правило, которое помечает узел от имени комментатора, когда кто-то комментирует его (что прекрасно работает). Я попытался исправить мою проблему, основываясь на информации, которую нашел здесь:

function hiderating_form_alter(&$form, &$form_state, $form_id) {
  global $user;
  $flag = flag_get_flag('commented') or die('no "commented" flag defined');
  if ($form_id == "comment_node_stuff_form") {
   if ($flag->is_flagged($form['#node']->uid, $user->uid)) { 
      unset($form['field_stars']);
    }
  }
}

К сожалению, это ничего не меняет (я тоже не получаю никаких ошибок). Что я сделал не так?


После отладки с кодом @jerdiggity я получаю:

DEBUG: form id "comment_node_stuff_form" found. Debugging...
DEBUG: The code $flag->is_flagged($form["#node"]->uid, $user->uid) is returning FALSE.

(конечно я получаю DEBUG: final form structure: тоже, но это способ долго вставлять сюда). Я не понимаю, почему маркировка не распознается, так как она хранится в базе данных...

1 ответ

Решение

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

function hiderating_form_alter(&$form, &$form_state, $form_id) {
  global $user;
  if ($form_id == "comment_node_stuff_form") {
    // I'm not sure why the examples make use of "die" because that will stop the entire
    // site from continuing any further.
    $flag = flag_get_flag('commented');

    // ** Begin debug ** //
    // Notify us that we've at least got the right form.
    drupal_set_message(t('DEBUG: form id "comment_node_stuff_form" found. Debugging...'), 'warning');
    // Warn us if $flag is giving us issues
    if (!$flag) {
      drupal_set_message(t('DEBUG: No "commented" flag defined.'), 'warning');
    }
    // Check form components
    if (!isset($form['#node']) || !$form['#node']) {
      drupal_set_message(t('DEBUG: Something is wrong with or missing from $form["#node"]'), 'warning'); 
    }
    // Check more form components
    if (!isset($form['#node']->uid)) {
      drupal_set_message(t('DEBUG: $form["#node"]->uid is not set.'), 'warning'); 
    }
    // Again
    if (!isset($form['field_stars']) || empty($form['field_stars'])) {
      drupal_set_message(t('DEBUG: <em>$form["field_stars"]</em> is not set or is empty/false.'), 'warning'); 
    }
    // Check flag stuff
    if (!$flag->is_flagged($form['#node']->nid, $user->uid)) {
      drupal_set_message(t('DEBUG: The code <em>$flag->is_flagged($form["#node"]->nid, $user->uid)</em> is returning FALSE.'), 'warning'); 
    }
    // Again...
    if (!$flag->is_flagged($form['#node']->uid, $user->uid)) {
      drupal_set_message(t('DEBUG: The code <em>$flag->is_flagged($form["#node"]->uid, $user->uid)</em> is returning FALSE.'), 'warning'); 
    }
    // ** End debug ** //

    // Changing this to nid instead of uid
    if ($flag->is_flagged($form['#node']->nid, $user->uid)) { 
      unset($form['field_stars']);
    }
    // One more debug item:
    drupal_set_message('DEBUG: final form structure:<br/><pre>' . check_plain(print_r($form, 1)) . '</pre>', 'warning');
  }
}
Другие вопросы по тегам