PHP HTML temiz tutmak

6 Cevap php

Şimdi yaklaşık bir yıl boyunca php ile çalışıyoruz ve nihayet OOP benim anlayış bazı ilerlemeler yapmaya başladım. Yani, şimdi benim HTML içine benim PHP çalışma temiz yöntemler arıyorum sınıfları yazıyorum. Ben aslında çıkış verileri benim veritabanında saklanan bir kaç sınıfları yazdım.

Örneğin ben getUserNameByIndex ($ dizin) adında bir fonksiyon yazmış olduğu bir "kullanıcı" sınıfının bir örneğini hangi "Echos" Ben o gibi benim tercih malikâne benim HTML içine yazabilirsiniz bir değeri olacak:

<h1> The <?php $user->getUserNameByIndex($index) ?> is not online </h1>

Bu harika. Ne beni bumming neler olduğunu ben o zaman benim çıktı sayfa bakmak daha başka bir PHP komut dosyası gibi yapmak benim HTML içine daha fazla PHP yazmak gerekiyor döndü gerekir dizelerden oluşan bir dizi varsa.

Örneğin:

<span> His likes are:<br> <?php foreach($user->likes as $like){ if($like != foo){echo $like . '<br>' }} ?>

Bu sadece benim gibi temiz görünmüyor, ama ben sınıf yönteme çıktı yazarsanız, benim stil kontrolü bazı uzak alıyorum. Ben arıyor gerektiğini burada bir denge olup olmadığını merak ediyorum. Yoksa HTML göstermek niyetinde dizeleri dizileri işlemek için standart bir yöntem varsa. Bu mantıklı ve aptal bir soru değildir umarım. Ben yine, HTML gibi görünüyor HTML yazma için çok heyecanlıyım, benim kod PHP ayak izini en aza indirmek için bu yine de büyük bir bonus.

Değerlendirilmesi için teşekkür ederiz.

6 Cevap

A good way to separate code from design is the Model-View-Controller (MVC) design pattern.
Specifically, in your case you are looking for a separation of model (data handling) and view (display).

Bunun birçok implimentations PHP varlığı zaten vardır. Bakarak değer olduğunu birkaçı:

CodeIgniter
Kohona
Symfony
Zend

(Eğer bir çiftleşmiş dil çözümleyici olarak çiftleşmiş bir dil kullanarak karşı değilseniz Ve, ben Tiny But Strong bakarak önerebilir.)

Her zaman daha samimi HTML PHP sözdizimi kullanabilirsiniz:

<?php foreach($user->likes as $like) : 
    if($like != foo):
?>
    <?=$like?><br>

<?php 
    endif;
endforeach; ?>

: Jascha, ben php istediğiniz her şeyi yazarken, orta-html yazabilirsiniz böyle yöntemleri ile bir sayfa sınıf oluşturmak için cazip olurdu

/* at the top of the file somewhere... */
$page = new PageWriter();
....
<!-- in the html body -->
<p><?php $page->print_users_likes($user); ?></p>

Tabii ki, varolan sınıflar için bu tür yöntemleri ekleyebilir, veya sadece onlara ekleme veya gerektiren yanı sıradan yöntemleri kullanın.

Bunu yapmak için nedeni tamamen kozmetik - ne yerine birkaç için-döngüler, algoritmalar vb daha oluyor html sayfasında görebilirsiniz bu şekilde

Ben dahil ve php fonksiyonları gerektiren bakarak öneririm - Ben ondan belirli bir sayfaya özgü değil php parçaları kaldırmak için kullanabilirsiniz.

Da kullanabilirsiniz output buffering. Eğer sınıfa şablonları yüklemek ve derlenmiş HTML kodunu dönebilirsiniz.

Ben çok PHP için Smarty Templating Engine öneriyoruz. Bu sizin mantık sizin sunum (HTML) ayrı sağlar. (PHP) önbelleğe alma gibi özellikler, dahili ve gerçekten PHP ve HTML karıştırma işlemini kolaylaştırır vardır.

Bu kararlı sürüm var, (v2) biraz Nesne Tabanlı zaten. (PHP4 + bile uyumlu) mevcut geliştirme sürümü (v3 - zaten Beta 7) ise çok daha Object-Oriented (PHP5 + uyumlu olur)

PHP niteliği göz önüne alındığında, ben Smarty overkill gibi çiftleşmiş sistemleri bulabilirsiniz. Kesinlikle sürekli php ve html kod arasındaki takas dağınık ve okunması zordur.

Bir çözüm dizeleri içindeki değişkenler sokmak için:

$all_likes=implode('<br />',$user_likes);
print "<span> His likes are:<br /> $all_likes</span>";

Eğer (bir çoklu-dil web sitesi için örneğin) farklı dizeleri içine birden fazla oyuncu değişikliği ile başa senaryoyu düşünün Ancak daha iyi bir çözüm [s] printf kullanmak olabilir:

$template="<span> %s likes these:<br />$s</span>";
...
printf($template, getUserNameByIndex($index), implode('<br />',$user_likes));

(BTW: Bu hiçbiri gerçekten özellikle OO ile ilgisi olan)

Eğer böyle bir şey yapabileceğini böyle bir şablonun içine değerleri keyfi bir dizi biçimlendirme ile ilgili genel bir yöntem istiyorsanız:

print render("<span>$s likes %s</span>",array($username, $user_likes));

function render()
{
   $args=func_get_args();
   foreach ($args as $key=>$val) {
      if ($key && is_array($val)) {
         $args[$key]=flatten($val);
      }
   }
   return call_user_func_array('sprintf',$args);
}

function flatten($inp)
{
   // there's probably a smarter way of doing this with 
   // the array fns
   $out='';
   $join='';
   foreach ($inp as $val) {
      $out.=$join;
      if (is_array($val)) {
         $out.=flatten($val);
      } else {
         $out.=$val;
      }
      $join="<br />\n";
   }
   return $out;
}

HTH

C.