MVC web siteleri için şablonlar işlemek nasıl?

8 Cevap php

Ben bu PHP olarak işaretlenmiş ama benim problem göstermek için PHP kodu kullanarak olacak çünkü.

Yani denetleyicisi için bu gibi bazı kod var:

switch ($page)
{
    case "home":
        require "views/home.php";
        break;
    case "search":
        require "views/search.php";
        break;
}

Açıkçası orada daha fazla sayfa bulunuyor ama bu benim sorunu göstermek gerekir. Bu sayfaların hem de (ve bu konuda sitedeki tüm sayfalar için) için ortak bir başlık, navigasyon ve altbilgi vardır. Ben birden kullanıyor olmalıdır ifadeleri gerektirir? Benim ilk tahminim olacaktır:

switch ($page)
{
    case "home":
        require "templates/header.php";
        require "templates/navigation.php";
        require "views/home.php";
        require "templates/footer.php";
        break;
    case "search":
        require "templates/header.php";
        require "templates/navigation.php";
        require "views/search.php";
        require "templates/footer.php";
        break;
}

Nedense içimden bir ses bu doğru değil bana söyler.

8 Cevap

Kontrolör sadece görünümü için verileri kurmak ve ekrana görüntülemek seçmeliyim. Görünümü paylaşılan sayfalar dahil sayfa düzeni, sorumlu olmalıdır. Ben saniyenin üzerinde ilk örnek gibi.

Evet, üstbilgi, altbilgi vb dışarı bölünmüş olmalıdır.

Özellikle Örneğin olmaz bu iş daha iyi gösteriyor?

    require "templates/header.php";
    require "templates/navigation.php";
    require "views/$page.php";
    require "templates/footer.php";

(Nerede $ sayfa, vb 'search', 'ev')

Burada herhangi bir şekilde kullanılması ise, benim mevcut proje ile şablonları yapmak nasıl bir basitleştirilmiş versiyonu bulunuyor:

class Template {
    var $pagename = 'index';

    function __construct() {
        $this->pagename = basename($_SERVER['SCRIPT_NAME'], '.php');
        register_shutdown_function(array($this, 'do_output'));
    }

    function do_output() {
        $this->header();
        $this->display($this->pagename);
        $this->footer();
    }

    function __call($template, array $params) {
        call_user_func(array($this, 'display'), $template, params);
    }

    function display($template, array $params = null) {
        include "templates/$template.php";
    }
}

Bunun arkasındaki fikir yazabilirsiniz olduğunu "'Template.inc' arasında; yeni şablon;" ve otomatik script sonunda çalıştırmak için () do_output için düzenler. Şablona değişkenleri geçmek için kullanılan yöntem gibi ondan dışında kalan bir kaç şey var.

Eğer PHP kullanarak değil söz ettik, ve bir kaç PHP-izmler orada var: register_shutdown_function () şablonları nesne Yıkıcılar önce denilen olsun emin yapar ama ana komut dosyası ve $ this-> başlığına aramalardan sonra () / footer () sihirli işlevi sadece ekran yapmak aramalar ('header') ve görüntü ('footer'), onlar geçersiz olması gerekiyordur.

Tabii orada gönderdiniz örnekteki gibi bir anahtarı kullanarak yanlış bir şey, ama her durumda deyimi içinde üstbilgi / altbilgi gerekmez. Böyle bir şey aynı şeyi yapardı:

require "templates/header.php";
require "templates/navigation.php";
switch ($page)
{
    case "home":
        require "views/home.php";
        break;
    case "search":
        require "views/search.php";
        break;
}
require "templates/footer.php";

Yukarıda kullandığım gibi Sayfalarınız ayarlanmıştır yol için çalışır ... ya sen, dosya dayalı şeyle anahtarını () yerini alabilir. Bir düğme olsa URL parametreleri ile bunu yapmayı planlıyorsanız en güvenli yoludur.

Ben tvanfosson katılıyorum, neden ve nasıl MVC ile ilgilidir açıklamak istiyorum.

İkinci örnek ile sorun kontrolör görünümü inşa nasıl maruz olmasıdır. Sıkı bir anlamda, kontrolör görünümü için girdileri mareşalinden ve ona iletir, ve başka bir şey.

Görünüm vardiya uygulama gereksinimleri veya girdiler kendilerini bağlı olarak, bu düşünce pratik bir yoludur. Üretilen görünümü bir JavaScript pop-up için Örneğin, bu (ve muhtemelen olacaktır) ikinci örnek ile üstbilgi, altbilgi, CSS, meta farklı bir dizi, vb kullanabilirsiniz, tüm bu denetleyiciye maruz . Tam nokta - İlk olarak, görünüm oluşturmak için nasıl bilir görünümdür.

Daha benim örnek almak için JavaScript pop-up tam sayfa görünümü olması için tasarlanmıştır, ya da AJAX (veya pop-up/page/AJAX soru böyle bir gizli bir unsur olarak girişler tarafından belirlenir için refactored olduğunu hayal alan). Görünümü değişti çünkü Şimdi denetleyici yırtarak ediyoruz. Bu MVC ihlal ettik o kadar çok değil, ama ilk etapta onunla rahatsız olmamalıdır.

Sizin örnekte de görüldüğü gibi dosya adları tüm view / sayfa isteği neticesinde o zaman sadece bir satır ve hiçbir switch deyimi gerekir:

require "templates/header.php";
require "templates/navigation.php";
require 'views/' . $page . '.php'; // <-- one-liner
require "templates/footer.php";

Böyle Symfony gibi bir MVC framework kullanarak veya CakePHP değil herhangi belirli bir nedeni var mı?

Ben bu doğrudan soruya cevap vermez biliyorum, ama yararlı olabilir.

Kodunu tekrar ediyorsun. Bu hiç iyi bir fikir yanındadır. Sizin ilk örneğe yakın kalmak, böyle bir şey kesinlikle tercih olacaktır:

require "templates/header.php";
require "templates/navigation.php";

switch ($page) {
    case "home":
        require "views/home.php";
        break;
    case "search":
        require "views/search.php";
        break;
}

require "templates/footer.php";

Bu mimari yaklaşımı hakkında daha fazla bilmeden fazla tavsiye vermek zor. Örneğin bir çok merkezi bir yerde sadece çıkışını hazırlar denetleyicisi, bu parçası olması ve görünüm şablonları da dahil olmak üzere daha önce çıktı tamponlama başlatmak için tavsiye olacaktır. Eğer HTTP yanıt içeriğini returnin önce daha fazla işlemek isteyebilirsiniz bir değişkende çıktı saklamak olabilir yoludur.

Eğer şablon olarak düz PHP sayfaları kullanıyorsanız, aslında istediğiniz sayfayı tutmak için bir küresel / oturum değişkeni ayarlayabilirsiniz. Bir $ sayfa dahil çağırır sonra, üstbilgi ve altbilgi öğeleri içeren bir "ana şablon" php sayfası olurdu. Denetleyicisi böyle bir şey:

$_SESSION['page'] = sanitize_input($_GET['page']);
require "templates/main.php";

ve sonra main.php şablon dosyasında:

require "templates/header.php";
require "templates/navigation.php";
require "views/{$_SESSION['page']}.php";
require "templates/footer.php";