Forms Drupal 6:修改已提交节点的uid

Forms Drupal 6:修改已提交节点的uid,forms,drupal,drupal-6,Forms,Drupal,Drupal 6,我希望一组用户(员工)能够创建节点,但要用当前显示的用户配置文件的uid(用户ID)替换uid 换句话说,我有一个块,它调用内容类型的表单。如果员工(uid=20)转到客户页面(uid=105)并填写表单,我希望与表单关联的uid是客户的(105),而不是员工的 我正在使用arg(1)获取客户端的uid-以下是我所拥有的 <?php function addSR_form_service_request_node_form_alter(&$form, $form_state) {

我希望一组用户(员工)能够创建节点,但要用当前显示的用户配置文件的uid(用户ID)替换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\u form\u alter,因为我不想修改实际的表单,因为客户可以直接填写表单,在这种情况下,我根本不想修改表单


我也很惭愧,我把它放在一个块中,但我想不出一种方法把它放在一个模块中,所以任何关于这方面的建议都是很好的…

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;
}

要在块中创建表单,可以使用。特别是如果您不习惯使用Drupal API。然后,如果要将您自己的提交处理程序添加到表单中,剩下的就只有这些了。这是一段在提交表单时运行的代码。您只希望在客户端页面上执行此操作,以便使用
hook\u form\u 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)
将是客户机,因此如果是其他内容,则需要更改原因。我们只需要添加一个submit函数,因为如果表单通过了验证,我们需要更改值


如果是这样的话,我们的第二个函数将运行,这将实际更改值。

我理解底部部分,我已将其添加到模块中。但是,我从未使用过“hook_block”函数。我以为它应该放在模块里,但我不知道它叫什么。另外,我还需要从区块中调用drupal\u get\u表单吗?是的,您需要。Hook_块定义代码中的块。它在一个模块中。请参见节点块、用户块、系统块。谢谢谷歌,这是一个非常简洁的回答。我安装了表单块,并创建了一个名为addSR(替换小马)的模块。formblock模块显示表单,但它仍在传递原始uid。有没有办法测试处理程序是否被调用---我发布了更新后的代码片段……最快的方法是调用drupal_set_message(“一些文本”);某处。如果调用,它将在显示验证错误等的消息区域中打印文本。如果您想进行一些认真的调试,您应该看看devel模块或drupalforfirebug。firebug插件/drupal模块组合,还有一些不错的调试工具。好的,我使用uid&name变量添加了一些“drupal\u set\u message”,所有设置都正确(它正在调用消息),但是uid没有改变。在表单提交到数据库之前,有没有一种方法可以在表单正常设置uid之后进入表单的处理过程?关键点出现在
node\u form\u submit\u build\u node
node\u submit
node\u submit需要将节点作为参数传递给它,这将无法工作,因为尚未创建节点。节点(form)(form)(submit)(submit)节点(build)节点(node)听起来似乎可以工作,但我在设置UID后将其添加到提交。我不可能是唯一一个想这么做的人!!我要死在这里:\