2010-01-03 3 views
1

У меня есть ситуация, когда я хочу, чтобы набор пользователей (сотрудников) мог создавать узел, но вместо этого заменить идентификатор пользователя (user ID) на профиль пользователя в настоящее время отображается.Drupal 6: Изменение uid поданного узла

Другими словами, у меня есть блок, который вызывает форму для типа содержимого. Если сотрудник (uid = 20) переходит на страницу клиентов (uid = 105) и заполняет форму, я хочу, чтобы uid, связанный с формой, был клиентом (105), а не сотрудником.

Я использую Arg (1), чтобы захватить UID Клиента - вот то, что у меня есть ..

<?php 
function addSR_form_service_request_node_form_alter(&$form, $form_state) { 
     if (arg(0) == 'user' && is_numeric(arg(1))) { 
     $form['#submit'][] = 'addSR_submit_function'; 
    } 
} 

function addSR_submit_function($form, $form_state) { 
    $account = user_load(arg(1)); 
    $form_state['values']['uid'] = $account->uid; 
    $form_state['values']['name'] = $account->name; 
} 

?> 

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

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

ответ

1

Чтобы создать форму в блоке, можно использовать formblock module. Особенно, если вы не используете API Drupal. Тогда все, что осталось, если добавить в свой собственный обработчик. Это часть кода, который запускается при отправке формы. Вы только хотите сделать это на страницах клиентов, чтобы сделать это, используя функцию hook_form_alter.

/** 
* Hooks are placed in your module and are named modulename_hookname(). 
* So if a made a module that I called pony (the folder would then be called 
* pony and it would need a pony.info and pony.module file I would create this function 
*/ 
function pony_form_service_request_node_form_alter(&$form, $form_state) { 
    // Only affect the form, if it is submitted on the client/id url 
    if (arg(0) == 'client' && is_numeric(arg(1))) { 
     $form['#submit'][] = 'pony_my_own_submit_function'; 
    } 
} 

function pony_my_own_submit_function($form, &$form_state) { 
    $account = user_load(arg(1)); 
    $form_state['values']['uid'] = $account->uid; 
    $form_state['values']['name'] = $account->name; 
} 

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

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

+0

Спасибо Googletorp, это был очень краткий ответ. Я установил блок формы и создал модуль с именем addSR (замененный пони). Модуль formblock отображает форму, но она все еще передает исходный uid. Есть ли способ проверить, является ли обработчик даже вызванным? --- Я опубликовал обновленный снипп ... – tpow

+0

Самый быстрый способ - вызвать drupal_set_message ('some text'); где-то. если он вызывается, он будет печатать текст в области сообщений, где отображаются эра проверки достоверности и т. д. Если вы хотите сделать серьезную отладку, вы должны взглянуть на модуль devel или взглянуть на drupal для Firebug. Компонент firebug addon/drupal, который также имеет некоторые хорошие инструменты отладки. – googletorp

+0

Хорошо, я добавил несколько «drupal_set_message», используя переменную uid & name, и все настроено правильно (вызывает вызовы), но uid не изменился.Есть ли способ, который мы можем задействовать в обработке формы после того, как она обычно устанавливает uid, как раз перед отправкой в ​​базу данных? – tpow

1

Блоки PHP плохие. Вы можете поместить их в модуль.

function hook_block($op, $delta = 0) { 
    // Fill in $op = 'list'; 
    if ($op == 'view' && $delta = 'whatever') { 
    $account = user_load(arg(1)); 
    $node = array('uid' => $account->uid, 'name' => $account->name, 'type' => 'service_request', 'language' => '', '_service_request_client' => $account->uid); 
    $output = drupal_get_form('service_request_node_form', $node); 
    // Return properly formatted array. 
    } 
} 

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

function hook_form_service_request_node_form_alter(&$form, $form_state) { 
    if (isset($form_state['node']['_service_request_client'])) { 
    $form['buttons']['submit']['#submit'] = array('yourmodule_node_form_submit', 'node_form_submit'); 
    } 
} 

function yourmodule_node_form_submit($form, &$form_state) { 
    $account = user_load($form_state['node']['_service_request_cilent'])l 
    $form_state['values']['uid'] = $account->uid; 
    $form_state['values']['name'] = $account->name; 
} 
+0

Я понимаю нижнюю часть, я добавил это к модулю. Однако я никогда не использовал функцию hook_block. Я думал, что он должен идти в модуле, но я не вижу, где это называется. Кроме того, мне еще нужно вызвать drupal_get_form из блока? – tpow

+0

Да, да. Hook_block определяет блоки из кода. Он входит в модуль. См. Node_block, user_block, system_block. http://api.drupal.org/api/function/hook_block/6 – dmitrig01

Смежные вопросы