Forçar o Drupal a anexar o comportamento do Drupal ao novo conteúdo ajaxed [apenas Drupal.attachBehaviors () não está funcionando da maneira certa]

10

Eu estava fazendo muitas postagens no drupal.org sobre esse tópico, mas infelizmente no contexto errado.

Eu acho que esse não é o problema, então eu tento com uma abordagem diferente, e talvez essa possa ser a solução. Carregar a página PHP inteira e extrair uma determinada div com o ajax não funcionou da maneira certa. Então eu pensei que eu poderia deixar o drupal carregar apenas o conteúdo e injetar com ajax no div. Fiz uma consulta com o hook_preprocess_page e o hook_preprocess_node que está procurando um "ajax = 1" na URL solicitada e depois fornece apenas o conteúdo sem a página inteira. E agora, com a ajuda de certos arquivos tpl.php, em teoria, eu poderia limitar a saída do drupal a apenas $ content. E aqui está o problema. Minha abordagem está funcionando mesmo quando deixo os arquivos tpl.php da maneira original, mas removendo o "$ content" do node-ajax.tpl.php. Com "trabalhando da maneira certa", quero dizer que o drupal não recarrega a página inteira, mas claro que não o conteúdo. Mas não posso explicar isso para mim, porque na variável $ content, pensei, é apenas o html do conteúdo gerado. Então, minha pergunta é: como posso limitar a saída do drupal, apenas para o conteúdo, ou estou fazendo as etapas erradas para que isso funcione. Aqui está o módulo e o arquivo js que estou 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 me ajude com isso. Toda sugestão é apreciada.

dennis605
fonte
2
Apenas um pequeno comentário D7 usa / nojs e / ajax no caminho para distinguir entre links ajax e links padrão. Isso pode lhe poupar alguma dor de cabeça mais tarde.
Jeremy French

Respostas:

11

Eu entendi. Isso está funcionando da maneira certa:

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

Obrigado por toda sua ajuda.

dennis605
fonte
1
Lembre-se de marcar sua própria resposta como a aceita (e votar todas as respostas que ajudaram). Isso marca essa pergunta como resolvida na visão geral. A votação adicional também ajuda a incentivar os usuários a fornecer boas respostas.
Berdir
Você também deve usar o "contexto" em seu anexo.
21711 Josh Koenig
apenas observando que .live () agora está obsoleto #
ErichBSchulz 4/13
Não usar context(como Josh Koenig apontou) é um grande não-não. Seu manipulador de eventos será anexado novamente a todos os elementos da página. Com o uso context, esse código precisaria ser alterado, pois o contextcontém documentna primeira ligação de evento e o próprio elemento quando o conteúdo será substituído, portanto, simples $('#content-group-inner a',context)não funcionará.
precisa
10

Acho que o seu problema é que sua função de sucesso não terá o contexto variável no escopo, portanto, os comportamentos de anexação estarão trabalhando indefinidamente.

Eu acho que você poderia fazer

Drupal.attachBehaviors($('#content-region-inner'));
Jeremy French
fonte
Eu pensei que a função de sucesso seria um fechamento e manteria a variável context(que é o contexto antigo e não a nova marcação) no escopo: isso está errado?
217 Andy
Não acho que funcione como um fechamento neste caso, mas posso estar muito enganado.
Jeremy French