Daha güzel bir dosyada php + html yazmak nasıl?

12 Cevap php
<?
if($id == 2) {
?>
       html goes here
<?
} 
else { 
?>
       if id is not 2 then something goes here
<?
}
?>

Nasıl ben bir dosyada php + html smarty öğrenme olmadan daha güzel yazabilirim?

12 Cevap

Sen kullanabilirsiniz PHP's alternative syntax for control structures:

<? if ($id == 2): ?>
    <h2>some html</h2>
<? else: ?>
    <h2>another html chunk</h2>
<? endif ?>

Aksi takdirde <?php her zaman yazmak zorunda olurdu, o short_open_tags açıkça etkinleştirilmesi gereken bir php.ini yönergesi olduğunu unutmayın.

Sen MVC (Model, View, Denetleyici) tasarım deseni, kod görünümünü yüklemek için bir Modèle olarak kullanılabilir uygulayabilirsiniz:

<?php
if($id == 2) 
{
 //somes variable and array controls
}
else  
{
 //somes variable and array controls
}
//include the view
include('view.php');
?>

View.php olarak, php değişkenler ve dizi için sadece ekolar html sayfasını gösterir.

Ben bazı HTML kodu yorumlu metin öneririz.

Bu gibi:

<?php
if($id==2)
 echo <<<EOT
Blah
EOT;
else
 echo <<<EOT
Your id is <b>{$id}</b>
EOT;
?>

Bir php dosyası ve bir phtml dosya: Ayrıca, size iki dosya var bir yaklaşım deneyebilirsiniz. Php dosya daha sonra phtml dosya html çıkış, ana mantıktır.

Sizin örnekte olduğu gibi,

// logic.php file
if($id==2)
 $sOutput = 'Yes';
else
 $sOutput = 'No';
// somewhere at the end of the file
include 'logic.phtml';

// logic.phtml
<html>
<title><?=$sOutput?></title>
<body>
Blah blah blah <?=$sOutput?> you can login
</body>
</html>

Diğer önerilen gibi birçok size MVC kullanabilirsiniz, ya da sıkı bir MVC yapısı uygulamak için sevmiyorum, zaten bir çiftleşmiş sistemi kullanmanız gerekir.

Bu smarty öğrenmek zorunda anlamına gelmez, sen gerçekten ihtiyacınız sadece fonksiyonu ile, kendi çiftleşmiş sistem yazabilirsiniz.

Sen tasarımcıları ve performans ile ilk nokta değil çalışma ise, dinamik içerik gitmek zorunda basit tutucular ile bir html dosyası oluşturmak ve daha sonra php (str_replace, preg_replace) ile değiştirin .. ama bu irade yavaş uygulama olabilir.

Örnek:

//html template
// the @[var] syntax is just as an example
<title>@[title]</title>
<body>
    @[content]
</body>

ve çiftleşmiş dosyası:

$title = 'Hello world';
if($id == 2){
    $content = get_content();
}else{
    $content = get_another_content();
}
//really, this is just as example ;)
ob_start();
include('template.html');
$output = ob_get_clean();
echo str_replace(
    array('@[title]', '@[content]'),
    array($title, $content),
    $output
);

Bu gerçekten çok temel bir örnek, ve 2 sorunları var:

  1. Performansı;
  2. Tasarımcılar tutucuları dokunmayın için talimat olmalıdır.

Bir simplier çözüm olabilir:

//html template
<title><?php echo $title; ?></title>
<body>
    <?php echo $content; ?>
</body>

ve php:

$title = 'Hello world';
if($id == 2){
    $content = get_content();
}else{
    $content = get_another_content();
}
include('template.php');

But echoing html should be reduced as possible, is not a good practice and it mix logic with content Logic is logic, data is data, and life is good

Daha ileride (tasarımı) Düzeltilebilirlik için, ben böyle bir şey öneririm:

<?php
if ($id == 2){
$someText = 'I like your id!';
}else{
$someText = 'I love your id!';
}
?>
<html>
...complex html...
<p><?php echo $someText ?></p> <!-- or <?= $someText ?> -->
...complex html...
</html>

Ben yöntemi gibi ve kullanımı soulmerge 's. Ama başka bir daha çıkmak:

<?php

if ($id == 2)
echo <<< END
    <h2>some html</h2>
END;
else
echo <<< END
    <h2>another html chunk</h2>
END;

?>

Ayrıca çok iyi bir dizi öneri için bu soruyu göz atın:

What's the best way to separate PHP code and HTML.

Ben şahsen dosyaları arasında onları tutarsız bulmak ve bir yönteme yapıştırıyoruz tercih olarak kısa etiketleri kullanarak sevmiyorum. Anında bu kadar gibi bazı basit değişiklikler ile biraz daha okunaklı görünmesini sağlayabilirsiniz:

<? if($id == 2) {    ?>

       <p>html goes here</p>

<? } else       {    ?>

       <span>if id is not 2 then something goes here</span>

<? }                 ?>

Diğer yanıtlar ama aynı zamanda en okunabilir bulacağımı yolu biraz daha biraz daha basit. Diğer iyi yöntemlerden çok öne sürülmüştür rağmen (bu ben bunu istiyorum sadece ne olduğu) kendi tercihi hakkında gerçekten.

Bunu böyle yapabilirdi ...

<?
$html_1 = <<<EOH
my html goes here
EOH;

$html_2 = <<<EOH
my html <i>something else</i> html goes here
EOH;

echo ($id==2?$html_1:$html_2);
?>

Eğer kolay tasarımcıları için yapmak istiyorsanız Buuut, sadece harici dosyaları kullanın:

<?
$html=($id==2 ? file_get_contents("html_1.html") : file_get_contents("html_2.html") );
$html=str_replace("%php generated content%", 1 + 1, $html );
echo $html;
?>

ve (bu örnekte) 2 (1 + 1 yerini almak %php generated content% gibi) php hesaplanan içerik eklemek için önceden tanımlanmış anahtar kelimeler kullanın

Daniel cevap ekleme, gibi bir şey yapabilirsiniz:

function htmlVars($html, $vars){
    $html = preg_replace_callback('/@\[([0-9a-zA-Z_\$]*)\]/',function ($matches) use ($vars){
  return isset($vars[$matches[1]])?$vars[$matches[1]]:"";
 },$html);
 return $html;
}

Örnek:

echo htmlVars('foo is @[foo] and bar is not @[bar]',
    Array('foo'=>'foo','bar'=>'barz'));

Sonuç:

foo is foo and bar is not barz

Anonim işlevler sadece php için çalışmak 5.3 veya daha yüksek

İki olgu gerçekten var:

1) Şablon kodu. Ben kontrol yapıları için alternatif sözdizimi soulmerge yaklaşımı öneriyoruz.

2) mutlaka kendi alt şablonu hak etmez genellikle daha sonra ikamesi için çıkış (üretir Kısa, görünüm yardımcı PHP kodu).

2 için ben böyle bir şey tercih:

public function draw(){
    $html = array();
    foreach($this->item as $item){
       $html[] = <<<EOD 
<li class="{$item->class()}">{$item->label()}</li>
EOD;
    }
    return implode($html);
}

I ob_start() ve ?> <?php blokları dahil olabilir sakat alternatif her tür üzerinde bu tercih. Her zaman fonksiyonları callees Aranan üzerine çıktı tamponunun yükünü geçmeden sonuçları birleştirerek ve aksi manipüle seçeneğiniz var ki çıktıyı doğrudan echo değil, dizeleri dönmek istiyorum.

Heredoc kolay dize çıkış belirlemek için yapar ve ben girinti kırılma tür çirkin olduğunu düşünmek bile, bu html çıktı küçük yapışkan notları gibi sıyrılıyor gibi oldukça etkili olmak biter. O, benim IDE (PDT), bu güzel yeşil vurgulanmış olur aslında. (... Burada SO vurgulayıcı görülen değil) bu yüzden her zaman açık olduğunu "mod" Ben varım tam olarak ne tür

Buna karşılık olarak, ?> <?php teknik zor php kodundan html ayırt kolaylaştırır. Bunu birkaç kez yapmak kez bir ?> veya <?php ihtiyacı olmadığını izlemek için can sıkıcı olur. Son olarak, ikameleri ile yapmak genellikle daha ayrıntılı var: <?php echo $obj->func() ?> {$obj->func()} vs

Kodunuzu daha karmaşık alırsa, o refactor zaman olabilir. Ben ad-hoc bir şey yapıyorum eğer ettik, onu (ad-hoc gereksinimleri eklemek gibi çamur topu dejenere eğilimi) satır aşağı birkaç ay öne ve gerçekten bariz olurum çünkü yorumlu metin gibi yorumlu metin 40 satır 5 olarak başlamış olabilir var ki. geri gelip benim kod bakmak ve olmayan-tamamen-ad-hoc versiyonunu geliştirmek zaman, ben kötü ediliyordu dosya parçalarını tanımlamak için çok daha kolay. Bu geri yapışkan notlar, ben de girinti hakkında yapılan yeşil vurgu Yorumlarınız gider.

By using this - PHP echo. Eğer istediğin buysa, yani - bu HTML büyük miktarda çıkış eğer ne yaptığınızı devam etmek daha okunaklı olabilir.