Drupal 6 hook_menu со строкой запроса из l()

[Drupal 6] Моя функция предварительной обработки

function blogs_additions_preprocess_user_profile(&$variables) {
    global $user;

    $op = '';
    $op .= l(t('Delete All My Blogs'),$_GET["q"],array('query' => 'delete=myBlogs'));

    $variables['profile'] = array('content_profile' => $op);
    $variables['user_profile'] = implode($variables['profile']);
}

и мой hook_menu

function blogs_additions_menu(){

    $items= array();

    $items['users/%?delete=myBlogs'] = array(
        'page callback' => 'delete_all_blogs',
        'access arguments' => array('access blogs additions'),
        'type' => MENU_CALLBACK,
    );
    return $items;
}

и мой delete_all_blogs()

function delete_all_blogs(){
    global $user;
    $sql = "SELECT nid FROM node node WHERE node.uid='".$user->uid."'AND node.type='blog'";
    $result = db_query($sql);
    while ($row = db_fetch_object($result)) {
        //print $sql;
        node_delete($row->nid);
    }
    drupal_set_message('test', 'test');
}

мои пользователи могут просматривать свой профиль следующим образом: www.mysite.com/users/barack-obama

Мой крючок, кажется, не работает. вероятно, ошибка с%, используемым в URL. я не знаю, как использовать его общий, чтобы он работал.


person Aravind Vel    schedule 13.12.2011    source источник
comment
Насколько я знаю, hook_menu делает не принимать/обрабатывать параметры запроса в своих объявлениях, поэтому вам нужно переключиться на что-то вроде, например. 'пользователи/%/блог/удалить'. Кроме того, если вы используете подстановочные знаки «%», вы обычно хотите передать их функции обратного вызова через запись «аргументы страницы» — подробности см. в связанной документации.   -  person Henrik Opel    schedule 13.12.2011


Ответы (1)


Вы точно не хотите:

$items['users/%?delete=myBlogs']

Вместо этого вам, вероятно, нужен обратный вызов, который генерирует форму подтверждения. [ ... вывод текста "Вы уверены, что хотите удалить все блоги?" а затем поместите бит, который фактически удаляет все блоги, в обработчик отправки формы. Этот подход в конечном итоге дает вам возможность проверить, есть ли у них какие-либо блоги. ]

Этот обратный вызов формы может проверять, установлена ​​ли переменная delete=myBlogs в этом обратном вызове, если это был ваш дизайн.

ИЛИ Если вы решили поместить эту форму по URL-адресу типа «user/%/delete-my-blogs», вы можете сделать эту форму вкладкой на странице профиля пользователя. (Обратите внимание на единственного пользователя. Вам также нужно изменить «тип» => MENU_CALLBACK на «тип» => MENU_NORMAL_ITEM, чтобы сделать его вкладкой.

% является заполнителем для их UID, который будет передан обратному вызову через «аргументы страницы» => массив (1),

Я бы также рекомендовал изменить имя функции delete_all_blogs на blog_additions_delete_all_blogs(), чтобы вы не столкнулись с каким-то пространством имен за пределами вашего модуля. Один из способов указать, что это "закрытая" функция, состоит в том, чтобы перейти к имени с символом подчеркивания.

функция _blog_additions_delete_all_blogs(){ ...

Изучение того, как создавать форму/обработчик отправки, лучше всего проводить на странице, подобной этой: http://drupal.org/node/751826

person Christian Nally    schedule 13.12.2011
comment
+1 - операции удаления никогда не должны выполняться с помощью простого запроса GET. Что касается формы подтверждения, Drupal предлагает помощник для этого - см. confirm_form(). - person Henrik Opel; 13.12.2011
comment
Если я создаю форму, куда мне ее поместить? В blogs_additions_preprocess_user_profile ИЛИ blogs_additions_menu ИЛИ blog_additions_delete_all_blogs ?? - person Aravind Vel; 14.12.2011
comment
Вот хороший пример... api.drupal.org/api/drupal/modules--block--block.admin.inc/ Вы можете скопировать эту функцию, изменить ее имя, чтобы оно соответствовало вашему модулю, с ЛЮБЫМ именем, а затем сделать эту функцию обратный вызов для вашей вкладки. (т. е. «обратный вызов страницы» в вашем соответствующем массиве $items) Ссылка Хенрика показывает документы для самого confirm_form, которые объясняют аргументы. Вероятно, вам придется немного изменить их. - person Christian Nally; 15.12.2011
comment
Поскольку я использую node_delete в функции delete_all_blogs(){} , кажется, нам нужно явно очистить кеш, поскольку блоги все еще отображаются (хотя узел удален) в представлениях. Как очистить кеш после node_delete? - person Aravind Vel; 15.12.2011
comment
лучше всего просто Google: drupal очистить кеш API :-) будет ли этого достаточно, чтобы мой ответ был принят? [-: - person Christian Nally; 17.12.2011