2012-03-07 10 views
3

Drupal 7のAJAXコールバックを使用して選択ボックスを作成しています。新しい<option...>ステートメントを設定するためにajax_command_append()とajax_command_html()を試しましたが、私は<div>の内部に作成します。これにより、<select>にはオプションが表示されません。Drupal 7 ajax_command_ *は不要なdivを作成します

Drupalに「ちょっとばかげて、これはまさに私が望むHTMLです、それを混乱させない」と言う方法はありますか?

私はdivを削除するためにいくつかのjQueryをコード化できますが、最初に追加しないようにすればもっと良いでしょう。それはだから、答えはあると思われるすべてのカスタムコードと「ajax_example」の例と同様

答えて

4

はいできます!

独自のカスタムjsコールバックを宣言します。以下の例では、divの代わりにspanを使用しました。しかし、あなたは明らかにラッパーをすべて削除することができます。

PHP:

function my_ajax_callback() { 
    $data = 'saved!'; 
    // instead of using ajax_command_html, we provide our own 
    // js custom callback function 
    $output = array(
    '#type' => 'ajax', 
    '#commands' => array(
     array('command' => 'myjscallback', 'data' => $data), 
    ), 
); 

    return $output; 
} 

JSは:

$(function() { 
    Drupal.ajax.prototype.commands.myjscallback = function (ajax, response, status) { 
    $('#save-btn-message').html('<span>' + response.data + '</span>'); 
    }; 
}); 
0

"いいえ"(少なくともコアをハッキングすることなく、私は死んだ子猫を私の良心に持たない)。

のmisc/ajax.js次のものが含まれます。

var new_content_wrapped = $('<div></div>').html(response.data); 

コメントは、その中に、彼らはトップレベルの一つであることが最初のHTML要素を必要とする理由を説明するために行きます。そうであれば、<div>ラッパーは使用されません。私の場合は、<option>要素を置き換えているので、<div>が得られます。

<select>の全体を置き換えることができましたが、ページロード時にスタイルを変更するスクリプトが原因で、他の問題が発生する可能性があります。それらを見つけて再起動するのではなく、オプションがロードされてdivラッパーが削除された後にスクリプトを実行するだけで、ajax_command_invokeを簡単に行うことができるようです。

編集:回避策として、私はajax_command_invoke($selector, 'html', array('<option...>'));を実行でき、div追加コードをバイパスすることがわかりました。こんにちは、しかし、それは動作します...

+0

私はそのページによく慣れています。生成された包含divを取り除く方法を教えていません。 –

1

を持って、このモジュールをダウンロードしhttp://drupal.org/project/examples 以上の基準と例えばhttp://api.drupal.org/api/drupal/developer!topics!forms_api_reference.html/7#ajax

このリンクを見て、あなたが使用することができます

+0

@ horlykに答えて私のコメントを参照してください。 Drupal.attachBehaviorsは呼び出されず、新しいコンテンツで処理される.use-ajaxボタンやその他のjsビヘイビアが破られるため、ajax_command_invokeには注意してください。 – titouille

2

答えはイエスです。 だけではなく、これを使用する:

$commands[] = ajax_command_invoke('#mywrapper', 'html', array($output)); 
-1

それは私の作品!

 
    $selector = '#my-select'; 
    $method = 'append'; 
    $opts = array('new option'); 

    $commands[] = ajax_command_invoke($selector, $method, $opts); 

    return array('#type' => 'ajax', '#commands' => $commands); 
+0

ajax_command_invokeを使うと余分なdivを避けることができますが、この場合はDrupalです。attachBehaviors()は呼び出されません(@see ajax.jsのinsertメソッドとinvokeメソッド)。追加するコンテンツに.use-ajaxボタンが含まれていると、処理されずに機能しません。 – titouille

関連する問題