it-swarm-vi.com

Buộc Drupal để đính kèm Drupal hành vi đối với nội dung mới bị đánh cắp [chỉ Drupal.attachBehaviors () không hoạt động đúng cách]

Tôi đã làm rất nhiều bài đăng trên drupal.org về chủ đề này, nhưng không may trong bối cảnh sai.

Tôi nghĩ đó không phải là vấn đề, vì vậy tôi thử nó với một cách tiếp cận khác, và có lẽ đây có thể là giải pháp. Tải toàn bộ PHP Trang và trích xuất một div nhất định với ajax không hoạt động đúng cách. Vì vậy, tôi nghĩ rằng tôi có thể cho phép drupal chỉ tải nội dung và đưa nó với ajax vào div. Tôi đã thực hiện một truy vấn với hook_pre process_page và hook_pre process_node đang tìm kiếm "ajax = 1" trong URL được yêu cầu và sau đó chỉ đưa ra nội dung mà không có toàn bộ trang. Về mặt lý thuyết, một số tệp tpl.php nhất định, tôi có thể giới hạn đầu ra của drupal chỉ với nội dung $. Và đây là vấn đề. Cách tiếp cận của tôi đang hoạt động ngay cả khi tôi rời khỏi tệp tpl.php cách ban đầu, nhưng loại bỏ "$ content" khỏi nút-ajax.tpl.php. Với "làm việc đúng cách", tôi có nghĩa là drupal không tải lại toàn bộ trang, nhưng tắt Tất nhiên không phải là nội dung. Nhưng tôi không thể giải thích điều đó với bản thân mình, vì trong biến $ content, vì vậy tôi nghĩ, chỉ là html của nội dung được tạo. Vì vậy, câu hỏi của tôi là, làm thế nào tôi có thể giới hạn đầu ra của drupal, chỉ nội dung, hoặc tôi đang làm các bước sai để làm việc này. Đây là mô-đun và tệp js tôi đang sử dụng: 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;
    });
};

Xin hãy giúp tôi với. Mọi đề nghị đều được đánh giá cao.

10
dennis605

Tôi hiểu rồi. Đây là cách làm việc đúng cách:

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

Cảm ơn bạn cho tất cả sự giúp đỡ của bạn.

11
dennis605

Tôi nghĩ vấn đề của bạn là chức năng thành công của bạn sẽ không có bối cảnh thay đổi trong phạm vi nên các hành vi đính kèm sẽ hoạt động không xác định.

Tôi đoán rằng bạn có thể làm

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