Html标签作为PHP内爆的分隔符

时间:2015-05-27 16:24:22

标签: php html arrays implode

我正在尝试关闭并在结果之间打开一个新标记,在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我可以发布截图:

结果:

enter image description here

在检查员身上:

enter image description here

希望这会有所帮助......

2 个答案:

答案 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&lt;/a&gt;&lt;a&gt;Classica

这就是为什么标签在浏览器中显示为文本而不是呈现为HTML的原因。 (您可以在Inspector中包含的图像中看到</a><a>是黑色文本而不是外部标记的颜色。)

您正在逃避输出。但是,由于您从函数返回的内容将包含HTML,因此您必须在函数中而不是在模板中进行转义。

$return[$row['id_feature']]['values'][] = htmlspecialchars($row['value']);

然后你应该能够在不逃避的情况下使用模板中的值。

<td><a>{$feature.value}</a></td>

这很明显,但我想我应该补充一点,当你准备好将href添加到<a>标签时,使用implode加入像这样的值不再有效(除非链接总是相同的。)