web-dev-qa-db-ja.com

送信後にモーダルウィンドウからフォームをリダイレクトする

Colorbox Modalウィンドウ内に、_submitハンドラーを使用して正常に送信するフォームがあります。次に、drupal_goto()を使用して、フォームを別のページ(別のフォームにいくつかのフィールドをプリロードする)に正常にリダイレクトします。私が抱えている問題は、リダイレクトがColorbox Modalウィンドウにとどまることです。どういうわけかモーダルウィンドウを閉じて、新しいフォームのURLを親ウィンドウに転送する必要があります。これをjquery関数で動作させることができます

$(#my_form_id).submit(function (){
   parent.window.location="/user/register";
});

この問題の問題は、フォームが送信されたときに、送信ハンドラで発生したことをすべて無視して関数が呼び出されることです。つまり、ページが更新されるまで、プリロードされた値なしで新しいページ/フォームが取得されます。

何か考えやアイデアはありますか?

2
user975044

#ajaxを使用してフォームを送信し、応答がモーダルを閉じて別の場所に移動できるようにすることをお勧めします。たとえば、フォームを送信してページを再読み込みする代わりに、クリック時に関数を実行する送信ボタンを次に示します。

$form['submit'] = array(
  '#prefix' => '<div id="super-cool-wrapper"></div>',
  '#type' => 'button',
  '#value' => 'Submit',
  '#ajax' => array(
    'callback' => 'my_super_cool_ajax_callback',
    'wrapper' => 'super-cool-wrapper',
    'method' => 'replace',
  ),
);

そして、あなたのコールバック関数で:

function my_super_cool_ajax_callback($form, $form_state) {
  // Do what you normally would with the form submission.
  return '<script type="text/javascript">
    parent.window.location="some/where";
  </script>';
}

これで、必要に応じてフォームを処理し、ユーザーをリダイレクトするだけの応答を返すことができます。

1

私はまた、dual modal formにも同様の問題があります。ユーザー登録後、パスワードを忘れてしまったら、お礼ページで送信します。 tplファイルを作成し、以下のコードを使用して登録リンクを作成します。

<?php
echo l('Sign up here', 'user/register', array('query'=>array('destination'=>'thanks')));
?>

Tplファイルを作成し、以下のコードを使用してパスワードを忘れた場合のリンクを作成します。

<?php
print l('Forgot Your Password?', 'user/password', array('query'=>array('destination'=>'thanks')));
?>
0

同じ問題が発生しました。回避策は次のとおりです。

まず、次のように$ GLOBAL配列にトリガーを追加します。

function my_module_node_presave($node){
  if ($node->type == 'product'){
    $GLOBALS['redirect_parent'] = 'product_list';
  }
}

次に、ノードが保存された後にトリガーされるこの素敵なイベントを追加します

function my_module_drupal_goto_alter(){
  if (@$GLOBALS['redirect_parent']!=''){
    die('<script type="text/javascript">parent.window.location="/'.$GLOBALS['redirect_parent'].'";</script>');
    $GLOBALS['redirect_parent']='';
  }
}

これは最もエレガントなソリューションではありませんが、機能します...

0
Coomie

Ctools このような考えのための素晴らしいツールがあります。ヘルプファイルを読んだとき(インストール後に 高度なヘルプ を使用すると、これ(およびその他:)をそのまま使用できます。

モーダルを出力するメニューコールバックの非常に単純なサンプルコード:

function mymodule_showmodal($js) {
ctools_include('modal');
ctools_include('ajax');

$form_state = array(
    'ajax' => true,
  );
$commands = ctools_modal_form_wrapper('modform',$form_state);
if ($form_state['executed']) {
  $commands = array(ctools_modal_command_dismiss());
}
print ajax_render($commands);
exit();
}

['rebuild'] = trueをどこかに置くことを忘れないでください...

0
mojzis