2009-08-18 8 views
0

J'ai commencé à écrire mon propre cadre à petite échelle et j'en suis arrivé à la partie de gabarit. Jusqu'à présent, je suis en mesure de faire variable simple remplacement par le code suivant:en utilisant une boucle dans un gabarit

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); 
} 

Ce qui fonctionne très bien, mais ce que je cherche est maintenant si je voulais faire une boucle pour montrer nombre inconnu d'enregistrements d'une base de données et J'ai essayé un coupleur d'idées mais aucun ne semble avoir fonctionné jusqu'ici

+0

Il y a beaucoup de langages open source PHP, pourquoi ne pas jeter un oeil à l'un de ces? – Zed

Répondre

1

Tout d'abord, vous devriez repenser la réécriture de vos variables. Il existe plusieurs cas où votre méthode ne se termine pas comme prévu, lorsque vous avez des dépendances entre eux. De plus, tout est remplacé même si une variable est dans une boucle ou non. Si vous voulez quelque chose comme {while (condition)} code {/ while}, vous devez être conscient que la récursivité est également possible et donc ce n'est pas aussi simple que de faire correspondre une regex dessus.

Une approche simple serait la suivante:

  • Trouver le début d'un jeton (variable, boucle while) et rappelez-vous la position où vous trouvez
  • Si elle est une variable et vous êtes dans le la plus grande partie externe (pas dans une boucle), traitez-la en faisant un remplacement. Ajustez votre pointeur de sorte que vous ne lisiez pas le remplacement par la suite pour éviter de remplacer les choses que vous ne voulez pas.
  • Si elle est une boucle
    • Extrait de l'état entre les crochets et le stocker somewher
    • additionaly, stocker la position actuelle
    • poussoir du jeton sur une pile pour retenir le niveau de récurrence en cours.
    • Supprimez un jeton de la pile lorsque vous rencontrez le jeton {/ while}.
    • Procédez maintenant de manière récursive en poussant tous les jetons de boucle imbriqués sur la pile et en les supprimant lorsqu'ils se terminent. Arrêtez de nouveau lorsque vous êtes au niveau le plus éloigné.
    • Évaluez l'état de la boucle. Tant que cela est vrai, créez de nouvelles copies à partir du texte source entre le jeton de début et le jeton de fin et traitez-les en utilisant la récursivité.
    • Concaténer les résultats intermédiaires et remplacer tout de {while} à {/ while} avec cette concaténation. Ajustez votre pointeur de sorte que vous pointez après la boucle et continuer :)

Espérons que cela aide. Je sais que cela semble un peu douloureux, mais si vous comprenez le concept, vous devriez être capable de le faire (bien que ce ne soit pas super efficace et compiler des moteurs de template comme smarty sera toujours en avance car ils analysent le fichier template une seule fois et compilez-le en code PHP). @Daff: vous pouvez trouver les jetons avec des expressions régulières, mais utiliser une regex pour correspondre à une construction de boucle entière ne fonctionne pas en raison des récursions (sauf si votre regex a une extension récursive).

+0

réponse tardive je sais mais je pensais que je vous ferais savoir que cela a beaucoup aidé, merci! –

1

Comme Zed déjà dit il y a beaucoup de langages de gabarit pour PHP, le plus populaire étant Smarty et je ne sais pas si cela aurait vraiment du sens de réinventer la roue sauf à des fins d'apprentissage. Les boucles que vous voulez faire sont en réalité bien plus complexes que le simple remplacement d'éléments. Je suis sûr que vous pouvez le faire avec beaucoup d'expressions régulières, mais à un moment donné vous finirez par écrire votre propre langage de script (comme les gars de Smarty) en analysant votre fichier de vue, en créant un arbre de syntaxe, en l'évaluant et compilez-le dans un nouveau fichier PHP. C'est assez complexe, donc je recommande soit d'utiliser un moteur de template existant, soit d'utiliser PHP comme langage de template lui-même (en suivant strictement le modèle MVC qui pourrait fonctionner même s'il y a beaucoup de discussions à ce sujet). Avec une expression régulière, vous pouvez tout analyser entre {for ...} {/ for} pour accéder à un élément avec un nom de variable donné, où après {for et} une définition de vos occurrences de variable et après} et avant {/ for} votre définition html Ce serait quelque chose comme une boucle foreach que vous ne pouvez même pas imbriquer les uns dans les autres.

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

Je le fais principalement pour apprendre, sûrement il doit y avoir un moyen de le faire qui n'implique pas d'aller à un extreame comme ça? –

+0

J'ai ajouté un petit exemple à quoi cela pourrait ressembler. Mais si vous voulez vraiment l'apprendre, vous voudrez peut-être aller à un extrême ... le plus simple d'utiliser PHP comme langage de gabarit ou l'extrême avec la création de votre propre moteur de gabarit. – Daff

+0

merci pour l'exemple, cela semble l'itinéraire que je regardais en descendant –

Questions connexes