質問

フォームが公開されたビューがあります。私はそれにいくつかのことをしようとしています。理想的には、ボタンなしでフォームを起動するドロップダウンが必要です。それが不可能な場合は、ボタンテキストを適用とは異なるものにしたいと思います。

今のところハックしてviews.moduleのviews_formを変更していますが、それは正しい方法とは思えません。現在公開されているフォームは1つだけですが、さらに追加した場合はどうなりますか?

私の例については、 http://www.wiredvillage.ca/News を参照してください。

私はdrupal.orgをいじって、同じ問題を抱えている他の人に会っていますが、今のところ解決策はありません。 Drupalのヘルプを得るのに最適な場所はどこかわかりません。

これまでに行った変更は次のとおりです。

function views_exposed_form(&$form_state) {
  // Make sure that we validate because this form might be submitted
  // multiple times per page.
  $form_state['must_validate'] = TRUE;
  $view = &$form_state['view'];
  $display = &$form_state['display'];
  $form_state['input'] = $view->get_exposed_input();
  // Let form plugins know this is for exposed widgets.
  $form_state['exposed'] = TRUE;
  $form['#info'] = array();
  if (!variable_get('clean_url', FALSE)) {
    $form['q'] = array(
      '#type' => 'hidden',
      '#value' => $view->get_url(),
    );
  }
  // Go through each filter and let it generate its info.
  foreach ($view->filter as $id => $filter) {
    $view->filter[$id]->exposed_form($form, $form_state);
    if ($info = $view->filter[$id]->exposed_info()) {
      $form['#info']['filter-' . $id] = $info;
    }
  }

  // I CHANGED The VALUE OF THIS SUBMIT BUTTON TO GO


  $form['submit'] = array(
    '#name' => '', // prevent from showing up in $_GET.
    '#type' => 'submit',
    '#value' => t('go'),
  );
  $form['#action'] = url($view->get_url());
  $form['#theme'] = views_theme_functions('views_exposed_form', $view, $display);
  $form['#id'] = views_css_safe('views_exposed_form-' . check_plain($view->name) . '-' . check_plain($display->id));
//  $form['#attributes']['class'] = array('views-exposed-form');
  // If using AJAX, we need the form plugin.
  if ($view->use_ajax) {
    drupal_add_js('misc/jquery.form.js');
  }
  views_add_js('dependent');
  return $form;
}
役に立ちましたか?

解決

ドロップダウンを起動する場合は、イートンが示唆するようにモジュールをハッキングする代わりにJavaScriptを使用します。

基本的に、Eatonが示唆するようにhook_form_alterでテキストを変更し、同じhook_form_alterで使用し、カスタムJSでdrupal_add_jsへの呼び出しを追加して、ボタンを非表示にし、選択ドロップダウンのonChangeハンドラーでフォームを送信します。 JSが失敗したユーザーの10%に対して、そこに送信ボタンが必要です。

他のヒント

または、前処理関数を使用して、フォームがビルドされる前でもフォームを変更できます。ボタンのテキストを変更したいので、これを行いました:

function MYTHEME_preprocess_views_exposed_form(&$vars, $hook) {

  // only alter the jobs search exposed filter form
  if ($vars['form']['#id'] == 'views-exposed-form-jobs-search-page-1') {

    // Change the text on the submit button
    $vars['form']['submit']['#value'] = t('Search');

    // Rebuild the rendered version (submit button, rest remains unchanged)
    unset($vars['form']['submit']['#printed']);
    $vars['button'] = drupal_render($vars['form']['submit']);
  }
}

上記のどちらでも問題ありませんが、主に公開されたフィルターが特定のテーマテンプレートを使用してテーマ設定されているため、フォームを変更しても必ずしも望ましい結果が得られるとは限りません。テーマを変更する適切な方法は、テーマのフォルダー内のviews-exposed-form.tplファイルをオーバーライドすることです。これは公開されているすべてのフィルターフォームに適用され、特定のテーマをテーマにするには、そのファイル名に次のような別の名前を使用する必要があることに注意してください。

views-exposed-form--TITLE--DISPLAY.tpl.php
views-exposed-form--TITLE.tpl.php

その他いくつかのテンプレートの命名規則については、ビューのテーマ:情報セクションで確認できます。

hook_form_alter()( http://api.drupal.orgを使用できるはずです。 / api / function / hook_form_alter )を使用して、ビルド時にフォームを変更し、特定のビューが表示されているときに問題のフィールドを変更します。送信ボタンを無効にしたり、drupal_add_js()関数を呼び出す#theme関数を追加したりできます。

ビューが期待する方法でGETパラメーターが来る限り、すべてが正常に機能します。公開されたフィルター設定などでページをブックマークできるように設計されています。重要な部分は、独自のモジュールのhook_form_alter()関数でフォームのマングリングを行うことで、他のビューに起因するものが詰まらないようにします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top