web-dev-qa-db-ja.com

ブロック内でprivatemsg_newを呼び出すときに、内部の$ destination変数を正しく設定するにはどうすればよいですか?

Phpでprivatemsg_newをブロックで呼び出しているので、ノードの作成者に連絡するためのフォームはコンテンツと同じページにあります。これがコードです。

$node = menu_get_object();
if ($node->uid != 0) {
module_load_include('pages.inc','privatemsg');
$recipients = $node->uid;
print "<div>Contact " . $node->name ." about this post.</div>";
$subject = $node->title ." question.";
print drupal_render(drupal_get_form('privatemsg_new', $recipients, $subject));

通常、ノードページから「この作成者にメッセージを送信する」というリンクを介してこのフォームにアクセスし、そのリンクは「宛先」パラメータをURLクエリにロードして、メッセージが終了するとノードにリダイレクトされるようにします。ページ。

ブロック内のフォームのコードは、送信後にページにリダイレクトされることを除いて、正常に機能します。設定する必要のある変数は、privatemsg_new関数のスコープ内にあります。

http://drupalcontrib.org/api/drupal/contributions!privatemsg!privatemsg.pages.inc/function/privatemsg_new/7

リダイレクトが正しく機能するようにその変数を設定するにはどうすればよいですか?

2012年8月1日編集以下のEugeneの回答は、この特定の問題の正しい方向とコードでしたが、完全に機能する「ContactAuthor」ブロックを実現するために必要な正確なコードで質問を更新したいと思いました。これをコピーしてDrupal 7に貼り付けるだけで、同じ解決策を探している場合はうまくいくはずです。

$node = menu_get_object();
if ($node->uid != 0) {
module_load_include('pages.inc','privatemsg');
$recipients = $node->uid;
print "<div>Contact " . $node->name ." about this post.</div>";
$subject = $node->title ." question.";
$form = drupal_get_form('privatemsg_new', $recipients, $subject);
// Setup destination parameter to be equal to current page.
$form['#action'] = url('messages/new/'. $node->uid, array ('query' =>    drupal_get_destination()));
  print drupal_render($form);
drupal_set_title($node->title);
}

drupal titleを手動で設定する必要があります。これはprivatemsg_new関数がこれをオーバーライドするためです。

1
blue928

カスタムモジュールにフックを実装したくない場合は、このコードをブロックで試してください。

$node = menu_get_object();
if ($node->uid != 0) {
  module_load_include('pages.inc','privatemsg');
  $recipients = $node->uid;
  print "<div>Contact " . $node->name ." about this post.</div>";
  $subject = $node->title ." question.";
  $form = drupal_get_form('privatemsg_new', $recipients, $subject)
  // Setup destination parameter to be equal to current page.
  $form['#action'] = url('node/'. $node->uid, array ('query' => drupal_get_destination()));
  print drupal_render($form);
}
2
Eugene Fidelin

hook_form_alter を実装し、送信ハンドラチェーンの最後に送信ハンドラを追加してリダイレクトを追加してみます。例えば、

function mymodule_privatemsg_new_form_alter(&$form, &$form_state, $form_id) {
  $form['#submit'][] = 'mymodule_submit_adds_redirect';
}

function mymodule_submit_adds_redirect($form, &$form_state) {
  $form_state['redirect'] = '/your/destination/final/redirect/url';
}
0
tenken