প্রোগ্রামের মাধ্যমে ভিউতে ফিল্টার ক্রিটারিয়া যুক্ত করুন


18

আমি একটি filter criteriaপ্রোগ্রামযুক্তভাবে যুক্ত / সংশোধন করতে চাই ।

উদাহরণস্বরূপ, একটি দর্শনর জন্য, আমি একটি "ইমেল ঠিকানা" ফিল্টার যুক্ত করেছি যার গতিবেগ পরিবর্তন করার জন্য এটির প্রয়োজন বর্তমান ব্যবহারকারীর ইমেল আইডিতে সেট করা প্রয়োজন।

কীভাবে অর্জন করব? আরও তথ্যের জন্য দয়া করে সংযুক্ত চিত্রটি দেখুন। সাহায্য করুন.

এখানে চিত্র বর্ণনা লিখুন

উত্তর:


24

ডিভেল মডিউলটি ব্যবহার করুন dpm($view)এবং dpm($query)তারপরে আপনি নিজের ছবিতে পাওয়া "মান" ক্ষেত্রে "test@email.com" এর মতো রাখুন। ডিভেল আউটপুট থেকে ভিউ এবং ক্যোয়ারির অবজেক্ট / অ্যারে কাঠামোটি দেখুন।

তারপরে hook_views_query_alter(&$view, &$query)আপনার মডিউলটিতে ফাংশনটি WHERE শর্ত ফিল্টার শর্তটিকে লক্ষ্য করতে এবং এটি আপনার পছন্দ অনুযায়ী মান হিসাবে সেট করতে ব্যবহার করুন।

কিছুটা এইরকম:

function MYMODULE_views_query_alter(&$view, &$query) {
  global $user;
  dpm($view, __FUNCTION__);
  dpm($query, __FUNCTION__);
  if ($view->name === 'your_view_machine_name') {
    // This will only work as-is if you always have something in the filter by
    // default, I guess. This hook runs always so you could just put
    // 'test@test.com' as the email to filter by in views and this
    // will always override it. I'm sure there is a cleaner way to put
    // the filter dynamically at runtime. But i think thats more complex
    // php that customizes a view.
    //
    // The index 2 below is the index of the condition for the email filter.
    // Your $query structure may be different in your dpm() of the View $query.
    $query->where[1]['conditions'][2]['field']['value'] = $user->email;
  }
}

অনেক ধন্যবাদ! আপনি দয়া করে বলতে পারেন আমি প্রথমে কোথায় লিখছি dpm($view);?
শফিউল

আপনি একটি কাস্টম মডিউল তৈরি করেন এবং উপরের ফাংশনটি এতে রাখুন views দৃশ্যগুলি সক্ষম করা থাকলে হুকটি আগুন জ্বলে উঠবে এবং একবার আপনি কাস্টম মডিউল এবং ডেভেল মডিউল সক্ষম করলে পৃষ্ঠার শীর্ষে $ দর্শন এবং $ কোয়েরিটি দেখতে পাবেন। তারপরে আপনার
ভিউটির

এটি একটি দুর্দান্ত উত্তর। ড্রুপাল In-এ আপনি আসলে করেন: $ কোয়েরি-> যেখানে [1] ['শর্তাবলী'] [২] ['মান'] = $ ব্যবহারকারী-> ইমেল
আর্তুর কেডজিওর

ব্যক্তিগতভাবে আমি মনে করি নীচের হুকগুলি ব্যবহার করে উত্তরটি আরও ভাল ড্রপল
st স্ট্যাককেেক্সচেঞ্জ.

6

এখানে একটি বিকল্প রয়েছে:

$view = views_get_view('view_machine_name');
$view->init_display('default');
$view->display_handler->display->display_options['filters']['your_filter_name']['default_value'] = 'your_value';
$view->is_cacheable = FALSE;  
$view->execute();
print $view->render();

আমি জানি আপনার সম্ভবত কিছু রহস্যময়, সংশ্লেষিত পদ্ধতি ব্যবহার করে এটি নির্ধারণ করা উচিত, তবে আপনি যদি কেবল এই বিষয়ে গোলমাল না করে দ্রুত এবং নোংরা অ্যাক্সেস চান তবে আপনাকে সেখানে পৌঁছে দেবে।


5

সময় রেন্ডারের চেয়ে হুকগুলিতে এগুলি পরিবর্তন করা ভাল। যাতে আপনার সাইটের কর্মক্ষমতা এবং ক্যাচিংয়ের ক্ষতি হয় না। হুক_ভিউ_প্রিয়_বিল্ড () খুব দেরিতে আগুন নেওয়ার জন্য আমার বয়স নিয়েছে , আপনার দরকার হুক_ভিউ_প্রিয়_ভিউ ()

আমি $ ভিউ-> অ্যাড_ইটিম () ব্যবহারের জন্য উল্লেখ পেয়েছি তবে উদাহরণের জন্য লড়াই করেছি, কেবলমাত্র কিছু ভোকাবকে অন্তর্ভুক্ত করার জন্য ট্যাক্সনোমির শর্তগুলির একটি সেট ফিল্টার করার জন্য নীচে আমার সমাধানটি ছিল:

function MODULENAME_views_pre_view(&$view, &$display_id, &$args) {

  if ($view->name == 'VIEWNAME' && $display_id == 'DISPLAYID') {
    // Add all the terms of a vocabulary to the terms listing widget select field
    $vids = array();
    $vocab = taxonomy_vocabulary_machine_name_load('vocab_name');
    $vids[ $vocab->vid ] = $vocab->vid;

    // Get the existing filters
    $filters = $view->display_handler->get_option('filters');

    if (empty($filters['vid'])) {
      // There is no vid filter so we have to add it
      $view->add_item(
        $view->current_display,
        'filter',
        'taxonomy_term_data',
        'vid',
        array(
          'operator' => 'in',
          'value' => $vids,
          'group' => 1
        )
      );
    }
    else {
      // Add to pre-existing filter
      foreach($vids as $vid) {
        $filters['vid']['value'][ $vid ] = $vid;
      }
      $view->display_handler->override_option('filters', $filters);
    }
  }
}

সম্পাদনা দ্রষ্টব্য : ডো গ্রুপের এই মন্তব্যটি আমাকে কীভাবে ভিউ ফিল্টারগুলি ব্যবহার করতে হবে $view->display_handler->get_option('filters')এবং তারপরে সেগুলি ব্যবহার করে ওভাররাইড করতে সাহায্য করতে পারে $view->display_handler->override_option('filters', $filters);


2

আমার একই রকম সমস্যা হয়েছে তবে যেখানে ফিল্টারটিতে একাধিক যুক্তি দেওয়ার চেষ্টা করা হচ্ছে। আমি "ভিউজেট_জেট_ভিউ" পদ্ধতিটি ব্যবহার করেছি, তবে দর্শনে যুক্তি দিয়ে যাচ্ছি। আমি আশা করি এটি কাউকে সাহায্য করবে আপনি আপনার প্রয়োজনের জন্য যে কোনও যুক্তি প্রকার বা মানকে প্রতিস্থাপন করতে পারেন:

আমি নিজেই ভিউতে প্রাসঙ্গিক ফিল্টার যুক্ত করেছি (অগ্রিম ভিউ সেটিংস ফিল্ডসেট থেকে)। প্রথমটি হ'ল "বিষয়বস্তু: বিভাগের শর্ত আইডি আছে"। দ্বিতীয়টি হ'ল "বিষয়বস্তু: এনআইডি" সহ "একাধিক" চেক করার অনুমতি দিন এবং "বাদ দিন" চেকবাক্স চেক করা হয়েছে (প্রাসঙ্গিক ফিল্টার পপ-আপের 'আরও' ফিল্ডসেট থেকে)।

আরগস [] = '1'; // টার্ম আইডি
আরগস [] = '1 + 2 + 3'; // নোড আইডি বাদ / অন্তর্ভুক্ত

$ ভিউ = ভিউ_জেট_ভিউ ($ ভিউ_নাম);
$ View-> Init ();
$ View-> set_display ($ প্রদর্শন);
$ View-> set_arguments ($ args);
$ View-> চালানো ();
$ View-> ফলাফলের

আপডেট: আমি উল্লেখ করতে ভুলে গেছি, প্রাসঙ্গিক ফিল্টার মানগুলির মধ্যে, আপনাকে পিএইচপি কোড নির্বাচন করতে হবে এবং পাস হওয়া ভিউ আর্গুমেন্টগুলি ফিরিয়ে দিতে হবে Eg যেমন:

রিটার্ন $ ভিউ-> আরগস [1];

1

ড্রুপাল 8 এ আপনি ViewExecutable::setHandler($display_id, $type, $id, $item)প্রোগ্রামিং হিসাবে ফিল্টার সেট করতে ব্যবহার করতে পারেন ।


4
এটি কেন কাজ করে সে সম্পর্কে এই উত্তরটি আরও কিছুটা ভারবস হতে পারে। প্রায়শই আমি ডকুমেন্টেশন পৃষ্ঠাগুলি লিঙ্ক এবং উদ্ধৃত করতে পছন্দ করি। এটি প্রশ্নকারীকে ড্রুপাল এপিআই সম্পর্কে আরও জানতে এবং ভবিষ্যতে নিজের জন্য তথ্য অনুসন্ধানে সহায়তা করবে।
mradcliffe

1

ড্রুপাল 8-এ কীভাবে ফিল্টার মানদণ্ড প্রোগ্রামিয়ালি যুক্ত করা যায় তার একটি উদাহরণ এখানে রয়েছে:

/**
 * @param ViewExecutable $view
 * @param QueryPluginBase $query
 *
 * Sets a custom custom filter criteria (takes current language into account)
 */
function MODULE_views_query_alter(ViewExecutable $view, QueryPluginBase $query) {
  if ($view->storage->id() === 'my_view_id') {
    $query->addWhere(0, 'node__field_custom_criteria.field_custom_criteria_value', \Drupal::languageManager()->getCurrentLanguage()->getId(), '=');
  }
}

উপরের জিজ্ঞাসাটি এমন একটি মানদণ্ড যুক্ত করবে যা নোডগুলি ফিল্টার করে যেখানে field_custom_criteriaক্ষেত্রটি বর্তমানে নির্বাচিত ভাষার সমান।

ডক্সে আরও তথ্য পাওয়া যাবে: হুক_ভিউ_কোয়ারি_আল্টার


0

উপর @ ভিত্তি করে Duncanmoo এর উত্তর উপরে যে আমি অনুভূত সেরা ছিল, আমি আমার দৃশ্যে নিচের ফিল্টারগুলি যোগ - চিন্তা ক্ষেত্রে এই হবে দরকারী উদাহরণ আপনি যদি একটি রেফারেন্সড বর্গীকরণ সূত্র কিন্তু এর পরিবর্তে একটি রেফারেন্সড সত্তা বা ভিত্তি করে ফিল্টার বের করার চেষ্টা করা হয় নি একটি এনআইডি:

function [MYMODULE]_views_pre_view(&$view, &$display_id, &$args) {
  if (($view->name == '[your view name]') && ($display_id == '[your display id]')) {
    // Get referenced service - example for entity reference.
    $node = menu_get_object();
    $node_wrapper = entity_metadata_wrapper('node', $node->nid);
    $referenced_service = $node_wrapper->field_service_ref->value();
    // Add service id as a filter to view.
    $filters = $view->display_handler->get_option('filters');
    if (empty($filters['field_service_ref_target_id'])) {
      // Only display operations nodes that reference the same service.
      $view->add_item(
        $display_id,
        'filter',
        'field_data_field_service_ref',
        'field_service_ref_target_id',
        array(
          'operator' => '=',
          'value' => ['value' => $referenced_service->id],
          'group' => 1
        )
      );
    }
    // Add nid as a filter to view - example for NID filter
    if (empty($filters['nid'])) {
      // Don't include current operation in list of related operations.
      $view->add_item(
        $display_id,
        'filter',
        'node',
        'nid',
        array(
          'operator' => '!=',
          'value' => ['value' => $node->nid],
          'group' => 1
        )
      );
    }
  }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.