CTAols İçerik Türü Eklentisinde AJAX çağrıları?


10

Bir CTools Paneller İçerik Türü oluşturuyorum (yani, bir düğüm değil içerik eklerken panellere eklediğiniz şey) ve #ajaxbazı varsayılan değerleri ayarlamak için bir form öğesinin özniteliğini kullanmaya çalışıyorum . Aşağıdaki koda bakınız.

Bu arada, içerik türünün my_module_content_type_edit_form($form, &$form_state)çağrısının içinde .

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

Geri aramam şu.

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'];
}

Önerdiğim getirinin gerçekten işe yarayıp yaramayacağı önemli watchdog()değil.

CTools'un AJAX ile garip şeyler yaptığını biliyorum, ama o kadar garip olamaz. Yapmak istediğim şeyi nasıl yapacağım hakkında bir fikrin var mı?

Teşekkürler!

Alternatif olarak: Önceki form seçeneğinin değerine göre nasıl varsayılan bir değer ayarlayabilirim?

Bunu nasıl yapacağımı anladım, ama biraz acayip - her bağımlılık çatalı için yeni form alanları oluşturuyorsun. Daha sonra hook_content_type_edit_form_submit(), başlangıçta her şeyi çatallayan bileşen için seçilen değere karşılık gelen değeri kullanarak değerleri bir araya getirebilirsiniz .

Soruyu açık bırakıyorum çünkü (ve açıkçası, birlikte çalıştığım her programcı) bu Panel içerik türü düzenleme formlarının içinde AJAX kullanmak için iyi bir yol istiyor.

Güncelleme: Görünüşe göre #attached ile bir şeyler yapamazsınız.

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

Drupal geliştiricisinin "her şey için paneller" türü olarak, bunun için gelecekte de bulabileceğimi hayal ediyorum, bu yüzden bir ödül ekledim, ne olacağını görelim.
Letharion

Vay be, bu ödül geldi ve bir yorum bile atmadı (Teşekkürler BTW, Letharion). İstediğim şey imkansız mı?
aendrew

Başarıyla ctools_add_js();veya drupal_add_js();sonunda Javascript ekleyebildiğimi belirtmek gerekir hook_content_type_edit_form();. Yalnızca kullanıcı arayüzü ile ilgili basit şeyler yapıyorsanız, bu en iyi çağrı olabilir gibi görünüyor (En azından biri bu soruyu doğru bir şekilde yanıtlayana kadar).
aendrew

Yanıtlar:


8

Kısa cevap: #ajax ['yol'] kullanmalısınız.

Uzun cevap:

Ajax geri aramasına sahip olmak, ctools'un formları farklı afaik oluşturduğu için yardımcı olmaz. System / ajax tarafından yapılan geri çağrı, form tanımının tamamını bulamaz ve bu nedenle ajax isteğini işlemek için bir öğe bulamaz. #Ajax [yol] kullanıldığında bir menü öğesi tetiklenir.

#Ajax [callback] kullanırken formu doldurarak kendiniz kontrol edebilirsiniz.

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

Kullanıcı otomatik tamamlama widget'ını ve her ikisinin de çalıştığı alanı ekleyerek simplecontext_content_type_edit_form değiştirdim :)

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

Artık #ajax yolunu kullandıkça, istediğim gibi bir menü öğesi eklemeniz gerekiyor

<?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"));
}

#Attached [js] ile ilgili bir açıklama: satır içi js şu = = değeri olmalıdır:

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

Sonuçta ortaya çıkan değeri kontrol etmek için Firebug kullandım. Umarım bu sorununuzu çözmenize yardımcı olur.


Vay. Sonunda bu soruya bir cevap vermek için çok stoklandım. Biraz deneyecek. Ayrıca #attached bit notu için teşekkürler, aslında başlangıçta olan bu (Ama bunu doğru olamaz düşündüm çünkü değiştirdim).
aendrew

Peki, başarı var mı? Ödül bitmeden bilmek ilginç olurdu :)
Letharion


Bu gecikme için özür dilerim, çalışmayı biraz zaman geçiriyorum - $ form dizisini döndürmeye çalıştığımda, onaylama işlevimin tanımlanmadığını söylüyor. Öyle ve modülümde yeniden bildirmeye çalıştığımda (içerik türü eklenti dosyasının aksine), yeniden paylaştığımı söylüyor. Yapmam gereken şey bu değil, ama benim form anlamlı bir yanıt olarak yorumlamak bir şey çıktı böylece drupal_json_output yapılandırmak nasıl anlayamıyorum. Herhangi bir yardım? Daha iyi bir örnek geri çağırma bir LOT yardımcı olacaktır. Teşekkürler!
aendrew

Sorunuzun dönüş değeriyle ilgili küçük küçük bölümünü kaçırdım: return $ form ['link_target'] ['# default_value']; drupal formunu html / javascript bağlamına döndürmeye çalışıyorsunuz . Bu işe yaramayacak. Panel kullanıcı arayüzünde benzer bir şey gördünüz mü? (Ben kendimi şimdi ve sonra js olmayan iş akışını görmek için görünümleri UI ile JavaScript devre dışı) (bu yorumu bir
milyon

2

Ben de bir görüntü seçmek için ajax kullanan bir CTools içerik türü eklentisine bir Medya öğesi türü eklemek istedim benzer bir sorun yaşadım.

'Geri arama' ayarı yerine kendi ajax 'yol' ayarını kullanır, ancak bir görüntü seçerken form tamamen medya öğesi olmadan yeniden oluşturulmuştur.

Bunu ne drupal_rebuild_form ne CTools form sarmalayıcı işlevi, ne de gerçek ayarlar formu işlevi bulamadı izledi. Bu yüzden ctools ayarları formuna bu kod satırlarını ekleyerek sabitledim:

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

}

Belki içerme dosyalarının neden yüklenmediği açık bir şey eksik, ancak bunları dahil etmek benim için sorunu manuel olarak düzeltti.


0

benim tarafımda, .module dosyasında bir form sarmalayıcı işlevi yazmak ve bölmeyi el ile (orijinal form içeriği tanımlandığı yerde) dahil etmek zorunda kaldı:

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

Şimdi, ajax çağrısı sırasında Drupal formumu alabilir, böylece standart AJAX form API'sini kullanabilirim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.