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


10

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ộ Trang PHP 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ể để drupal tải nội dung và tiêm 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à bây giờ với sự trợ giúp của một số tệp tpl.php, theo lý thuyết, tôi có thể giới hạn đầu ra của drupal chỉ còn $ 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 để các tệp tpl.php theo 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 là drupal không tải lại toàn bộ trang, nhưng 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 nội dung $, 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 sai các bước để 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.


2
Chỉ cần một nhận xét nhỏ D7 sử dụng / nojs và / ajax trong đường dẫn để phân biệt giữa các liên kết ajax và các liên kết chuẩn. Điều đó có thể giúp bạn tiết kiệm một số đau đầu sau này.
Jeremy Pháp

Câu trả lời:


11

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.


1
Hãy nhớ đánh dấu câu trả lời của riêng bạn là câu trả lời được chấp nhận (và nêu lên tất cả các câu trả lời có ích). Điều này đánh dấu câu hỏi này như được giải quyết trong tổng quan. Nâng cao thêm giúp khuyến khích người dùng cung cấp câu trả lời tốt.
Berdir

Bạn cũng nên sử dụng "bối cảnh" trong tài liệu đính kèm của mình.
Josh Koenig

chỉ cần lưu ý .live () hiện không được chấp nhận
ErichBSchulz

Không sử dụng context(như Josh Koenig đã chỉ ra) là một điều không nên. Trình xử lý sự kiện của bạn sẽ được gắn lại vào tất cả các yếu tố trên trang. Với việc sử dụng context, mã này sẽ cần phải được thay đổi, vì contextchứa documenttrong ràng buộc sự kiện đầu tiên và chính phần tử khi nội dung sẽ được thay thế, vì vậy đơn giản $('#content-group-inner a',context)sẽ không hoạt động.
Alex Skrypnyk

10

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

Tôi nghĩ rằng hàm thành công sẽ là một bao đóng và giữ biến context(đó là bối cảnh cũ chứ không phải là đánh dấu mới) trong phạm vi: điều đó có sai không?
Andy

Tôi không nghĩ rằng nó hoạt động như một đóng cửa trong trường hợp này, nhưng tôi có thể rất sai về nó.
Jeremy Pháp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.