Mar*_*ark 4 ajax jquery drupal 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;
}
Run Code Online (Sandbox Code Playgroud)
第二步:
function post_to_main_node(){
// Sorry, I'm totally lost. What do I put here?
}
Run Code Online (Sandbox Code Playgroud)
你也提到了这个:
在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");
}
Run Code Online (Sandbox Code Playgroud)
此外,步骤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);
});
});
}
Run Code Online (Sandbox Code Playgroud)
我在网址上看到了一个带有正确数据的帖子.这很好.但没有回应.警报为空.
还有一个新的空白...已经创建了一些东西.它没有任何内容,但我可以在为节点过滤时在视图中看到它.它没有标题,任何字段等.只是一个发布日期.
我想要更新的节点未更新.
所以这让我认为第二步可能有点不正确.我有几个问题.
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);
}
Run Code Online (Sandbox Code Playgroud)
再次感谢你.
这可以很容易地完成,但它有几个步骤.
更新了代码以显示我将如何执行此操作.这段代码几乎可以复制到你的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;
Run Code Online (Sandbox Code Playgroud)创建一个您指定的回调函数,这是一个访问该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);
}
Run Code Online (Sandbox Code Playgroud)添加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');
}
}
Run Code Online (Sandbox Code Playgroud)如果你有一个按钮和一个文本字段,使用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.
}
});
});
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
5853 次 |
| 最近记录: |