PHP ile HTML eklemek için en iyi yolu nedir?

11 Cevap php

Görünümünde bir 'en iyi uygulama' açısından konuşmak, ne sizce PHP kullanarak HTML eklemek için en iyi yoldur. Şu an için ben aşağıdaki yöntemleri (çoğunlukla ikincisi) birini kullanın, ama iyi olduğunu düşünüyorum merak ediyorum.

<?php
  if($a){
?>
[SOME MARKUP]
<?php
  }
  else{
?>
[SOME OTHER MARKUP]
<?php
  }
?>

Karşılıklı için:

<?php
  unset($out);
  if($a) $out = '[SOME MARKUP]';
  else $out = '[OTHER MARKUP]';
  print $out;
?>

11 Cevap

Eğer bazı şeyleri bu şekilde yapacağız iseniz, gerçek, mantık ve tasarım ayırmak istiyorum.

Ama bunu yapmak için Smarty kullanmak gerekmez.

Öncelik zihniyet ilgili. Ben insanların Smarty şok edici şeyler gördük, ve sonunda siteleri in Smarty geliştiren insanların dönüşür ve daha sonra bazı parlak kıvılcım (bir potansiyelini hafife asla onlar Smarty şablon motoru yazmak gerekir karar verecek aptalca bir fikir).

Iki bölüme kodunuzu kırmak ve bir standarda uymak için kendinizi zorlarsanız, o zaman çok daha iyi performans alırsınız.

PageLogic.php

<?php 

  $pageData = (object)(array());  // Handy trick I learnt. 

  /* Logic Goes here */


 $pageData->foo = SomeValue; 

 ob_start(); 
 require("layout.php"); 
 ob_end_flush();

Layout.php

 <html>
   <!-- etc -->
   <?php for ( $i = 1; $i < 10; $i++ ){ ?>
    <?php echo $pageData->foo[$i]; ?>
   <?php } ?>
   <!-- etc -->
</html>

PHP çiftleşmiş motoru olarak yazılır oldu, bu yüzden en az try Eğer Smarty dalmak gerek olup olmadığını değerlendirirken önce tasarlanan görev için kullanmak gerekir.


Ayrıca size bir çiftleşmiş motoru kullanmaya karar verirseniz, default tarafından HTML kaçar tane denemek ve yerine "in tercih" nin "katılmama" Kendinizi XSS baş ağrısı bir çok tasarruf edersiniz. Smarty bu açıdan zayıf olduğu, ve bu nedenle, içinde yazılı içerik naif şablonları bir yeri vardır.

{if $cond}
    {$dangerous_value}
{else}
    {$equally_dangerous_value}
{/if}

Smarty şablonları gitmek ne genellikle. Sorun dangerous_value keyfi HTML olabilir $ 'dır ve bu sadece bile more kötü yerde izlenemez spagetti kod ile kodlama uygulamaları yol açar.

Eğer düşünün herhangi bir şablon dili should bu endişe hitap. örneğin:

{$code_gets_escaped} 
{{$code_gets_escaped_as_a_uri}}
{{{$dangerous_bare_code}}}

DEFAULT davranış olmanın sömürüsüne kapı aksine bu şekilde, sömürü için potansiyel kapı, şablonda kolay bir şekilde görülebilir.

-1 Tipik histerik 'yerine [benim favori çiftleşmiş sistemi] kullanın!' Mesaj için. Doğal PHP cevap one-liner bile Her PHP sonrası, her zaman, her biri-liner JavaScript soru 'yerine [benim favori çerçeve] kullanın!' Tam biter gibi, bu dönüşür. Bu utanç verici.

Cidden, biz know iş mantığını ve sunumu endişeleri ayıran hakkında. Bunu yapmak - ya da not bunu - herhangi çiftleşmiş sisteminde, PHP, Smarty veya tamamen farklı bir şey olsun. Hiçbir şablon sistemi sihirli bir düşünce demet olmadan endişelerinizi ayırır.

(Aslında çok kısıtlayıcı bir çiftleşmiş sistem sunum endişeleri ile iş mantığı karmaşık, tamamen gösterim, yardımcı kodu yazmak zorunda ile sona erebilir. Bu bir kazan değil!)

Sordu soruyu cevaplamak için, ilk örnek kötü girinti nedeniyle okumak Tamam, ama çok zordur. Daha okunabilir bir yol monzee örneğini görmek; hangisi tercih gösterim veya {} s, ama okunabilirlik için önemli olan bir tek, 'iyi-oluşturulmuş' girintili hiyerarşisi olarak HTML ve PHP tutmak: Eğer kullanabilirsiniz.

Ve son bir savunma: htmlspecialchars hatırlıyorum (). Düz metin bir web sayfasına gitmek için gereken her zaman, bu must kullanılabilir, ya da tüm zemin üzerinde XSS bulunuyor. Bu soru doğrudan o ile ilgili değil biliyorum, ama her zaman biz de dahil olmak üzere örnek kod sonrası < ? Php echo kaçan olmadan ($ title)?> Veya bir çerçeve eşdeğer, biz çoğu PHP uygulamalar haline gelmiştir güvenlik afet alanının sürdürülmesini teşvik ediyoruz.

En önemli husus sunum ayrı mantığı tutuyor - az kavrama hem de çok daha basit gelecek değişiklikler yapacaktır.

Hatta smarty gibi çiftleşmiş sistemi çeşit kullanarak düşünebilirsiniz.

Benzer sorular:

What’s the best way to separate PHP Code and HTML?

PHP as a template language, or some other PHP templating script?

Bu gibi oldukça basit bir durum için, bir şablon olarak PHP kullanmak için gayet iyi. Basit mantık ötesinde (ve büyük olasılıkla olacaktır) Ancak, bu şablon motorları kullanmak için iyi bir fikirdir.

Varsayılan PHP görünümü komut kullanır Zend Framework, bu yapmak için önerilen yol bu gibi olacaktır:

<?php if ($a) : ?>
    [MARKUP HERE]
<?php else : ?>
    [SOME MORE MARKUP]
<?php endif ?>

Daha ayrıntılı sözdizimi çok daha kolay parantez kullanarak daha bir bakışta koşullu blokları maç yapar.

Ne. Kullan Smarty. Ekran mantığı sizin iç mantığı ayırarak korumak için çok basit bir kod inşa edecek. (Tamamen ayrı PHP ve HTML çalıştı PHPLib eski şablon sisteminin yolunu almayın - bu sizin temel iş mantığı ile iç içe olması ekran mantığı gerektiren ve çok dağınık.) Kesinlikle PHP kodu HTML parçacıkları oluşturmak gerekir senin 2. yöntemi kullanmak, ancak Smarty için değişken geçmek.

Bir şablon motor fazla bir güçlük gibi görünüyor Eğer kendi zavallı adamın şablon motoru yapabilirsiniz. Bu örnek kesinlikle geliştirilmiş ve tüm görevler için uygun değildir, ama daha küçük siteleri için uygun olabilir olmalıdır. Sadece bir fikir almak için:

template.inc:

<html><head><title>%title%</title></head><body>
%mainbody%
Bla bla bla <a href="%linkurl%">%linkname%</a>.
</body></html>

index.php:

<?php
$title = getTitle();
$mainbody = getMainBody();
$linkurl = getLinkUrl();
$linkname = getLinkName();
$search = array("/%title%/", "/%mainbody%/", "/%linkurl%/", "/%linkname%/");
$replace = array($title, $mainbody, $linkurl, $linkname);
$template = file_get_contents("template.inc");
print preg_replace($search, $replace, $template);
?>

Eğer kendi şablon sistemi olmayan bir çerçeve kullanarak olduğunuzda size bir çerçeve kullanarak ya da eğer bilmiş, ok.

Aksi takdirde en PHP çerçeveler ve genç nesil CMS kendi çiftleşmiş sistemi var.

Genel olarak bir çiftleşmiş sistem fikri neredeyse sadece HTML (View / Şablon Dosyası) ve sadece veri veya iş mantığını (Model veya Controller Dosyaları) içeren dosyaları içeren dosyaları sahip olmaktır.

Bir Şablon Dosyası Bu (SilverStripe örneğin) gibi görünebilir:

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <head>
        <% base_tag %>
        $MetaTags
        <link rel="stylesheet" type="text/css" href="tutorial/css/layout.css" />
    </head>
    <body>
        <div id="Main">
            <ul id="Menu1">
                <% control Menu(1) %>
                <li class="$LinkingMode">
                    <a href="$Link" title="Go to the &quot;{$Title}&quot; page">$MenuTitle</a>
                </li>
                <% end_control %>
            </ul>
            <div id="Header">
                <h1>$Title</h1>
            </div>
            <div id="ContentContainer">
                $Layout
            </div>
            <div id="Footer">
                <span>Some Text</span>
            </div>
        </div>
     </body>
</html>

Sen sayfa istemciye gönderilmeden önce veri eklenecektir yerlerde takılı olmayan birkaç HTML kodu parçaları sadece orada olduğunu görebilirsiniz.

Sizin sonra kod (basitleştirilmiş) oldukça gibi görünebilir:

<?php
  unset($out);
  if($a) $out = '[SOME CONTENT TO INSERT INTO THE TEMPLATE]';
  else $out = '[SOME ALTERNATIVE CONTENT]';
  templateInsert($out);
?>

Bu konuda çok şey: Sizin HTML gibi görüldüğü ve gibi değiştirilebilir, tasarımcı bunun mantıklı ve herhangi bir şans olmadan farklı yerlerde bir araya bit ve parçaları almak için çalışırken kodu bakmak zorunda değildir O ne yaptığını görmek. Öte yandan bunu sayfada nasıl görüneceğini hakkında endişeleri olmaksızın mantığı içinde değişiklikler yapabilirsiniz. Kodunuzu kompakt ve therfore okunabilir olacaktır çünkü büyük olasılıkla da daha az hata yapacağız.

Şey ben ilk PHP yapmaya başladı ben bilseydim: olduğunca uzağa HTML çıktısı mümkün olduğunca ağır kaldırma program kodu tutun. Ikisi büyük, oldukça bitişik, okunabilir parçalar kalmak bu şekilde.

Ben bunu buldum en iyi yolu, bu yüzden dinamik bölümünü almak için PHP kodu yazmak, sonra etrafında karıştırmak ve tasarım hakkı alabilirsiniz belki bazı sahte verilerle, bir statik HTML dosyası first yapmaktır çıkış ve (eğer kısmı size kadar olduğunu nasıl - öneriyorlar sen diğerleri gibi Smarty ile bunu yapabileceğini) bunları birlikte tutkal.

Sana must ya bunu yaparsanız yolu kıvırcık parantez kullanmak. PHP ile HTML yankı etmeyin.

Bu tamamen bir şablon motoru kullanarak, sunum (HTML) sizin mantığı (PHP kodu) ayırmak daha iyidir.

Bu hızlı ve HTML içine PHP eklemek kolaydır, ama çok hızlı dağınık alır ve bakımı çok zordur. Bir very hızlı ve very kirli bir yaklaşımdır ...

PHP bulunan tüm şablon motorları hangi için daha iyi olduğu gibi, örneğin bu sorulara bakın:

Smarty KULLANMAYIN - PHP başlı başına bir şablon sistemi. Bu sözdizimini kullanarak düşünün:

<?php if($a):?>
[SOME MARKUP]
<?php else: ?>
[SOME OTHER MARKUP]
<? endif; ?>