সফল অ্যাজাক্সের পরে কীভাবে দ্রুপাল.আটাচবিহেভিয়ার্স ট্রিগার করা যায়


10

আমার কাছে একটি মডিউল রয়েছে যা লিঙ্কটি ক্লিক করা হলে এজ্যাক্সের মাধ্যমে নোড আপডেট করে।

লিঙ্কটি একটি টগল, এটিতে প্রথম ক্লিকের মান 1 দিয়ে নোডটি আপডেট করা উচিত, তারপরে পরবর্তী ক্লিকের মান 0 দিয়ে ইত্যাদি something

নীচের কোডটি পৃষ্ঠা লোডের পরে প্রথম ক্লিকে কাজ করে, তবে পরবর্তী ক্লিকগুলিতে নয়। আমি বিশ্বাস করি যে প্রতিটি ক্লিকের পরে দ্রুপাল.আত্তাচবিহিয়রসকে কল / ট্রিগার করতে হবে, তবে কীভাবে এটি করা যায় তা আমি বুঝতে পারি না।

  1. মডিউল

    function mymodule_menu() {
      $items['mypath/%/%/ajax'] = array(
      'title' => 'My title',
      'page callback' => 'mymodule_ajax_callback',
      'page arguments' => array(1,2),
      'access arguments' => array('access content'),
      'type' => MENU_CALLBACK,
      );
    
      ...
    }
    
    function mymodule_ajax_callback($id, $status) {
      //Validation[...]
    
      //Node Update using $id as the nid and $status as the field value[...]
    
      // Define a new array to hold our AJAX commands.
      $ajax_commands = array();
    
      // Create a new AJAX command that replaces the #div.
      $replacedivid = '#status'.$id;
      $replacestring = '<div id="status'.$id.'"><a data-url="'.base_path().'mypath/'.$id.'/'.$new_status.'/ajax" title="This item is marked as '.$status_text.'" id="statuslink'.$id.'" class="midui">'.$status_text.'</a></div>';
    
    
      $ajax_commands[] = ajax_command_replace($replacedivid, $replacestring);
    
    
      return drupal_json_output($ajax_commands);
    }
    
  2. জাভাস্ক্রিপ্ট

    (function ($) {
      Drupal.behaviors.mymodule = {
        attach: function(context, settings) {
          var $uilink = $('.midui'); //find all links
    
          for (var i=0;i<$uilink.length;i++) { //Loop
            var $link = $('#' + $uilink[i].id);
            if (!$link.hasClass("middone")) {
    
              new Drupal.ajax('#' + $uilink[i].id, $link, {
                url: $link.attr('data-url'),
                effect: 'fade',
                settings: {},
                progress: {
                  type: 'throbber'
                },
                event: 'click tap'
              });
    
              $link.addClass("middone"); //add class when we're done
    
            }
          }
        }
      }
    })(jQuery);
    
  3. আমি এ পর্যন্ত যা চেষ্টা করেছি:

(ক) একটি অ্যাড ajax_command_invoke(NULL, 'mymodule');একটি সঙ্গে মিলিত $ ajax_commands অ্যারেতে $.fn.mymoduleফাংশন

(খ) $('body').ajaxSuccess(Drupal.attachBehaviors);আমার জাভাস্ক্রিপ্টে যুক্ত করুন। এজ্যাক্স কমপ্লিটও চেষ্টা করেছিল। এটি নথিতেও চেষ্টা করেছি।

(গ) এখানে বিস্তারিত হিসাবে একটি কাস্টম কমান্ড তৈরি করুন http://www.jaypan.com/tutorial/calling-function- after-ajax- event-drupal-7

দ্রষ্টব্য: আমি জানি যে এটি এইচটিএমএল সন্নিবেশ / সংশোধিত হওয়ার জন্য প্রতিটি ক্লিকের পরে অ্যাজটিবিয়ারগুলি ট্রিগার করার বিষয়। আমি যদি লিঙ্কটি ক্লিক করি এবং কনসোলে Drupal.attachBehaviors () টাইপ করি তবে লিঙ্কটি আমার জাভাস্ক্রিপ্ট দ্বারা আবার প্রক্রিয়া করা হবে, যেমনটি 'মিডোন' শ্রেণীর সংযোজন দ্বারা প্রমাণিত হয় এবং আবার ক্লিক করা যায়।

দ্রষ্টব্য: আগ্রহের পাশাপাশি, আমি যদি $ajax_commandsকলব্যাক ফাংশন শেষে খালি রেখে এটিকে (খালি অ্যারে) ফিরিয়ে দিই তবে লিঙ্কটি প্রথম এবং পরবর্তী ক্লিকগুলিতে ক্লিকযোগ্য থাকবে। এটির কার্যকারিতাটি আমি সন্ধান করছি (একটি টগল)। তবে, যেহেতু প্রতিটি ক্লিকের পরে এইচটিএমএলটিতে কোনও পরিবর্তন করা হয়নি, তাই ব্যবহারকারীর পক্ষে টগল চালু বা বন্ধ আছে তা জানার কোনও উপায় নেই।

যে কোনও পয়েন্টার প্রশংসিত হবে।

================================================== =====

একটি আংশিক উত্তর:

দ্রুপাল আজাক্স.জেএস সাফল্য ফাংশন কেবল ফর্মগুলির জন্য আচরণগুলিকে পুনরায় সংযুক্ত করে (আমার মনে হয়?)

    if (this.form) {
      var settings = this.settings || Drupal.settings;
      Drupal.attachBehaviors(this.form, settings);
    }

সুতরাং আমি আমার সমস্ত এজাক্স অবজেক্টের সাফল্য ফাংশন হ্যাক করার সিদ্ধান্ত নিয়েছি।

জাভাস্ক্রিপ্ট এখন হয়ে যায়

    (function ($) {
      Drupal.behaviors.mymodule = {
        attach: function(context, settings) {
          var $uilink = $('.midui'); //find all links

          for (var i=0;i<$uilink.length;i++) { //Loop
            var $link = $('#' + $uilink[i].id);
            if (!$link.hasClass("middone")) {

              myAjax = new Drupal.ajax('#' + $uilink[i].id, $link, {
                url: $link.attr('data-url'),
                effect: 'fade',
                settings: {},
                progress: {
                  type: 'throbber'
                },
                event: 'click tap'
              });

              myAjax.options.success = function (response, status) {
                //Trigger Attach Behaviors
                setTimeout(function(){Drupal.attachBehaviors($(myAjax.selector))}, 0);
                // Sanity check for browser support (object expected).
                // When using iFrame uploads, responses must be returned as a string.
                if (typeof response == 'string') {
                  response = $.parseJSON(response);
                }

                return myAjax.success(response, status);
              }

              $link.addClass("middone"); //add class when we're done

            }
          }
        }
      }
    })(jQuery);

সাফল্য ফাংশন হ'ল অ্যাজাক্স.জেএস থেকে ডিফল্টর অনুলিপি আচরণের জন্য একটি যুক্ত লাইন সহ একটি অনুলিপি পেস্ট। কিছু কারণে, Drupal.attachBehaviorsএকটি টাইমার মধ্যে থাকতে হবে। আমি এড়াতে পারি না এমন কারণে এটি কেবল নিজের হাতে রাখতে পারি না।

আমি এই প্রশ্নটি কয়েকজনের জন্য উন্মুক্ত রেখে দেব যদি কেউ হয় আরও মার্জিত সমাধান খুঁজে পেতে পারে এবং / অথবা টাইমার বিজোড়তার ব্যাখ্যা দিতে পারে।

অনেক ধন্যবাদ


আপনি বারবার আচরণ সংযুক্ত করতে চান কেন? এজেএক্স ব্যবহার করে তৈরি করা নতুন কোনও উপাদানগুলিতে সেগুলি স্বয়ংক্রিয়ভাবে পুনরায় চালিত হয়, তবে এটি কেন পর্যাপ্ত নয়?
Mołot

আচরণগুলি আমার ক্ষেত্রে স্বয়ংক্রিয়ভাবে পুনরায় সংযুক্ত হয় না। thx
জেএসএল

উত্তর:


1

এটি আজাক্স অনুরোধ থেকে নিজেই ফিরে আসা সামগ্রীতে আজাক্স আচরণের সাথে সংযুক্ত হওয়া জটিল হতে পারে। তবে এটি সম্ভব।

যদিও আপনার হুক_মেনু কোড স্নিপেটটি অসম্পূর্ণ দেখায়, এটি সঠিক বলে ধরে নিয়েছে (রিটার্ন $ আইটেমগুলি এবং ফাংশনটি বন্ধ রয়েছে) - আপনার ক্ষেত্রে আপনার ডেলিভারি কলব্যাকটি কেবল 'অজ্যাক্স_ডেলিভার' এ সামঞ্জস্য করতে হতে পারে

অর্থাৎ,

/**
 * Implements hook_menu
 */
function mymodule_menu() {

  $items['mypath/%/%/ajax'] = array(
    'title' => 'My title',
    'page callback' => 'mymodule_ajax_callback',
    'page arguments' => array(1,2),
    'access arguments' => array('access content'),
    'delivery callback' => 'ajax_deliver',
    'theme callback' => 'ajax_base_page_theme',
    'type' => MENU_CALLBACK,
  );

  return $items;

}

পরামর্শ দেওয়ার জন্য ধন্যবাদ তবে এটি কোনও কাজ করে না। আমি আপনার কোডটি হুক_মেনুতে ব্যবহার করি এবং আচরণগুলি স্বয়ংক্রিয়ভাবে পুনরায় সংযুক্ত হয় না।
জেএসএল

1

কিছু ডিবাগিংয়ের পরে, আমি বুঝতে পারি যে সমস্যাটি আমার কোডের সাথে নয়।

সমস্যাটি অন্য মডিউলটির সাথে মিথ্যা বলেছে, আমার ক্ষেত্রে রঙবক্স মডিউল, যা তার নিজস্ব আচরণের কার্যক্রমে জেএস ত্রুটির উত্স ছিল। আমি বিশ্বাস করি যে ত্রুটির কারণে সংযুক্তি আচরণের প্রক্রিয়াটি বন্ধ হয়ে গেছে, এবং এর ফলে আমার নিজের আচরণের ক্রিয়াকলাপটি পুনরায় সংযুক্ত করা হয়নি। ত্রুটিটি কনসোলে দেখা যায়।

রঙবক্স ত্রুটি: 7.24 এ

Uncaught TypeError: Cannot read property 'transition' of undefined colorbox_inline.js?

এবং 7.25 এ

Uncaught TypeError: Cannot read property 'mobiledetect' of undefined

আমার সমাধানটি ছিল রঙবক্স মডিউলটি অক্ষম করা।

যারা সহযোগিতা করেছেন তাদের সবাইকে অনেক ধন্যবাদ।


1

আমি প্রথম উত্তরে মন্তব্য করতে পারি না , তবে আপনি সেটিংসে রঙিনবক্সের জন্য সম্পত্তি সেট করতে পারেন। উদাহরণ স্বরূপ:

myAjax = new Drupal.ajax('#' + $uilink[i].id, $link, {
  url: $link.attr('data-url'),
  effect: 'fade',
  settings: {
    colorbox: {
      mobiledetect: false
    }
  },
  progress: {
    type: 'throbber'
  },
  event: 'click tap'
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.