Smarty özyineleme işlemek için en iyi yolu nedir?

5 Cevap php

Ben kaynaklarının saçma atık gibi görünüyor kendilerini çoğunlukla içine şablonları da dahil olmak üzere dayalı Smarty özyineleme işlemek için yollar bir çift, bulundu. Ben sadece doğru gibi görünüyordu Smarty de Messju üzerinde tarafından, bir çözüm buldum - ama desteklenen ve smarty son sürümünde başarısız değil: (

Soran insanlar için: ben smarty yazdırmak istediğim girişlerinin dizisi tarafından tanımlanan bir tartışma iplik. Bir giriş, bir veya daha fazla cevap varsa, o böylece çocuklar bir dizi giriş sözü olarak listelenir ve.

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()
    		)
    	)
    ),
);

İç içe Dizi keyfi bir derinliğe sahiptir ve her giriş çocukların keyfi bir numarası olacak. Bana göre bu saf ekran mantığı düşünürken ben, şablon çerçevesinde yapmak istediğiniz şeydir. Ben şablonun dışında HTML veya HTML tutucuların çeşit işlemek zorunda istemiyorum.

Ben smarty bu kadar iç içe geçmiş listeleri yazdırmak istiyorsanız:

<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>

Ben bu çok vaka-by-case sorun olabileceğini fark etmeye başlıyorum, ben doğrusu bir all-around bir çözüm olurdu, ancak ben sadece, özellikle bu işlemek için bir smarty eklenti yazacağım rakam.

Bir yolu var mı?

5 Cevap

"Özyineleme anlamak için, öncelikle özyineleme anlamak gerekir ..."

Şaka yapıyorum. Bu ne istediğinizi yapmanız gerekir:

<?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';
}
}

Lütfen smarty / plugins klasörünün içine dosyayı yerleştirin. Smarty için dizi atayın o zaman gibi şablonunda çağırır:

{recurse_array array=$data}

İşte özel Smarty işlevleri yapmak için güzel bir öğretici bulunuyor:

Creating Custom Smarty Functions

Bu örnek size temel veri yapısı üzerindeki bağımlılık farkında olun. Ayrıca, bir veri alışılmadık uzun veya içe geçmiş set gerçekten yavaş olabileceğini unutmayın. Senin karmaşıklığı yönetmek iyi belgelenmiş şeyler tutmak ve ince olmalıdır. İyi şanslar!

Smarty 3 ile bu {} fonksiyonu kullanılarak yapılabilir. Aşağıdaki kod gerekli çıktıya üretecek.

{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}

Daha fazla bilgi docs bulunabilir.

Yan not: bir şey karmaşık veya özyinelemeli çünkü sadece onu bir şablon içinde olamaz anlamına gelmez. Tanrı aşkına HTML ül-li yapısı, doğal özyinelemeli olduğunu ve onu uzak gizleme veya (bir şablon için çok karmaşık olduğu için) başka bir yere hareket ederek uygulamaya ekstra karmaşıklığı sunuyoruz.

You might need to elaborate on what you are doing exactly, code samples, requirements, because as it stands, the very IDEA that you have complicated code in smarty enough to enter recursion frankly scares me.

AKA: I NOT bilgilere sağlanan dayalı proje üzerinde çalışıyor oy.

En iyi şekilde yapmak değil.

Smarty basit olması gerekiyordu. Bu o ses deesn't.

You might want to consider creating custom function/modifier/plugin for smarty. Pass the array to the custom function along with defining what is the template the function should use. If it is that simple, only to insert a text to certain place, load the template within function and in PHP work with the template using regexes/str_replace/...

Yoksa ihtiyacınız olan tüm h1, ul, li ve p etiketleri, çünkü smarty şablonları kullanarak olmadan PHP bunu doğrudan yapmak ve düzeni kullanım CSS değiştirmek için.

Sizin endişe Smarty açılış ve kapanış dosyaları ile havai ise Veya, vakaların% 90 seviyelerinin miktarı ne tahmin ve bu% 90 kapsayacak şablon oluşturmak. Şablonun kendisi dahil ederek kalan kullanım için özyineleme ...