Jump to content
php.lv forumi

Kāpēc izmantot template engines?


Maris-S

Recommended Posts

Maris-S, nejauc, piemēram, Smarty ar Mustache. Mustache ir "logic-less" un... ļoti labs piemērs ir te (zem 'README.markdown').

 

Vēl ir tāda lieta, ka Mustache ir vēl viens abstrakcijas slānis - 'class View_...'. Sanāk, ja runājam par MVC, tad ir kontroleris (visa 'virzīšanās'), modelis (visa 'domāšana'), skats kā klase (loģikas atņemšana), templeits (.mustache (citiem vārdiem, .html) fails, kurā ir HTML un tikai '{{mustache}}' tagi (?), kas ir bez loģikas (šajā gadījumā, liels plus). Pašlaik Mustache ir krietni vien ātrāks, teiksim, par slaveno Smarty, plus, to var iemācīties desmit minūšu laikā. Jau ~mēnesi zombor`s (cilvēks, kas ir viens no Kohana 'core developer`iem') strādā pie PHP 'extension`a' (rakstīta C), kas ātrumu Mustache uzlabos vēl dramatiskāk!

 

No vienas puses Mustache ir kaut kas līdzīgs Linux`am - tiklīdz esi 'paspēlējies' kādu mēnesi - atpakaļ vairs neskatīsies. Vienkārši pamēģini, nevis tukši spried! Iesaku.

Link to comment
Share on other sites

  • Replies 43
  • Created
  • Last Reply

Top Posters In This Topic

Par Mustache konkrēti nezinu, nezinu pat vai tā ir klasiska šablonu sistēma, vai kas pavisam cits, būs jāpapēta. Visumā es nemaz nerunāju tikai par kādu konkrētu šablonu sistēmu, pieminēju Smarty tikai tāpēc ka tā samērā izplatīta.

 

Uz ātro apskatoties Mustache, pēc saites ko iedevi, tad šablons tur ir tāds:

 

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>{{title}}</title>
</head>

<body>
<h1>{{title}}</h1>
<p>{{>content}}</p>
</body>
</html>

 

uzreiz varu uzdot to pašu jautājumu, ar ko tas labāks par šo:

 

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title><?php echo($title); ?></title>
</head>

<body>
<h1><?php echo($title); ?></h1>
<p><?php echo($content); ?></p>
</body>
</html>

 

?

 

Tā, lai dziļi nemeklēt pa dokumentācijām, tad kā ar viņu tiek organizēti cikli vai nosacījumi, piemēram vairāku tabulu rindiņu izvadīšana? Vai patiešām tur nav loģiskās daļas?

Link to comment
Share on other sites

PHP way:

 

<p class="pagination">

   <?php if ($first_page !== FALSE): ?>
       <a href="<?php echo $page->url($first_page) ?>" rel="first"><?php echo __('First') ?></a>
   <?php else: ?>
       <?php echo __('First') ?>
   <?php endif ?>

   <?php if ($previous_page !== FALSE): ?>
       <a href="<?php echo $page->url($previous_page) ?>" rel="prev"><?php echo __('Previous') ?></a>
   <?php else: ?>
       <?php echo __('Previous') ?>
   <?php endif ?>

   <?php for ($i = 1; $i <= $total_pages; $i++): ?>

       <?php if ($i == $current_page): ?>
           <strong><?php echo $i ?></strong>
       <?php else: ?>
           <a href="<?php echo $page->url($i) ?>"><?php echo $i ?></a>
       <?php endif ?>

   <?php endfor ?>

   <?php if ($next_page !== FALSE): ?>
       <a href="<?php echo $page->url($next_page) ?>" rel="next"><?php echo __('Next') ?></a>
   <?php else: ?>
       <?php echo __('Next') ?>
   <?php endif ?>

   <?php if ($last_page !== FALSE): ?>
       <a href="<?php echo $page->url($last_page) ?>" rel="last"><?php echo __('Last') ?></a>
   <?php else: ?>
       <?php echo __('Last') ?>
   <?php endif ?>

</p><!-- .pagination -->

 

Mustache way:

 

<p class="pagination">
{{#items}}
{{#url}}<a href="{{url}}" {{#title}}rel="{{rel}}"{{/title}}>{{/url}}{{#num}}<strong>{{/num}}{{name}}{{#num}}</strong>{{/num}}{{#url}}</a>{{/url}}
{{/items}}
</p>

 

Kaut vai koda garums, ko redz dizaineris. Vienkārši, vieglāk pēc tam visu būs uzturēt!

Link to comment
Share on other sites

Tas piemērs nekam neder. Pirmo daļu (kas rakstīta iekš PHP) arī var pārrakstīt īsāk...

 

+ kādēļ tas skaitās logic-less? Tak tas {{#items}} pārrakstīsies uz foreach($items as $item) aka tāpat tur ir loģika...

 

enīvei - arī piekrītu, ka template engine priekš PHP nav vajadzīga...

Link to comment
Share on other sites

Cikls nav nekāda dižā loģika. Citiem vārdiem sakot, tas, ko redzi apakšējā kodā - Tavā gadījumā - būtu liekams iekš templeita. Man tas gan kaut kā neliekas tur iederošs.

 

Loģika:

 

class View_Pagination_Basic extends kostache {

   protected $pagination;

   protected function items()
   {   
       $items = array();

       // First.
       $first['title'] = 'first';
       $first['name'] = __('first');
       $first['url'] = ($this->pagination->first_page !== FALSE) ? $this->pagination->url($this->pagination->first_page) : FALSE;
       $items[] = $first;

       // Prev.
       $prev['title'] = 'prev';
       $prev['name'] = __('previous');
       $prev['url'] = ($this->pagination->previous_page !== FALSE) ? $this->pagination->url($this->pagination->previous_page) : FALSE;
       $items[] = $prev;

       // Numbers.
       for ($i=1; $i<=$this->pagination->total_pages; $i++)
       {
           $item = array();

           $item['num'] = TRUE;
           $item['name'] = $i;
           $item['url'] = ($i != $this->pagination->current_page) ? $this->pagination->url($i) : FALSE;

           $items[] = $item;
       }

       // Next.
       $next['title'] = 'next';
       $next['name'] = __('next');
       $next['url'] = ($this->pagination->next_page !== FALSE) ? $this->pagination->url($this->pagination->next_page) : FALSE;
       $items[] = $next;

       // Last.
       $last['title'] = 'last';
       $last['name'] = __('last');
       $last['url'] = ($this->pagination->last_page !== FALSE) ? $this->pagination->url($this->pagination->last_page) : FALSE;
       $items[] = $last;

       return $items;
   }
}

 

Enīvej, nesākšu svēto karu... katrs dara kā Viņam labāk patīk un der.

Link to comment
Share on other sites

Cikls ir tikai kā piemērs. Tāpat tajā mustache ir {{#var?}} kas ir kas līdzīgs if, partials un gan jau vēl kaut kas, kas galu galā ir loģika...

 

Un protams, ka pašā template'ā to loģikas kodu nevajag likt, bet neviens to neliedz sagatavot vai nu pašā modelī, kontrolierī vai (ja tāda ir) skata klasē - kur nu labāk iederas un tad izvadīt neizmantojot nekādus template dzinējus, bet gan parastu PHP kodu.

 

 

Galu galā, IMO, template valodas var izmantot tikai pie lietotāju ievades, lai nodrošinātu sandbox vidi un saprotamāku sintaksi (tur to pašu mustache tad arī var izmantot).

Link to comment
Share on other sites

Nu šis te labais. :)

 

<?php if ($first_page !== FALSE): ?>
   <a href="<?php echo $page->url($first_page) ?>" rel="first"><?php echo __('First') ?></a>
<?php else: ?>
   <?php echo __('First') ?>
<?php endif ?>

 

Priekš kam pēdējās 3 rindiņās katrā tiek atvērti aizvērti <?php ?> tagi? Nekad neesmu sapratis kāpēc if nosacījumus bāž vienā rindiņā kopā ar php tagiem, vai tad Jums patiešām ir tā ērtāk?

 

Man šis liekās daudz saprotamāks:

 

<?php
if ($first_page !== FALSE):
?><a href="<?php echo $page->url($first_page) ?>" rel="first"><?php echo __('First') ?></a><?php
else:
echo __('First');
endif
?>

 

tomēr te jāpiekrīt daGrevis, katrs kodē kā ir pieradis un kā viņam ir ērtāk. Tas tā par pašu php koda rakstīšanas stilu.

 

Tas ka šablonu sistēmu kods būs īsāks nestrīdos, bet ērtāks viņš no tā nepaliek. Tā garā rindiņa ar kaudzi {{}} nu nemaz neizskatās ērta. Te es laikam atkal kaut ko neesmu sapratis, jo nezinu Mustache, bet izskatās ka tur ar vieniem un tiem pat {{}} apzīmē gan mainīgos, gan ciklus, gan visu pārējo. Sanāk ka koda vidū jebkuru no atrastajiem apzīmējumiem pat neizpratīsi ko viņš dara, neapskatot un neizpētot visu apkārt. Vai tomēr tā nav? Vai ir tā, sanāk {{#items}}{{/items}} ir cikls, bet visi iekšējie ir jau kā mainīgie?

 

Par logicless vienalga nesaprotu, kāpēc jāapgalvo ka šablonu sistēmām nav loģiskās struktūras, bet php jau neskaitās logicless? Ja jau šablonu sistēmu cikls saucams par logicless, tad jau ari php cikla pieraksts ir logicless, tā pat jebkurš if, vai jebkura cita konstrukcija. Tas ka es pierakstu 5 ar romiešu V, skaitļa vērtību nemaina. Šablonu sistēmas nav logicless, ir tikai cita pieraksta sintakse.

Edited by Maris-S
Link to comment
Share on other sites

Logic-less:

 

if($items){
foreach($items as $item){
	if(strlen($item->name) > 5){
		print "$item->name...";
	} else {
		print $item->name;
	}
}
}

 

Vienvārdsakot, atņemt kontroles iespējas attēlojot datus (template engines) ir sev nevajadzīgu ierobežošanu radīšana. Pēc tam jādomā, kā apčakarēt tā saucamās template engines. Piemēram, pamēģini attēlot tabulu ar kādu no tā saucamajām enginēm, tad piemet pāris rowspan/colspan un murgs ir radīts.

 

Ja pats nemāk nodalīt loģiku (datu apstrādi) no attēlošanas - pats vainīgs. Kaut-kādas samurgotas template engines nepalīdzēs, tieši otrādi. Bet par šo jau ir bijušas diskusijas sen sen.

Link to comment
Share on other sites

if($items){
       foreach($items as $item){
               if(strlen($item->name) > 5){
                       print "$item->name...";
               } else {
                       print $item->name;
               }
       }
}

 

{{#items}}
   {{name}}
{{/items}}

Link to comment
Share on other sites

Čaļi, Jūs neesat laikam tā riktīgi iebraukuši par ko runāju.

 

'Logic-less' nav tas pats kas 'no-logic'. Kā parādīju augstāk minētajā piemērā, marrtins ciklu un 'if statement`u' var padarīt 'logic-less'. Dizainerim ir vienalga, kā tie dati tiek apstrādāti. Viss kas viņam ir jāzina ir, ka tur ir īstā vieta datiem. Nekādi 'if`i' utml. mēsli HTML`ā vairs nav... viss tiek samazināts līdz mazākajai loģiskajai vienībai - sīkāk nav iespējams uzrakstīt.

 

Ja tā padomā, bez tā '{{#items}}' un '{{/items}}' arī, mierīgi, var iztikt.

Link to comment
Share on other sites

Neatceros īsti sintaksi, bet doma tāda...

 

Iekš skata klases:

 

public function items($items) {

$output = '';

if (!empty($items)) {

	foreach ($items as $item) {

		if (strlen($item['name']) > 10) {

			$item['name'] = substr($item['name'], 0, 10) . '...';

		}

		$output .= '<a href="' . HTML::chars($item['link']) . '">' . HTML::chars($item['name']) . '</a><br />';

	}

}

return $output;

}

 

Iekš HTML:

 

{{items}}

Link to comment
Share on other sites

Dizainerim ir vienalga, kā tie dati tiek apstrādāti. Viss kas viņam ir jāzina ir, ka tur ir īstā vieta datiem. Nekādi 'if`i' utml. mēsli HTML`ā vairs nav... viss tiek samazināts līdz mazākajai loģiskajai vienībai - sīkāk nav iespējams uzrakstīt.

90% gadijumu vispār Nekādi IF un cikli etc. HTML kodā nav nepieciešami. izmanto templetu endžinu vai nē, tāpat ir redzams ka kods nav īsti loģisks.

Ja jaizvada 2 bloki tad katrā gadijumā to var izdarīt svādāk.

Kut vai katram ielādēt atsevišķu failu

--

 

šo arī var parkstīt savādāk

<?php
if ($first_page !== FALSE):
       ?><a href="<?php echo $page->url($first_page) ?>" rel="first"><?php echo __('First') ?></a><?php
else:
       echo __('First');
endif
?>

 

<?php
if ($first_page !== FALSE){

  $izvade='<a href="'.$page->url($first_page)'." rel="first">'. __('First').'</a>';
else{
  $izvade= __('First');
}

?>
Html ....
<?php echo $izvade; ?>

Man personīgi šādi ir krietni ērtāk lasīt un arī jebkuram svešam koderim būs saprotamāk -> atliks tikai sameklēt kur definēts $izvade (kaut vai 'izbraucot' , ar kādu failu pārlūku, cauri visiem projekta failiem ...

 

un dizainerim jau nu pastāstīt ka dotajā vietā jāraksta $izvade ir elementārāk kā likt uzrakstīt to templeta pseido kodu

Edited by Grey_Wolf
Link to comment
Share on other sites

Neatceros īsti sintaksi, bet doma tāda...

Iekš skata klases:

	
$output .= '<a href="' . HTML::chars($item['link']) . '">' . HTML::chars($item['name']) . '</a><br>

Nu redz, man tad atkal liekas, ka šajā gadījumā pārāk daudz html lien ārpus savas vietas - skata.

Ja man tagad vajag pamainīt, teiksim, stila klasi vai iekļaut <a> iekš <div>, nevis atdalīt tos ar <br>, tad ir jārokas pa kaut kādu skata klasi, nevis skata failu, kāda būtu tā pamatdoma...

Edited by briedis
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...