Примушуйте Drupal приєднувати поведінку Drupal до нового доданого вмісту [тільки Drupal.attachBehaviors () не працює належним чином]


10

Я робив багато публікацій на drupal.org на цю тему, але, на жаль, у неправильному контексті.

Я думаю, що це не проблема, тому я спробую це з іншим підходом, і, можливо, це може бути рішенням. Завантаження всієї сторінки PHP та витягнення певного дива з ajax не спрацювало правильним чином. Тож я подумав, що я можу дозволити друпалу завантажувати лише вміст і вводити його в Ajax у діві. Я зробив запит за допомогою гачки_preprocess_page та kuke_preprocess_node, яка шукає "ajax = 1" у запитуваній URL-адресі, а потім видає лише вміст без усієї сторінки. І тепер, за допомогою певних файлів tpl.php, теоретично я міг обмежити вихід drupal лише на $ вміст. І ось проблема. Мій підхід працює навіть тоді, коли я залишаю файли tpl.php оригінальним способом, але видаляючи "$ content" з node-ajax.tpl.php. "Працюючи правильно", я маю на увазі, що drupal не перезавантажує всю сторінку, але звичайно не зміст. Але я не можу пояснити це самому, викликати в змінній $ content, так що я думав, це лише html створеного контенту. Отже, моє запитання полягає в тому, як я можу обмежити випуск drupal лише вмістом, чи я роблю неправильні кроки, щоб це працювати. Ось модуль та js-файл, який я використовую: 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;
    });
};

Будь ласка, допоможіть мені в цьому. Кожна пропозиція цінується.


2
Лише невеликий коментар D7 використовує / nojs та / ajax на шляху для розрізнення між посиланнями ajax та стандартними. Це може позбавити вас від головного болю згодом.
Джеремі Французький

Відповіді:


11

Я отримав його. Це працює правильно:

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

Дякую за всю допомогу.


1
Не забудьте позначити власну відповідь як прийняту (і підтвердити всі відповіді, які допомогли). Це означає, що це питання вирішено в огляді. Оновлення додатково допомагає спонукати користувачів до надання хороших відповідей.
Бердір

Ви також повинні використовувати "контекст" у своєму вкладенні.
Джош Коніг

просто зазначивши .live () тепер застаріло
ErichBSchulz

Не використовувати context(як Джош Кеніг зазначив) - це велика ні-ні. Ваш обробник подій буде знову приєднаний до всіх елементів на сторінці. З використанням contextцього коду потрібно було б змінити, оскільки він contextмістить documentприв'язку першої події та сам елемент, коли зміст буде замінено, настільки простий $('#content-group-inner a',context)не буде працювати.
Олексій Скрипник

10

Я думаю, що ваші проблеми полягають у тому, що ваша функція успіху не матиме змінний контекст за обсягом, тому прикріплення поведінки буде працювати над невизначеним.

Я б здогадався, що ти міг би зробити

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

Я подумав, що функція успіху буде закриттям і збереже змінну context(яка є старим контекстом, а не новою розміткою) в межах: це неправильно?
Енді

Я не думаю, що це спрацьовує як закриття в цьому випадку, але я можу дуже помилятися з цим.
Джеремі Френч
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.