web-dev-qa-db-fra.com

Forcer Drupal pour attacher Drupal au nouveau contenu ajaxé [seul Drupal.attachBehaviors () ne fonctionne pas correctement)]

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 la totalité de la page PHP et extraire un certain div avec ajax ne fonctionnait pas 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 le hook_preprocess_page et hook_preprocess_node qui cherche un "ajax = 1" dans l'URL demandée et puis ne donne 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 les façon originale, mais en supprimant le "$ content" de node-ajax.tpl.php. Avec "travailler de la bonne façon", je veux dire que drupal ne recharge pas la page entière, mais off bien sûr pas le contenu. Mais je ne peux pas m'expliquer cela, parce que dans la variable $ content, donc je pensais, n'est que le html du contenu généré. Donc ma question est, comment puis-je limiter la sortie de drupal, à juste le contenu, ou est-ce que je fais 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.

10
dennis605

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.

11
dennis605

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