Nasıl birden fazla benzer 'görünümü / düzeni' kullanarak dosyaları kullanmadan kuru tutmak yok her yerde CakePKP'deki ifadeler '() if'?

2 Cevap php

Ben CakePHP ile bir uygulama geliştiriyorum ve ben iki düzenleri var: uygulamanın geri kalanı için ana sayfa, diğeri. Başlığında bazı kodlama dışında, neredeyse tamamen aynı. Ben bütün düzeni üzerinde if () ifadeleri kullanmadan, DRY tutmak için yapabileceğiniz bir şey var mı?

2 Cevap

Ben elemanlarının bir ton kullanarak öneririm. Bu şekilde, hala tek bir yerde tüm kod tutabilirsiniz. Bu ana sayfa düzeni Örneğin, (demirbaş hariç):

<body>
     <?php echo $this->renderElement('pageHeader'); ?>
     <?php echo $this->renderElement('frontPageNotification'); ?>
     <?php echo $this->renderElement('navAndOtherStuff'); ?>
     ...
</body>

Ve bu frontPageNotification şeyler dışında her şeyi görüntülemek istediğiniz yeri (sizin iç düzeni:

<body>
     <?php echo $this->renderElement('pageHeader'); ?>
     <?php echo $this->renderElement('navAndOtherStuff'); ?>
     ...
</body>

Şimdi, neredeyse tam olarak benziyoruz, ben muhtemelen sadece tek bir düzen kullanmak ve düzeni kendi içinde tablolar görüntülenecek ne olduğunu belirlemek için eğer birkaç tane var. Ayrıca, denetleyici ve eylem sayfa yüklenirken arkasında olduğunu anlamaya dolar bu-> params dizisi bakarak görüntülenen olsun hangi unsurlar seçebilirsiniz. Gibi:

<body>
     <?php echo $this->renderElement('pageHeader'); ?>

     <?php if($this->params['controller'] == 'pages' && $this->params['action'] == 'index') { echo $this->renderElement('frontPageNotification'); } ?>
     <?php echo $this->renderElement('navAndOtherStuff'); ?>
     ...
</body>

, Kuşkusuz, oldukça çirkin olduğunu. Sadece düşünebildiğim tüm seçenekleri sunmak için çalışıyoruz :)

İyi şanslar

Bir düzen türüne bir arayüz tanımlayın. Eğer "diğer düzen eğer" bir arabirim işlevi tanımlamak bir "eğer düzen main" veya var her yerde

interface IMyLayout
{
    function DrawArea1(...)
    ...
}

class CMyMainLayout implements IMyLayout
{
    function DrawArea1()
    {
        //... draw area 1 for main
    }
    ...
}


class CMyOtherLayout implements IMyLayout
{
    function DrawArea1()
    {
        //... draw area 1 for other
    }
}

Sonra sadece newing tarafından doğru nesneyi birini veya diğerini seçmek

 if ($main)
 {
     $layout = new CMyMainLayout;
 }
 else
 {
     $layout = new CMyOtherLayout;
 }

 $layout->DrawArea1();