Forzar a Drupal a adjuntar el comportamiento de Drupal al nuevo contenido ajaxed [solo Drupal.attachBehaviors () no funciona de la manera correcta]

10

Estaba haciendo muchas publicaciones en drupal.org sobre este tema, pero desafortunadamente en el contexto equivocado.

Creo que ese no es el problema, así que lo intento con un enfoque diferente, y tal vez esta podría ser la solución. Cargar toda la página PHP y extraer un cierto div con ajax no funcionó de la manera correcta. Entonces pensé que podía dejar que drupal cargara solo el contenido e inyectarlo con ajax en el div. Hice una consulta con hook_preprocess_page y hook_preprocess_node que está buscando un "ajax = 1" en la URL solicitada y luego solo muestra el contenido sin toda la página. Y ahora, con la ayuda de ciertos archivos tpl.php, en teoría, podría limitar la salida de drupal a solo $ content. Y aquí esta el problema. Mi enfoque funciona incluso cuando dejo los archivos tpl.php de la manera original, pero eliminando el "$ content" de node-ajax.tpl.php. Con "trabajar de la manera correcta", quiero decir que drupal no vuelve a cargar toda la página, pero por supuesto no el contenido. Pero no puedo explicarme eso a mí mismo, porque en la variable $ content, así que pensé, es solo el html del contenido generado. Entonces mi pregunta es, ¿cómo puedo limitar la salida de drupal, solo al contenido, o estoy haciendo los pasos incorrectos para que esto funcione? Aquí está el módulo y el archivo js que estoy 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;
    });
};

Por favor, ayúdame con esto. Todas las sugerencias son apreciadas.

dennis605
fuente
2
Solo un pequeño comentario D7 usa / nojs y / ajax en la ruta para distinguir entre enlaces ajax y enlaces estándar. Eso puede ahorrarle un poco de dolor de cabeza más adelante.
Jeremy French,

Respuestas:

11

Lo tengo. Esto funciona de la manera correcta:

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

Gracias por toda tu ayuda.

dennis605
fuente
1
Recuerde marcar su propia respuesta como la aceptada (y votar todas las respuestas que ayudaron). Esto marca esta pregunta como resuelta en la descripción general. La votación adicional también ayuda a alentar a los usuarios a proporcionar buenas respuestas.
Berdir
También debe usar el "contexto" en su adjunto.
Josh Koenig
solo notando que .live () ahora está en desuso
ErichBSchulz
No usar context(como señaló Josh Koenig) es un gran no-no. Su controlador de eventos se volverá a adjuntar a todos los elementos de la página. Con el uso context, este código debería cambiarse, ya que contextcontiene documentel enlace del primer evento y el elemento en sí mismo cuando se sustituirá el contenido, por lo que lo simple $('#content-group-inner a',context)no funcionará.
Alex Skrypnyk
10

Creo que su problema es que su función de éxito no tendrá el contexto variable en el alcance, por lo que los comportamientos de adjunto funcionarán de forma indefinida.

Supongo que podrías hacer

Drupal.attachBehaviors($('#content-region-inner'));
Jeremy French
fuente
Pensé que la función de éxito sería un cierre y mantener la variable context(que es el contexto anterior en lugar del nuevo marcado) en el alcance: ¿está mal?
Andy
No creo que funcione como un cierre en este caso, pero podría estar muy equivocado al respecto.
Jeremy French