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

时间:2010-08-12 作者:Bryan M.

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

然而,我必须按程序构建HTML输出,在PHP中作为字符串。这种标签汤总是让我抓狂,我习惯于使用MVC框架,它提供帮助函数和生成HTML的部分模板。

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

4 个回复
最合适的回答,由SO网友:MikeSchinkel 整理而成

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

1.)Heredocs

您可以将大块文本存储为heredocs 字符串,这样我就可以存储对单引号和双引号混合的担忧:

   $html=<<<HTML
<input type="{$type}" size="{$size}" id="{$id}" class="{$class}" value="{$value}" />
HTML;
请注意,变量可以作为数组传递给函数,然后extract()或者你可以用其他方式分配它们。还要注意,我使用大括号并不是因为它们总是必需的,而是因为它们使代码更易于阅读。(当然可以使用以下功能:the_content() 与…有实质性的不同get_the_content() WordPress并不总是让这种编码方式变得容易。)

更重要的是,虽然它可能与您无关,但如果我使用诸如HTML、SQL等heredoc名称,那么我的IDEPhpStorm 执行语法注入,并在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);         
}   

SO网友:Todd Perkins

为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字符串中的所有内容分离开来。

SO网友:marfarma

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

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>

SO网友:EAMann

这取决于HTML和JS的类型。

JavaScript首先,尽可能地将动态部分与静态部分分开。然后在运行时加载所需的任何动态变量,并在页眉(或页脚,无论什么)中将静态脚本排队。但是这样,大部分JS都与PHP分离。

这是一个在PHP中干净地构建代码的问题。如果你有大量的HTML要重复使用,我会将它们存储为单独的变量。然后,在调用快捷码时,将所有内容拼接在一起非常简单:

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

结束

相关推荐

如何在WordPress中关闭标记的自动关闭标签(例如,HTML5或HTML4)?

我想在我的WordPress主题中使用HTML5,如何关闭wptexturize 我不介意增加休息时间,但我想让他们休息一下<br> 而不是<br />. 我如何控制这些中断在代码中的显示方式 EDIT: 我只在乎<br> 标签问题,我不介意它对排版的改变 EDIT2: 事实上,我想<img> 标签也很重要。任何自动关闭的独立标签在这里都很重要。所以<hr> 也可能是个问题。更不用说这些了wp_head() 项目作为<link> 各种