Paksa Drupal untuk melampirkan perilaku Drupal ke konten ajax baru [hanya Drupal.attachBehaviors () tidak berfungsi dengan cara yang benar]

10

Saya melakukan banyak posting di drupal.org tentang topik ini, tetapi sayangnya dalam konteks yang salah.

Saya pikir itu bukan masalahnya, jadi saya mencobanya dengan pendekatan yang berbeda, dan mungkin ini bisa menjadi solusinya. Memuat seluruh Halaman PHP dan mengekstrak div tertentu dengan ajax tidak berfungsi dengan benar. Jadi saya pikir, saya bisa membiarkan drupal memuat konten dan menyuntikkannya dengan ajax ke div. Saya membuat kueri dengan hook_preprocess_page dan hook_preprocess_node yang mencari "ajax = 1" di URL yang diminta dan kemudian hanya membagikan konten tanpa seluruh halaman. Dan sekarang dengan bantuan file tpl.php tertentu, secara teori, saya bisa membatasi output drupal hanya $ content. Dan inilah masalahnya. Pendekatan saya bekerja bahkan ketika saya meninggalkan file tpl.php dengan cara yang asli, tetapi menghapus "$ content" dari node-ajax.tpl.php. Dengan "bekerja dengan cara yang benar", maksud saya drupal tidak memuat ulang seluruh halaman, tapi tentu saja bukan isinya. Tetapi saya tidak bisa menjelaskan itu kepada diri saya sendiri, karena dalam variabel $ content, jadi saya pikir, hanya html dari konten yang dihasilkan. Jadi pertanyaan saya adalah, bagaimana saya bisa membatasi output drupal, hanya konten, atau apakah saya melakukan langkah yang salah untuk mendapatkan ini berfungsi. Ini adalah file module dan js yang saya gunakan: 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;
    });
};

Tolong bantu saya dengan ini. Setiap saran sangat dihargai.

dennis605
sumber
2
Hanya sedikit komentar D7 menggunakan / nojs dan / ajax di jalur untuk membedakan antara tautan ajax dan yang standar. Itu mungkin menghemat beberapa sakit kepala nanti.
Jeremy French

Jawaban:

11

Saya telah mendapatkan nya. Ini bekerja dengan cara yang benar:

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

Terima kasih atas semua bantuannya.

dennis605
sumber
1
Ingatlah untuk menandai jawaban Anda sendiri sebagai jawaban yang diterima (dan hapus semua jawaban yang membantu). Ini menandai pertanyaan ini sebagaimana diselesaikan dalam ikhtisar. Upvoting juga membantu mendorong pengguna untuk memberikan jawaban yang baik.
Berdir
Anda juga harus menggunakan "konteks" dalam melampirkan Anda.
Josh Koenig
hanya mencatat .live () sekarang tidak digunakan lagi
ErichBSchulz
Tidak menggunakan context(seperti yang ditunjukkan Josh Koenig) adalah hal yang tidak boleh. Penangan acara Anda akan dilampirkan kembali ke semua elemen pada halaman. Dengan menggunakan context, kode ini perlu diubah, karena contextmengandung documentpada peristiwa pertama yang mengikat dan elemen itu sendiri ketika konten akan diganti, sehingga sederhana $('#content-group-inner a',context)tidak akan berfungsi.
Alex Skrypnyk
10

Saya pikir masalah Anda adalah bahwa fungsi kesuksesan Anda tidak akan memiliki konteks variabel dalam ruang lingkup sehingga perilaku attach akan bekerja pada yang tidak ditentukan.

Saya kira Anda bisa melakukannya

Drupal.attachBehaviors($('#content-region-inner'));
Jeremy French
sumber
Saya berpikir bahwa fungsi kesuksesan akan menjadi penutup dan menjaga variabel context(yang merupakan konteks lama daripada markup baru) dalam ruang lingkup: apakah itu salah?
Andy
Saya tidak berpikir itu berfungsi sebagai penutupan dalam kasus ini, tetapi saya bisa sangat salah tentang hal itu.
Jeremy French