मैं किसी फ़िल्टर का मान कैसे बदल सकता हूं और दृश्य रेंडर करने से पहले आउटपुट बदल गया है?


15

Drupal 7 और Views 3 का उपयोग करते समय, किसी व्यू फ़िल्टर मान को बदलने का सही तरीका क्या है जिससे यह उस सामग्री को प्रभावित करता है जो अभी प्रस्तुत की जाने वाली है?

मैंने डी 6 के लिए यहां बताई गई हर चीज को आजमाया ।

भले ही कुछ लोगों को यह काम करने के लिए मिला हो, लेकिन मर्लिन ने कहा कि डिस्प्ले_ऑप्टिशन को संशोधित करना इसे प्राप्त करने का गलत तरीका है, लेकिन वह अपनी प्रतिक्रिया में अस्पष्ट है कि क्या करना है ( http://drupal.org/node/789710#comment) 2927556 ) है।

मैंने कोशिश की है:

function pages_views_pre_view($view){
    $view = views_get_view('north_carolina');
    $view->set_display('default');

    $view->display_handler->options['filters']['province']['value'] = 'Georgia';
    dsm($view->display_handler->options['filters']['province']);
}

टिप्पणियाँ:

1) मेरे पास एक दृश्य है जिसे कहा जाता north_carolinaहै जिसमें दो प्रकार के डिस्प्ले होते हैं - एक पृष्ठ और एक ब्लॉक (पेज_1 और ब्लॉक_1)।

2) मेरे फ़िल्टर मेरे डिस्प्ले में समान हैं इसलिए मैं 'डिफ़ॉल्ट' डिस्प्ले को बदलने की कोशिश कर रहा हूं ताकि यह उन सभी को प्रभावित करे।

3) मेरे फ़िल्टर का डिफ़ॉल्ट मान 'नॉर्थ कैरोलिना' है (जिसे मैंने व्यू यूआई में सेट किया है) लेकिन ध्यान दें कि मैं इसे 'जॉर्जिया' में बदलने की कोशिश कर रहा हूं

4) अगर मैं तुरंत बाद DSM चलाता हूं, तो मैं देखता हूं कि फ़िल्टर बदल दिया गया है, हालांकि, मेरे परिणाम अभी भी 'नॉर्थ कैरोलिना' के परिणाम दिखाते हैं। कैशिंग बंद कर दिया जाता है, और मैं अभी भी सभी ड्रंक सीसी चलाने के बाद एक ही बात करता हूं।

मैंने भी उसी कोड को चलाने की कोशिश की है hook_views_pre_buildऔर hook_views_pre_execute

कोई सुझाव?

संपादित करें:

जैसा कि सुझाव दिया गया है कि इससे अतिरिक्त जानकारी प्राप्त करने में मदद मिल सकती है। यहाँ दृश्य का एक डंप है:

$view = new view();
$view->name = 'north_carolina';
$view->description = '';
$view->tag = 'default';
$view->base_table = 'node';
$view->human_name = 'North Carolina';
$view->core = 7;
$view->api_version = '3.0';
$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */

/* Display: Master */
$handler = $view->new_display('default', 'Master', 'default');
$handler->display->display_options['title'] = 'test nc block';
$handler->display->display_options['use_more_always'] = FALSE;
$handler->display->display_options['access']['type'] = 'perm';
$handler->display->display_options['cache']['type'] = 'none';
$handler->display->display_options['query']['type'] = 'views_query';
$handler->display->display_options['exposed_form']['type'] = 'basic';
$handler->display->display_options['pager']['type'] = 'full';
$handler->display->display_options['style_plugin'] = 'default';
$handler->display->display_options['row_plugin'] = 'fields';
/* Field: Content: Title */
$handler->display->display_options['fields']['title']['id'] = 'title';
$handler->display->display_options['fields']['title']['table'] = 'node';
$handler->display->display_options['fields']['title']['field'] = 'title';
$handler->display->display_options['fields']['title']['label'] = '';
$handler->display->display_options['fields']['title']['alter']['word_boundary'] = FALSE;
$handler->display->display_options['fields']['title']['alter']['ellipsis'] = FALSE;
/* Sort criterion: Content: Post date */
$handler->display->display_options['sorts']['created']['id'] = 'created';
$handler->display->display_options['sorts']['created']['table'] = 'node';
$handler->display->display_options['sorts']['created']['field'] = 'created';
$handler->display->display_options['sorts']['created']['order'] = 'DESC';
/* Filter criterion: Content: Published */
$handler->display->display_options['filters']['status']['id'] = 'status';
$handler->display->display_options['filters']['status']['table'] = 'node';
$handler->display->display_options['filters']['status']['field'] = 'status';
$handler->display->display_options['filters']['status']['value'] = 1;
$handler->display->display_options['filters']['status']['group'] = 1;
$handler->display->display_options['filters']['status']['expose']['operator'] = FALSE;
/* Filter criterion: Location: Province */
$handler->display->display_options['filters']['province']['id'] = 'province';
$handler->display->display_options['filters']['province']['table'] = 'location';
$handler->display->display_options['filters']['province']['field'] = 'province';
$handler->display->display_options['filters']['province']['value'] = 'North Carolina';
$handler->display->display_options['filters']['province']['exposed'] = TRUE;
$handler->display->display_options['filters']['province']['expose']['operator_id'] = 'province_op';
$handler->display->display_options['filters']['province']['expose']['label'] = 'State';
$handler->display->display_options['filters']['province']['expose']['operator'] = 'province_op';
$handler->display->display_options['filters']['province']['expose']['identifier'] = 'province';
$handler->display->display_options['filters']['province']['expose']['remember_roles'] = array(
  2 => '2',
  1 => 0,
  3 => 0,
  4 => 0,
);

/* Display: Block */
$handler = $view->new_display('block', 'Block', 'block_1');
$handler->display->display_options['block_description'] = 'test nc block';

ध्यान दें कि ये हैंडलर लोकेशन मॉड्यूल द्वारा प्रदान किए गए हैं। विशेष रूप से "स्थान: प्रांत" फ़िल्टर के लिए मुझे एक ऑटो पूर्ण रूप दिया जाता है। जब मैं उत्तरी कैरोलिना में टाइप करता हूं, तो यह पॉप अप हो जाता है, और मुझे यह चुनना पड़ता है। हालाँकि, SQL कथन में जो दृश्य उत्पन्न करता है वह राज्य के लिए दो वर्ण संक्षिप्त नाम का उपयोग करता है:

SELECT node.title AS node_title, node.nid AS nid, node.created AS node_created
FROM 
{node} node
LEFT JOIN {location_instance} location_instance ON node.vid = location_instance.vid
LEFT JOIN {location} location ON location_instance.lid = location.lid
WHERE (( (node.status = '1') AND (location.province = 'NC') ))
ORDER BY node_created DESC
LIMIT 10 OFFSET 0

जवाबों:


8

संशोधित करने के लिए ऑब्जेक्ट ऑब्जेक्ट के सटीक भाग का पता लगाना कठिन हो सकता है। मैं आमतौर पर पहले दृश्य निर्यात करता हूं और मुझे शुरू करने के लिए उत्पन्न कोड को देखता हूं।

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

//Alter the End date filter on the offer views
function offer_select_views_pre_view(&$view) {
  if ($view->name == 'active_offers') {
    $view->display['default']->handler->options['filters']['field_end_value']['value']['value'] = time();
  }
}

--UPDATE--
आपके विशिष्ट दृश्य के लिए मैंने स्थान मॉड्यूल स्थापित किया और नेकां और जॉर्जिया में कुछ नोड बनाए और परीक्षण के लिए आपके विचार को आयात किया। मेरे कस्टम मॉड्यूल (नामित dev) में मैंने इस कोड के साथ शुरुआत की (डेवेल स्थापित के साथ):

function dev_views_pre_view(&$view) {
  if ($view->name == 'north_carolina') {
    dpm($view->display['default']->handler->options['filters']);
  }
}

जब तक मैं यहाँ नहीं आया, तब तक मैंने क्रामो में प्रदर्शित स्पष्ट मूल्यों को जोड़ना जारी रखा:

function dev_views_pre_view(&$view) {
  if ($view->name == 'north_carolina') {
    dpm($view->display['default']->handler->options['filters']['province']['value']);
  }
}

जो केवल North Carolinaक्रुमो में छपी थी। उस समय मैं इस तरह इसे स्थापित करने के मूल्य को प्रिंट करने से बदल गया:

function dev_views_pre_view(&$view) {
  if ($view->name == 'north_carolina') {
    $view->display['default']->handler->options['filters']['province']['value'] = 'Georgia';
  }
}

और वोइला। यही चाल चली।


ठंडा। जब मेरे पास मौका होता है, तो मैं आपके विचार से खेलता हूं और देखता हूं कि क्या मैं अधिक ठोस जवाब दे सकता हूं।
एडम बालसम

@ नीला 928 ऊपर देखें। मैंने आपके सवालों के जवाब के साथ अपने जवाब को अपडेट किया है और मुझे वहां कैसे मिला, इस बारे में सामान्य निर्देश।
एडम बालसम

यह बहुत अच्छा काम किया। सही उत्तर के बारे में ध्यान दें: मेरी समस्या का हिस्सा यह है कि मुझे view_get_view को कॉल करने या डिस्प्ले सेट करने की आवश्यकता नहीं थी।
ब्लू

2

यदि D8 पर समान समाधान खोजते समय किसी ने यह धागा पॉप अप किया है (जैसा मैंने किया):

न्यू एपीआई इन मापदंडों को बहुत अधिक स्पष्ट तरीके से हेरफेर करने की अनुमति देता है। संदर्भ के लिए यह अनुभाग देखें ।

छोटा उदाहरण

function dev_views_pre_view(ViewExecutable &$view, $display_id, array &$args) {
  if ($display_id === 'my_unique_display_name') {
      $args[0] = 'desired_value';
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.