Forzare Drupal ad associare il comportamento di Drupal a nuovi contenuti ajax [solo Drupal.attachBehaviors () non funziona nel modo giusto]


10

Stavo scrivendo molti post su drupal.org su questo argomento, ma sfortunatamente nel contesto sbagliato.

Penso che non sia questo il problema, quindi lo provo con un approccio diverso e forse questa potrebbe essere la soluzione. Caricare l'intera pagina PHP ed estrarre un certo div con ajax non ha funzionato nel modo giusto. Quindi ho pensato di poter caricare drupal solo il contenuto e iniettarlo con ajax nel div. Ho fatto una query con hook_preprocess_page e hook_preprocess_node che sta cercando un "ajax = 1" nell'URL richiesto e quindi distribuisce solo il contenuto senza l'intera pagina. E ora con l'aiuto di alcuni file tpl.php, in teoria, potrei limitare l'output di drupal a solo $ content. Ed ecco il problema. Il mio approccio funziona anche quando lascio i file tpl.php nel modo originale, ma rimuovendo il "$ content" da node-ajax.tpl.php. Con "lavorare nel modo giusto", intendo dire che drupal non ricarica l'intera pagina, ma ovviamente non il contenuto. Ma non posso spiegarmelo, causa nella variabile $ content, quindi ho pensato, è solo l'html del contenuto generato. Quindi la mia domanda è: come posso limitare l'output di drupal, solo al contenuto, o sto facendo i passi sbagliati per farlo funzionare. Ecco il modulo e il file js che sto usando: 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;
    });
};

Per favore, aiutatemi con questo. Ogni suggerimento è apprezzato.


2
Solo un piccolo commento che D7 usa / nojs e / ajax nel percorso per distinguere tra collegamenti ajax e quelli standard. Questo potrebbe farti venire il mal di testa in seguito.
Jeremy French,

Risposte:


11

Ho capito. Funziona nel modo giusto:

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

Grazie per tutto il tuo aiuto.


1
Ricorda di contrassegnare la tua risposta come accettata (e vota tutte le risposte che hanno aiutato). Questo contrassegna questa domanda come risolta nella panoramica. L'upgrade inoltre aiuta a incoraggiare gli utenti a fornire buone risposte.
Berdir,

Dovresti anche usare il "contesto" nel tuo allegato.
Josh Koenig,

solo notare .live () è ora deprecato
ErichBSchulz

Non usare context(come ha sottolineato Josh Koenig) è un grande no-no. Il gestore dell'evento verrà ricollegato a tutti gli elementi della pagina. Con l'utilizzo context, questo codice dovrebbe essere modificato, in quanto contextcontiene documentil primo binding di eventi e l'elemento stesso quando il contenuto verrà sostituito, così semplice $('#content-group-inner a',context)non funzionerà.
Alex Skrypnyk,

10

Penso che i tuoi problemi siano che la tua funzione di successo non avrà il contesto variabile nell'ambito, quindi i comportamenti di attaccamento lavoreranno su indefiniti.

Immagino che tu possa fare

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

Ho pensato che la funzione di successo sarebbe stata una chiusura e avrebbe tenuto in considerazione la variabile context(che è il vecchio contesto anziché il nuovo markup): è sbagliato?
Andy,

Non penso che in questo caso funzioni come una chiusura, ma potrei sbagliarmi al riguardo.
Jeremy francese,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.