web-dev-qa-db-ja.com

AJAX呼び出し?

CTools Panels Content Type(つまり、ノードのタイプではなく、コンテンツを追加するときにパネルに挿入するもの)を構築していて、フォーム項目の_#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()で値をマージできます。

私(そして率直に言って、私が一緒に作業しているすべてのプログラマー)は、これらのPanelコンテンツタイプ編集フォーム内でAJAX.

pdate: #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'
    ),
  )
);
_
10
aendrew

短い答え:#ajax ['path']を使用する必要があります。

長い答え:

Ajaxコールバックを使用しても、ctoolsがフォームを別の方法で作成するため、効果がありません。 system/ajaxによって実行されるコールバックは完全なフォーム定義を見つけることができないため、ajaxリクエストを処理するための要素を見つけることができません。 #ajax [path]を使用すると、メニュー項目がトリガーされるだけです。

#ajax [callback]を使用するときにフォームをダンプすることで、自分自身を確認できます

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

#attached [js]に関する簡単な説明:インラインjsは次のようにkey => valueである必要があります。

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

Firebugを使用して、結果の効果ではなく、結果の値を確認しました。これが問題の解決に役立つことを願っています。

8
Clemens Tolboom

同様の問題がありました。CToolsコンテンツタイププラグインにMedia要素タイプを含めたいのですが、これもajaxを使用して画像を選択します。

「コールバック」設定の代わりに、それ自身の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');

}

インクルードファイルが読み込まれない理由は明らかですが、それらを手動で含めると問題が解決しました。

2
Placinta

私の側では、フォームラッパー関数を.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を使用できます。

0
Pierco