Drupal zwingen, Drupal-Verhalten an neuen Ajax-Inhalt anzuhängen [nur Drupal.attachBehaviors () funktioniert nicht richtig]

10

Ich habe viele Beiträge auf drupal.org zu diesem Thema verfasst, aber leider im falschen Kontext.

Ich denke, das ist nicht das Problem, also versuche ich es mit einem anderen Ansatz, und vielleicht könnte dies die Lösung sein. Das Laden der gesamten PHP-Seite und das Extrahieren eines bestimmten Div mit Ajax funktionierte nicht richtig. Also dachte ich, ich könnte Drupal nur den Inhalt laden lassen und ihn mit Ajax in das Div injizieren. Ich habe eine Abfrage mit hook_preprocess_page und hook_preprocess_node durchgeführt, die nach einem "ajax = 1" in der angeforderten URL sucht und dann nur den Inhalt ohne die gesamte Seite ausgibt. Und jetzt könnte ich mit Hilfe bestimmter tpl.php-Dateien theoretisch die Ausgabe von drupal auf nur $ content beschränken. Und hier ist das Problem. Mein Ansatz funktioniert auch dann, wenn ich die tpl.php-Dateien auf die ursprüngliche Weise belasse, aber den "$ content" aus node-ajax.tpl.php entferne. Mit "richtig arbeiten" meine ich, dass Drupal nicht die ganze Seite neu lädt, aber natürlich nicht den inhalt. Aber ich kann mir das nicht erklären, weil in der Variablen $ content, also dachte ich, nur das HTML des generierten Inhalts ist. Meine Frage ist also, wie ich die Ausgabe von Drupal auf den Inhalt beschränken kann oder ob ich die falschen Schritte mache, um dies zum Laufen zu bringen. Hier ist das Modul und die JS-Datei, die ich verwende: 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;
    });
};

Bitte helfen Sie mir dabei. Jeder Vorschlag wird geschätzt.

dennis605
quelle
2
Nur ein kleiner Kommentar D7 verwendet / nojs und / ajax im Pfad, um zwischen Ajax-Links und Standard-Links zu unterscheiden. Das kann Ihnen später Kopfschmerzen ersparen.
Jeremy French

Antworten:

11

Ich habe es. Das funktioniert richtig:

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

Danke für all deine Hilfe.

dennis605
quelle
1
Denken Sie daran, Ihre eigene Antwort als die akzeptierte zu markieren (und alle Antworten, die geholfen haben, zu bewerten). Dies markiert diese Frage als in der Übersicht gelöst. Upvoting hilft außerdem dabei, Benutzer zu ermutigen, gute Antworten zu geben.
Berdir
Sie sollten auch den "Kontext" in Ihrem Anhang verwenden.
Josh Koenig
Nur .live () ist jetzt veraltet
ErichBSchulz
Nicht zu benutzen context(wie Josh Koenig betonte) ist ein großes Nein-Nein. Ihr Event-Handler wird erneut an alle Elemente auf der Seite angehängt. Mit Verwendung contextmüßte dieser Code geändert werden, da das contextenthält documentauf der ersten Ereignisbindung und das Element selbst , wenn der Inhalt ersetzt wird, so einfach $('#content-group-inner a',context)ist , nicht zur Arbeit gehen.
Alex Skrypnyk
10

Ich denke, Ihre Probleme sind, dass Ihre Erfolgsfunktion nicht den variablen Kontext im Gültigkeitsbereich hat, sodass das Verhalten von Anhängen undefiniert funktioniert.

Ich würde vermuten, dass Sie tun könnten

Drupal.attachBehaviors($('#content-region-inner'));
Jeremy French
quelle
Ich dachte, dass die Erfolgsfunktion ein Abschluss wäre und die Variable context(die eher der alte Kontext als das neue Markup ist) im Geltungsbereich hält: Ist das falsch?
Andy
Ich denke nicht, dass es in diesem Fall als Abschluss funktioniert, aber ich könnte mich sehr irren.
Jeremy French