2009-01-13 8 views
7

मैं तरीके चतुर में प्रत्यावर्तन को संभालने के लिए की एक जोड़ी, ज्यादातर जो संसाधनों की हास्यास्पद बेकार की तरह लगता है खुद में टेम्पलेट्स, सहित के आधार पर पाया। मैसीजू द्वारा मैसीजू द्वारा एक समाधान मिला, जो कि सही था - लेकिन यह समर्थित नहीं है और smarty के नवीनतम संस्करण में विफल रहता है :(smarty में रिकर्सन को संभालने का सबसे अच्छा तरीका क्या है?

लोगों से पूछने के लिए: मैं क्या प्रिंट करना चाहता हूं एक चर्चा है थ्रेड कि प्रविष्टियों की एक सरणी द्वारा परिभाषित किया गया है। एक प्रविष्टि एक या अधिक जवाब है, तो उन के रूप में बच्चों एक सरणी में प्रवेश कहा करने के लिए सूचीबद्ध किया गया है, और इतने पर।

array(
    array(
     'id'=>0, 
     'headline'=>"My parent headline", 
     'body' =>"My parent body", 
     'children'=>array(
      array(
       'id'=>1, 
       'headline'=>"My firstChild headline", 
       'body' =>"My firstChild body", 
       'children'=>array() 
      ), 
      array(
       'id'=>2, 
       'headline'=>"My secondChild headline", 
       'body' =>"My secondChild body", 
       'children'=>array() 
      ) 
     ) 
    ), 
); 

नेस्टेड सरणी एक मनमाना गहराई है, और प्रत्येक प्रविष्टि के बच्चों की एक मनमाना संख्या होगा। मेरे लिए यह कुछ मैं टेम्पलेट के दायरे के भीतर साथ क्या करना चाहते है, मैं विचार के रूप में यह शुद्ध प्रदर्शन तर्क। मैं नहीं चाहता कि HTML या HTML के कुछ प्रकार संभाल करने के लिए करना चाहते हैं के बाहर प्लेसहोल्डर्स टेम्पलेट।

मैं इस रूप में नेस्टेड सूचियों मुद्रित करने के लिए चतुर हैं:

<ul> 
    <li> 
     <h1>My parent headline</h1> 
     <p>My parent body</p> 
     <ul> 
      <li> 
       <h1>My firstChild headline</h1> 
       <p>My firstChild body</p> 
      </li> 
      <li> 
       <h1>My secondChild headline</h1> 
       <p>My secondChild body</p> 
      </li> 
     </ul> 
    </li> 
</ul> 

मैं महसूस करने के लिए यह एक बहुत ही मामला-दर-मामला समस्या हो सकती है शुरू कर, तो मैं समझ मैं सिर्फ एक चतुर प्लगइन लिखेंगे इसे विशेष रूप से संभालने के लिए, हालांकि मैं एक आसपास के समाधान के बजाय होगा।

क्या कोई तरीका है?

उत्तर

6

शामिल करके बाकी उपयोग प्रत्यावर्तन के लिए "आदेश प्रत्यावर्तन समझने के लिए, आप पहली बार प्रत्यावर्तन को समझना चाहिए ..."

बस मजाक कर। यह वही करना चाहिए जो आप चाहते हैं:

<?php 
/* 
* Smarty plugin 
* ————————————————————- 
* File:  function.recurse_array.php 
* Type:  function 
* Name:  recurse_array 
* Purpose: prints out elements of an array recursively 
* ————————————————————- 
*/ 

function smarty_function_recurse_array($params, &$smarty) 
{ 

if (is_array($params['array']) && count($params['array']) > 0) { 
    $markup = ''; 

    $markup .= '<ul>'; 

    foreach ($params['array'] as $element) { 
     $markup .= '<li>'; 

     $markup .= '<h1>' . $element['headline'] . '</h1>'; 
     $markup .= '<p>' . $element['body'] . '</p>'; 

     if (isset($element['children'])) { 
     $markup .= smarty_function_recurse_array(array('array' => $element['children']), $smarty); 
     } 

     $markup .= '</li>'; 
    } 

    $markup.= '</ul>'; 

    return $markup; 

} else { 
    return 'not array'; 
} 
} 

फ़ाइल को अपने smarty/plugins फ़ोल्डर में रखें। चतुर करने के लिए अपने सरणी निरुपित तो जैसे अपने खाके में इसे कहते:

{recurse_array array=$data} 

यहां कस्टम चतुर कार्यों बनाने के लिए अच्छा ट्यूटोरियल है:

Creating Custom Smarty Functions

निर्भरता कि इस उदाहरण पर है के प्रति सचेत रहें अपने अंतर्निहित डेटा संरचना। साथ ही, ध्यान रखें कि डेटा का असामान्य रूप से लंबा या गहराई से घोंसला वाला सेट वास्तव में धीमा हो सकता है। अपनी जटिलता को प्रबंधित करें, चीजों को अच्छी तरह से दस्तावेज रखें, और आपको ठीक होना चाहिए। सौभाग्य!

-3

सबसे अच्छा तरीका यह करने के लिए नहीं है।

चतुर सरल माना जाता है। यह आवाज नहीं है।

+3

इस तरह से सोचें, ऐप को सामान की मनमाने ढंग से घोंसला वाली सूची प्रदर्शित करने की आवश्यकता है। वहाँ जटिलता है। आपको जटिलता का प्रबंधन करने की आवश्यकता है। टेम्पलेट में अनिवार्य रूप से तर्क प्रदर्शित करना (सरणी के माध्यम से लूप और मार्कअप थूकना) डालना समझ में आता है। बस रिकर्सन होने से यह बुरा नहीं बनता है। – GloryFish

+0

काफी उचित है, लेकिन एक ऑफ-फ़ंक्शन के साथ रिकर्सन करने की तुलना में, एक स्मार्ट समाधान को गठबंधन किया जाएगा। –

0

आप smarty के लिए कस्टम फ़ंक्शन/संशोधक/प्लगइन बनाने पर विचार करना चाहेंगे। को परिभाषित टेम्पलेट समारोह का उपयोग करना चाहिए है क्या के साथ कस्टम कार्य करने के लिए सरणी दर्रा। यदि यह इतना आसान है, केवल कुछ जगह पर एक टेक्स्ट डालने के लिए, फ़ंक्शन के भीतर टेम्पलेट लोड करें और PHP में regexes/str_replace/का उपयोग कर टेम्पलेट के साथ काम करें ...

या स्मार्टफ़ टेम्पलेट का उपयोग किये बिना सीधे इसे PHP में करें, क्योंकि आपको केवल एच 1, उल, ली और पी टैग की आवश्यकता है और लेआउट उपयोग सीएसएस को बदलने के लिए।

या यदि आपकी चिंता स्मार्टी में खोलने और बंद करने वाली फाइलों के साथ ओवरहेड है, तो अनुमान लगाएं कि 90% मामलों में स्तरों की मात्रा क्या है और टेम्पलेट बनाएं जो 90% को कवर करेगा। स्वयं टेम्पलेट को ...

14

Smarty 3 के साथ, यह {function} का उपयोग करके किया जा सकता है। निम्नलिखित कोड आवश्यक आउटपुट का उत्पादन करेगा।

{function name=printList} 
<ul> 
    {foreach $items as $item} 
    <li> 
     <h1>{$item['headline']}</h1> 
     <p>{$item['body']}</p> 
     {if $item['children']} 
      {call name=printList items=$item['children']} 
     {/if} 
    </li> 
    {/foreach} 
</ul> 
{/function} 

{call name=printList items=$comments} 

अधिक जानकारी docs पर मिल सकती है।

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

+0

शानदार! मुझे पता है कि यह एक पुराना सवाल है लेकिन यह दृष्टिकोण शानदार है। +1 –