บังคับให้ Drupal แนบพฤติกรรม Drupal กับเนื้อหา ajaxed ใหม่ [only Drupal.attachBeh พฤติกรรม () ไม่ทำงานอย่างถูกต้อง]


10

ฉันกำลังทำโพสต์จำนวนมากบน drupal.org เกี่ยวกับหัวข้อนี้ แต่น่าเสียดายในบริบทที่ไม่ถูกต้อง

ฉันคิดว่านั่นไม่ใช่ปัญหาดังนั้นฉันลองใช้วิธีอื่นและอาจเป็นวิธีแก้ปัญหา การโหลดหน้า PHP ทั้งหมดและแยกส่วนที่แน่นอนด้วย ajax ไม่ได้ทำงานอย่างถูกต้อง ดังนั้นฉันคิดว่าฉันสามารถปล่อยให้ drupal โหลดเนื้อหาและฉีดมันด้วย ajax ลงใน div ฉันทำแบบสอบถามด้วย hook_preprocess_page และ hook_preprocess_node ที่กำลังมองหา "ajax = 1" ใน URL ที่ร้องขอจากนั้นให้เนื้อหาที่ไม่มีหน้าทั้งหมดเท่านั้น และตอนนี้ด้วยความช่วยเหลือของไฟล์ tpl.php บางอันในทางทฤษฎีฉันสามารถ จำกัด เอาต์พุตของ drupal เพียง $ content และนี่คือปัญหา วิธีการของฉันใช้งานได้แม้ว่าฉันจะปล่อยไฟล์ 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 และลิงก์มาตรฐาน ที่อาจช่วยให้คุณปวดหัวในภายหลัง
Jeremy French

คำตอบ:


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
อย่าลืมทำเครื่องหมายคำตอบของคุณเองว่าเป็นคำตอบที่ยอมรับได้ (และยกเลิกคำตอบทั้งหมดที่ช่วย) ทำเครื่องหมายคำถามนี้ตามที่ได้รับการแก้ไขในภาพรวม การดึงข้อมูลเพิ่มเติมช่วยส่งเสริมให้ผู้ใช้ให้คำตอบที่ดี
Berdir

คุณควรใช้ "บริบท" ในการแนบ
Josh Koenig

เพิ่งสังเกตว่า. live () เลิกใช้แล้ว
ErichBSchulz

ไม่ได้ใช้context(อย่างที่ Josh Koenig ชี้ให้เห็น) เป็นเรื่องใหญ่โต ตัวจัดการเหตุการณ์ของคุณจะถูกแนบกับองค์ประกอบทั้งหมดในหน้า ด้วยการใช้contextรหัสนี้จะต้องมีการเปลี่ยนแปลงตามที่contextมีdocumentอยู่ในเหตุการณ์ที่มีผลผูกพันครั้งแรกและองค์ประกอบตัวเองเมื่อเนื้อหาจะถูกแทนที่ดังนั้นง่าย$('#content-group-inner a',context)จะไม่ทำงาน
Alex Skrypnyk

10

ฉันคิดว่าปัญหาของคุณคือฟังก์ชั่นความสำเร็จของคุณจะไม่มีบริบทของตัวแปรในขอบเขตดังนั้นพฤติกรรมการแนบจะทำงานบนไม่ได้กำหนด

ฉันเดาว่าคุณสามารถทำได้

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

ฉันคิดว่าฟังก์ชั่นความสำเร็จจะเป็นการปิดและรักษาตัวแปรcontext(ซึ่งเป็นบริบทเก่ามากกว่ามาร์กอัปใหม่) ในขอบเขต: ผิดหรือเปล่า?
Andy

ฉันไม่คิดว่ามันจะเป็นการปิดในกรณีนี้ แต่ฉันผิดไปมาก
Jeremy French
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.