AJAX के CTools कंटेंट टाइप प्लगइन में कॉल?


10

मैं एक CTools पैनल सामग्री प्रकार का निर्माण कर रहा हूं (यानी, वह चीज जो आप सामग्री जोड़ते समय पैनलों में डालते हैं, एक प्रकार का नोड नहीं) और मैं #ajaxकुछ डिफ़ॉल्ट मान सेट करने के लिए प्रपत्र आइटम की विशेषता का उपयोग करने का प्रयास कर रहा हूं । नीचे कोड देखें।

यह सभी सामग्री प्रकार की my_module_content_type_edit_form($form, &$form_state)कॉल के अंदर है, वैसे।

  $form['link_type'] = array(
    '#type' => 'radios',
    '#title' => t('Link Type'),
    '#ajax' => array(
      'callback' => 'my_module_set_target'
    ),
    '#default_value' => empty($conf['link_type']) ? '_blank' : $conf['link_type'],
    '#options' => array('none'=>t('No Link'), 'internal'=>t('Internal Link'), 'external'=>t('External Link'), 'document'=>t('Document Link')),
  );

मेरा कॉलबैक निम्नलिखित है।

function my_module_set_target($form, $form_state) {
  watchdog("Test", "Testing callback", array(), WATCHDOG_ALERT);
  $form['link_target']['#default_value'] = '_parent';

  return $form['link_target']['#default_value'];
}

भले ही मैं जो वापसी का सुझाव दे रहा हूं वह वास्तव में काम करेगा, watchdog()काम भी नहीं करता है।

मुझे पता है कि CTools AJAX के साथ कुछ अजीब चीजें करता है, लेकिन यह अजीब नहीं हो सकता। क्या आपके पास कोई विचार है कि मैं वह कैसे करूंगा जो मैं करना चाहता हूं?

धन्यवाद!

वैकल्पिक रूप से: मैं पिछले फॉर्म विकल्प के मूल्य के आधार पर एक डिफ़ॉल्ट मान कैसे सेट करूं?

मुझे यह पता चला कि यह कैसे करना है, लेकिन यह थोड़ा हैकरी है - आप प्रत्येक निर्भरता कांटा के लिए नए फॉर्म फ़ील्ड बनाते हैं। फिर आप मूल्यों को एक साथ मर्ज कर सकते हैं hook_content_type_edit_form_submit(), जो भी उस घटक के लिए चुने गए मूल्य से मेल खाता है जो शुरू में सब कुछ भूल गया था।

मैं प्रश्न को खुला छोड़ रहा हूं क्योंकि मैं (और, स्पष्ट रूप से, प्रत्येक प्रोग्रामर जो मैं साथ काम कर रहा हूं) वास्तव में इन पैनल सामग्री प्रकार के रूपों के अंदर AJAX का उपयोग करने का एक अच्छा तरीका चाह रहा हूं।

अपडेट: ऐसा प्रतीत होता है कि आप #attached के साथ सामान नहीं कर सकते।

$form['link'][$i] = array(
  '#type' => 'fieldset',
  '#title' => t('Link #@num', array('@num' => $i)),
  '#collapsible' => TRUE,
  '#collapsed' => TRUE,
  '#attached' => array(
    'js' => array(
      'alert("Yay.");', 'inline'
    ),
  )
);

ड्रुपल डेवलपर के प्रकार "सब कुछ के लिए पैनल" होने के नाते, मुझे लगता है कि मैं भविष्य में भी इसके लिए उपयोग कर सकता हूं, इसलिए मैंने एक इनाम जोड़ा, देखते हैं कि क्या होता है।
सुस्ती

वाह, वह इनाम आया और एक टिप्पणी के बिना भी चला गया (धन्यवाद BTW, सुस्ती)। क्या मैं असंभव या कुछ और पूछ रहा हूं?
aendrew

ध्यान देने योग्य होना चाहिए कि मैं सफलतापूर्वक जावास्क्रिप्ट का उपयोग करने में सक्षम हूं ctools_add_js();या drupal_add_js();के अंत में hook_content_type_edit_form();। यदि आप साधारण यूआई-संबंधित सामान कर रहे हैं, तो ऐसा लगता है कि यह सबसे अच्छा कॉल हो सकता है (कम से कम जब तक कोई इस प्रश्न का ठीक से उत्तर नहीं देता है)।
aendrew

जवाबों:


8

संक्षिप्त उत्तर: आपको # रास्ता ['पथ'] का उपयोग करना चाहिए।

लंबा जवाब:

अजाक्स कॉलबैक होने में मदद नहीं करता है क्योंकि ctools बनाता है यह अलग तरह से afaik है। सिस्टम / अजाक्स द्वारा की गई कॉलबैक पूर्ण रूप से परिभाषा नहीं पा सकती है, इस प्रकार ajax अनुरोध को संसाधित करने के लिए कोई तत्व नहीं मिल सकता है। #Ajax [पाथ] का उपयोग करना केवल एक मेनू आइटम को ट्रिगर करता है।

आप #ajax [कॉलबैक] का उपयोग करते समय फ़ॉर्म को डंप करके अपने लिए जांच सकते हैं

function ajax_form_callback() {
  list($form, $form_state) = ajax_get_form();
  drupal_process_form($form['#form_id'], $form, $form_state);

मैंने उपयोगकर्ता स्वत: पूर्ण विजेट और आपके क्षेत्र दोनों को जोड़कर simplecontext_content_type_edit_form को संशोधित किया है जो दोनों काम करते हैं :)

function simplecontext_content_type_edit_form($form, &$form_state) {
  $conf = $form_state['conf'];

  $form['owner_name'] = array(
    '#type' => 'textfield',
    '#title' => t('Username'),
    '#default_value' => 'admin',
    '#autocomplete_path' => 'user/autocomplete',
    '#size' => '6',
    '#maxlength' => '60',
    '#description' => '$description',
  );

  $form['link_type'] = array(
    '#type' => 'radios',
    '#title' => t('Link Type'),
    '#ajax' => array(
      'path' => 'my_module_set_target'
    ),
    '#default_value' => empty($conf['link_type']) ? '_blank' : $conf['link_type'],
    '#options' => array('none' => t('No Link'), 'internal' => t('Internal Link'), 'external' => t('External Link'), 'document' => t('Document Link')),
  );
...

जैसा कि आप अब #ajax पथ का उपयोग करते हैं, आपको मेनू आइटम जोड़ने की आवश्यकता है जैसा मैंने किया था

<?php

function my_module_menu() {
  $items = array(
    'my_module_set_target' => array(
      'title' => 'AJAX Example',
      'page callback' => 'my_module_set_target',
      'access callback' => TRUE,
      'expanded' => TRUE,
    )
  );
  return $items;
}

function my_module_set_target() {
  drupal_json_output( array('data' => "ABC"));
}

# सट्टा [js] के बारे में एक nittpick: इनलाइन js कुंजी होना चाहिए => जैसे मूल्य:

'#attached' => array(
  'js' => array(
    'alert("Yay.");' => 'inline',
  ),
),

मैंने परिणाम के प्रभाव की जांच करने के लिए फायरबग का उपयोग किया है जिसके परिणामस्वरूप परिणाम नहीं है। इसलिए मुझे उम्मीद है कि यह आपकी समस्या को ठीक करने में मदद करेगा।


वाह। मैं आखिरकार इस सवाल का जवाब देने के लिए तैयार हूं। इसे थोड़ा सा आजमाएंगे। # बिट बिट पर नोट के लिए भी धन्यवाद, यह वास्तव में वही है जो मैंने शुरू में किया था (लेकिन इसे बदल दिया क्योंकि मुझे लगा कि यह सही नहीं हो सकता है)।
बजे

तो, कोई सफलता? यह जानना दिलचस्प होगा कि बाउंटी के खत्म होने से पहले :)
लेटेरियन

मुझे आशा है कि मुझे मेरा इनाम मिलेगा: पी
क्लेमेंस टोलबॉम

इसके साथ देरी के लिए क्षमा करें, काम करने में थोड़ा समय लगने पर - जब मैं $ फॉर्म सरणी वापस करने की कोशिश करता हूं, तो यह बताता है कि मेरा मान्य कार्य परिभाषित नहीं है। यह है, और जब मैं इसे अपने मॉड्यूल में फिर से घोषित करने की कोशिश करता हूं (जैसा कि सामग्री प्रकार प्लगइन फ़ाइल के विपरीत), यह बताता है कि मैं इसे पुन: घोषित कर रहा हूं। मैं अनुमान लगा रहा हूं कि मुझे ऐसा करने की आवश्यकता नहीं है, लेकिन मैं यह पता नहीं लगा सकता कि ड्रुपल_जसन_आउटपुट को कैसे तैयार किया जाए ताकि यह कुछ ऐसा हो सके कि मेरा रूप सार्थक प्रतिक्रिया के रूप में व्याख्या करे। कोई मदद? एक बेहतर उदाहरण कॉलबैक एक बहुत मदद करेगा। धन्यवाद!
aendrew

मैंने आपके प्रश्न के छोटे छोटे हिस्से को याद किया है, जो कि रिटर्न वैल्यू के बारे में है: $ फॉर्म लौटाएँ ['link_target'] ['# default_value']; जो एक html / जावास्क्रिप्ट संदर्भ के लिए एक drupal प्रपत्र वापस करने की कोशिश कर रहा है । यह काम नहीं करेगा। क्या आपने पैनल यूआई में वही चीज देखी है जो आप चाहते हैं? (मैं स्वयं अभी जावास्क्रिप्ट को अक्षम कर देता हूं और यूआई को केवल गैर जेएस वर्कफ़्लो देखने के लिए) (इस टिप्पणी को एक
ज़िलिन

2

मुझे एक समान समस्या थी, जहां मैं एक मीडिया तत्व प्रकार को एक CTools सामग्री प्रकार प्लगइन में शामिल करना चाहता था, जो छवि का चयन करने के लिए ajax का भी उपयोग करता है।

यह 'कॉलबैक' सेटिंग के बजाय अपनी स्वयं की अजाक्स 'पथ' सेटिंग का उपयोग करता है, लेकिन एक छवि का चयन करते समय, प्रपत्र को मीडिया तत्व के बिना पूरी तरह से फिर से बनाया गया था।

मैंने इस तथ्य का पता लगाया कि drupal_rebuild_form को न तो CTools फॉर्म रैपर फ़ंक्शन मिल सकता है, और न ही वास्तविक सेटिंग फ़ंक्शन। इसलिए मैंने इसे ctools सेटिंग्स फॉर्म में कोड की इन पंक्तियों को जोड़कर तय किया:

function custom_module_my_content_plugin_content_type_edit_form($form, &$form_state) {

$background_image = isset($conf['background_image']) ? $conf['background_image'] : array();
  $form['background_image'] = array(
    '#title' => t('Background image'),
    '#default_value' => $background_image,
    '#type' => 'media',
    '#input' => TRUE,
    '#extended' => TRUE,
    '#tree' => TRUE,
    '#media_options' => array(),
  );

  // The two function calls below are necessary if we want to use a media
  // element type, because it causes ajax requests, which in turn call
  // drupal_form_rebuild(), and without the below includes, Drupal will
  // not be able to rebuild the form.

  // Include the CTools content type plugin file, because it provides
  // the ctools_content_configure_form_defaults() function, which is needed
  // when rebuilding the form, because of an ajax action, like selecting
  // a media element.
  ctools_form_include($form_state, 'content');

  // Include this plugin file as well, so that when the form is rebuilt, it
  // can successfully retrieve the settings form.
  ctools_form_include($form_state, 'my_content_plugin', 'custom_module', 'plugins/content_types/my_content_plugin');

}

शायद मुझे कुछ स्पष्ट याद आ रहा है कि क्यों शामिल फ़ाइलों को लोड नहीं किया गया है, लेकिन उनमें से मैन्युअल रूप से मेरे लिए समस्या तय की गई है।


0

मेरी ओर से, मुझे .module फ़ाइल में एक प्रपत्र आवरण फ़ंक्शन लिखना था और उस तरह से मैन्युअल रूप से फलक को शामिल करना था (जहाँ मूल प्रपत्र सामग्री परिभाषित है):

function mymodule_form($form, &$form_state) {
  // include mymodule/panes/mypane.inc
  ctools_include('mypane', 'mymodule', 'panes');
  return mymodule_form_content($form, $form_state);
}

अब, ajax कॉल के दौरान, Drupal मेरे फॉर्म को पुनः प्राप्त करने में सक्षम है, इसलिए मैं मानक AJAX फॉर्म API का उपयोग कर सकता हूं।

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