ビュー3は、公開されたフィルターをプログラムで削除します


9

いくつかのノードタイプがあり、それぞれが異なる分類用語の語彙を参照しています。カテゴリを表示するには、taxonomy_displayモジュールを使用します。

たとえば、キュ​​ーとビリヤードボールの2つのカテゴリがあります。

Cuesには、from、price to、woodタイプのフィルターがあります。ただし、ボールにはウッドタイプのフィルターはありません。

したがって、taxonomy_term tidがビリヤードボールの語彙を参照している場合は、ウッドタイプフィルターを削除する必要があります。

したがって、プログラムで多くの公開されたフィルターの1つを削除する必要があります。

function modulename_views_pre_view(&$view, &$display_id, &$args) {
  // Some custom logic wich field_info_instances checking ...
  $filter_field = 'filter_id';
  // Removes from everywhere where i can find filter or filters properties
  unset($view->display[$view->current_display]->display_options['filters'][$filter_field]);
  unset($view->display[$view->current_display]->handler->options['filters'][$filter_field]);
  unset($view->display_handler->display->display_options['filters'][$filter_field]);
  unset($view->display_handler->options['filters'][$filter_field]);
}

フィルターフィールドは正常に削除されますが、phpの通知があります。

  Notice: Undefined index: field_wood_reference_tid in function views_handler_filter_term_node_tid->exposed_validate()

また、hook_pre_execute()でフィールドを削除しようとしていますが、同じ結果が得られます。

function modulename_views_pre_execute(&$view) {
  $filter_field = 'filter_id';
  unset($view->display_handler->handlers['filter'][$filter_field]);
  unset($view->filter[$filter_field]);
}

また、こちらのようにoverride_option()メソッドを試してみてください-http://groups.drupal.org/node/82219、しかし結果はまったくありません。

助言がありますか?Plsヘルプ=)


返信ありがとうございましたが、まだ答えはありません。多分何かがはっきりしていませんか?=(


hook_views_pre_render()を試しましたか?jQueryでの選択に応じて、関連するフィルターを表示/非表示にすることもできます。
エンジッパー2013年

こんにちは、私はあなたのソリューションが大丈夫だと理解していますが、正しい方法はありません。したがって、CSS条件を使用しても非表示にできます...説明しようとしています。各種類のコードは、本来あるべき場所に配置する必要があります。この問題で、レンダリングの前または後に公開されたフィルターを非表示にしても、ビューはそれを処理します。そして、クエリ文字列を追加しようとすると?filter_id=val、ビューは空の表示または不正な選択エラーを返します...
Oleg Sherbakov

私の答えを試しましたか?
Mathankumar

フォームを変更する必要はありません(バリアントが機能することはわかっています)。ビューオブジェクトを変更して、結果に似ていますが、フォームビルドよりも前にしたいと思います。
Oleg Sherbakov 2013

回答:



1

これは、スコットトーマスが述べたフォームの変更を使用して、ビューの公開フォームからフィルターを削除できるようにするテスト済みのスニペットです。

/**
 *Implements hook_form_FORM_ID_alter().
 */
function hook_form_views_exposed_form_alter(&$form, &$form_state) {
  $filter_field = 'filter_id';
  // Get the filters list for the current view. Here page_1 is the display ID.
  $filters = $form_state['view']->get_items('filter', 'page_1');
  if (isset($filters[$filter_field])) {
    $info_key = 'filter-' . $filter_field;
    unset($form[$filter_field], $form['#info'][$info_key]);
  }     
}

フォームフィールドの削除とは別に、$ form ['#info']で利用できる特定のフィルターの情報も削除する必要があります。これにより、ラベルも削除されます。フォーム要素のみを削除すると、フィールドが削除されてもフィルターラベルが表示されるので、必ずこの情報も削除するようにしてください。

必要に応じてこれを変更してください。これを特定のビューに対して実行したい場合は、そのための条件を追加します。

if ($form_state['view']->name == 'view_name') {
  // DO your operation.
}

ここで$ form_state ['view']は、処理中の現在のビューオブジェクトを提供します。

お役に立てれば。


これは、ラベルとフィールドウィジェットを非表示にする唯一のソリューションであり、ブロック内の公開されたフィルターフォームで機能しました。
xenophyle

1

以下の手順に従ってください

  1. まず、カスタムモジュールにhook_form_alterを記述します
  2. 次に、次のコードを試してください

    unset($ form ['#info'] ['your_field_name']); $ form ['your_field_name'] ['#access'] = 'FALSE';

お役に立てば幸いです。


1

テンプレートファイルを使用して、公開されたフィルターを削除することもできます。

次のコマンドを使用します。

cp sites/all/modules/contrib/views/theme/views-view.tpl.php sites/all/themes/costa/templates/views/views-view--<machine_name>.tpl.php

テンプレートファイルで次のコードを見つけます。

  <?php if ($exposed): ?>
    <div class="view-filters">
      <?php print $exposed; ?>
    </div>
  <?php endif; ?>

そしてそれを削除します。公開されたフィルターは表示から削除されますが、適切な引数をURLに渡して動作し続けます。


返信はThxですが、公開フィルターを構築するためにコアフォームAPIを使用するD8を待っています:)
Oleg Sherbakov

0

あなたの問題を完全に理解しているとは思えないので、私が間違っている場合は訂正してください。他の公開されたフィルターの値に応じて、ビューで公開されたフィルターを非表示にしますか?もしそうなら、Views Dependent Filtersモジュールを試すことができます。私はそれを数回使用し、それが仕事をします。

このモジュールに関する悪魔のLullabotのレビューを確認できます。

コードで本当にそれを行う必要がある場合、公開されたオプションが機能するはずです:filter [$ filter_id]-> options ['exposed'] = FALSE;


現在のコンテンツタイプにこの(フィルターされた)フィールドがない場合は、公開されているフィルターを非表示にしたいと思います。スニペットを試してみると、$view->display_handler->handlers['filter'][$filter_field]->options['exposed'] = FALSE;致命的なエラーが発生します- PHP Fatal error: Call to undefined method stdClass::access() in .../view.inc on line 766。フィルターが公開されていない場合は、デフォルト値も必要であるため、正しい動作と思います。何か案は?
Oleg Sherbakov 2013

pastebin.com/f1FKgUdeここに私のコードがありますが、おそらく私の英語よりも明確になります
Oleg Sherbakov

0

以下は私のためにhook_form_alterの中でそれを行いました:

$info_key = 'filter-' . $fieldName;
unset($form[$fieldName], $form['#info'][$info_key], $form_state['view']->display_handler->options['filters'][$fieldName], $form_state['view']->display_handler->handlers['filter'][$fieldName], $form_state['view']->filter[$fieldName]);

0

方法1

hook_views_query_alter()を使用する。次の例を参照してください。

<?php
/**
 * Implements hook_views_query_alter().
 */
function foo_views_query_alter(&$view, &$query) {

  if ($view->name == 'foo_view') {

    // Allow any distance when the postcode it is not specified.
    if (empty($_GET['postcode']['postal_code']) || $_GET['postcode']['postal_code'] === 'All') { 
      // Scan through the query.
      foreach ($query->where as $condition_group_key => &$condition_group) {
        foreach ($condition_group['conditions'] as $condition_key => &$condition) {
          $search_name = '(COALESCE(ACOS(';
          if (is_string($condition['field']) && strstr($condition['field'], $search_name) !== FALSE) {
            // Remove filter from the query.
            unset($query->where[$condition_group_key]['conditions'][$condition_key]);
          }
        } // end: foreach
      } // end: foreach
    } // end: if


    /*
     * Change the field conditions.
     * Possible field values: 1, 2, 3
     * Logic: When 3 is selected, then display 1, 2 and 3.
     */
    switch (@$view->display_handler->handlers['filter']['field_123_value']->value[0]) {

      case 3:
        foreach ($query->where as $condition_group_key => &$condition_group) {
          foreach ($condition_group['conditions'] as $condition_key => &$condition) {
            if($condition['field'] == 'field_data_field_123.field_123_value') {
              unset($query->where[$condition_group_key]['conditions'][$condition_key]);
              $query->where[] = array(
                  'conditions' => array(
                      array(
                          'field' => 'field_data_field_123.field_123_value',
                          'value' => 1,
                          'operator' => "=",
                      ),
                      array(
                          'field' => 'field_data_field_123.field_123_value',
                          'value' => 2,
                          'operator' => "=",
                      ),
                      array(
                          'field' => 'field_data_field_123.field_123_value',
                          'value' => 3,
                          'operator' => "=",
                      ),
                  ),
                  'args' => array(),
                  'type' => 'OR',
              );
            }
          }
        } // end: foreach
        break;

    } // end: switch

  } // end: if
}

方法2

正しいフィールド条件を見つけて参照を返そうとする、hook_views_pre_executeとカスタム関数を使用して例を参照してください。

/**
 * Implements hook_views_pre_execute().
 */
function foo_views_pre_execute(&$view) {

  if ($view->name == 'foo_view') {


    foo_get_view_filter_recursively(
      $view,
      $view->build_info['query']->conditions(),
      'field_data_field_123.field_123_value',
      $filter
    );

    // We want our filter to work as a bit mask.
    $filter[0]['operator'] = '&';

    unset ($filter);

    // Example of finding Proximity filter condition
    $search_name = '(COALESCE(ACOS(';

    foo_get_view_filter_recursively(
      $view,
      $view->build_info['query']->conditions(),
      $search_name,
      $filter
    );

    if (empty($_GET['postcode']['postal_code']) || $_GET['postcode']['postal_code'] === 'All') {
      // Allowing any distance.
      $filter[0]['value'][':distance'] = 10000000;
    }
    else {
      $filter[0]['value'][':distance'] = 80000;
    }

    unset ($filter);


    // Fetching single record?

    foo_get_view_filter_recursively(
      $view,
      $view->build_info['query']->conditions(),
      'node.nid',
      $filter
    );

    if (!empty($_GET['nid'])) {
      $filter[0]['value'] = (int) $_GET['nid'];
    }
    else {
      $filter[0]['operator'] = '<>';
    }

    unset ($filter);                                                        

    // echo '<pre style="font-size:11px;font-family: Monaco">'; print_r($view->build_info['query']); exit;
  }
}

/**
 * Custom function to find the field condition within the view
 */
function foo_get_view_filter_recursively($view, &$conditions, $field_name, &$filter) {

  if (!empty($conditions)) {

    foreach ($conditions as &$condition) {
      if ($condition instanceof DatabaseCondition) {
        if (foo_get_view_filter_recursively($view, $condition->conditions(), $field_name, $filter)) {
          return TRUE;
        }
      } else if ($condition['field'] instanceof DatabaseCondition) {
        if (foo_get_view_filter_recursively($view, $condition['field']->conditions(), $field_name, $filter)) {
          return TRUE;
        }
      } elseif (is_string($condition['field']) && strstr($condition['field'], $field_name) !== FALSE) {
        @$filter = array(&$condition);
        return TRUE;
      }
    } // end: foreach

  } // end: if

  return FALSE;
}

0

テンプレートファイルから削除しています。views-view.tpl.phpをオーバーライドして、次のコードを削除します。

  <?php if ($exposed): ?>
    <div class="view-filters">
      <?php print $exposed; ?>
    </div>
  <?php endif; ?>

0

作戦は順調だったと思います。公開されたフィルターなしで同様の状況が発生したため、hook_form_alterメソッドを使用できませんでした。これは、これに遭遇した他の人のためのいくつかのサンプルコードです:

$view->set_item($view->current_display, 'filter', $filter_id, null);

ビューオブジェクトは持っていないremove_item機能を単にあなたがフィルタを含むアイテムを削除するために、これをnullに設定できるというコードに述べて: views/includes/view.incライン上2526

以下は、特定のビューとディスプレイをターゲットとするすべてのユーザーの完全な例です。

/**
 * Implements HOOK_views_pre_view().
 */
function HOOK_views_pre_view(&$view) {
  if($view->name == 'VIEW_MACHINE_NAME') {
    switch($view->current_display) {
      case 'VIEW_DISPLAY_MACHINE_NAME':
        $view_filters = $view->display_handler->get_option('filters');
        foreach ($view_filters as $filter_id => $filter) {
          if ($filter_id == 'my_filter') {
            $view->set_item($view->current_display, 'filter', $filter_id, null);
          }
        }
      break;
    }
  }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.