Nasıl yinelenen HTML olmayan bir yinelenen bir şekilde, sizin kod temeli temsil edilir?

7 Cevap php

Büyük bir web sitesi En HTML (başlık, altbilgi navigasyon menüleri, vs) sayfalar arasında yineleniyor. Bütün bu yinelenen HTML aslında kodunda değil yineleniyor böylece nasıl kodunuzu tasarlıyorsunuz? Ben bir bir <ul> benim navigasyon bağlantıları değiştirmek istiyorsanız Örneğin, <ol>, sadece tek bir dosyada bu değişikliği yapmak istiyorum.

Burada belirli bir kod tabanı, bu sorunun üstesinden gördüm nasıl. Her sayfa için kod şöyle görünür:

print_top_html();

/* all the code/HTML for this particular page */

print_bottom_html();

Ama (açılış etiketleri kapanış etiketleri gibi aynı dosyada olmadığı kısmen çünkü) bu yaklaşım ile rahatsız hissediyorum.

Is there a better way?

Ben çoğunlukla PHP siteleri ile çalışır, ancak ben (bu soru dil agnostik ise emin değilim) diğer diller için çözümler işitme ilgi duyarım.

7 Cevap

En azından PHP (ve diğer programlama dilleri) durumunda bir çözüm şablonları. Bunun yerine yukarıda var gibi iki fonksiyona sahip bunun yerine bu gibi HTML ve PHP bir karışımı olacaktır.

<html>
  <head>
   <title><?php print $page_title ?></title>
   <?php print $styles ?>
   <?php print $scripts ?>
  </head>

  <body>
    <div id="nav">
      <?php print $nav ?>
    </div>
    <div id="content">
      <?php print $content ?>
    </div>
  </body>
</html>

Bu şablon içinde her bir değişken başka bir şablon, bir işlev tarafından üretilen HTML, ya da bir veritabanından da içerik tarafından üretilen HTML içerecektir. Daha az ya da bu şekilde kullanılmaya PHP template engines bir dizi vardır.

Eğer genel ve tekrar tekrar kullanmak istiyorsunuz HTML için bir şablon oluşturmak. O zaman böyle bir şey olacağını kullanmak için.

<?php
  $vars['nav'] = _generate_nav();
  $vars['content'] = "This is the page content."
  extract($vars);  // Extracts variables from an array, see php.net docs
  include 'page_template.php'; // Or whatever you want to name your template

Bu şeyler ve çerçeveleri ve içerik yönetim sistemleri çok kullanmak biri yapmanın oldukça esnek bir yoludur.

Ben bir php programcı değilim, ama biz şablonları (Görüntülendi) ile çalışır Smarty adında bir çerçeve, asp.net mvc gibi bir şey kullanabilirsiniz biliyorum.

buraya bak http://www.smarty.net/

Burada yaygın bir yöntem gerçekten, really basitleştirilmiş versiyonu.

layout.php

<html>
  <body>
    <?php echo $content; ?>
  </body>
</html>

O zaman

whatever_page.php

<?php

$content = "Hello World";

include( 'layout.php' );

Eğer include () ya da require () kullanmanız gerekir gibi geliyor

<?php
include("header.inc.php");

output html code for page

include("footer.inc.php");
?>

Üstbilgi ve altbilgi dosyaları sitenin tüm ortak HTML tutabilir.

Diğer dillerde bu nasıl ele için sordu ve ben PHP başka bir şey görmedim, bu yüzden Rails kontrol etmenizi öneririz. Raylar kongre zarif, ve PHP @ codeincarnate 'ın versiyonunu yansıtıyor.

MVC çerçevede, geçerli görünüm mevcut yöntemin uygun görüşünü özetliyordu bir denetleyicisi özgü düzen dosyası içinde oluşturulur. Bu görünüm içeriği girilmelidir bir bölümü tanımlamak için bir "verim" yöntemini kullanır. Ortak bir düzen dosyası bu gibi görünüyor:

<html>
  <head>
    <% #stylesheet and js includes %>
   <body>
     <div id="header">Header content, menus, etc…</div>
    <%= yield %>
    <div id="footer">Footer content</div>
   </body>   
</html>

Bu denetleyiciye bağlı farklı bir görünüm ve his veya farklı navigasyon sahip uygulama sağlar. Uygulamada, ben her denetleyici için farklı düzen kullanılan dosyaları değil, ama bunun yerine "uygulama" adlı varsayılan düzen, güveniyor.

Ancak, diyelim ki bir şirket "bilgi", "blog" için ayrı kontrolörleri ile web sitesi,, ve "admin" vardı diyelim. Daha sonra kendi denetleyicileri karşılık kendi düzeni dosyalarında farklı düzen görüşlerini ele alarak, temiz ve mütevazi bir şekilde her biri için navigasyon değiştirebilir.

Her zaman belirterek denetleyicisi yöntemi özel bir düzen ayarlayabilirsiniz:

render :layout => 'custom_layout'

Eğer CSS ve JavaScript yolları geliştirme ortamı (dev, evreleme, eşya ...) bağlı olarak doğru olmasını sağlamak için PHP $ global değişkenler güvenmek zorunda kalmazsınız Rails yerleşik büyük yardımcı yöntemler de vardır. En yaygın şunlardır:

#looks in public/stylesheets and assumes it's a css file
stylesheet_link_tag "filename_without_extension"

#looks in public/javascripts and assumes it's a js file
javascript_include_tag "jquery"

Tabii ki, bu bölümlerin her biri çok daha ayrıntılı üzerine anlatmış olabilir ve bu sadece yüzeyi fırçalıyor. Daha fazla detay için aşağıdaki göz atın:

http://guides.rubyonrails.org/layouts_and_rendering.html

Tamam işleri önerdi neler. Sürece print_top_html ve print_bottom_html senkronize kalmak (ve bu kontrol için otomatik testler kullanabilirsiniz) gibi, daha sonra {odaklanmak bırakarak, yine onlar hakkında endişelenmenize gerek asla Sitenin [(2)]} içerik - ortasında şeyler.

Alternatif olarak, print_top_html birleştirebilir ve print_bottom_html tek bir çağrı içine ve ortasında bir yere HTML kodunu (veya bir geri) göndermek.

Ben (Rails çok benzer) Zend_View in Partials sistemini kullanın. Kısmi aslında kendi değişken kapsamı olan küçük bir HTML şablon. Bu gibi içeride manzaralı çağrılabilir:

<?php echo $this->partial('my_partial.phtml', array( 'var1' => $myvar ));

Yapı içine geçmiş olsun değişkenler kısmi kendi içinde yerel değişkenlere bağlı olsun. Yeniden kullanım için çok kullanışlı.

Eğer normal bir görünümde koyarak rahat hissederim daha karmaşık mantığı var nerede bir yardımcı nesnesi yazıyorsanız da, normal kod içindeki kısmi hale getirebilir.

public function helperFunction()
{
   // complex logic here

   $html = $this->getView()->partial('my_partial.phtml', array('var1' => $myvar ));
   return $html;
}

Sonra görünümünde

<?php echo $this->myHelper()->helperFunction(); ?>