eklenti kodu ile büyük HTML çıktısı ile uğraşmak


9

Kısa süre önce, yayınlara özel bir jquery resim galerisi yerleştirmek için bir kısa kod ekleyen ilk WP eklentimi yazdım. Öncelikle, başlangıç ​​için gerekli javascript ile birlikte, iyi bir HTML yığınını gönderir.

Ancak, PHP çıktısı olarak, HTML çıktısını yordamsal olarak oluşturmak zorunda kaldım. Bu tür bir etiket çorbası her zaman beni deli ediyor ve yardımcı fonksiyonlar ve HTML oluşturmak için kısmi şablonlar gibi şeyler sağlayan MVC çerçeveleri ile çalışmaya alışkınım.

Çok miktarda dinamik olarak oluşturulmuş HTML veya JS'yi yönetmesi gereken eklenti yazarları için genel yaklaşım nedir?

Yanıtlar:


12

@Byran M. Sık sık kullandığım diğer WordPress geliştiricilerini sık görmediğim iki yapı kullanma eğilimindeyim, bu beni şaşırtıyor, ama onları çok seviyorum.

1.) Yorumlu metinler

Büyük metin bloklarını heredocs dizesi olarak şöyle görünebilir, böylece tek ve çift tırnakları karıştırmayla ilgili endişeleri saklayabilirim:

   $html=<<<HTML
<input type="{$type}" size="{$size}" id="{$id}" class="{$class}" value="{$value}" />
HTML;

Değişkenlerin bir fonksiyona dizi olarak geçirilebileceğini ve daha sonra extract()düzenlenebileceğini veya bunları başka şekillerde atayabileceğinizi unutmayın. Ayrıca, her zaman gerekli olduğu için değil, kodun okunmasını kolaylaştırdığı için parantezleri kullandığımı unutmayın. (Elbette WordPress'ten the_content()maddi olarak farklı olmak gibi işlevlerle get_the_content()bu kodlama tarzını her zaman kolay hale getirmez.)

Dahası, sizin için önemli olmasa da, HTML, SQL vb. Gibi yorumlu isimler kullanırsam IDE PhpStorm sözdizimi enjeksiyonu yapar ve heredoc içinde otomatik tamamlama ve sözdizimi renklendirmesi verir.

2.) Dizi Kullanarak Dize Birleştirme

Kullanmak istediğim diğer deyim, içeriği bir diziye ve sonra diziye toplamaktır implode(). Her ne kadar ben hiç karşılaştırılmış bu yüzden ben dizeleri daha büyük olarak tekrarlanan dize birleştirme bir katil olduğunu bildiğimden daha az yardımcı olabilir, ancak (kimse bu yaklaşımın neden daha iyi olmadığını bilir veya daha iyi bir yaklaşım biliyorsanız ben geribildirim duymak isterim):

function my_get_form_and_fields($input_items) {
    $html = array();
    $html[] = '<form name="my_form" method="get">';
    foreach($input_items as $input_item) {
        extract($input_item);
        $html=<<<HTML
<input type="{$type}" size="{$size}" id="{$id}" class="{$class}" value="{$value}" />
HTML;
    $html[] = '</form>';
    return implode("\n",$html);         
}   

1
Yorumlu metinler için +1, özellikle bu durumda harikalar.
kimse

Bunu değerlendirmek için gerçekten zamanım olmadı, ama ihtiyacım olan en basit yaklaşım gibi görünüyor.
Bryan M.

Dizi / dize birleştirme için +1. Bunu çok yaparım. Harici satırlar ve boşluklar olmadan dizeler oluşturmayı kolaylaştırır.
s_ha_dum

5

PHP için bu işlevi kontrol edin:

http://php.net/manual/en/function.ob-start.php

İçinde sadece html kodu içeren bir dosyayı bir php değişkenine arabelleğe alabilirsiniz. Bu, bakımını daha temiz hale getirecektir.

Böylece şöyle bir şey elde edersiniz:

ob_start();
   include('path/to/my/html/file.php');
   $includedhtml = ob_get_contents();
ob_end_clean();

Sonra sadece $ incluhtml İhtiyacınız olan yere dönebilirsiniz ve html içeriğinizi php dizeleri içinde yankılamak zorunda kalmadan ayrı tutar.


4

Aslında bu çerçeveyi kullanmadım, ancak sunduğu şablon modeli muhtemelen cazip olacak. Yazarın bunu nasıl ayarladığına bir göz atmak isteyebilirsiniz.

https://github.com/Emerson/Sanity-Wordpress-Plugin-Framework

Şablonlar ========= Mümkün olduğunda PHP'yi HTML'den ayırmalıyız. Wordpress içinde, ikisinin endişesiz bir şekilde karıştığını göreceksiniz. Bu genellikle işleri yapmanın "kolay bir yolu" olsa da, neredeyse hiçbir zaman "doğru yol" değildir. Bunun yerine, ikisini ayırmalıyız, böylece mantığımızı saf ve görüşlerimizi aptal tutmalıyız. Bu amaçla $ this-> render ('my-template') yöntemimiz var. Birkaç örnek:

    // From within a method in our controller
    $this->data['message'] = 'Pass this on to the template please';
    $this->render('my-template');

    // Meanwhile, in the /plugin/views/my-template.php file
    <h2>The Separation of Logic and Views</h2>
    <p><?php echo $this->data['message'];?></p>

Todd Perkins'in cevabında açıkladığı gibi, sadece çıktı tamponlaması kullanıyor.
Ian Dunn

2

Bu, HTML ve JS türüne bağlıdır.

JavaScript

Her şeyden önce, dinamik parçaları statik parçalardan mümkün olduğunca ayırın. Ardından, çalışma zamanında ihtiyacınız olan dinamik değişkenleri yükleyin ve statik komut dosyalarınızı üstbilgi (veya altbilgi, ne olursa olsun) sırasında sıraya alın. Ancak bu şekilde, JS'nizin çoğunluğu PHP'nizden ayrıdır.

HTML

Bu, PHP'de kodunuzu temiz bir şekilde oluşturma meselesidir. Yeniden kullanacağınız çok büyük HTML parçalarınız varsa, bunları ayrı değişkenler olarak saklarım. Daha sonra kısa kod çağrıldığında işleri bir araya getirmek şu kadar basittir:

echo $firstblock;
echo $shortcodecontent;
echo $lastblock;

Prosedürel olarak oluşturmaya çalışmak yerine, tüm farklı HTML bloklarınızı içeren bir nesne (evet, PHP nesneleri destekler) oluşturun, sonra hangisini kullanacağını ve hangi verilerin geri gönderileceğini belirtin. Bu size büyük zaman kazandırır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.