jquery - Drupal 6/jQuery Ajax 更新字段

标签 jquery ajax drupal field

我位于同一站点的不同路径上,并且我需要允许用户更改他/她在不同位置写入的节点上的字段内容。我有nodeid和字段名称以及ids等np。

我不认为这太难,但如果有教程或解释就太好了。

谢谢。

编辑:谢谢 anschauung 的提问,所以澄清一下:

这是一个 CCK 文本区域。至于为什么,有一个中心节点类型,有许多链接节点引用节点。从任何引用中心节点的节点的编辑页面,都需要能够编辑和保存中心节点的字段。这就是我的用例。

再次感谢。

非常感谢 googletorp,我真的非常感谢你的帮助。

这是我到目前为止所拥有的:

第一步:

function update_main_field_menu() {

  $items = array();

  $items['update_main_field/%'] = array(
    'title' => 'Update Main Field',
    'page callback' => 'post_to_main_node',
    'page arguments' => 1,
    'type' => MENU_CALLBACK
  );

  return $items;
}

第二步:

function post_to_main_node(){
    // Sorry, I'm totally lost. What do I put here?
}

您还提到了这一点:

Either in hook_form_alter, hook_nodeapi or some other hook that is invoked when the node form is generated. You should investigate which is best in your situation.

如何生成节点表单?

第三步:

function modulename_form_mainct???_node_form_alter (&$form, &$form_state) {

    // I'm not sure about which form I'm doing node form alter on. If I do it to the mainct, wouldn't that alter the regular edit page the user is viewing? I only want to load the js for the ajax submission. Is there a update_main_field node form?


    drupal_add_js(drupal_get_path('module', 'modulename') ."/updateField.js");
}

另外,步骤 2 中的函数和步骤 3 中获取节点形式之间有什么关系?

第 4 步: 我想我大部分都明白了,尽管由于其他原因我还无法测试它。 :)

我真的很想学习如何在 drupal 中做到这一点,但是如果你能稍微提高你的语言的虚拟级别,那就太好了。 :D 再次非常感谢您。

<小时/>

再次编辑:

我昨天实际上尝试添加访问参数,但由于某种原因它不起作用。 :( 但现在确实如此!是的,你有魔法。

现在,当我像这样触发帖子时:

Drupal.behaviors.ajax_update_field = function (context) {
    $("#button").click(function(){
        var url = $("#edit-field-reference-0-nid-nid").val().replace(/.*?\[nid:(\d+)?]/ig, "$1");
        url =  "/update_main_field/"+url;

            // The data is just some silly test thing
        $.post(url, {data: $("#edit-field-reference-0-nid-nid-wrapper label").text()}, function(value) {

            // Here you can write your js to handle a response to the user,
            // or if something went wrong an error message.
            // value = response data from drupal

            alert(value);

        });
    });
}

我看到该网址的帖子包含正确的数据。这很好。但没有回应。警报为空。

还有一个新的空白...已经创建了一些东西。其中没有任何内容,但在过滤节点时我可以在 View 中看到它。它没有标题、任何字段等。只有发布日期。

我想要更新的节点没有更新。

所以这让我认为第二步可能有点不正确。我有几个问题。

function post_to_main_node(){

    // Is this sufficient to load the node? nid doesn't have to be set as an arg for the function?
    $node = node_load($_POST['nid']);

    // Is the field set like this? 'field_library' is the 'machine name' of the field. This is what's needed right?
    $node->field_library = $_POST['data'];
    node_save($node);
}

再次非常感谢您。

最佳答案

这可以很容易地完成,但需要几个步骤。

更新了代码以展示我将如何执行此操作。这段代码几乎可以复制到您的 drupal 项目中,但我还没有对其进行过实际测试,因此这里可能存在拼写错误或那里存在错误。

  1. 设置一个您可以发布到的网址 hook_menu() 。您需要使用 CALLBACK 类型。您需要记住的是向菜单项添加某种访问控制。如果您不这样做,则任何人都无法访问它,甚至用户 1 也无法访问它,因为没有进行访问控制。在这种情况下,您应该使用访问参数,并输入用户需要拥有的权限的名称。您可以使用不同模块中已存在的模块,也可以使用 hook_perm 创建自己的模块。 。您需要确保您的用户拥有正确的权限才能使用它。这通常是通过 Drupal AI 完成的。

    function modulename_menu() {
        $items = array();
        $items['update_main_field'] = array(
            'page callback' => 'call_back',
            'type' => MENU_CALLBACK,
            'access arguments' => array('name of perm'),
        );
        return $items;
    
  2. 创建您指定的回调函数,这是当有人访问该网址时将运行的函数。
    一个简单的版本看起来像这样。在保存节点之前,您需要验证数据并执行类似的操作。您可能还想进行权限检查。

    function call_back() {
        $result = array();
        // Here we check the date get the node, update the cck field and save it.
        $node = isset($_POST['nid']) ? node_load($_POST['nid']) : FALSE;
        // $node will be false if nid wasn't set or nid was invalid.
        if (!$node || !isset($_POST['text']); {
            $result['status'] = 'error';
            $result['message'] = t('error message');
        }
        // Check if the loaded node have the correct type so it will have the field we want.
        else if ($node->type != 'node_type') {
            $result['status'] = 'error';
            $result['message'] = t('error message');
        }
        else {
            $node->field = $_POST['text'];
            node_save($node);
            $result['status'] = 'success';
            $result['message'] = t('success message');
        }
        return drupal_json($result);            
    }
    
  3. 添加js文件,可以通过drupal_add_js()来完成,您可能想查看 drupal_get_path()为您的 js 文件创建正确的路径。您可以通过多种不同的方式添加 js 文件。在 hook_form_alter、hook_nodeapi 或生成节点表单时调用的其他 Hook 中。您应该调查哪一个最适合您的情况。如果你使用 hook_form_alter ,它看起来像这样:

    modulename_form_alter(&$form, &$form_state, $form_id){
        // Add js to the desired node form.
        if ($form_id == 'content_type_name_node_form') {
            drupal_add_js(drupal_get_path('module', 'modulename') . '/script.js');
        }
    }
    
  4. 使用 jQuery 执行 javascript 操作,如果您的 fx 有一个按钮和一个文本字段,这可能看起来像这样:

    $("#button_id#").click(function(){
        var nid = $("#edit-field-reference-0-nid-nid").val().replace(/.*?\[nid:(\d+)?]/ig, "$1");
        var text = $("#edit-field-reference-0-nid-nid-wrapper label").text();
        $.post("/update_main_field", {"nid": nid, "text", text}, function(data) {
            // This is basically how jQuery converts response data to json
            var json = eval("(" + data + ")");
            if (json['status'] == "error") {
                // Handle error cases.
            }
            else if (json['status'] == "success") {
                 // Handle the success case.
            }
        });
    });
    
  5. 在你的回调函数中,你处理 $_POST 中的数据,你应该通过返回 json 数据来结束你的函数,你的 js 可以根据它来让用户知道发生了什么。 drupal_json可以用于此目的。

关于jquery - Drupal 6/jQuery Ajax 更新字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1670858/

相关文章:

javascript - 如何访问发送到 php 脚本的 jQuery.ajax() 返回数据

javascript - Django,角色匹配查询不存在

drupal - Flickr 在 drupal 中?

drupal - 将 drupal 6 或 7 用于新的 PHP Web 应用程序?

javascript - 使用jquery选择按下回车时的下一个字段

javascript - 如何在输入框内定位加载动画?

jQuery:将 dom 元素放置在视口(viewport)中心的最佳方式

javascript - 使用 jquery 和 FileResult 更改图像的 src

php - 在ajax中添加一个新的文本框onclick

drupal - 如何将 onchange 处理程序添加到 Drupal 中的下拉列表?