Drupal AJAX Nodeloader

26.02.2012
19:50

1. Модуль Ajax Nodeloader позволит вам:

2. Частые вопросы по использованию модуля.

См.: http://www.denry.ru/programmirovanie/662-ajax-nodeloader-f-a-q-ru/

3. Загрузка

Существует несколько способов скачать этот модуль:

1. Скачать файлы .zip с github.com

7.x-1.x.zip

6.x-1.x.zip

2. или клонировать исходный код модуля с drupal.org

Версия для Drupal 7:

git clone --branch 7.x-1.x http://git.drupal.org/sandbox/nick-denry/1447152.git ajax_nodeloader
cd ajax_nodeloader

Версия для Drupal 6:

git clone --branch 6.x-1.x http://git.drupal.org/sandbox/nick-denry/1447152.git ajax_nodeloader
cd ajax_nodeloader 

или github.com

git://github.com/nick-denry/Ajax-Nodeloader.git

Внимание! Ajax Nodeloader — это проект с открытым исходным кодом, однако в настоящий момент код является экспериментальным и проходит проверку на drupal.org (en).

3. Описание

Чтобы загрузить ноду без перезагрузки вам необходимо добавить класс «nodeloader» к ссылке, указывающей на ноду, которую вы хотите загрузить, например:

<a href="/node/1" class="nodeloader">Test link</a>

Переименованные ссылки также поддерживаются:

<a href="/contacts.html" class="nodeloader">Test link</a>

Наверх

Добавлена поддержка пользовательских селекторов для отображения материала нод, с помощью аттрибута rel и JSON. Например:

<a href="/node/2" class="nodeloader" rel={'title':'#selector1','body':'#selector2'}>Эта ссылка загрузит и покажет загловок вашей ноды #2 в теге с id="selector1", и тело(body) вашей ноды #2 в теге с id="selector2"</a>

Вы можете указывать селектор только для title или для body вашей ноды, отдельно друг для друга, например:

<a href="/node/2" class="nodeloader" rel={'title':'#selector1'}>Only title custom target</a>

или

<a href="/node/2" class="nodeloader" rel={'body':'#selector2'}>Only body custom target</a>

Элементы JSON-строки должны быть заключены в одинарные кавычки для корректной работы.

Наверх

Версия модуля для Drupal 7 теперь может загружать все поля (fields) нод вместо загрузки только body и title по-умолчанию.

Теперь вы можете заружать поля в произвольные селекторы, используя синтаксис, указанный выше. Например, если вы имеете поля «field_text» и «field_price», вы можете загрузить их следующим образом:

<a href="/node/2" rel="{'title':'#some-id-selector1','body':'.someclass span','field_text':'#some-id-selector2','field_price':'#selector3'}">Load title, body and custom fields link</a>

Наверх

Для того, чтобы добавить поддержку загрузки нод в меню через AJAX, используйте модуль
http://drupal.org/project/menu_attributes

Наверх

Включайте или выключайте отслеживание Google Analytics с помощью Ajax Nodeloader в панели администратора.

Наверх

Модуль имеет частичную поддержку для навигации по хэш-тегу, например, следующая ссылка
http://yoursite.org/#/contacts.htm

загрузит страницу /contacts.html вместо главной страницы «yoursite.org»

Наверх

В скором времени в модуль будет добавлена поддержка названий полей (fields labels).

26.07.2012
14:23

46 комментариев на “Drupal AJAX Nodeloader”

  1. Алексей:

    Здравствуйте, спасибо за ваш модуль.
    Как можно добавить поля к выводу (field_ИМЯ_ПОЛЯ, drupal 7) ? Через селекторы не получается.
    Я не силен в программировании, не подскажите, что можно добавить в ajax_nodeloader.module для вывода произвольных полей вместе с body. Заранее спасибо

    • Nick Denry:

      Добавлена частичная поддержка загрузки полей для версии 7. В ближайшие несколько дней будет добавлена полная поддержка.

      • Алексей:

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

        • Nick Denry:

          В ближайшее время будет реализована улучшенная навигация на основе HTML5 History.API для тех браузеров, которые ее поддерживают, и улучшена работа с полями для Drupal 7.

          UPD. К сожалению, проверка модуля на drupal.org проходит медленно, поэтому пока нет возможности предоставлять автоматические обновления.

  2. Андрей:

    А можно как-то этим же модулем вывести вэб-форму???

  3. Nick Denry:

    Здравствуйте, Алексей. К сожалению, в настоящий момент функционал разработан только для вывода field_body и node title. Однако, работа над загрузкой произвольных полей для Drupal 7 ведется. Я планирую выложить обновленную версию модуля через несколько дней.

  4. Nick Denry:

    Добрый день, Андрей. В настоящий момент модулем предусмотрен вывод только заголовков и содержания (body) нод. Тем не менее, мне хотелось бы знать, какого типа форму и в какой версии Drupal вы хотите вывести? Для drupal 6 существует модуль http://drupal.org/project/ajax_load , возможно он сможет вам помочь. Функционал модуля nodeloader будет расширяться, однако я не уверен насчет загрузки форм.

  5. Андрей:

    Добрый день, Nick. Сайт стоиться на drupal 7, модуль ajax_load видел, но его нет для семёрки. На форме будет несколько чекбоксов и поля для ввода имени и e-mail. Сабмит формы тоже будет прозводиться аяксом, но это уже я сам сделать смогу… по сути тут наверно должно быть всё то же самое, только если при выводе боди выводим одно поле, то в случае с формой надо будет вручную формировать html так как поля хранятся в разных ячейках таблицы. Я в php не очень силён, я больше по C# работаю, но если у меня получиться реализовать вывод, я могу вам прислать исходники чтобы внедрить потом мой код в Ваш модуль, я думаю функция полезная будет.

  6. Nick Denry:

    Андрей, я думаю вам нужно в первую очередь посмотреть в сторону модулей:

    http://drupal.org/project/webform
    http://drupal.org/project/webform_ajax_page

    и, возможно
    http://drupal.org/project/webform_ajax

    Модуль webform очень прост в настройке и установке, и кроме того, существует для drupal 7. Я настоятельно рекомендую использовать вам его во всех случаев, кроме тех, когда вы создаете динамические формы/формы с динамически изменяемым количеством полей. Пробуйте, если решение на основе набора этих модулей вас не устроит — возвращайтесь, я готов подумать над загрузкой форм на основе webform через nodeloader как дополнительный функционал, но модуль nodeloader в первую очередь все-таки предназначен для вывода контентной части сайтов.

  7. Андрей:

    Nick, webform у меня стоит, другие два модуля посмотрел:
    webform_ajax_page — для многостраничных форм, не подходит;
    webform_ajax — по описанию должен делать как раз то всё что мне надо, но он пока в разработке, попробовал поставить, но он у меня практически не работает… буду ждать стабильной версии…
    В любом случае спасибо… полезные модули показали…

  8. Nick Denry:

    Андрей, пожалуйста. Возвращайтесь, если ничего не найдете.

    • Андрей:

      И снова добрый день Nick.
      Ничего толкового так и не нашёл… вывести форму получилось немного изменив Ваш модуль. Форму сделал доступную как блок и получил её код с помощью module_invoke. Получилось вот так:

      function ajax_nodeloader_load_node($encoded_url) {

      switch($node->type) {
      case ‘page’: {
      // Get body filed value.
      $body_field = field_get_items(‘node’, $node, ‘body’, $node->language);
      $node_info['body'] = render(field_view_value(‘node’, $node, ‘body’, $body_field[$delta]));
      break;
      }

      case ‘webform’: {
      $block = module_invoke(‘webform’, ‘block_view’, ‘client-block-’.$nid);
      $node_info['body'] = render($block);
      }
      }

      }

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

  9. Алексей:

    Добрый день, у меня еще одна проблема. Если сайт на другом языке, т. е. когда он с суффиксом «mysite/en/….», модуль не может получить id ноды. Не проходит эта проверка if ($nid != 0) { $node = node_load($nid); }. Если вручную пишу перед этим условием, например, $nid = 126; , то все работает. Включены человекопонятные ссылки. Очень надеюсь на Вашу помощь. Спасибо.

    • Алексей:

      не работает эта функция для других языков drupal_lookup_path(‘source’, $encoded_url).
      В drupal api посмотрел что она выглядит так: drupal_lookup_path($action, $path = », $path_language = NULL). Вместо $path_language подставлял: $node->language, ‘en’, ‘/en’, ‘en/’. Ничего не помогло.

      • Nick Denry:

        Алексей, каким образом вы указываете ссылку на ноду? Открывается ли она без класса «nodeloader»? С помощью чего вы создаете многоязычный контент?

        • Алексей:

          да, открывается. Ссылки выводятся во views вида: /en/menu/zakuski/mushrooms-truffles, там же им присваивается класс nodeloader.

          $encoded_url выводит эту же ссылку — /en/menu/zakuski/mushrooms-truffles

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

        • Алексей:

          использую модуль i18n, у меня сайт на 3-х языках

          • Nick Denry:

            Спасибо за сообщение, Алексей. Я буду изучать эту проблему, в течении некоторого времени сообщу вам о результатах.

          • Nick Denry:

            Алексей, у меня заработала загрузка многоязычных страниц путем прямого добавления языкового префикса перед отправкой AJAX-запроса в JS модуля. Многоязычный контент создавался с помощью стандартного модуля «Content translation». Пожалуйста, попробуйте текущую версию и сообщите о результатах — они могут отличаться при использовании i18n.

            Сейчас изменения доступны для 7й версии.

          • Алексей:

            К сожалению, добавление префикса не помогло, адрес и так передавался с префиксом. А функция drupal_lookup_path почему-то не хотела работать с префиксом. Поэтому я вставил в строку 66 файла ajax_nodeloader.module такой костыль:

            $lang_flag = NULL;
            $rest = substr($encoded_url, 0, 3);
            if (($rest == ‘en/’)||($rest == ‘ro/’)) {
            $encoded_url = substr($encoded_url, 3);
            $lang_flag = substr($rest, 0, 2);
            }

            а в функцию drupal_lookup_path передал третий параметр «$lang_flag». Теперь все работает!
            Еще раз спасибо Вам за модуль.

          • Nick Denry:

            Алексей, посмотрите, пожалуйста, что отдает исходный модуль по адресам:

            http://ваш-сайт/en/node_load/node-alias.html
            http://ваш-сайт/ro/node_load/node-alias.html
            http://ваш-сайт/ru/node_load/node-alias.html

            Если модуль возвращает искомый контент, вы можете использовать последнюю версию модуля.

            Ваша почта, указанная при регистрации в комментариях — действительная?

          • Алексей:

            Передает false в первых двух случаях, в третьем страница не найдена. Да, почта действительна.

          • Алексей:

            забыл сказать сайт пока на denwer’e

          • Nick Denry:

            Спасибо, Алексей. Отправил детали запроса вам на почту.

  10. head:

    3. Описание

    hode/1 => node/1

  11. head:

    В настройках views в мультиполе image не могу добавить класс для ссылки , в итоге ваш метод не работает .

    Как можно обойти это ?

    • Nick Denry:

      Что есть мультиполе image? Среди стандартных fileds его нет, насколько я понимаю?

  12. head:

    Добавьте в песочницу на дорге демонстрационную страницу и обновите ссылку , там сейчас версия 0.01 .

    • Nick Denry:

      Какую ссылку я должен обновить? Остальные замечания исправил, спасибо.

  13. head:

    http://drupal.org/sandbox/nick-denry/1447152

    Если есть возможность , залить новую версию .

    В описании у атрибута rel после знака равно фигурная скобка , забыли в двойные кавычки взять .

  14. Дмитрий:

    Здраствуйте, очень хороший модуль, но не могу вывести никак страницу views, подумал что можно было бы создать страницу и написать php код для вывода блока views. Но код php почему то не исполняется. Пишу в body, а страничка ничего не отображает если через ajax, php filter. Объясните пожалуйста как выполнить код в body или вывести view с помощью модуля?

    • Nick Denry:

      К сожалению, функционал модуля ограничен загрузкой и выводом нод и полей нод (node fileds). Для модуля views, я думаю, вам стоит поискать ругие решения, либо full ajax варианты модулей для Drupal. Обработка фильтра php в настоящий момент не реализована, но находится в разработке вместе с загрузкой блоков.

  15. Уверен прекрасный модуль, спасибо. Но у меня не заработал, выдал:
    uncaught exception: Invalid JSON: {«nid»:»2″, «title»:»;02=K9 -:040H8 3>40  0=4020 8@460;0!», «fields»:{«body»:»\u003Cp\u003E\u003Cimg alt=\u0022ekadashi4.jpg\u0022 src=\u0022\u002Fsites\u002Fdefault\u002Ffiles\u002F1\u002Fimages\u002F2012\u002F05\u002Fekadashi4.jpg\u0022 style=\u0022width:520px;height:284px;\u0022 \u002F\u003E1 8N=O 2 «$>@C;;» ?@>945B >G5@54=>9 =>G=>9 D5AB820;L 2548G5A:>9 :C;LBC@K «-(  11-/ ’,».  ?@>3@0<<5 ?@8;=8B5;8 4@52=8E 8=489A:8E AA88 (@8;0 E0:B8 =0=B0 @8H=0 >A20<8, (@8<0= 48B8 C:E0E0 ?@01EC, (@8H0 0@H8 8B09 ?@01EC 8 8725AB=K9 N@8AB !2OB>A;02 I5=:>. -:040H8 — (A0=A:@.  «>48==04F0BL»)  >48==04F0BK9 45=L ?>A;5 ?>;=>;C=8O 8 =>2>;C=8O :064>3> ;C==>3> 745@60=85 >B C?>B@51;5=8O 2 ?8IC 75@=>2KE 8 1>1>2KE 8 >A>1K5 CA8;8O 2 4CE>2=>9 ?@0:B8:5 2 -:040H8 ?>30NB 4CH5 4>AB8GL >A2>1>645=8O 87 F8:;0 @>645=8O 8 AAB 8 4CE>2=0O ?@0:B8:0 2 0=4020 -:040H8 70AG8BK20NB ?;>4K 0A:57 70 2A5 -:040H8 3>40. @>3@0<A2OI5==0O MB><C 701KB8N, ?@5?>4=5A5B A2>8ABO< 0BAD5@C 3;C1>:>3> ?>3@C65=8O 2 4@52=NN 4CE>2=CN ?@0:B8:C A?520=85 1E0460=>2 8 5: =0 >B:@KB85 A5@4F0 4CE>2=K< M=5@38OG8I0NI8 >B A:>?82H53>AO =530B820 70 385 687=8. «0:65 20A 645B 7=0:> A 2548G5A:>9 :C;LBC@>9 =0 ?@0:B8:5  2>76=>ABL ?5@5>45BLAO 2 A0@8 8 4E>B8, C:@0A8BL A51O ?8-4>BA0=AC;LB0F88 2548G5A:8E 0AB@>;>3>2 8 E8@>2, 0@>AB8:0, 2>AB>G=K9 I5=8O, <0E0-" " =0 250 :3 8 CB@5==89  !\u003C\u002Fp\u003E\u000A\u003Cp\u003E\u003Cstrong\u003E% !+\u003C\u002Fstrong\u003E !B.2A:0O 11\u002F10\u003C\u002Fp\u003E\u000A\u003Cp\u003E\u003Cstrong\u003E>4@>1=>AB8\u003C\u002Fstrong\u003E: \u003Ca href=\u0022http:\u002F\u002Fwww.gauraclub.ru\u0022\u003Ewww.gauraclub.ru\u003C\u002Fa\u003E 8 ?> B5;5D>=040\u0022 \u002F\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E», «field_category»:»\u003Cspan thmr=\u0022thmr_3\u0022\u003E\u003Ca href=\u0022\u002Fpoznavatelnye-materialy\u002Fsamopoznanie\u0022 typeof=\u0022skos:Concept\u0022 property=\u0022rdfs:label skos:prefLabel\u0022\u003E!0?>7=0=85\u003C\u002Fa\u003E\u003C\u002Fspan\u003E», «meta_robots»:»"}}jQuery.extend(Drupal.settings, {«thmr_2″:{«id»:»thmr_2″, «name»:»image», «used»:»theme_image», «type»:»func», «duration»:0.2, «candidates»:[ "image" ], «preprocessors»:[ "rdf_preprocess_image" ], «processors»:[ ]}, «thmr_1″:{«id»:»thmr_1″, «name»:»image_formatter», «used»:»theme_image_formatter», «type»:»func», «duration»:2.74, «candidates»:[ "image_formatter" ], «preprocessors»:[ ], «processors»:[ ]}, «thmr_3″:{«id»:»thmr_3″, «name»:»link», «used»:»theme_link», «type»:»func», «duration»:0.1, «candidates»:[ "link" ], «preprocessors»:[ ], «processors»:[ ]}, «request_id»:»1577892433502324cae7343″, «devel_themer_uri»:»\u002Fdevel_themer\u002Fvariables\u002F1577892433502324cae7343″});

    В то же время ответ: 200 OK 819ms. JSON массив пришел, но загрузка не пошла, gif крутится и все.

  16. Предыдущая ошибка, из-за «theme developer». Сейчас какая-то каша на странице получилась, когда я отключил модуль theme developer. Во первых, при каждом переходе, загружается ajax-loader.gif. Во вторых, страница открывается нормально, потом отрабатывает Ajax nodeloader, верстка слетает. Далее жму на ссылку с классом «nodeloader», верстка восстанавливается и загружается нода, при этом URL меняется на путь ноды как бы загруженной аяксом, но все блоки остаются с изначальной страницы.
    Мне нужно просто открыть ноду аяксом в модальном окне, видимо этот модуль не для меня…

    • Nick Denry:

      Об этой ошибке мне стало известно несколько дней назад, работаю над ее устранением. Используйте версию без html5 History API или дождитесь устранения проблемы. Я надеюсь закончить с этим в течении нескольких ближайших дней. Спасибо.

      • Однозначно страницу в закладки. Я слежу за развитием проекта :)
        Моя задача решена другим способом, но этот модуль будет использован на других проектах.

  17. Евгений:

    Добрый день!
    Столкнулся с проблемой и, боюсь, без вашей помощи мне не обойтись…

    На хосте стоит чистый друпал 6, только с теми плагинами, которые необходимы для работы AJAX Node Loader, на него натянут простой шаблон artisteer. Отдельным блоком я сверстал меню, в котором кликабельные изображения с ссылкой и, прописанным в ней, классом «nodeloader». Выглядит так:

    Плагин не срабатывает вообще, нет ни картинки загрузчика, ничего. Страница просто загружается в обычном режиме. Fire bug выдаёт такую ошибку при клике на ссылку:
    TypeError: $(«a.nodeloader»).die is not a function
    $(‘a.nodeloader’).die(‘click’).live(‘click’,nodeloader_click);

    Подскажите, пожалуйста, как решить проблему?

    Update: попробовал подгрузить страницу по примеру http://mysite/ajax_nodeloader/contacts и получил вполне внятный ответ:
    {«title»:»Contact»,»body»:»\u0412\u0441\u0435\u043c \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u044b, \u043f\u043e\u0441\u043e\u043d\u044b»,»nid»:»4″}

    Но тогда не понятно, почему-ж модуль не срабатывает при клике на ссылку с классом «nodeloader» и загружает страницы обыкновенным образом?

    • Nick Denry:

      Простите, очень много спама — пропустил ваш комментарий. В настоящее время в модуле имеется несколько ошибок, они будут устранены в ближайшее время. Возвращайтесь через несколько дней.

      • Евгений:

        Здравствуйте! Большое спасибо за ваш ответ и за то, что вы взялись за устранение ошибок, тем самым помогая мне. Благодарю вас и буду ждать новостей в ближайшее время!

      • Евгений:

        Добрый день! Скажите пожалуйста, есть ли какиенибудь подвижки в исправлении ошибок модуля?

  18. Roman:

    как мне добавить в ссылку на ноду селектор, если ссылки выводятся через вьюс как поля, поле картинки и поле заголовка, а? Я уже галаву сломал(

  19. s_m:

    во-первых, хочу сказать спасибо за проделанный труд. ваш модуль очень пригодился
    но есть одна проблемка. отображается только тело ноды, заголовок ноды ни в какую не хочет появляться.
    может быть я что то не так делаю?

    имеется нода — article
    нода формируется шаблоном — node—article.tpl.php

    в шаблоне ноды заголовок формируется таким образом

    пробовал в настройках Ajax Nodeloader в поле «Set default css selector where display your titles» подставить #article-header. НИЧЕГО НЕ ВЫШЛО

    пробовал в ссылку на ноду подставлять rel=»{‘title’:'#article-header’} — так же НИЧЕГО НЕ ВЫШЛО

    подскажите, плиз, что я делаю не так?

    • Nick Denry:

      Спасибо. В настоящее время модулем поддерживается только тип Basic Page, модуль ограничен в своем применении. Планы по доработке модуля есть, но пока нет времени на их осуществление, к сожалению.

Оставить комментарий

CAPTCHA изображение