gpt4 book ai didi

jquery - Drupal 6/jQuery Ajax 更新字段

转载 作者:行者123 更新时间:2023-12-01 00:05:18 24 4
gpt4 key购买 nike

我位于同一站点的不同路径上,并且我需要允许用户更改他/她在不同位置写入的节点上的字段内容。我有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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com