it-swarm.it

Force Drupal da allegare Drupal comportamento al nuovo contenuto ajaxed [solo Drupal.attachBehaviors () non funziona nel modo giusto]

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'intero PHP Pagina ed estrarre un certo div con ajax non ha funzionato nel modo giusto. Quindi ho pensato che avrei potuto lasciare drupal caricare 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 il modo originale, ma rimuovendo il "$ content" da node-ajax.tpl.php. Con "lavorare nel modo giusto", intendo che drupal non ricarica l'intera pagina, ma off 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, a solo il contenuto o lo 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.

10
dennis605

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.

11
dennis605

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'));
10
Jeremy French