Forms Drupal 6:修改已提交节点的uid
我希望一组用户(员工)能够创建节点,但要用当前显示的用户配置文件的uid(用户ID)替换uid 换句话说,我有一个块,它调用内容类型的表单。如果员工(uid=20)转到客户页面(uid=105)并填写表单,我希望与表单关联的uid是客户的(105),而不是员工的 我正在使用arg(1)获取客户端的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) {
<?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后将其添加到提交。我不可能是唯一一个想这么做的人!!我要死在这里:\