एक दृश्य के परिणामों के माध्यम से पुनरावृति करने के लिए, प्रोग्रामेटिक रूप से सबसे अच्छा तरीका क्या है?


12

एक दृश्य को देखते हुए, 'चिल्ड्रन' (दो क्षेत्रों के साथ: child_node_id और a birth_order_value) नाम दिया गया, विचारों के परिणामों को पुनरावृत्त करने के लिए सबसे अच्छा तरीका क्या है, 'डिफ़ॉल्ट' का प्रदर्शन_आईडी और एक तर्क जिसमें पेरेंट नोड आईडी हो?

पहले, मैंने निम्नलिखित के समान कोड का उपयोग करके एक ब्लॉक में व्यू का उपयोग किया है:

if ( arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2)) {
   $node = node_load(arg(1));
   $args = array($node->nid);
   $view = views_get_view('Children');
   print $view->preview('default', $args);
}

हालाँकि, एक अन्य ब्लॉक में मैं देखने में मिले मूल्यों के आधार पर कुछ तर्क करना चाहता हूं। आप अनुमान लगा सकते हैं कि मेरी अंतिम आवश्यकता के आधार पर व्यावसायिक तर्क: मैं चाहता हूं कि कोड का ब्लॉक समर्थन करने वाले दृश्य ('बच्चे') को कई बार कहा जाए। जैसा कि मैं डेटासेट परिणामों के माध्यम से पुनरावृति करता हूं, मैं अपने बच्चों के लिए क्वेरी करने वाले बच्चों के माध्यम से पुनरावृत्ति करना चाहता हूं।


आपका दृष्टिकोण ठीक लग रहा है। यदि आप इसे एक उत्तर में रखते हैं तो लोग इस पर वोट कर सकते हैं और अनुमोदन कर सकते हैं। एक बार आप जो कोशिश कर सकते हैं वह हर बार दृश्य को परेशान करने के बजाय है। निष्पादन से पहले एक $ दृश्य-> क्लोन_व्यू () करें। देखें लोडिंग काफी भारी है और इससे मेमोरी और प्रदर्शन में मदद मिल सकती है।
जेरेमी फ्रेंच

क्षमा करें यदि मैं यहाँ से बाहर हूँ, लेकिन इस तरह की चीज़ है जो आप रिश्तों का उपयोग करके और माता-पिता की तालिका में किसी फ़ील्ड पर समूहीकृत कर सकते हैं। मुझे यकीन नहीं है कि आपको अभी तक कोड का सहारा लेना होगा। पेरेंट टेम्पलेट ओवरराइड से सबव्यू और लॉजिक को कॉल करना भी सरल हो सकता है।
जेसन स्मिथ

आपको foreach इसके बजाय (.. sizeof ()) पर विचार करना चाहिए , यह बहुत बेहतर प्रदर्शन करता है (क्योंकि यह PHP के बजाय C है)।
बर्क

एक बात ध्यान दें, करने के बजाय if (arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2)), इसका उपयोग करना बेहतर हो सकता है if ($node = menu_get_object())
क्रिस प्लियाकास

मैंने प्रश्न से उत्तर की छंटनी की है और इसे उत्तर के रूप में पोस्ट किया है। इस तरह यह साइट के उपयोगकर्ताओं के लिए स्पष्ट है कि इस प्रश्न का उत्तर है।
जेरेमी फ्रेंच

जवाबों:


2

एक दृश्य के साथ खेलते हुए मुझे लगता है कि मैंने एक दृष्टिकोण पर काम किया है। हालाँकि, मैं अपने प्रश्न को अन्य उत्तरों और बेहतर समाधानों के लिए खुला छोड़ना चाहूंगा।

<?php
if ( arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2) ) {
   $node = node_load(arg(1));
   $args = array($node->nid );
   unset($view);
   $view = views_get_view('Children');
   $view->set_display('default');  
   $view->set_arguments($args);
   $view->set_items_per_page(20);
   $view->execute();
   $newarg = array();
   for ($i=0; $i<sizeof($view->result); $i++) {
      $newarg[$i] = $view->render_field('nid_1', $i);
   }
   for ($i=0; $i<sizeof($newarg); $i++) {
      unset($view);
      $view = views_get_view('Children');
      $view->set_display('default');  
      $view->set_arguments($newarg[$i]);
      $view->set_items_per_page(20);
      $view->execute();
      ....
   }
}
?>

जब मैं परिणाम सेट के साथ किया गया था, तो कई बार दृश्य को निष्पादित करने की कुंजी मेरे लिए परेशान ($ दृश्य) थी।


1

मैंने निम्न फ़ंक्शन से अच्छा लाभ प्राप्त किया है। रिटर्न वैल्यू सभी व्यू रिकॉर्ड का एक सरणी है। Dsm ($ return_value) को कॉल करने से आपको अपने विशेष दृश्य की संरचना का एक अच्छा विचार मिलेगा।

function _get_view_data($view_name, $args, $page = NULL, $page_size = 0 ) {
    $view = views_get_view($view_name);
    $view->pager['items_per_page'] = $page_size;
    $view->set_arguments($args);
    if ($page) {
        $view->build($page);
        $view->execute($page);
    }
    else {
        $view->execute();
    }
    return $view->result;
}

1

यहाँ एक सहायक फ़ंक्शन है जो पहले से ही Drupal API में बनाया गया है। (मैंने थोड़ी देर ड्रुपल डॉक्स में इधर-उधर घूमने में बिताया, और आखिरकार यह मिल गया। ऐसा लगता है कि कई अन्य लोगों ने भी समाधान का उत्पादन किया है जो इस सहायक का उपयोग नहीं करते हैं, और यह भी कि यह सहायक एक दिलचस्प कदम है कि अन्य समाधान नहीं करते हैं .. निष्पादित करने से पहले $ दृश्य वस्तु पर pre_render को कॉल करने के लिए)।

मैं इस बात के लिए प्रतिज्ञा नहीं कर सकता कि यह अच्छा काम करता है या नहीं, लेकिन कम से कम इन दृष्टिकोणों के साथ मुद्दों को कॉल करने के लिए यह एक विशिष्ट स्थान है।

D6 के लिए http://api.drupal.org/api/views/views.module/function/views_get_view_result/6

और डी 7 के लिए http://api.drupal.org/api/views/views.module/function/views_get_view_result/7

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