プラグインコードを介して大きなHTML出力を扱う
-
16-10-2019 - |
質問
最近、カスタムJQueryイメージギャラリーを投稿に埋め込むためのショートコードを追加する最初のWPプラグインを書きました。それは主に、初期化に必要なJavaScriptとともに、HTMLのかなりの部分を投稿に捨てるだけです。
ただし、PHPの文字列として、手続き的にHTML出力を構築する必要がありました。この種のタグスープは常に私にナットを駆り立てます。私は、HTMLを生成するためのヘルパー関数や部分的なテンプレートなどを提供するMVCフレームワークを使用することに慣れています。
動的に構築された大量のHTMLまたはJSを大量に管理する必要があるプラグイン著者の一般的なアプローチは何ですか?
解決
@byran M. 2つの構成要素を使用する傾向があります。他のWordPress開発者が頻繁に使用していることはあまりありません。
1.)heredocs
テキストの大きなブロックをASとして保存できます ヘレドック このように見えるかもしれない文字列は、シングルと二重引用符を混ぜることを心配することを保存できます:
$html=<<<HTML
<input type="{$type}" size="{$size}" id="{$id}" class="{$class}" value="{$value}" />
HTML;
変数は配列として関数に渡され、次に渡される可能性があることに注意してください。 extract()
edまたは他の方法でそれらを割り当てることができます。また、ブレースは常に必要であるためではなく、コードの読み取りを容易にするためではなく、ブレースを使用していることに注意してください。 (もちろん、ような関数があります the_content()
大幅に異なる get_the_content()
WordPressは常にこのスタイルのコーディングを簡単にするとは限りません。)
さらに、それはあなたに関係のないかもしれませんが、HTML、SQLなどのようなHeredoc名を使用した場合です。 phpstorm 構文注入を行い、Heredoc内のオートコンプリートと構文の着色を提供します。
2.)配列を使用した文字列連結
私が使用したい他のイディオムは、コンテンツをアレイに収集してから、 implode()
配列。私はこれをベンチマークしたことがないので、弦の連結が大きくなるにつれて繰り返しの弦の連結がキラーであることを知っているよりも役に立たないかもしれません(このアプローチが良くない理由を知っている人や、より良いアプローチを知っているなら私は'フィードバックを聞くのが大好きです):
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);
}
他のヒント
PHPのこの関数をチェックアウトします:
http://php.net/manual/en/function.ob-start.php
HTMLコードをPHP変数に含めるだけのファイルをバッファリングできます。これにより、メンテナンスがきれいになります。
だからあなたはこのようなものになります:
ob_start();
include('path/to/my/html/file.php');
$includedhtml = ob_get_contents();
ob_end_clean();
その後、必要な場所で$ acludthmlを返すことができ、HTMLコンテンツをPHP文字列内ですべてエコーしなければならないようにします。
私は実際にこのフレームワークを使用していませんが、それが提供するテンプレートモデルはおそらくアピールするでしょう。著者がそれをどのように設定したかを見てみたいと思うかもしれません。
https://github.com/emerson/sanity-wordpress-plugin-framework
テンプレート==========可能な限り、PHPをHTMLから分離する必要があります。 WordPress内では、2つが不安を伴わずに混ざり合っているのがわかります。これはしばしば物事を行う「簡単な方法」ですが、「正しい方法」ではありません。代わりに、2つを分離する必要があります。したがって、論理を純粋に保ち、見解を馬鹿にします。この目的のために、$ this-> render( 'my-template')メソッドがあります。いくつかの例:
// 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>
これは、HTMLとJSのタイプに依存します。
JavaScript
まず、動的部分を可能な限り静的部分から分離します。次に、実行時に必要な動的変数をすべてロードし、ヘッダー(またはフッターなど)で静的スクリプトをキューにします。しかし、このようにして、JSの大部分はPHPとは別です。
HTML
これは、PHPでコードをきれいに構築することの問題です。再利用するHTMLの巨大なチャンクがある場合は、それらを個別の変数として保存します。次に、ショートコードが呼び出されたときに物事をつなぎ合わせることは、次のように簡単です。
echo $firstblock;
echo $shortcodecontent;
echo $lastblock;
手続き的に構築しようとするのではなく、すべての異なるHTMLブロックを含むオブジェクト(はい、PHPがオブジェクトをサポートします)を作成し、使用するものとどのデータを渡すかを指示します。これにより、大量の時間を節約できます。