Заставить Drupal присоединить поведение Drupal к новому ajaxed-контенту [только Drupal.attachBehaviors () работает неправильно]

10

Я делал много постов на drupal.org на эту тему, но, к сожалению, не в том контексте.

Я думаю, что это не проблема, поэтому я пробую это с другим подходом, и, возможно, это может быть решением. Загрузка всей страницы PHP и извлечение определенного div с помощью ajax не работает должным образом. Поэтому я подумал, что могу позволить drupal загружать только содержимое и вставлять его с помощью ajax в div. Я сделал запрос с hook_preprocess_page и hook_preprocess_node, который ищет «ajax = 1» в запрошенном URL, а затем только выдает контент без всей страницы. И теперь с помощью некоторых файлов tpl.php теоретически я могу ограничить вывод drupal только $ content. И здесь проблема. Мой подход работает, даже когда я оставляю файлы tpl.php оригинальным способом, но удаляя «$ content» из node-ajax.tpl.php. Под «правильной работой» я имею в виду, что drupal не перезагружает всю страницу, но, конечно, не содержание. Но я не могу объяснить это себе, потому что причина в переменной $ content, так что я подумал, это только HTML-код сгенерированного контента. Итак, мой вопрос: как я могу ограничить вывод drupal только контентом, или я делаю неправильные шаги, чтобы заставить это работать. Вот модуль и js-файл, который я использую: my_ajax.module:

<?php

function my_ajax_init()
{
    drupal_add_js(drupal_get_path('module', 'my_ajax') . '/my_ajax.js');
}

function my_ajax_preprocess_page(&$vars, $hook)
{

    if (isset($_GET['ajax']) && $_GET['ajax'] == 1)
    {
        $vars['template_file'] = 'page-ajax';
    }
}

function my_ajax_preprocess_node(&$vars, $hook)
{

    if (isset($_GET['ajax']) && $_GET['ajax'] == 1)
    {
        $vars['template_file'] = 'node-ajax';
    }
}

my_ajax.js:

Drupal.behaviors.my_ajax = function (context) {
    $('#content-group-inner .node a').live('click', function (e) {
        var url = $(this).attr('href');
        //$('#content-region-inner').slideUp('slow');
        $('#content-region-inner').empty().html('<img src="ajax-loader.gif" style="margin-left:50%;"/>');
        xhr = $.ajax({
            data: 'ajax=1',
            type: 'GET',
            url: url,
            success: function (data) {
                $('#content-region-inner').html(data);
                Drupal.attachBehaviors(context);
            }
        });
        return false;
    });
};

Пожалуйста, помогите мне с этим. Каждое предложение приветствуется.

dennis605
источник
2
Небольшой комментарий D7 использует / nojs и / ajax в пути, чтобы отличить ссылки ajax от стандартных. Это может избавить вас от головной боли позже.
Джереми Френч

Ответы:

11

Я понял. Это работает правильно:

Drupal.behaviors.my_ajax = function (context) {
    $('#content-group-inner a').live('click', function (e) {

        $('#content-group-inner a').addClass('my_ajax-processed');
        var url = $(this).attr('href');
        $('#content-region-inner').empty().html('<img src="ajax-loader.gif" style="margin-left:50%;"/>');        
        $('#content-region-inner').load(url,'ajax=1',function() {
                        Drupal.attachBehaviors('#content-region-inner');
                        });
        return false;
        });
   };

Спасибо за твою помощь.

dennis605
источник
1
Не забудьте пометить свой ответ как принятый (и опишите все ответы, которые помогли). Это помечает этот вопрос как решенный в обзоре. Оптимизация также помогает пользователям дать хорошие ответы.
Бердир
Вы также должны использовать «контекст» в вашем приложении.
Джош Кениг
просто отметив, что .live () устарела
ErichBSchulz
Не использовать context(как отметил Джош Кениг) - это большое нет-нет. Ваш обработчик событий будет повторно присоединен ко всем элементам на странице. При использовании contextэтот код необходимо будет изменить, так как он contextсодержит documentпервую привязку события и сам элемент, когда содержимое будет заменено, поэтому простой $('#content-group-inner a',context)способ работать не будет.
Алексей Скрипник,
10

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

Я предполагаю, что вы могли бы сделать

Drupal.attachBehaviors($('#content-region-inner'));
Джереми Френч
источник
Я думал, что функция успеха будет закрытием и сохранит переменную context(которая является старым контекстом, а не новой разметкой) в области видимости: это неправильно?
Энди
Я не думаю, что это работает как закрытие в этом случае, но я могу быть очень неправ в этом.
Джереми Френч