Bir şablonda bir döngü kullanarak

3 Cevap php

Benim kendi küçük ölçekli bir çerçeve yazmaya başladı ve ben bunun çiftleşmiş kısmına aldık. Şimdiye kadar ben aşağıdaki kod ile yerine basit bir değişken yapmak mümkün olmuştur:

public function view($page, $vars)
{
    if(!file_exists('system/views/' . $page . '.php'))
    {
        trigger_error("No Template found", E_USER_ERROR);
    }

    $tempArray = file_get_contents('system/views/' . $page . '.php');

    foreach($vars as $key => $value)
    {
        $tempArray = str_replace('{' . $key . '}', $value, $tempArray);
    }

    print $tempArray;
    unset($tempArray);
}

Çalışıyor, ama ne ben şimdi arıyorum ben bir veritabanındaki kayıtları bilinmiyor sayısını göstermek için döngü istedim ve ben fikirlerin bir bağlayıcı denedim ama hiçbiri şimdiye kadar çalışmış gibi görünüyor eğer Hangi

3 Cevap

Her şeyden önce, sizin değişken yeniden yazılmasında yeniden düşünmek gerekir. Eğer bunların arasında bazı bağımlılıkları olduğunda beklendiği gibi yöntem bitmiyor çeşitli durumlarda, var. Ek olarak, her ne olursa olsun, bir döngü ya da bir değişkenin yerini alır.

Eğer gibi bir şey istiyorsanız kodu {/ while}, sen özyineleme da mümkün olduğunu farkında olmak gerekir ve bu nedenle bunun üzerinde bir regex eşleştirme gibi basit değil {(koşul) ise}.

Basit bir yaklaşım şu olacaktır:

  • Bir belirteç (değişken, whileloop) başlangıcını bulmak ve onu bulmak konumunu hatırlamak
  • Bir yedek yaparak bu bir değişken olduğunu ve en çok dış kapsamında ise (bir döngüde), işliyoruz. Eğer istemediğiniz şeyleri değiştirmekten kaçınmak için sonradan değiştirme okumaz böylece işaretçi ayarlayın.
  • If it is a loop
    • parantez arasındaki durumunu ayıklamak ve saklamak somewher
    • Ek olarak, mevcut konumunu saklamak
    • Geçerli yineleme seviyesini hatırlamak için bir yığına belirteci itin.
    • Eğer {/ while} belirteci karşılaştığınızda yığından bir belirteç çıkarın.
    • Şimdi yığını tüm iç içe döngü belirteçleri iterek ve biterler gibi bunları kaldırarak, ardışık devam edin. Tekrar dıştaki düzeyde durun.
    • Döngü durumunu değerlendirmek. Sürece bu doğrudur gibi, başlangıç ​​belirteç arasındaki kaynak metin ve simge sonundan itibaren yeni kopyalarını oluşturmak ve özyineleme kullanarak bunları işlemek.
    • Ara sonuçları birleştirmek ve bu birleştirme ile {} iken gelen {/} ise her şeyi değiştirin. Eğer döngü sonra işaret ediyoruz böylece işaretçi ayarlayın ve devam edin :)

Bu yardımcı olur umarım. Ben biraz acı geliyor biliyorum, ama kavramını anlamak, bunu yapmak gerekir (süper-verimli olmasa ve sadece bir kez şablon dosyasını ayrıştırmak beri smarty gibi template motorları derleme her zaman önceden olacak ve) PHP kodu derlemek.

@ Daff: Düzenli ifadeler ile belirteçleri bulabiliriz, ama (senin regex bir özyinelemeli uzantısı olmadığı sürece) bir bütün döngü yapısı üzerinde maç için regex kullanarak nedeniyle recursions için çalışmaz.

Zed zaten orada PHP, Smarty olmanın en popüler biri için çiftleşmiş dillerin çok ve gerçekten öğrenme amaçları dışında tekerleği yeniden icat etmek mantıklı olur eğer ben bilmiyorum dediğim gibi. Yapmak istediğiniz döngüler aslında yolu daha karmaşık sadece elemanlarının yerine daha vardır. Ben nasılsa normal ifadeler sürü yapabilirsiniz eminim, ama bir noktada bunu değerlendirmek, bir sözdizimi ağacı oluşturma, View dosyasını ayrıştırma (Smarty adamlar yaptığı gibi) kendi betik dili yazı ile sona erecek ve yeni bir PHP dosyası derlemek. Bu yüzden varolan çiftleşmiş motoru kullanmak ya da (kesinlikle bu konuda tartışmalar çok olsa bile işe yarayabilecek MVC desen folowing varsa) çiftleşmiş dilin kendisi olarak PHP kullanmak ya da tavsiye oldukça karmaşıktır.

Bir düzenli ifade ile belirli bir değişken adı, nereye sonra {ve} değişken occurrs bir tanım ve sonrasında} ve daha önce {/ for} ile bir öğeye erişmek için {/ for} {} ... için arasındaki her şeyi ayrıştırmak html tanımı. Bu bir foreach döngü gibi bir şey olurdu hangi birbirlerine bile yuva olamaz.

{for item=$varname}
    <p>{item.othervalue}</p>
{/for}

senin bu öğrenmeye istekli (i gibi oldu) ise, http://net.tutsplus.com/tutorials/php/roll-your-own-templating-system-in-php-new-premium-tutorial/ gidebiliriz - bu konuda bir öğretici olduğunu, ama sen sanki okumak için artı-üye olmanız gerekiyor :)