Drupal'ı yeni ajax içeriklerine Drupal davranışı eklemeye zorlayın [yalnızca Drupal.attachBehaviors () doğru şekilde çalışmıyor]


10

Bu konu hakkında drupal.org'da çok fazla yazı yapıyordum, ama ne yazık ki yanlış bağlamda.

Bence sorun bu değil, bu yüzden farklı bir yaklaşımla deniyorum ve belki de bu çözüm olabilir. Tüm PHP Sayfasını yüklemek ve ajax ile belirli bir div çıkarmak doğru şekilde çalışmadı. Drupal'ın sadece içeriği yüklemesine izin verebileceğimi ve div içine ajax ile enjekte edebileceğimi düşündüm. Ben istenen URL bir "ajax = 1" arıyor hook_preprocess_page ve hook_preprocess_node ile bir sorgu yaptım ve sonra sadece tüm sayfa olmadan içeriği verir. Ve şimdi bazı tpl.php dosyaları yardımıyla, teoride, drupal çıktısını sadece $ içerikle sınırlayabilirim. Ve işte sorun. Tpl.php dosyalarını orijinal şekilde bıraktığımda bile "$ content" node-ajax.tpl.php dosyasından kaldırıldığında yaklaşımım çalışıyor. "Doğru şekilde çalışmak" ile, yani drupal'ın tüm sayfayı yeniden yüklemediğini, ama elbette içerik değil. Ama ben kendime açıklayamıyorum, neden $ content değişkeni, bu yüzden düşündüm, sadece oluşturulan içeriğin html olduğunu. Yani sorum, drupal çıktısını sadece içerikle nasıl sınırlayabilirim veya bu çalışmayı elde etmek için yanlış adımlar atıyorum. İşte kullanıyorum modül ve js dosyası: 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;
    });
};

Lütfen bana bu konuda yardım et. Her öneri takdir edilmektedir.


2
Sadece küçük bir yorum D7, ajax bağlantıları ve standart olanları ayırt etmek için / nojs ve / ajax yollarını kullanır. Bu daha sonra baş ağrısından kurtarabilir.
Jeremy French

Yanıtlar:


11

Anladım. Bu doğru şekilde çalışıyor:

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

Tüm yardımların için teşekkür ederim.


1
Kendi cevabınızı kabul edilen olarak işaretlemeyi (ve yardımcı olan tüm cevapları oylamayı) unutmayın. Bu, bu soruyu genel bakışta çözülmüş olarak işaretler. Ek olarak yükseltme, kullanıcıları iyi yanıtlar vermeye teşvik etmeye yardımcı olur.
Berdir

Eklemenizde "bağlam" ı da kullanmalısınız.
Josh Koenig

sadece dikkat çeken .live () artık kullanımdan kaldırıldı
ErichBSchulz

Kullanmamak context(Josh Koenig'in işaret ettiği gibi) büyük bir hayır-hayır. Etkinlik işleyiciniz sayfadaki tüm öğelere yeniden eklenir. Kullanıldığında , ilk olay bağlamasının içerdiği ve içeriğin ne zaman değiştirileceği öğenin kendisi olduğu için contextbu kodun değiştirilmesi gerekir , bu nedenle basit çalışmaz. contextdocument$('#content-group-inner a',context)
Alex Skrypnyk

10

Sorunlarınızın, başarı işlevinizin kapsamdaki değişken içeriğe sahip olmayacağı, bu nedenle ekleme davranışlarının tanımsız üzerinde çalışacağını düşünüyorum.

Yapabileceğini tahmin ediyorum

Drupal.attachBehaviors($('#content-region-inner'));

Başarı fonksiyonunun bir kapanış olacağını ve değişkeni context(yeni biçimlendirme yerine eski bağlam olan) kapsamda tutacağını düşündüm : bu yanlış mı?
Andy

Ben yok düşünüyorum bu durumda bir kapak olarak çalışır, ama bu konuda çok yanlış olabilir.
Jeremy French
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.