我位于同一站点的不同路径上,并且我需要允许用户更改他/她在不同位置写入的节点上的字段内容。我有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 项目中,但我还没有对其进行过实际测试,因此这里可能存在拼写错误或那里存在错误。
设置一个您可以发布到的网址 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;
创建您指定的回调函数,这是当有人访问该网址时将运行的函数。
一个简单的版本看起来像这样。在保存节点之前,您需要验证数据并执行类似的操作。您可能还想进行权限检查。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 中。您应该调查哪一个最适合您的情况。如果你使用 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 操作,如果您的 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. } }); });
- 在你的回调函数中,你处理 $_POST 中的数据,你应该通过返回 json 数据来结束你的函数,你的 js 可以根据它来让用户知道发生了什么。 drupal_json可以用于此目的。
关于jquery - Drupal 6/jQuery Ajax 更新字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1670858/