繁体   English   中英

Drupal 6 / jQuery Ajax更新字段

[英]Drupal 6/jQuery Ajax update a field

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

我不相信这太难了,但教程或解释会很精彩。

谢谢。

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

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

再次感谢。

非常感谢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?
}

你也提到了这个:

在hook_form_alter,hook_nodeapi或生成节点表单时调用的其他一些钩子。 您应该调查哪种情况最适合您的情况。

如何生成节点表单?

第三步:

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

        });
    });
}

我在网址上看到了一个带有正确数据的帖子。 这很好。 但没有回应。 警报为空。

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

我想要更新的节点未更新。

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

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项目中,但是我还没有对它进行过测试,所以这里可能会有拼写错误或者有bug。

  1. 设置一个你可以使用hook_menu()发布的网址。 您需要使用CALLBACK类型。 您需要记住的是为菜单项添加某种访问控制。 如果你不这样做,没有人可以访问它,甚至用户1,因为没有访问控制。 在这种情况下,您应该使用访问参数,并输入用户需要具有的perm的名称。 您可以使用已存在于不同模块中的模块,也可以使用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. 创建一个您指定的回调函数,这是一个访问该URL时将运行的函数。
    一个简单的版本看起来像这样。 在保存节点之前,您需要验证数据并执行类似的操作。 您可能还想进行权限检查。

     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_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东西看起来像这样吗:

     $("#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可以用于此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM