让PHP str_replace与Joomla一起工作


Getting PHP str_replace to work with Joomla

如您所知,Joomla组件使您能够通过将模板文件复制到站点模板中来覆盖其输出。Joomla组件通常使用无法覆盖的帮助程序文件。

我有一个包含字符串的助手.php文件:

$specific_fields_text = '<tr><td class="key">'.$specific_field_title.': </td><td class="kr_sidecol_subaddress">'.$specific_fields[$i]->text.' '.$specific_fields[$i]->description.'</td></tr>';

在我的模板覆盖中是代码:

<table border="0" cellpadding="2" cellspacing="0">
  <?php echo koparentHTML::getHTMLSpecificFields($this->specific_fields); ?>
</table>

输出如下:

<table border="0" cellpadding="2" cellspacing="0">
  <tr>
    <td class="key">title</td>
    <td class="kr_sidecol_subaddress">value</td>
  </tr>
  <tr>
    <td class="key">title</td>
    <td class="kr_sidecol_subaddress">value</td>
  </tr>
    //.....etc......//
</table>

基本上我想摆脱表并将其转换为定义列表,但我无法修改帮助程序.php文件。我认为答案与str_replace有关

我试过使用:

<dl>
  <?php
    $spec_fields = koparentHTML::getHTMLSpecificFields($this->specific_fields);
    $spec_fields_dl = str_replace("<tr><td class='key'>'.$specific_field_title.': </td><td class='kr_sidecol_subaddress'>'.$specific_fields[$i]->text.' '.$specific_fields[$i]->description.'</td></tr>'", "<dt class='key'>'.$specific_field_title.': </dt><dd class='kr_sidecol_subaddress'>'.$specific_fields[$i]->text.' '.$specific_fields[$i]->description.'</dd>'", $spec_fields);
    echo $spec_fields_dl;
  ?>
</dl>

这将返回所有文本,但没有 html 标记(没有 tr、td、dt 等)。

您可以使用 PHP 轻松解析表数据,如以下示例所示:

$doc = new DOMDocument();
$doc->loadHTML(koparentHTML::getHTMLSpecificFields($this->specific_fields));
$rows = $doc->getElementsByTagName('tr');
$data = array();
for ($i = 0; $i < $rows->length; $i++) {
    $cols = $rows->item($i)->getElementsbyTagName("td");
    $data[$cols->item(0)->nodeValue] = $data[$cols->item(1)->nodeValue];
}
var_dump $data;

这应该将您的表转换为 assoc 数组("标题"=>"值")。我希望它有所帮助。

我已经想通了。出于某种原因,PHP位例如'.$specific_field_title.'阻止str_replace工作的地方。为了解决这个问题,我只是搜索了HTML元素并将它们放在一个数组中,如下所示:

echo str_replace(array('<tr><td class="key">', '</td><td class="kr_sidecol_subaddress">', '</td></tr>'),
array('<dt class="key">', '</dt><dd class="kr_sidecol_subaddress">', '</dd>'),
koparentHTML::getHTMLSpecificFields($this->specific_fields));

现在这完美地工作。感谢所有做出贡献的人。