2011-11-11 19 views
6

में है, मैं smarty के साथ php का उपयोग कर रहा हूँ। php में मैं दो सरणियों है: - और होगा -Smarty: जांच करें कि चर सरणी

$code = Array 
(
    [n_id] => 1 
    [t_code] => ABC123 
    [t_description] => Test code 
    [b_enabled] => Yes 
    [n_type] => 3 
    [dt_start] => 
    [dt_end] => 
    [n_min_req_gbp] => 0 
    [n_min_req_usd] => 0 
    [n_amount_gbp] => 
    [n_amount_usd] => 
    [n_max_overall_gbp] => 
    [n_max_overall_usd] => 
    [n_extra] => 6 
    [b_reuse] => No 
    [n_applications] => Array 
     (
      [0] => 2 
     ) 
) 

और

$all_application = Array 
(
    [1] => New registration 
    [2] => Mid-subscription upgrade 
    [3] => Subscription renewal 
    [4] => Additional purchase 
) 

ध्यान दें कि दूसरी सरणी हो सकता है बड़े होते हैं, इस संदर्भ डेटा, पहली सरणी में n_applications सरणी क्षेत्र है जहाँ से है बनाया। यही है, n_applications में सरणी $all_applications सरणी से कुंजी का सबसेट होगा।

अब, मैं टेम्पलेट में इन दो सरणियों बताए हूँ:

$template->assign('code', $code); 
$template->assign('apps', $all_applications); 

और टेम्पलेट में, मैं $code सरणी में फ़ील्ड का संपादन के लिए एक रूप बना रहा हूं। 'एप्लिकेशन' चयन को छोड़कर सब कुछ ठीक काम कर रहा है। मैं उन ऐप्स को पूर्व-चयन करना चाहता हूं जो पहले से ही n_applications फ़ील्ड में हैं। तो, मेरे टेम्पलेट में मेरे पास यह है:

<select name="c_apps[]" size="3" class="multiselect" multiple="multiple"> 
    {foreach from=$apps key=k item=a} 
     {assign var=v value=$k|@array_search:$code['n_applications']} 
     <option value="{$k}"{if $v!==FALSE} selected="selected"{/if}>{$a|escape}</option> 
    {/foreach} 
</select> 

हालांकि यह अपेक्षा के अनुसार काम नहीं करता है - और सभी विकल्पों का चयन किया जा रहा है। मैंने in_array फ़ंक्शन का उपयोग करने का प्रयास किया - लेकिन उसी परिणाम के साथ। मेरे बाद क्या हासिल करने का सबसे अच्छा तरीका क्या है?

उत्तर

6

सभी संभव दिशाओं में संघर्ष का एक सा के बाद, मैं अंत में यह इस (चतुर केवल कोड) की तरह से खींचने के लिए

<select name="c_apps[]" size="3" class="multiselect" multiple="multiple"> 
    {foreach from=$apps key=k item=a} 
     {if @in_array($k, $code.n_applications)} 
      {assign var=v value=true} 
     {else} 
      {assign var=v value=false} 
     {/if} 
     <option value="{$k}"{if $v} selected="selected"{/if}>{$a|escape}</option> 
    {/foreach} 
</select> 

कामयाब रहे और यह चाल किया था।

0

मैंने कुछ साल पहले ऐसा कुछ किया है, और उसी तार्किक चुनौती पर ठोकर खाई है।

मेरे समाधान आधार सरणी ($all_applications आपके मामले में,) को संशोधित करने के एक अन्य प्रमुख वहाँ (शायद ['opt_selected']) को जोड़ते समय था। मैंने डिफ़ॉल्ट मान खाली छोड़ दिया, और जिस डेटा को मैं चुनना चाहता था, उसके लिए मैंने मूल्य बदल दिया है, अनुमान लगाया है, ... selected="selected"

यह बजाय अपने चतुर टेम्पलेट के लिए आसान बनाता है:

<option value="{$k}" {$a.opt_selected|default:''}>{$a|escape}</option> 

यह सबसे अच्छा समाधान नहीं हो सकता है, लेकिन यह टेम्पलेट से बाहर कोड के बहुत छोड़ने जहां मैं आमतौर पर बहुत ज्यादा कार्यक्रम नहीं करना चाहते में मदद करता है तर्क।

अद्यतन

अपने php कोड में HTML हिस्सा होने का मुकाबला करने के लिए, आप के रूप में अच्छी बस सरणी को चिह्नित करता हो सकता है:

$all_applications['opt_selected'] = 1 

... और फिर इस तरह चतुर व्यवस्था:

<option value="{$k}" {if $a.opt_selected eq '1'}selected="selected"{/if}> 
    {$a|escape} 
</option> 
+0

मुझे लगता है कि यह टेम्पलेट को थोड़ा क्लीनर बनाता है, लेकिन PHP कोड थोड़ा और गंदा है - और यह एचटीएमएल-विशिष्टताओं को PHP में रखता है, जो कि सबसे अच्छा समाधान भी नहीं है।, लेकिन अगर यह काम करता है ... –

+0

I पूरी तरह से आपसे सहमत हैं।इसे साफ़ करने के लिए, आप बस ध्वज सेट कर सकते हैं और अपने स्मार्ट टेम्पलेट में ध्वज की जांच कर सकते हैं, मैं अपने मुख्य पोस्ट में प्रदर्शित करूंगा। – Bjoern

+0

मुझे विचार मिलता है। एक बात जो मुझे इस दृष्टिकोण के बारे में चिंतित करती है वह है कि मैं अपने क्लाइंट को अगले से पूछने की उम्मीद करता हूं, अर्थात्, इन कोडों में से प्रत्येक के इन-प्लेस संपादन के साथ एक तालिका में प्रदर्शित किया गया है। इस मामले में, एक ही पृष्ठ पर कई कोड होंगे, जिनमें से प्रत्येक के अपने अनुप्रयोगों की सरणी होगी - और 'all_applications' की एक सरणी होगी। तो यह वास्तव में गन्दा हो जाएगा ... फिर भी, वैसे भी धन्यवाद। –

2

आप इस तरह यह कर सकते हैं:

<select name="c_apps[]" size="3" class="multiselect" multiple="multiple"> 
    {foreach from=$apps key=k item=a} 
     <option value="{$k}"{if in_array($k, $code.n_applications)} selected="selected"{/if}>{$a|escape}</option> 
    {/foreach} 
</select> 
+0

यह पहली चीज थी जिसकी मैंने कोशिश की थी, लेकिन परिणाम वास्तव में बिज्जर था, क्योंकि

+0

अच्छा यह काम करना चाहिए। आपका रिजल्ट क्या था? और आप Smarty का किस संस्करण का उपयोग करते हैं? –

संबंधित मुद्दे