Вопрос по drupal_get_form() [РЕШЕНО]

Главные вкладки

Аватар пользователя BOOZ BOOZ 11 января 2010 в 17:22

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

Для этого в menu_alter прописал следующее:

function remove_tab_menu_alter(&$items) {

  $items['node/%node_add_review/addreview']['page callback'] = 'remove_tab_addreview_load';

}

Потом добавил callback функцию там же в модуле:

function remove_tab_addreview_load() {
  global $user;
  if (arg(0) == 'node' && is_numeric(arg(1))) {
     $node = node_load(arg(1));
   }

  if ($user->uid) {
     return drupal_get_form('nodereview_node_form');
  }
  else{
   return drupal_goto('user','destination=node/'.urlencode($node->nid) .'/addreview');
  }

  drupal_not_found();
}

Сценарий с анонимом работает четко, а вот загрузка формы не работает. Думаю проблема связана с тем, что я переписываю форму в template.php.

Так вот, когда вызывается drupal_get_form - на странице нет моей переопреденной формы, а только ее админ часть.

Как подгрузить все форму из моего модуля???

Спасибо заранее за помощь.

BOOZ

Комментарии

Аватар пользователя kosilko kosilko 12 января 2010 в 12:56

"BOOZ" wrote:
Для этого в menu_alter прописал следующее:

hook_menu_alter используется вроде как для перехвата чужих меню и их модификации, hook_menu почему не использовали? Непонятно.

Аватар пользователя BOOZ BOOZ 12 января 2010 в 16:40

Не в меню дело здесь, хотя если будет время попробую. Проблема как переопределенную форму нода подгрузить?

Аватар пользователя kosilko kosilko 12 января 2010 в 17:12

вспоминайте где находится функция nodereview_node_form(), в каком файле. Ибо если она не в *.module а в каком-нить *.pages.inc то скорее всего такой вызов формы не сработает.

Аватар пользователя Dan Dan 12 января 2010 в 20:45

Думаю задача решается проще. Зарегенный пользователь попадает на нужную страницу, с ним (по умолчанию) проблем быть не должно, а для анонима нужно проставить права (доступ к node/%node_add_review/addreview должен быть запрещён), а при ошибке 403 (access denide) перенапрявлять на страницу логина. Это делается стандатрными средствами друпала (настройка ошибок).

Аватар пользователя BOOZ BOOZ 13 января 2010 в 5:46

"Dan" wrote:
Зарегенный пользователь попадает на нужную страницу, с ним (по умолчанию) проблем быть не должно, а для анонима нужно проставить права (доступ к node/%node_add_review/addreview должен быть запрещён), а при ошибке 403 (access denide) перенапрявлять на страницу логина.

Не получиться, линк не показывается если убрать права у анонима (так cделан модуль node_review). Хотелось бы показать линк, но при нажатии перенаправить на логин, а потом уже обратно на форму. Здесь-то и не работает....

Аватар пользователя Dan Dan 13 января 2010 в 8:25

А если в хуке menu_alter измените проверку доступа:
<?php
$items['node/%node_add_review/addreview']['access callback'] = 'user_access';
$items['node/%node_add_review/addreview']['access arguments'] = array('access content');
?>

Аватар пользователя BOOZ BOOZ 14 января 2010 в 6:14

Заработало. Поменял drupal_get_form на node_add (). Спасибо всем!

function remove_tab_addreview_load() {
  global $user;
  if (arg(0) == 'node' && is_numeric(arg(1))) {
     $node = node_load(arg(1));
   }
  if ($user->uid) {
     return node_add('nodereview');
  }
  else{
     return drupal_goto('user','destination=node/'.urlencode($node->nid) .'/addreview');
  }
  drupal_not_found();
}