2010-01-03 74 views
1

我有一种情况,我希望一组用户(员工)能够创建一个节点,但用当前用户配置文件替换用户标识(用户标识)显示。Drupal 6:修改提交的节点的用户标识

换句话说,我有一个块调用内容类型的表单。如果雇员(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。特别是如果你不习惯使用Drupal API。然后,如果要将自己的提交处理程序添加到表单中,就剩下了。这是在提交表单时运行的一段代码。您只需要在客户端页面上执行此操作,以便使用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 2010-01-04 15:08:25

+0

最快的方法是调用drupal_set_message('some text');某处。如果调用它将打印显示验证错误等消息区域中的文本。如果你想做一些严肃的调试,你应该看看devel模块或者看看Firebug的drupal。一个Firebug插件/ Drupal模块组合,它也有一些很好的调试工具。 – googletorp 2010-01-04 15:16:43

+0

好吧,我使用uid&name变量添加了一些“drupal_set_message”,并且所有设置都正确(它正在调用消息),但uid未更改。在它提交给数据库之前,是否有办法通过设置uid来处理表单的处理? – tpow 2010-01-04 15:34:18

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 2010-01-03 19:29:15

+0

是的,你可以。 Hook_block从代码中定义块。它在一个模块中。请参阅node_block,user_block,system_block。 http://api.drupal.org/api/function/hook_block/6 – dmitrig01 2010-01-03 21:50:17