【问题标题】:Drupal 6: Modifying uid of a submitted nodeDrupal 6:修改提交节点的uid
【发布时间】:2023-03-19 19:20:01
【问题描述】:

我有一种情况,我希望一组用户(员工)能够创建一个节点,但要将 uid(用户 ID)替换为当前显示的用户配置文件的用户 ID。

换句话说,我有一个为内容类型调用表单的块。如果员工(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 因为我不想修改实际的表格,因为客户可以直接填写表格,在这种情况下,我根本不想修改表格。

我也很惭愧我把它放在一个块中,但我想不出一种方法把它放在一个模块中,所以任何关于这方面的建议也将不胜感激......

【问题讨论】:

    标签: forms drupal drupal-6


    【解决方案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) 将是客户端,所以如果是其他原因,您需要更改原因。我们只需要添加一个提交函数,因为我们想要的是在表单通过验证时更改值。

    如果是这种情况,我们的第二个函数会运行,它会实际更改值。

    【讨论】:

    • 感谢 Googletorp,这是一个非常简洁的答案。我安装了表单块,并创建了一个名为 addSR(替换小马)的模块。 formblock 模块显示表单,但仍传递原始 uid。有没有办法测试处理程序是否被调用? ---我发布了更新的 sn-p...
    • 最快的方法是调用drupal_set_message('some text');某处。如果被调用,它将在显示验证错误等的消息区域中打印文本。如果你想做一些严肃的调试,你应该看看 devel 模块或者看看 drupal for Firebug。一个 firebug 插件/drupal 模块组合,也有一些不错的调试工具。
    • 好的,我使用 uid & name 变量添加了一些“drupal_set_message”,一切都设置正确(它正在调用消息),但 uid 没有改变。有没有一种方法可以在表单正常设置 uid 之后,就在它提交到数据库之前进行处理?
    • 关键点发生在node_form_submit_build_nodenode_submit
    • node_submit 需要一个节点作为参数传递给它,这将不起作用,因为该节点尚未创建。 node_form_submit_build_node 听起来它会起作用,但是我在设置 UID 后将它添加到提交按钮处理程序中,它仍然没有效果。我不能是唯一一个尝试这样做的人!我要死在这里:\
    【解决方案2】:

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

    【讨论】:

    • 我了解底部部分,我已将其添加到模块中。但是,我从未使用过“hook_block”功能。我以为它应该放在模块中,但我看不到它在哪里被调用。另外,我还需要从块中调用 drupal_get_form 吗?
    • 是的。 Hook_block 从代码中定义块。它进入一个模块。参见 node_block、user_block、system_block。 api.drupal.org/api/function/hook_block/6
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    相关资源
    最近更新 更多