Forcer Drupal à associer le comportement Drupal au nouveau contenu ajaxé [seul Drupal.attachBehaviors () ne fonctionne pas correctement]

10

Je faisais beaucoup de messages sur drupal.org sur ce sujet, mais malheureusement dans le mauvais contexte.

Je pense que ce n'est pas le problème, donc je l'essaie avec une approche différente, et cela pourrait peut-être être la solution. Charger toute la page PHP et extraire un certain div avec ajax n'a pas fonctionné correctement. J'ai donc pensé que je pouvais laisser Drupal charger juste le contenu et l'injecter avec ajax dans le div. J'ai fait une requête avec hook_preprocess_page et hook_preprocess_node qui cherche un "ajax = 1" dans l'URL demandée et ne donne ensuite que le contenu sans la page entière. Et maintenant, avec l'aide de certains fichiers tpl.php, en théorie, je pourrais limiter la sortie de drupal à seulement $ content. Et voici le problème. Mon approche fonctionne même lorsque je laisse les fichiers tpl.php de la manière originale, mais en supprimant le "$ content" de node-ajax.tpl.php. Avec "travailler dans le bon sens", je veux dire que drupal ne recharge pas la page entière, mais bien sûr pas le contenu. Mais je ne peux pas m'expliquer cela, car dans la variable $ content, alors j'ai pensé que ce n'est que le html du contenu généré. Donc ma question est, comment puis-je limiter la sortie de drupal, au contenu uniquement, ou suis-je en train de faire les mauvaises étapes pour que cela fonctionne. Voici le module et le fichier js que j'utilise: 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;
    });
};

S'il vous plait, j'ai besoin de votre aide avec ceci. Chaque suggestion est appréciée.

dennis605
la source
2
Juste un petit commentaire D7 utilise / nojs et / ajax dans le chemin pour distinguer les liens ajax des liens standard. Cela pourrait vous éviter des maux de tête plus tard.
Jeremy French

Réponses:

11

J'ai compris. Cela fonctionne dans le bon sens:

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

Je vous remercie pour votre aide.

dennis605
la source
1
N'oubliez pas de marquer votre propre réponse comme étant acceptée (et de voter pour toutes les réponses qui ont aidé). Cela marque cette question comme résolue dans l'aperçu. Le vote complémentaire contribue également à encourager les utilisateurs à fournir de bonnes réponses.
Berdir
Vous devez également utiliser le «contexte» dans votre pièce jointe.
Josh Koenig
il suffit de noter que .live () est désormais obsolète
ErichBSchulz
Ne pas utiliser context(comme l'a souligné Josh Koenig) est un gros non. Votre gestionnaire d'événements sera rattaché à tous les éléments de la page. Avec l'utilisation context, ce code devrait être modifié, car le contextcontient documentsur la première liaison d'événement et l'élément lui-même lorsque le contenu sera remplacé, si simple $('#content-group-inner a',context)ne fonctionnera pas.
Alex Skrypnyk
10

Je pense que vos problèmes sont que votre fonction de réussite n'aura pas le contexte variable dans la portée, donc les comportements d'attachement fonctionneront sur undefined.

Je suppose que tu pourrais faire

Drupal.attachBehaviors($('#content-region-inner'));
Jeremy French
la source
Je pensais que la fonction de succès serait une fermeture et garderait la variable context(qui est l'ancien contexte plutôt que le nouveau balisage) dans la portée: est-ce faux?
Andy
Je ne pense pas que cela fonctionne comme une clôture dans ce cas, mais je peux me tromper.
Jeremy French