Jquery постоянных сортируемых объектов в Drupal? - PullRequest
2 голосов
/ 29 сентября 2011

Я работаю над проектом в drupal, который позволяет делать скриншоты с закладками (например, zootool.com). У меня есть каждый скриншот в сетке, которая использует jQuery для сортировки. Все это работает правильно, и я могу отсортировать все изображения в любом порядке, который я хочу. Единственная проблема заключается в том, что я не могу сохранить местоположения / порядок, на которые я только что их изменил.

Я использовал модуль 'weight', чтобы назначить значение по умолчанию для каждого скриншота, и это выводится с использованием Views, отсортированных по этому 'weight'. Поэтому мне нужен механизм для обновления / сохранения порядка веса всех узлов при их перемещении с помощью 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, или мне нужно сделать свою собственную страницу, которая будет сохранять узлы? Кроме того, это правильный путь или есть лучший способ обновить / сохранить позиции узлов после перемещения сортируемого окна?

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 15 октября 2011

Хорошо, я решил дополнить свой вопрос найденным решением. Это может помочь другим. Он в значительной степени основан на ответе, который googletorp дал на очень похожий вопрос, размещенный здесь: Drupal 6 / jQuery Ajax обновляет поле .

Шаг 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); строка назначает позицию в массиве 1,2,3,4 и т. д. узлу wight. (Таким образом, создание заказа). 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. Объект (который в моем случае является DIV), помеченный как .sortable-node, становится сортируемым с помощью метода «sortable» jQuery. Когда я нажимаю и перетаскиваю DIV, он делает это:

2.2 Используйте CSS-класс 'ui-state-highlight' между каждым сортируемым DIV.

2.3 Уменьшите непрозрачность до 70%.

2.4 Как только позиция была изменена, она запустит событие «update».

2.5 Событие 'update' создаст переменную с именем 'result', которая содержит строку всех идентификаторов узлов сортируемых объектов. (например, 113,114,115,116,117 и т. д.)

2.6. Метод .ajax запускается, и ему предлагается отправить запрос POST на URL-адрес / update_positions (созданный ранее в файле updatemynode / updatemynode.module) и передать переменную $ _POST с именем 'theorder', которая содержит строку ' результат'. Как только строка «result» передается в URL, тогда функция модуля update_node_position () использует эту строку и выполняет свою магию, как описано выше.

3.0 Мои результаты на странице упорядочены по весу узла с использованием представлений. Таким образом, когда страница перезагружается, порядок должен оставаться таким же, как вы ее заказали (потому что был обновлен node_weight) с помощью вызова AJAX.

Надеюсь, что это может кому-то помочь. Любые вопросы / комментарии приветствуются!

0 голосов
/ 29 сентября 2011

В Drupal такой функциональности еще нет, если только вы не рассчитываете на использование Сервисного модуля над jsonp, что потребует больше времени для настройки, чем самостоятельная реализация функциональности.

По моему мнению, нет лучшего способа сделать это, любой добавленный вами модуль, вероятно, будет очень раздутым с большим количеством функциональных возможностей, которые вам не нужны. Так легко выполнить публикацию в пользовательском пункте меню, что я бы порекомендовал просто сделать это. Вы также получите полный контроль над кодом и сможете оптимизировать его по своему желанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...