Drupal को नए ajaxed सामग्री में Drupal व्यवहार संलग्न करने के लिए बाध्य करें [केवल Drupal.attachBehaviors () सही तरीके से काम नहीं कर रहा है]


10

मैं इस विषय पर drupal.org पर बहुत सारी पोस्ट कर रहा था, लेकिन दुर्भाग्य से गलत संदर्भ में।

मुझे लगता है कि यह समस्या नहीं है, इसलिए मैं इसे एक अलग दृष्टिकोण के साथ कोशिश करता हूं, और शायद यह समाधान हो सकता है। पूरे PHP पृष्ठ को लोड करना और ajax के साथ एक निश्चित div को निकालना सही तरीके से काम नहीं करता है। तो मैंने सोचा, कि मैं ड्रुपल को सिर्फ सामग्री लोड कर सकता हूं और इसे अजाक्स के साथ इंजेक्ट कर सकता हूं। मैंने हुक किए गए URL में "ajax = 1" की तलाश में हुक_परप्रोसेस_पेज और हुक_परप्रोसेसर_नोड के साथ एक प्रश्न किया और फिर पूरे पृष्ठ के बिना केवल सामग्री देता है। और अब कुछ tpl.php फ़ाइलों की मदद से, सिद्धांत रूप में, मैं ड्रुपल के उत्पादन को केवल $ सामग्री तक सीमित कर सकता था। और यहाँ समस्या है। Tpl.php फ़ाइलों को मूल तरीके से छोड़ने पर भी मेरा दृष्टिकोण काम कर रहा है, लेकिन नोड-ajax.tpl.php से "$ सामग्री" हटा रहा है। "सही तरीके से काम करने" के साथ, मेरा मतलब है कि ड्रुपल पूरे पृष्ठ को फिर से लोड नहीं करता है, लेकिन निश्चित रूप से सामग्री नहीं। लेकिन मैं खुद को यह नहीं समझा सकता कि $ सामग्री चर में कारण है, इसलिए मैंने सोचा, केवल उत्पन्न सामग्री का html है। तो मेरा सवाल यह है कि मैं ड्रुपल के आउटपुट को केवल सामग्री तक कैसे सीमित कर सकता हूं, या क्या मैं यह काम करने के लिए गलत कदम उठा रहा हूं। यहाँ मॉड्यूल और 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
Ajax लिंक और मानक वाले के बीच अंतर करने के लिए बस एक छोटी सी टिप्पणी D7 / nojs और / 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
अपने स्वयं के उत्तर को स्वीकार किए गए के रूप में चिह्नित करना याद रखें (और सभी उत्तरों को आगे बढ़ाएं जो मदद करते हैं)। यह प्रश्न इस अवलोकन में हल के रूप में चिह्नित करता है। इसके अलावा Upvoting उपयोगकर्ताओं को अच्छे उत्तर प्रदान करने के लिए प्रोत्साहित करने में मदद करता है।
बर्दिर

आपको अपने अटैचमेंट में "संदर्भ" का भी उपयोग करना चाहिए।
जोश कोएनिग

सिर्फ नोटिंग .live () अब पदावनत है
ErichBSchulz

उपयोग नहीं context(जैसा कि जोश कोएनिग ने बताया) एक बड़ी संख्या है। आपके ईवेंट हैंडलर को पृष्ठ पर सभी तत्वों से फिर से जोड़ा जाएगा। का उपयोग कर के साथ context, इस कोड को परिवर्तित करने की, के रूप में की आवश्यकता होगी contextशामिल documentपहली घटना बंधन और तत्व में ही जब सामग्री बदल दी जाएगी पर, इतना आसान $('#content-group-inner a',context)काम नहीं जा रहा है।
एलेक्स स्क्रीपनीक

10

मुझे लगता है कि आपके मुद्दे हैं कि आपकी सफलता के कार्यक्षेत्र में परिवर्तनशील संदर्भ नहीं होगा इसलिए संलग्न व्यवहार अपरिभाषित होंगे।

मुझे लगता है कि आप कर सकते हैं

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

मैंने सोचा था कि सफलता समारोह एक बंद होगा और चर context(जो नए मार्कअप के बजाय पुराने संदर्भ है) को दायरे में रखें: क्या यह गलत है?
एंडी

मुझे नहीं लगता कि यह इस मामले में एक बंद के रूप में काम करता है, लेकिन मैं इसके बारे में बहुत गलत हो सकता है।
जेरेमी फ्रेंच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.