[英]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。
设置一个你可以使用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;
创建一个您指定的回调函数,这是一个访问该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); }
添加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'); } }
如果你有一个按钮和一个文本字段,使用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. } }); });
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.