Zmuszaj Drupala do dołączenia zachowania Drupala do nowej treści aukcji [tylko Drupal.attachBehaviors () nie działa poprawnie]


10

Robiłem wiele postów na drupal.org na ten temat, ale niestety w niewłaściwym kontekście.

Myślę, że to nie jest problem, więc wypróbowałem to z innym podejściem i być może może to być rozwiązanie. Ładowanie całej strony PHP i wyodrębnianie określonego pliku div za pomocą ajax nie działało we właściwy sposób. Pomyślałem więc, że mogę pozwolić drupalowi na załadowanie tylko treści i wstrzyknięcie jej za pomocą ajax do div. Zrobiłem zapytanie za pomocą strony hook_preprocess_pode i hook_preprocess_node, która szuka „ajax = 1” w żądanym adresie URL, a następnie podaje zawartość tylko bez całej strony. A teraz, przy pomocy niektórych plików tpl.php, teoretycznie mógłbym ograniczyć wydajność drupala tylko do treści $. I tu jest problem. Moje podejście działa nawet wtedy, gdy zostawiam pliki tpl.php w oryginalny sposób, ale usuwam „$ content” z węzła-ajax.tpl.php. Przez „działanie we właściwy sposób” mam na myśli, że drupal nie przeładowuje całej strony, ale oczywiście nie treść. Ale nie mogę sobie tego wytłumaczyć, bo zmienna $ content, tak myślałem, to tylko HTML wygenerowanej treści. Moje pytanie brzmi: w jaki sposób mogę ograniczyć wydajność drupala do samej zawartości, czy też robię niewłaściwe kroki, aby to działało. Oto moduł i plik js, którego używam: 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;
    });
};

Proszę, pomóż mi z tym. Każda sugestia jest doceniana.


2
Tylko mały komentarz D7 używa w ścieżce / nojs i / ajax, aby odróżnić linki ajax od standardowych. To może później zaoszczędzić trochę bólu głowy.
Jeremy French,

Odpowiedzi:


11

Mam to. Działa to we właściwy sposób:

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;
        });
   };

Dziękuję Ci za całą twoją pomoc.


1
Pamiętaj, aby zaznaczyć własną odpowiedź jako zaakceptowaną (i głosować za wszystkimi odpowiedziami, które pomogły). Oznacza to, że pytanie zostało rozwiązane w przeglądzie. Uaktualnianie dodatkowo pomaga zachęcić użytkowników do udzielania dobrych odpowiedzi.
Berdir

Powinieneś także używać „kontekstu” w swoim załączaniu.
Josh Koenig

tylko zauważając, że .live () jest teraz przestarzałe
ErichBSchulz

Nieużywanie context(jak zauważył Josh Koenig) jest dużym nie-nie. Twój moduł obsługi zdarzeń zostanie ponownie dołączony do wszystkich elementów na stronie. Przy użyciu contextten kod musiałby zostać zmieniony, ponieważ contextzawiera documenton powiązanie pierwszego zdarzenia i sam element, kiedy treść zostanie zastąpiona, więc proste $('#content-group-inner a',context)nie zadziała.
Alex Skrypnyk

10

Myślę, że Twoim problemem jest to, że funkcja sukcesu nie będzie miała zmiennego kontekstu w zakresie, więc zachowania dołączania będą działać na niezdefiniowane.

Domyślam się, że dasz radę

Drupal.attachBehaviors($('#content-region-inner'));

Myślałem, że funkcją sukcesu byłoby zamknięcie i utrzymanie zmiennej context(która jest starym kontekstem zamiast nowego znacznika) w zasięgu: czy to źle?
Andy,

Nie sądzę, aby działało to w tym przypadku jako zamknięcie, ale mogę się bardzo mylić.
Jeremy French,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.