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


9

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

但是,我必须按程序将HTML输出构建为PHP中的字符串。这种标记汤总是让我发疯,并且我习惯使用MVC框架,该框架提供诸如辅助函数和用于生成HTML的部分模板之类的东西。

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

Answers:


12

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

1.)Heredocs

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

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

请注意,变量可以作为数组传递给函数,然后由extract()ed或您可以通过其他方式分配。还要注意,我使用花括号并不是因为总是需要花括号,而是因为它们使代码更易于阅读。(当然,与WordPress the_content()实质不同的功能get_the_content()并不总是使这种编码风格容易。)

而且,尽管可能与您无关,但是如果我使用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);         
}   

1
对于Heredocs +1,它们很棒,特别是在这种情况下。
没人在2010年

尚未真正有时间对此进行评估,但这似乎是我所需要的最简单的方法。
Bryan M.

+1用于数组/字符串串联。我经常做。它很容易构造字符串而没有多余的换行符和空格。
s_ha_dum

5

为PHP签出此功能:

http://php.net/manual/zh/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字符串中全部回显的内容分开。


4

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

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>

它只是使用输出缓冲,就像Todd Perkins在他的回答中描述的那样。
伊恩·邓恩2012年

2

这取决于HTML和JS的类型。

的JavaScript

首先,尽可能将动态部分与静态部分分开。然后在运行时加载所需的任何动态变量,并将静态脚本排入页眉(或页脚,无论如何)。但是这样一来,您的大多数JS就与PHP分离了。

的HTML

这是在PHP中干净地构建代码的问题。如果您有大量要重用的HTML,我会将它们存储为单独的变量。然后在调用短代码时将事情拼凑起来很简单:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.