2009-09-14 13 views
9

Mam zamiar napisać CMS, ale teraz zapisuję wszystkie moje pomysły i staram się uzyskać wszystkie moje koncepcje bezpośrednio przed rozpoczęciem. Jedną z rzeczy, które mam na sobie, jest to, czy używać języka szablonów i parsować strony witryny, i zastępować tagi szablonów przedmiotami zawartości, czy po prostu rozwijać stronę za pomocą prostego PHP i czy CMS generuje struktury danych, które pomagają. Na przykład:Język szablonowy a prosty PHP

{navigation: products} 

vs.

foreach($cms_label['products'] as $product) { 

    echo '<li class="product_nav">'. 
     '<a href="products/{$product.id}">{$product.name}</a>'. 
     "</li>\n"; 

} 

Pierwszy jest czystsze, ale wiązałoby się to wynalezienie języka, a także analizowania każdej strony przed wyświetlaczem. Ta ostatnia jest mniej czysta, ale myślę, że mogłaby działać naprawdę świetnie, gdyby CMS właśnie dostarczył dane dla całego kodu. Ale czy byłoby to uważane za logikę miksowania z prezentacją? Inną rozważaną przeze mnie alternatywą jest użycie funkcji PHP podobnych do znaczników szablonu:

<?php navigation('products'); ?> 

Jakie są Twoje myśli?

Pamiętaj, że nie muszę robić nic bardziej skomplikowanego niż dołączenie strony do określonego miejsca lub spisanie nieuporządkowanej listy; reszta będzie obsługiwana przez CSS.

+1

Dość pewnie, że było to już wielokrotnie zadawane. – MitMaro

+0

Dup: http://stackoverflow.com/questions/731743/php-vs-template-engine http://stackoverflow.com/questions/436014/why-should-i-use-ementing-system-inphphp http://stackoverflow.com/questions/62605/php-as-a-template-language-lub-some-other-php-templating-script – MitMaro

Odpowiedz

13

Języki szablonów dla PHP są przykładem wzorca zapobiegawczego o nazwie "Inner-Platform Effect". Smarty jest przykładem struktury szablonów dla PHP, ale nawet Hasin Hayder, autor książki o Smarty mówi, że Smarty is dead i nie ma potrzeby jej już używać.

Może istnieć uzasadnione powody, aby rozwinąć język szablonów, na przykład, jeśli korzystasz z CMS przez projektantów lub edytorów treści i nie chcesz przytłoczyć ich złożonością PHP (lub pozwolić im na napisać kod, który mógłby złamać twoją stronę).

Ale nie opisałeś tego jako celu, więc zakładam, że korzystam z PHP, ponieważ twój szablon jest najlepszy w tym przypadku. Będzie to mniej pracy, ponieważ nie musisz rozwijać własnego języka, a zapewni to większą elastyczność w rzadkich przypadkach, w których potrzebujesz określonego rodzaju dynamicznej zawartości.

Nie pisz funkcji PHP do enkapsulacji bloków wyjściowych HTML. Zamiast tego użyj include(), aby pobrać fragmenty kodu HTML. Technika ta jest czasami nazywana "cząstkami".

Można również użyć szkieletu MVC, takiego jak Symfony, Kohana, Solar, CodeIgniter lub Zend Framework, aby pomóc ci zachować dyscyplinę w zakresie oddzielania kodu szablonu PHP od reszty kodu aplikacji.

+0

Buduję go na kodzierze. Co się stanie, jeśli część kodu HTML zostanie określona w PHP? Dla wypisywania listy (jak w moim przykładzie) myślałem, że użycie włączeń byłoby niepotrzebne. Nie ma potrzeby wypisywania "some-specific-navigation.html" i dołączania go, prawda? Jeśli chodzi o strony, te nie będą generowane w locie. –

+1

Chodzi mi o to, że cały HTML przechowuję w plikach szablonów, podczas gdy ja piszę funkcje PHP (jak wspomniany przykład "navigation()") tylko po to, aby dostarczyć dane do szablonu. Nigdy nie używaj tagów HTML nawet w szablonie. Usuń blok '', gdy chcesz dosłowne znaczniki HTML. –

+0

Po prostu pomyślałem, że napisanie '{$product.name}' było czystsze niż napisanie '' –

2

Być może warto zajrzeć do Smarty- http://smarty.php.net Smarty to potężny silnik szablonów, który zapewnia najlepsze z obu światów. Posiada rozbudowaną obsługę niestandardowych modułów i wtyczek.

Zbudowałem niestandardowy CMS ze Smarty i PHP i mam tylko dobre rzeczy do powiedzenia na ten temat.

Kod php używać Smarty wygląda to

<?php 
// my cms 

$smarty = new Smarty(); 
. 
. 
$smarty->display('home.tpl'); 

?> 

kod szablonu jest coś takiego

<h1>{$pagetitle}</h1> 

{insert tag="navigation"} 
+0

Polecam Dwoo [dwoo.org] nad Smarty. Ma większość cech Smarty bez nadęcia. – MitMaro

+0

+1 Użyłem Smarty do wielu projektów, chociaż to było jakiś czas temu, więc mogą być tam również inne silniki do sprawdzenia (na przykład Dwoo, jak wspomniał MitMaro). Nadrzędna obawa dotycząca języków szablonów, z mojego doświadczenia, polega na tym, że logika biznesowa nie może się do nich wkraść. Zwykle oznacza to trochę więcej pracy, aby upewnić się, że szablon zawiera tylko informacje, które chcesz wyświetlić, pozostawiając tylko formatowanie i strukturę wyświetlania. – yukondude

7

byłem bardzo zadowolony Smarty użytkownik przez dłuższy czas, nie wiem wierzę już w wyspecjalizowane języki szablonów.

Język szablonów nie uniemożliwi wstawienia niewłaściwej logiki do kodu prezentacji, spowoduje jedynie wymuszenie napisania niewłaściwego kodu w języku szablonów.

To dość banalne, aby przetasować własny system szablonów, który korzysta z php w szablonach. Następnie utwórz różnych pomocników, aby zachować czysty kod szablonu (np. Funkcję "nawigacji()").

Myślę, że podejście przyjęte przez Zend_View jest całkiem dobre. Pliki warstwy widoku Symfony również są dość zgrabne, ale mogą być trochę onieśmielające. Nie musisz używać frameworka, aby coś z niego zrobić. Wystarczy spojrzeć na niektóre z kodu szablonu w przykładach i zobaczyć, co Cię inspiruje. Podsumowując: zapomnij o specjalnym języku dla szablonów - po prostu zastosuj dobry sens projektu do kodu widoku, zmniejszając złożoność ze skryptów widoku i do pomocników wielokrotnego użytku.

7

Ponowne odkrywanie koła jest zazwyczaj złym pomysłem.

PHP jest już językiem szablonów. Nie musisz wdrażać własnego.

Jeśli chodzi o Smarty, jest to najbardziej kompletny system szablonów dla php i nadal jest to zły pomysł.

Kilka artykułów na ten temat:

Jeśli chcesz spojrzeć na szablonach zrobić lepiej spojrzenie:

  • phpSavant używa kod php i nadal promuje separację obaw.

Ostatecznym celem jest oczywiście, aby mieć łatwiejszy kod do utrzymania poprzez promowanie oddzielenie logiki biznesowej i prezentacji

1

Zastanawiam się, dlaczego nikt nie wspomniał, co jest jednym z najważniejszych zastosowań języka szablonu: automatyczne wyprowadzanie danych wyjściowych.

Łatwo jest zapomnieć htmlspecialchars() tu czy tam, więc język szablon, który zapewnia wskazówki jak {$ nazwa} musi upewnić się nazwa $ jest automatycznie przepuszcza htmlspecialchars, z odpowiednim kodowaniem i wszystko.

Oczywiście oznacza to również, że można podać inny "kontekst" dla zmiennych wyników, takich jak np. alert ("Witaj {$ nazwa | kontekst = pojedyncze cytaty}!"); gdzie interpreter szablonów uciekłby z treści $ name, tak że niemożliwe jest rozbicie pojedynczych cudzysłowów, zamiast ucieczki XML (co powinno być domyślne).

Takie konteksty mogą również zawierać rzeczy jak int (wymuszenie numeru), a to może również zostać przedłużony do przyjęcia dodatkowych parametrów formatowania danych wyjściowych, et itp

moje 2 centów. Nie jestem pewien, czy istnieje rozwiązanie o otwartym kodzie źródłowym, które pozwala na to (byłbym zainteresowany, aby usłyszeć o tym!), Przetrenowałem mojego tłumacza na te rzeczy w pracy. Ponieważ wynikowy "kod pośredni" jest czystym PHP, można go bardzo łatwo "buforować" (jak robią to Smarty i inne systemy tpl).

+0

jest to dobry punkt, którego wcześniej nie rozważałem. Ale czy nie można tego zrobić równie dobrze z funkcjami PHP zamiast tagów szablonów? –

+0

Tak, ale chodzi o to, że łatwo jest zapomnieć wywołać htmlspecialchars() lub uciec z cytatów w bloku