gpt4 book ai didi

Drupal 中的 Jquery 持久可排序对象?

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

我正在 drupal 中开发一个项目,该项目允许我拥有可视书签屏幕截图(想想zootool.com)。我将每个屏幕截图放在一个使用 jQuery 进行排序的网格中。这一切都工作正常,我可以将所有图像按我希望的顺序排序。唯一的问题是我无法保存刚刚更改的位置/订单。

我使用“权重”模块为每个屏幕截图分配默认值,这是使用按此“权重”排序的 View 输出的。因此,当我使用 jQuery 移动节点时,我需要一种机制来更新/保存所有节点的权重顺序。

目前我有 jQuery 代码,可以输出带有新订单的警报框:

//Draggable boxes
$(function() {
$( ".sortable-nodes" ).sortable({
placeholder: "ui-state-highlight",
opacity: 0.7,
update: function(event, ui) {
var result = $(this).sortable('toArray');
alert(result);
}
});
});

我的问题是这样的:Drupal 是否已经有一个页面可以用来通过 jQuery.post 更新节点,还是我必须制作自己的页面来保存节点?另外,这是正确的方法还是有更好的方法在移动可排序框后更新/保存节点位置?

非常感谢!

最佳答案

好的,我想我应该用我找到的解决方案来跟进我的问题。它可能会帮助其他人。它很大程度上基于 googletorp 对此处发布的非常相似的问题的回答:Drupal 6/jQuery Ajax update a field .

步骤 1.0 创建一个新模块。我创建了一个简单的 updatemynode.info 文件和 updatemynode.module 文件。

1.1 updatemynode/updatemynode.module包含两个函数。

function updatepos_menu() {

$items = array();
$items['update_positions'] = array(
'page callback' => 'update_node_position',
'type' => MENU_CALLBACK,
'access callback' => TRUE,
'access arguments' => array('access content'),
);
return $items;
}

这是模块中创建 URL www.mywebsite.com/update_positions 的第一个函数,该函数调用 php 函数“update_node_position”。 (见下文)

1.2 updatemynode/updatemynode.module第二个函数是:

   function update_node_position() {
// Create an array from the passed string
$neworder = explode(",", $_POST['theorder']);

// For each array entry, redo their node weight (which Views sorts on)
foreach ($neworder as $key => $value){
$node = node_load($value);
$node->node_weight = ($key+1);
node_save($node);
}
}

为了简洁起见,我删除了任何错误检查,它只是完成了一个功能,仅此而已。基本上,它执行以下操作: A. 搜索 $_POST['theorder'] 变量(其中包含我的应用程序中的 NID 字符串),使用 php 'explode' 将字符串转换为数组并分配给 $neworder。 B. 对于新数组的每个条目,使用值 (NID) 加载该节点。 C. 我正在使用“重量”模块来创建排序。 $node->node_weight = ($key+1); line 将数组 1、2、3、4 等中的位置分配给节点权重。 (从而创建订单)。 D. 保存节点并对数组中的每个条目重复此操作。

2.0 我有一个 main_javascript.js 文件,它附加到我的所有 drupal 页面上。该 javascript 文件包含以下代码:

$(function() {
$( ".sortable-nodes" ).sortable({
placeholder: "ui-state-highlight",
opacity: 0.7,
update: function(event, ui) {

// Create result variable that contains array order.
var result = $(this).sortable('toArray');

// Run AJAX function with RESULT data to update_positions page

$.ajax({
type: "POST",
url: "/update_positions",
// Pass the RESULT array
data: { theorder : [result]},
});
}
});

这是 jQuery 的关键,它做了一些事情:

2.1 标记为 .sortable-nodes 的对象(在我的例子中是一个 DIV)使用 jQuery 'sortable' 方法进行排序。当我单击并拖动 DIV 时,它将执行以下操作:

2.2 在每个可排序 DIV 之间使用 CSS 类“ui-state-highlight”。

2.3 将不透明度降低到70%。

2.4 一旦位置更改,它将运行“更新”事件。

2.5 “update”事件将创建一个名为“result”的变量,其中包含所有可排序对象节点 id 的字符串。 (例如113,114,115,116,117等...)

2.6 .ajax 方法运行并被告知将 POST 请求发送到/update_positions URL(之前在 updatemynode/updatemynode.module 文件中创建)并传递名为“theorder”的 $_POST 变量,其中包含字符串“结果'。一旦字符串“result”被传递到 URL,模块函数 update_node_position() 就会使用这个字符串并按照上面的解释发挥它的魔力。

3.0 我在页面上的结果是使用 View 按节点权重排序的。因此,当页面重新加载时,顺序应该与您使用 AJAX 调用订购的方式保持相同(因为 node_weight 已更新)。

希望这对某人有帮助。欢迎任何问题/意见!

关于Drupal 中的 Jquery 持久可排序对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7596120/

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