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']);
我在 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']);