PHP 在页面上创建隐藏的超链接

PHP creating hidden hyperlinks on pages

我在 Joomla 3.9 网站上使用了一个自定义组件。

下面的代码从数据库创建带有适当锚点的超链接(2 个页面)并且工作正常,除了它还会创建不相关的隐藏链接。

如果您查看页面的源代码,您只能看到 href 链接。

<a href="https://www.example.com/main-category/sub-cat1/"></a>

我可以在这里尝试什么来确保代码不会创建这些隐藏链接?

 else:
JFactory::getDocument()->addStyleDeclaration('@media (max-width:540px){table.all-regions tr td{width: 100% !important;display: inline-block !important;text-align: center !important;}}');
$regionsList = '';
$regionsList .= '<table class="all-regions">';
    $regions = $this->get('regions');

    for($i = 0;$i <= count($regions); $i+=3):
        $regionsList .= '<tr>';
            $regionsList .= '<td style="width: 1%;padding: 9px; line-height: 24px;"><a href="'.JUri::root().'main-category/'.$country.'/'.strtolower(implode('-',explode(' ',$regions[$i]->region_name))).'">'.$regions[$i]->region_name.'</a></td>';
            $regionsList .= '<td style="width: 1%;padding: 9px; line-height: 24px;"><a href="'.JUri::root().'main-category/'.$country.'/'.strtolower(implode('-',explode(' ',$regions[$i+1]->region_name))).'">'.$regions[$i+1]->region_name.'</a></td>';
            $regionsList .= '<td style="width: 1%;padding: 9px; line-height: 24px;"><a href="'.JUri::root().'main-category/'.$country.'/'.strtolower(implode('-',explode(' ',$regions[$i+2]->region_name))).'">'.$regions[$i+2]->region_name.'</a></td>';
        $regionsList .= '</tr>';
    endfor;
$regionsList .= '</table>';
$text = JString::str_ireplace('{%regions_list%}', $regionsList, $this->article->text);

$this->setBreadcrumbs(
    array(
        'country'
    )
);
endif;

echo $text;

可能有用也可能没用的详细信息:

一个页面显示 3 个隐藏链接,另外 2 个隐藏链接。隐藏的链接指向我当前所在的同一页面。有 3 个隐藏链接的页面显示了 3 个偶数列链接,而有 2 个隐藏链接的页面有一行有 5 个链接,另外 2 行有 4 个链接

有更好的方法来完成这一切,但无需重写代码,您需要查看这些元素是否已设置且不为空,否则您将得到空锚点:

if(!empty($regions[$i]->region_name)) {
    $regionsList .= '<td style="width: 1%;padding: 9px; line-height: 24px;"><a href="'.JUri::root().'main-category/'.$country.'/'.strtolower(implode('-',explode(' ',$regions[$i]->region_name))).'">'.$regions[$i]->region_name.'</a></td>';
}
if(!empty($regions[$i+1]->region_name)) {
    $regionsList .= '<td style="width: 1%;padding: 9px; line-height: 24px;"><a href="'.JUri::root().'main-category/'.$country.'/'.strtolower(implode('-',explode(' ',$regions[$i+1]->region_name))).'">'.$regions[$i+1]->region_name.'</a></td>';
}
if(!empty($regions[$i+2]->region_name)) {
    $regionsList .= '<td style="width: 1%;padding: 9px; line-height: 24px;"><a href="'.JUri::root().'main-category/'.$country.'/'.strtolower(implode('-',explode(' ',$regions[$i+2]->region_name))).'">'.$regions[$i+2]->region_name.'</a></td>';
}

正如@AbraCadaver 所暗示的,您的代码可以使用一些 DRYing 和一些抛光。

与 Abra 建议的解决方案不同,对于有效的 html 标记,在 html table 的每一行中始终输出相同数量的单元格非常重要。如果特定索引处没有区域数据,则只打印一个空单元格。

与其重复相同的单元格标记文本并手动插入递增索引,不如使用单元格模板字符串和 for() 循环。

我还建议将所有样式移动到 css 声明并引用 .all-regions td

建议重写(未测试)

$html = '<table class="all-regions">';
$cellTemplate = '<td style="width: 1%; padding: 9px; line-height: 24px;"><a href="%smain-category/%s/%s">%s</a></td>';
$regions = $this->get('regions');
foreach (array_chunk($regions, 3) as $chunk) {
    $html .= '<tr>';
    for ($i = 0; $i < 3; ++$i) {
        if (!isset($chunk[$i])) {
            $html .= '<td></td>';
        } else {
            $html .= sprintf(
                $cellTemplate,
                JUri::root(),
                $country
                strtolower(str_replace(' ', '-', $chunk[$i]->region_name)),
                $chunk[$i]->region_name
            );
        }
    }
    $html .= '</tr>';
}
$html .= '</table>';
$text = JString::str_ireplace('{%regions_list%}', $html, $this->article->text);

$this->setBreadcrumbs(['country']);