प्रोग्राम में फ़िल्टर CRITERIA जोड़ें


18

मैं filter criteriaप्रोग्रामेटिक रूप से जोड़ना / संशोधित करना चाहता हूं ।

उदाहरण के लिए, एक दृश्य के लिए, मैंने एक "ईमेल पता" फ़िल्टर जोड़ा जिसका मूल्य गतिशील रूप से बदलने के लिए आवश्यक है, इसे उपयोगकर्ता की ईमेल आईडी में वर्तमान लॉग में सेट करने की आवश्यकता है।

कैसे प्राप्त करें? अधिक जानकारी के लिए कृपया संलग्न छवि देखें। कृपया मदद कीजिए।

यहाँ छवि विवरण दर्ज करें

जवाबों:


24

देवल मॉड्यूल का उपयोग करें dpm($view)और dpm($query)उसके बाद आप अपने pic में पाए गए "value" फ़ील्ड में "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);?
शफीउल

आप एक कस्टम मॉड्यूल बनाते हैं और उपरोक्त फ़ंक्शन को इसमें डालते हैं, हुक सक्षम होने पर आग लग जाएगी और कस्टम मॉड्यूल और डेवेल मॉड्यूल को सक्षम करने के बाद पृष्ठ के शीर्ष पर आपको $ दृश्य और $ क्वेरी दिखाई देगी। फिर बस अपने कोड को बदल कर अपने दृश्य की मशीन का नाम उसमें
रख दें

यह बहुत अच्छा जवाब है। Drupal 7 में आप वास्तव में करते हैं: $ क्वेरी-> जहां [1] ['स्थितियां'] [2] ['मूल्य'] = $ उपयोगकर्ता-> ईमेल
Artur Kędzior

व्यक्तिगत रूप से मुझे लगता है कि नीचे दिए गए हुक का उपयोग करने का उत्तर बहुत बेहतर है drupal.stackexchange.com/a/200870/9634
kbrinner

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

समय पर रेंडर करने के बजाय हुक में इन्हें बदलना बेहतर होगा ताकि आप साइट के प्रदर्शन और कैशिंग को कम न करें। मुझे यह समझने के लिए उम्र लग गई कि हुक_व्यूज_पर_बिल्ट () आग में बहुत देर हो जाती है, आपको हुक_व्यूज_पर_व्यू () की आवश्यकता है ।

मुझे $ दृश्य का उपयोग करने के लिए संदर्भ मिला-> add_item () लेकिन उदाहरण के लिए संघर्ष किया गया, नीचे कुछ विशेष शब्दों को शामिल करने के लिए केवल वर्गीकरण शब्दों के एक सेट को फ़िल्टर करने के लिए मेरा समाधान था:

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);
    }
  }
}

नोट संपादित करें : do समूह की इस टिप्पणी से मुझे यह पता लगाने में मदद मिली कि किस तरह से व्यू फिल्टरों का उपयोग किया जा सकता है $view->display_handler->get_option('filters')और फिर उन्हें उपयोग करने से ओवरराइड किया जा सकता है $view->display_handler->override_option('filters', $filters);


2

मेरे पास एक समान मुद्दा है लेकिन जहां एक फिल्टर के लिए कई तर्कों में पारित करने की कोशिश की जा रही है। मैंने "view_get_view" पद्धति का उपयोग किया है, लेकिन दृश्य में तर्क पारित करना। मुझे उम्मीद है कि यह किसी की मदद करता है। आप अपनी आवश्यकताओं के लिए किसी भी तर्क प्रकार या मूल्य को प्रतिस्थापित कर सकते हैं:

मैंने स्वयं ही दृश्य को प्रासंगिक फ़िल्टर जोड़ दिया है (अग्रिम दृश्य सेटिंग फ़ील्ड से)। पहला एक "सामग्री: में वर्गीकरण शब्द आईडी है"। दूसरा एक "कंटेंट: एनआईडी" है जिसमें "मल्टीपल" चेक किए गए और "एक्सक्लूसिव" चेकबॉक्स चेक किए गए हैं (संदर्भ फिल्टर पॉप-अप में 'अधिक' फ़ील्ड से)।

args [] = '1'; // टर्म आईडी
args [] = '1 + 2 + 3'; // नोड आईडी को बाहर करने / शामिल करने के लिए

$ दृश्य = view_get_view ($ view_name);
$ देखें> init ();
$ देखें> set_display ($ प्रदर्शन);
$ देखें> set_arguments ($ args);
$ देखें> निष्पादित ();
$ देखें> परिणाम

अद्यतन: मैं उल्लेख करना भूल गया, संदर्भ फ़िल्टर मानों के भीतर, आपको php कोड का चयन करना होगा और पारित किए गए दृष्टिकोण को वापस करना होगा।

$ वापस लौटें-> आर्ग्स [1];

1

Drupal 8 में आप ViewExecutable::setHandler($display_id, $type, $id, $item)प्रोग्राम को फ़िल्टर करने के लिए उपयोग कर सकते हैं ।


4
यह जवाब थोड़ा और अधिक हो सकता है कि यह क्यों काम करता है। अक्सर मैं प्रलेखन पृष्ठों को लिंक करना और उद्धृत करना पसंद करता हूं। यह पूछने वाले को Drupal API के बारे में और जानने में मदद करेगा और भविष्य में अपने लिए जानकारी खोजने में मदद करेगा।
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

@ डंकनमो के उत्तर के आधार पर, जो मुझे सबसे अच्छा लगा, मैंने अपने विचार में निम्नलिखित फ़िल्टर जोड़े - सोचा कि ये ऐसे मामले में उपयोगी उदाहरण होंगे जब आप संदर्भित टैक्सोनॉमी के आधार पर फ़िल्टर करने की कोशिश नहीं कर रहे थे, बल्कि एक संदर्भित इकाई पर या एक एनआईडी:

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
        )
      );
    }
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.