it-swarm.cn

通过插件代码处理大型HTML输出

我最近编写了我的第一个WP插件,它添加了一个用于在帖子中嵌入自定义jquery图库的短代码。它主要是将大量的HTML转储到帖子中,以及初始化所需的javascript。

但是,我必须在程序上构建HTML输出,作为PHP中的字符串。这种标签汤总是让我疯狂,我习惯于使用MVC框架,它提供辅助函数和用于生成HTML的部分模板之类的东西。

需要管理大量动态构建的HTML或JS的插件作者的一般方法是什么?

9
Bryan M.

@Byran M.我倾向于使用两种结构,我经常看不到其他WordPress开发人员经常使用,这让我感到惊讶,但我非常喜欢它们。

1.)Heredocs

您可以将大块文本存储为 heredocs 字符串,这可能看起来像这样,所以我可以存储担心混合单引号和双引号:

   $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名称,那么我的IDE 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);         
}   
12
MikeSchinkel

结帐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();

然后你可以在你需要它的地方返回$ includedhtml,它可以让你的html内容分开,不必在php字符串里面全部回应。

5
Todd Perkins

我实际上并没有使用这个框架,但它提供的模板模型可能会吸引人。您可能想看看作者如何设置它。

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

模板=========只要有可能,我们应该将PHP与HTML分开。在Wordpress中,你会看到两者混合在一起而不用担心。虽然这通常是做事的“简单方法”,但几乎从来都不是“正确的方式”。相反,我们应该将两者分开,从而保持我们的逻辑纯洁,我们的观点愚蠢。为此,我们有$ 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>
4
marfarma

这取决于HTML和JS的类型。

JavaScript的

首先,尽可能将动态部件与静态部件分开。然后在运行时加载您需要的任何动态变量,并将静态脚本排在标题(或页脚,无论如何)中。但是这样,你的大多数JS都与你的PHP分开了。

HTML

这是在PHP中干净地构建代码的问题。如果你有大量的HTML要重复使用,我会将它们存储为单独的变量。然后在调用短代码时将事物拼凑在一起就像下面这样简单:

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

不是试图在程序上构建它,而是构建一个包含所有不同HTML块的对象(是的,PHP支持对象),然后指示它使用哪些数据以及传回哪些数据。这将为您节省大量时间。

2
EAMann