2011-03-03 16 views
5

Site içeriğinin mantıksal bloklara ayrılmasıyla ilgili en iyi uygulama tavsiyesi arıyorum. Sitede sabit olan bir üstbilgi ve altbilgi istiyorum. Böylece, farklı içeriğe sahip birkaç sayfam varsa bunların hepsi aşağıdaki gibi görünür - üstbilgi ve altbilgide yapılan değişiklikler ardından her sayfayı değiştirmeden otomatik olarak güncelleştirilir.PHP'yi kullanarak site içeriğini ayırmak için

<?php 
include 'header.php'; 
?> 
<body> 
    <p>page content here</p> 
</body> 
<? 
include 'footer.php'; 
?> 

header.php açıklığı <html>, <head> ve statik içeriğe sahip olacağını ve footer.php herhangi bir ekstra statik içerik ve kapanış </html> etiketi içerecektir. Yani, benim sorum: Bu iyi bir yaklaşım mı?<html> etiketlerinin birden fazla dosyaya yayılmasının kötü bir uygulama olduğu konusunda endişeliyim. Eğer öyleyse, bu tür bir tasarıma yaklaşmanın doğru yolu nedir?

+3

Kötü bir uygulama nasıl olabilir? WordPress bunu yapar. Yanıt için ' –

cevap

13

Hayır, yaklaşımınız yanlış. Sen header.php her sayfa çağrı üzerine denilen olacağını varsayıyoruz

  1. : İşte
    tasarımınızda ana hatalarıdır. Bu yanlış.
  2. Header.php'nin her zaman statik olacağını varsayıyorsunuz. Bu yanlış.
  3. Sayfanın kendisi için bir şablon oluşturmayı unutmuşsunuzdur.

ana kural herkes ezbere öğrenmek zorunda:

değil tek bir karakter tüm veriler hazır hale gelene kadar, tarayıcıya gönderilen gerekmektedir.

Neden?

  • 2011 tarihi. AJAX dönemi. Kodunuz tüm HTML sayfası yerine JSONed verilerini göndermek zorunda kalırsa ne olur?
  • HTTP header adlı bir şey var. Bazen onları göndermek zorundayız. Süslü HTML üstbilginizi zaten gönderdiyseniz, imkansız olur.
  • sadece 4 sayfalık bir site içindir. Tamam. Şansınız olduğunu ve başka bir 4 sayfalık site için istek aldığınızı düşünün. Sadece şablonları değiştirmeli ve motor dosyalarına dokunma. Bu gerçekten büyük bir avantaj.
  • Sayfa içeriğinize göre sayfalarınız için özel bir <title> etiketi hazırlayacağınızı düşünün. Bu son derece yaygın bir şey değil mi? Ama şablonları kullanmadan yapamazsın.

Bu nedenle, her bir üstbilgi için üstbilgi ve altbilgi içeren bir genel site şablonuna ve ayrıca özel şablonlara sahip olmanız gerekir.

bir örnek düzeni

böyle olacak:

.1. sayfa kendisi.

o şey verir ama sadece gerekli verileri toplamak ve bir şablon çağırır:

<?php 
//include our settings, connect to database etc. 
include dirname($_SERVER['DOCUMENT_ROOT']).'/cfg/settings.php'; 
//getting required data 
$DATA=dbgetarr("SELECT * FROM links"); 
$pagetitle = "Links to friend sites"; 
//etc 
//and then call a template: 
$tpl = "links.tpl.php"; 
include "template.php"; 
?> 

.2. Ana site şablonu olan template.php,

senin başlık ve bitişin oluşur:

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>My site. <?=$pagetitle?></title> 
</head> 
<body> 
<div id="page"> 
<?php include $tpl ?> 
</div> 
</body> 
</html> 

.3. ve son olarak links.tpl.php gerçek sayfa şablonu:

<h2><?=$pagetitle?></h2> 
<ul> 
<?php foreach($DATA as $row): ?> 
<li><a href="<?=$row['link']?>" target="_blank"><?=$row['name']?></a></li> 
<?php endforeach ?> 
<ul> 

, kolay, temiz ve sürdürülebilir.

+6

@Shrap'den bahsetmeye gerek yok, üzgünüm, katılmıyorum. Sağladığı örnek, basit siteler için oldukça yaygındır. Bunu birçok geliştiricinin ihtiyaç duymadığı bir seviyeye taşıyorsunuz. Ayrıca, başlık örneğiniz gibi başlıkların bir değişken olarak tanımlanması ve başlık çağırılmadan önce ayarlanması gibi çeşitli yaratıcı yollar vardır. Bunlardan hiç bahsetmedi. Ve bunun yanlış olduğunu söylemesi yanlış değil! Bunun duruma bağlı olduğunu söylüyorum. – bpeterson76

+1

Kabul etmeliyim, sadece dört sayfalık, basit bir site ama işaretçiyi doğru yönde gördüğünüz için teşekkür ederim - geliştirdiğiniz konular, daha karmaşık site tasarımlarına girdiğimde düşünülecek şeyler! – persepolis

+3

@persepolis böyle bir düzen, yıllar süren araştırma ve deneyimlere dayanmaktadır. Çekirdek dosyalarına dokunmadan, farklı tasarımlarla tüm site sayısını yaratabileceksiniz. Bu şablonlar kullanmanın büyük avantajı. Ayrıca başka birçok gelişme var. Örneğin, veritabanı sorgu sonucuna göre, AJAX çağrısına hizmet etmek için yalnızca HTTP üstbilgisini veya JSON verilerini göndermeniz gerekir. İlk planımla kolay ve başlangıçta imkansız olacaktı. ve bunun gibi. Sonuçta, onunla birlikte 4 sayfalık bir site oluşturmak daha kolay olurdu. –

-6

index.php - REQUEST değişkenine dayalı üstbilgi, altbilgi ve içerik içerir.

<?php 
include ('header.php'); 

// VERY IMPORTANT - do not use the GET variable directly like this 
// make sure to filter it through a white-list 
include(basename($_GET['page']).'.php'); 

include ('footer.php'); 
?> 

: vb altbilgi içeriği

content1.php, content2.php,


İndex.php -
Header.php - başlık içeriği
footer.php

URL'nin www.domain.com/pagename adresine gitmesini isterseniz, index.php'ye yüklemeye çalıştığınız sayfa "pagename", HTACCESS kullanın ve Bazı URL Yeniden Yazma: Bu evet, çalışır, temel bir yaklaşımdır ama http://corz.org/serv/tricks/htaccess2.php

+0

+1, ancak daha fazlası yapılabilir. ama PHP kodunu açmak için ' Spudley

+1

Buradaki risk, kullanıcıların $ _GET ['page'] adresini tam bir URL ile besleyebilmeleri ve tüm klasörünüze göz atabilen kötü amaçlı bir komut dosyası içerebilmeleridir.Muhtemelen bunu istemiyorsunuz, ince kaburga bu değerin ilk değerini kontrol ediyor :) – Tsadiq

+1

** buradaki dosya enjeksiyonu, son derece tehlikeli güvenlik açığı ** –

4

:) Eminim çiftleşmiş ve OOP bir çok rahatsız olur ama 'ı can gibi doğru yolda

üzerinde kesinlikle Artık yorum yaptıktan sonra buraya cevap vereceğim;) Eğer özel bir başlığa ihtiyacı varsa, o zaman daha gelişmiş fonksiyonlara ihtiyacı var. Yani, söylediğim gibi, bu bir temel yaklaşımdır. Ama sonunda, eğer gerçekten bir statik üstbilgi/altbilgi varsa ve gerçekten her yerde onları kullanırsa, evet, bu gitmek için iyi bir yoldur.

Bazı sayfa başlıklarında, her sayfada besleyebileceğiniz parametrelerle uğraşabilirsiniz. Tüm MVC şeylerine gidebilirsin. Sonunda ona önceden hazırlanmış bir çerçeve kullanmasını ve rahatsız etmeyi bırakmasını söyle. Bir deneme yanılma yapmasına izin vermezsen nasıl öğrenebilirdi?

+0

Özel bir başlık isterse? –

+0

Dostum, özel başlıktaki şeyi bırak. Birçok insan umursamıyor! – bpeterson76

+0

Daha kaliteli bir html sağlamak istediğinizi anlıyorum. Ama sonra ona bir diziden metz ekleme olanağı sunmalısın. Her sayfa için özel css/js. Belki de daha az http isteğine sahip olmak için onları birleştirir. Yapabilirdin. – Tsadiq

7

Your Common Sense'un yanıtının kapalı olması durumunda, her sayfa için 2 dosyaya sahip olmanız için iyi bir neden yoktur. Şablonunuzu (YCS olarak adlandırılan bu .tpl.php) ve gerçek sayfanızı tek bir dosyada kolayca birleştirebilirsiniz.

Öncelikle, şablon ihtiyaçlarına olarak genişletebilirsiniz bir sınıf ile başlamak genişletmek:

<?php 
#lib/PageTemplate.php 
class PageTemplate { 
    public $PageTitle; 
    public $ContentHead; 
    public $ContentBody; 
} 

Ardından, düzen yapmak:

<?php 
# layout.php 
require_once('lib/PageTemplate.php'); 
?> 
<!DOCTYPE HTML> 
<html> 
<head> 
    <title><?php if(isset($TPL->PageTitle)) { echo $TPL->PageTitle; } ?></title> 
    <?php if(isset($TPL->ContentHead)) { include $TPL->ContentHead; } ?> 
</head> 
<body> 
    <div id="content"> 
     <?php if(isset($TPL->ContentBody)) { include $TPL->ContentBody; } ?> 
    </div> 
</body> 
</html> 

Ve son olarak, bedenle sayfanızı eklemek içeriği:

<?php 
#Hello.php 
require_once('lib/PageTemplate.php'); 
# trick to execute 1st time, but not 2nd so you don't have an inf loop 
if (!isset($TPL)) { 
    $TPL = new PageTemplate(); 
    $TPL->PageTitle = "My Title"; 
    $TPL->ContentBody = __FILE__; 
    include "layout.php"; 
    exit; 
} 
?> 
<p><?php echo "Hello!"; ?></p> 
+0

Bu da her sayfa için iki dosya var gibi görünüyor? (hello.php ve ContentBody'nin içeriği)? –

İlgili konular