Tüm yanıtlar için Update- Teşekkürler. Bu Q dağınık gibi oluyor, bu yüzden eğer kimse ilgi Ben bir sequel başladı.
Ben bir arkadaşım için hızlı bir komut dosyası araya atma ve PHP çiftleşmiş yapmanın gerçekten çok basit bir şekilde tökezledi.
Temel olarak, fikri bir yorumlu metin dizesi olarak html belgeyi ayrıştırmak için, yani bunun içinde değişkenleri PHP ile genişletilmiş olacaktır.
Bir geçidi işlevi ifade değerlendirme ve fonksiyon sağlar ve statik yöntem dize içinde çağırır:
function passthrough($s){return $s;}
$_="passthrough";
Bir heredoc dize içindeki belgeyi ayrıştırmak için kod gülünç basittir:
$t=file_get_contents('my_template.html');
eval("\$r=<<<_END_OF_FILE_\n$t\_END_OF_FILE_;\n");
echo $r;
Tek sorun eval
kullanan vardır.
Questions
Herkes
eval
kullanmadan çiftleşmiş bu tür yapmak için bir yol düşünmek, ama regex delilik bir ayrıştırıcı ya da bir ton eklemeden miyim?Tam üzerinde ayrıştırıcı yazmadan PHP değişkenlere ait olmayan başıboş dolar işaretleri kaçmak için herhangi bir öneriniz? Başıboş dolar işareti sorunu 'ciddi' kullanmak için geçerli değil bu yaklaşım çevirir mi?
İşte bazı örnek şablonu HTML kodu bulunuyor.
<script>var _lang = {$_(json_encode($lang))};</script>
<script src='/blah.js'></script>
<link href='/blah.css' type='text/css' rel='stylesheet'>
<form class="inquiry" method="post" action="process.php" onsubmit="return validate(this)">
<div class="filter">
<h2>
{$lang['T_FILTER_TITLE']}
</h2>
<a href='#{$lang['T_FILTER_ALL']}' onclick='applyFilter();'>
{$lang['T_FILTER_ALL']}
</a>
{$filter_html}
</div>
<table class="inventory" id="inventory_table">
{$table_rows}
<tr class="static"><th colspan="{$_($cols+1)}">
{$lang['T_FORM_HELP']}
</th></tr>
{$form_fields}
<tr class="static">
<td id="validation" class="send" colspan="{$cols}"> </td>
<td colspan="1" class="send"><input type="submit" value="{$lang['T_SEND']}" /></td>
</tr>
</table>
</form>
Why use templating?
Bir çiftleşmiş bir tabaka oluşturarak kuşkusuz, zaten çiftleşmiş oldukça iyi olan, PHP gerekli olup olmadığını bazı tartışma olmuştur.
Bazı hızlı nedenleri çiftleşmiş yararlıdır:
You can control it
O tercümana gitmeden önce dosyayı önişlem, bunun üzerinde daha fazla kontrole sahip. Sen, bir şeyler enjekte izinleri kilit aşağı, zararlı php / javascript, önbellek için kazımak, bir xsl şablonu üzerinden çalıştırabilirsiniz, ne olabilir.
Good MVC design
Şablonu modeli ve kontrol bakış ayrılmasını teşvik etmektedir.
Senin görünümünde
<?php ?>
etiketleri içinde ve dışında atlama zaman, tembel almak ve bazı veritabanı sorgularını yapmak veya başka bir sunucu eylemi gerçekleştirmek kolaydır. Yukarıdaki gibi bir yöntemi kullanarak, tek bir deyim (hayır noktalı virgül) 'blok' başına kullanılan olabilir, bu nedenle bu tuzağa yakalanmak için çok daha zordur.<?= ... ?>
hemen hemen aynı yararı var, ama ...Short tags aren't always enabled
... Ve bizim app çeşitli yapılandırmaları çalıştırmak istiyorum.
Ben başlangıçta birlikte bir kavram kesmek zaman bir php dosyası olarak başlar. Ama ben tüm php dosyalarının başında sadece bir <?php
yoksa mutlu değilim, ve bir ?>
sonunda, ve tercihen tüm sınıflar denetleyici gibi şeyler dışında vardır yetişir önce , ayarlar, görüntü sunucusu, vb
Böyle bir şey gördüğü zaman dreamweaver veya ne olursa olsun yatak poops zaman tasarımcılar karışık hale gelir, çünkü tüm benim görüşlerim çok PHP istemiyorum:
<a href="<?php $img="$img_server/$row['pic'].png"; echo $img; ?>">
<img src="<?php echo $img; ?>" /></a>
Bu bakmak için bir programcı için yeterince zor. Ortalama grafik tasarımcı onun yakın yere gitmeyeceğim. Böyle bir şey ile başa çıkmak için çok daha kolaydır:
<a href="{$img}"><img src="{$img}" /></a>
Programcı html dışarı onun kötü kod tuttu ve şimdi tasarımcı onun tasarım sihirli çalışabilir. Yay!
Quick update
Dikkate herkesin tavsiyelerini dikkate alarak, ben dosyaları önişleme gitmek için yol ve ara dosyaları şablonları sözdizimsel şeker olmak, mümkün olduğunca normal "php çiftleşmiş" kadar yakın olması gerektiğini düşünüyorum. Hala yerinde şimdi Eval onunla oynarken. Heredoc şey çeşit rolünü değiştirdi. Ben daha sonra yazmak ve cevapları bazı yanıt vermeye çalışacağız, ama şimdi olacak ...
<?php
class HereTemplate {
static $loops;
public function __construct () {
$loops=array();
}
public function passthrough ($v) { return $v; }
public function parse_markup ($markup, $no_escape=null, $vars=array()) {
extract($vars);
$eot='_EOT_'.rand(1,999999).'_EOT_';
$do='passthrough';
if (!$no_escape) $markup=preg_replace(
array(
'#{?{each.*(\$\w*).*(\$\w*).*(\$\w*).*}}?#',
'#{?{each.*(\$\w*).*(\$\w*).*}}?#',
'#{?{each}}?#',
'#{{#', '#}}#',
'#{_#', '#_}#',
),
array(
"<?php foreach (\\1 as \\2=>\\3) { ?>",
"<?php foreach (\\1 as \\2) { ?>",
"<?php } ?>",
"<?php echo <<<$eot\n{\$this->passthrough(", ")}\n$eot\n ?>",
"<?php ", " ?>",
),
$markup);
ob_start();
eval(" ?>$markup<?php ");
echo $markup;
return ob_get_clean();
}
public function parse_file ($file) {
// include $file;
return $this->parse_markup(file_get_contents($file));
}
}
// test stuff
$ht = new HereTemplate();
echo $ht->parse_file($argv[1]);
?>
...
<html>
{{each $_SERVER $key $value}
<div id="{{$key}}">
{{!print_r($value)}}
</div>
{each}}
</html>