CToolsコンテンツタイププラグインでのAJAX呼び出し?


10

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を使用する良い方法を本当に望んでいるので、私は質問を開いたままにします。

更新: #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'
    ),
  )
);

「すべてのパネル」タイプのDrupal開発者であるため、将来的にはこの用途も見つかると思いますので、報奨金を追加して、何が起こるかを見てみましょう。
Letharion 2012

うわー、その賞金はコメントなしで行き来しました(BTW、Lethharionに感謝)。私が求めているのは不可能か何かですか?
aendrew 2012

を使用して、ctools_add_js();またはdrupal_add_js();の最後にJavascriptを正常に追加できたことは注目に値しhook_content_type_edit_form();ます。単純なUI関連のことだけをしている場合は、それが最善の方法のようです(少なくとも誰かがこの質問に正しく答えるまで)。
aendrew

回答:


8

短い答え:#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を使用して、結果の効果ではなく、結果の値を確認しました。これが問題の解決に役立つことを願っています。


ワオ。私はこの質問にようやく答えることができてとてもうれしいです。少し試してみます。#attachedビットについてのメモもありがとうございます。これは実際には私が最初に持っていたものです(ただし、正しくないことがわかったので変更しました)。
2012年

それで、どんな成功ですか?バウンティが終わる前に知っておくと面白いでしょう:)
Letharion

私は私の賞金を手に入れたいと思います:p
クレメンストルブーム

これによる遅延で申し訳ありませんが、動作するまでに少し時間がかかります-$ form配列を返そうとすると、検証関数が定義されていないことがわかります。それは、私がそれを(コンテンツタイプのプラグインファイルとは対照的に)モジュールで再宣言しようとすると、再宣言していることを示します。それは私がする必要があることではないと思いますが、drupal_json_outputを構造化して、フォームが意味のある応答として解釈するものを出力する方法を理解できません。何か助けは?より良い例のコールバックは、LOTに役立ちます。ありがとう!
2012年

戻り値に関する質問のごく一部を逃しました:return $ form ['link_target'] ['#default_value']; これはdrupalフォームをhtml / javascriptコンテキストに返そうとする試みです。それはうまくいきません。パネルUIで同じようなものを見たことがありますか?(私は時々JavaScriptを無効にして、非jsワークフローを表示するためだけにビューUIを使用します)(このコメントを無数に編集しました...ぎこちないです)
Clemens Tolboom 2012年

2

同様の問題がありました。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');

}

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


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を使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.