Html 标签作为分隔符 PHP 内爆
Html tags as separator with PHP implode
我正在尝试关闭和打开结果之间的新标签,使用标签作为内爆中的分隔符。
代码如下:
$return = array();
if ($result && is_array($result) && sizeof($result)) {
foreach ($result as $row) {
$return[$row['id_feature']]['values'][] = $row['value'];
$return[$row['id_feature']]['name'] = $row['name'];
}
$tag = '</a><a>';
foreach ($return as $key=>$row) $return[$key]['value'] = implode($tag, $row['values']);
}
这是我的结果:
<td><a>Moderna</a><a>Classica</a></td>
看起来不错(在代码上),问题是在浏览器上的真实结果。
它看起来像这样(尝试使用 Chrome、Safari 和 Firefox):
Moderna</a><a>Classica
我想 post 截图,但我不能,因为我是 Whosebug 的菜鸟...
什么都试过了,还没找到原因。
怎么了?是功能还是我认为我可以使用 html 作为内爆的分隔符是错误的?
我会 post 完整代码,如您所愿:
public function getFrontFeatures($id_product, $separator = null, $id_feature = null) {
if (version_compare(_PS_VERSION_, '1.5.0.0', '>=')) {
$id_lang = (int)Context::getContext()->cookie->id_lang;
} else {
global $cookie;
$id_lang = $cookie->id_lang;
}
if ($separator == null) {
$config = $this->_getModuleConfiguration();
$separator = $config['featureSeparator'];
}
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
SELECT fp.id_feature, vl.value, fl.name
FROM `'._DB_PREFIX_.'feature_product` fp
LEFT JOIN `'._DB_PREFIX_.'feature_value` v ON (fp.`id_feature_value` = v.`id_feature_value`)
LEFT JOIN `'._DB_PREFIX_.'feature_value_lang` vl ON (v.`id_feature_value` = vl.`id_feature_value` AND vl.`id_lang` = '.(int)$id_lang.')
LEFT JOIN `'._DB_PREFIX_.'feature` f ON (f.`id_feature` = v.`id_feature`)
'.(version_compare(_PS_VERSION_, '1.5.0.0', '>=') && Shop::isFeatureActive() && Shop::getContext() == Shop::CONTEXT_SHOP ? Shop::addSqlAssociation('feature', 'f') : '').'
LEFT JOIN `'._DB_PREFIX_.'feature_lang` fl ON (fl.`id_feature` = f.`id_feature` AND fl.`id_lang` = '.(int)$id_lang.')
WHERE fp.`id_product` = '.(int)$id_product
. ($id_feature != null && $id_feature ? ' AND f.`id_feature` = '.(int)$id_feature : '')
. ' ORDER BY '
. (version_compare(_PS_VERSION_, '1.5.0.0', '>=') ? 'f.`position` ASC, ' : '')
. 'fp.`position` ASC');
$return = array();
if ($result && is_array($result) && sizeof($result)) {
foreach ($result as $row) {
$return[$row['id_feature']]['values'][] = $row['value'];
$return[$row['id_feature']]['name'] = $row['name'];
}
$tag = '</a><a>';
foreach ($return as $key=>$row) $return[$key]['value'] = implode($tag, $row['values']);
}
if ($id_feature != null && $id_feature && isset($return[$id_feature])) {
return $return[$id_feature]['value'];
} else {
return $return;
}
}
这是 .tpl 上的代码:
{if isset($features) && $features}
<!-- Data sheet -->
<section class="page-product-box visible-xs">
<h3 class="page-product-heading">{l s='Data sheet'}</h3>
<table class="table-data-sheet">
{foreach from=$features item=feature}
<tr class="{cycle values="odd,even"}">
{if isset($feature.value)}
<td>{$feature.name|escape:'html':'UTF-8'}</td>
<td><a>{$feature.value|escape:'html':'UTF-8'}</a></td>
{/if}
</tr>
{/foreach}
</table>
</section>
<!--end Data sheet -->
{/if}
而且...现在我不再是菜鸟了:D 我可以post 截图:
结果:
检查员:
希望这对您有所帮助...
implode 只需在数组中的每个元素之间添加 "</a><a>"
(因此,您无需在前后添加任何内容)
如果你在前面放一个 <a>
并在后面放一个 </a>
就可以了。
return[$key]['value'] = "<a>".implode($tag, $row['values'])."</a>"
在您的模板中,您正在使用转义。
<td><a>{$feature.value|escape:'html':'UTF-8'}</a></td>
但是您要转义的字符串包含 HTML。所以你的字符串
Moderna</a><a>Classica
将转换为
Moderna</a><a>Classica
这就是标签在浏览器中显示为文本而不是呈现为 HTML 的原因。 (您可以在 Inspector 包含的图像中看到 </a><a>
是黑色文本,而不是外部标签的颜色。)
很好,你正在转义你的输出。但是由于您从函数返回的内容将包含 HTML,因此您必须在函数中而不是在模板中进行转义。
$return[$row['id_feature']]['values'][] = htmlspecialchars($row['value']);
那你应该可以不用转义就可以使用模板中的值了
<td><a>{$feature.value}</a></td>
这将变得很明显,但我想我应该补充一点,当你准备好将 href
添加到你的 <a>
标签时,使用 implode 加入值,如这将不再有效(除非 link 将始终相同。)
我正在尝试关闭和打开结果之间的新标签,使用标签作为内爆中的分隔符。
代码如下:
$return = array();
if ($result && is_array($result) && sizeof($result)) {
foreach ($result as $row) {
$return[$row['id_feature']]['values'][] = $row['value'];
$return[$row['id_feature']]['name'] = $row['name'];
}
$tag = '</a><a>';
foreach ($return as $key=>$row) $return[$key]['value'] = implode($tag, $row['values']);
}
这是我的结果:
<td><a>Moderna</a><a>Classica</a></td>
看起来不错(在代码上),问题是在浏览器上的真实结果。
它看起来像这样(尝试使用 Chrome、Safari 和 Firefox):
Moderna</a><a>Classica
我想 post 截图,但我不能,因为我是 Whosebug 的菜鸟...
什么都试过了,还没找到原因。
怎么了?是功能还是我认为我可以使用 html 作为内爆的分隔符是错误的?
我会 post 完整代码,如您所愿:
public function getFrontFeatures($id_product, $separator = null, $id_feature = null) {
if (version_compare(_PS_VERSION_, '1.5.0.0', '>=')) {
$id_lang = (int)Context::getContext()->cookie->id_lang;
} else {
global $cookie;
$id_lang = $cookie->id_lang;
}
if ($separator == null) {
$config = $this->_getModuleConfiguration();
$separator = $config['featureSeparator'];
}
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
SELECT fp.id_feature, vl.value, fl.name
FROM `'._DB_PREFIX_.'feature_product` fp
LEFT JOIN `'._DB_PREFIX_.'feature_value` v ON (fp.`id_feature_value` = v.`id_feature_value`)
LEFT JOIN `'._DB_PREFIX_.'feature_value_lang` vl ON (v.`id_feature_value` = vl.`id_feature_value` AND vl.`id_lang` = '.(int)$id_lang.')
LEFT JOIN `'._DB_PREFIX_.'feature` f ON (f.`id_feature` = v.`id_feature`)
'.(version_compare(_PS_VERSION_, '1.5.0.0', '>=') && Shop::isFeatureActive() && Shop::getContext() == Shop::CONTEXT_SHOP ? Shop::addSqlAssociation('feature', 'f') : '').'
LEFT JOIN `'._DB_PREFIX_.'feature_lang` fl ON (fl.`id_feature` = f.`id_feature` AND fl.`id_lang` = '.(int)$id_lang.')
WHERE fp.`id_product` = '.(int)$id_product
. ($id_feature != null && $id_feature ? ' AND f.`id_feature` = '.(int)$id_feature : '')
. ' ORDER BY '
. (version_compare(_PS_VERSION_, '1.5.0.0', '>=') ? 'f.`position` ASC, ' : '')
. 'fp.`position` ASC');
$return = array();
if ($result && is_array($result) && sizeof($result)) {
foreach ($result as $row) {
$return[$row['id_feature']]['values'][] = $row['value'];
$return[$row['id_feature']]['name'] = $row['name'];
}
$tag = '</a><a>';
foreach ($return as $key=>$row) $return[$key]['value'] = implode($tag, $row['values']);
}
if ($id_feature != null && $id_feature && isset($return[$id_feature])) {
return $return[$id_feature]['value'];
} else {
return $return;
}
}
这是 .tpl 上的代码:
{if isset($features) && $features}
<!-- Data sheet -->
<section class="page-product-box visible-xs">
<h3 class="page-product-heading">{l s='Data sheet'}</h3>
<table class="table-data-sheet">
{foreach from=$features item=feature}
<tr class="{cycle values="odd,even"}">
{if isset($feature.value)}
<td>{$feature.name|escape:'html':'UTF-8'}</td>
<td><a>{$feature.value|escape:'html':'UTF-8'}</a></td>
{/if}
</tr>
{/foreach}
</table>
</section>
<!--end Data sheet -->
{/if}
而且...现在我不再是菜鸟了:D 我可以post 截图:
结果:
检查员:
希望这对您有所帮助...
implode 只需在数组中的每个元素之间添加 "</a><a>"
(因此,您无需在前后添加任何内容)
如果你在前面放一个 <a>
并在后面放一个 </a>
就可以了。
return[$key]['value'] = "<a>".implode($tag, $row['values'])."</a>"
在您的模板中,您正在使用转义。
<td><a>{$feature.value|escape:'html':'UTF-8'}</a></td>
但是您要转义的字符串包含 HTML。所以你的字符串
Moderna</a><a>Classica
将转换为
Moderna</a><a>Classica
这就是标签在浏览器中显示为文本而不是呈现为 HTML 的原因。 (您可以在 Inspector 包含的图像中看到 </a><a>
是黑色文本,而不是外部标签的颜色。)
很好,你正在转义你的输出。但是由于您从函数返回的内容将包含 HTML,因此您必须在函数中而不是在模板中进行转义。
$return[$row['id_feature']]['values'][] = htmlspecialchars($row['value']);
那你应该可以不用转义就可以使用模板中的值了
<td><a>{$feature.value}</a></td>
这将变得很明显,但我想我应该补充一点,当你准备好将 href
添加到你的 <a>
标签时,使用 implode 加入值,如这将不再有效(除非 link 将始终相同。)