我正在尝试关闭并在结果之间打开一个新标记,在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
我想发布截图,但我不能让我在stackoverflow上成为菜鸟......
我尝试了一切,但我还没有找到原因。
怎么了?是函数还是我错了以为我可以在implode上使用html作为分隔符?
我会按照您的要求发布完整的代码:
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我可以发布截图:
结果:
在检查员身上:
希望这会有所帮助......
答案 0 :(得分:1)
implode只需在数组中的每个元素之间添加<a>
(因此,您不会在之前和之后添加任何内容)
如果你之前加</a>
而return[$key]['value'] = "<a>".implode($tag, $row['values'])."</a>"
之后它会正常工作。
FacesContext ctxt = FacesContext.getCurrentInstance();
ConfigurableNavigationHandler configNavHandler = (ConfigurableNavigationHandler)ctxt.getApplication().getNavigationHandler();
NavigationCase navCase = configNavHandler.getNavigationCase(ctxt,null,"Page");
String toViewId = navCase.getToViewId(ctxt);
答案 1 :(得分:0)
在模板中,您正在使用转义。
<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加入像这样的值不再有效(除非链接总是相同的。)