web-dev-qa-db-ja.com

単一のカスタムコンテンツタイプの代替テーマフォーム

サイトでは、フロントページのカスタムコンテンツタイプの「クイックエントリ」フォームを希望しますが、「通常の」カスタマイズされていない「node/add/mycontenttype」フォームも保持します。フォームをレンダリングする関数( 'template' => 'some-node-form')を指す適切な配列を返すtheme_hook関数を使用して、「通常の」フォームをカスタマイズできます。

しかし、理想的には、フォームの両方のバージョンを保持し、カスタマイズされたフォームをフロントページのブロックにレンダリングし、通常のフォームを通常の場所「node/add/mycontenttype」に配置します。変数などを渡すことによって、たとえば「node/add/mycontenttype/frontpage」という特別なパスを介して呼び出された場合、「some-node-form」関数で実行時に検出を試みることができると考えました。私はまだこれをなんとか成し遂げていませんが、少なくとも理論的にはそれが可能であるべきです。

しかし、経験豊富なDrupal開発者は、異なるテンプレートレンダリング関数などを指す複数のパスを持っているなど、私がやっていることを達成するためのより良い方法を持っていますか?

2
Marius Kjeldahl

私の最初の考え(Drupal 6))は、パスに応じてフォームに別の#theme値を設定するためにhook_form_alterを使用することです。

例えば

mymodule_form_alter(&$form, &$form_state, $form_id) {
 if ($form_id = 'my_form_id') {
  if ($_GET['q'] == 'somepath') {
   $form['#theme'] = 'function_one';
  } elseif ($_GET['q'] == 'someotherpath') {
    $form['#theme'] = 'function_two';
  }    
 }
}
0
cam8001

実装で最終的に行ったのは、 entityform (D7)を使用し、ルールを使用してエンティティフォームが保存されるときに適切なノードをマップおよび作成することでした。

0
Remog

cam8001は、 '#theme'設定に関して私を助けてくれました。私のtemplate.phpで私は持っています:

<?php

function groc_theme($existing, $type, $theme, $path) {
  return array(
    'purchase_node_form_fp' => array(
      'render element' => 'form',
      'template' => 'groc-purchase-node-form'
    )
   );
}

function groc_form_alter(&$form, &$form_state, $form_id) {
  if (arg(3) == 'fp') {
    $form['#theme'] = 'purchase_node_form_fp';
  }
 }
?>

そして、私のgroc-purchase-node-form.tpl.phpで、特別なフォームをレンダリングします。上記のgroc_form_alterでは、リクエストパラメータを使用する代わりにパス要素をハードコーディングしましたが、これは受け入れられているソリューションと似ています。上記のコードが機能する方法は、「特別な」形式が必要な場合は、通常のノード追加リンクに「/ fp」を追加するだけです。

0
Marius Kjeldahl