Smarty框架如果/ else语句总是进入"如果"部分

时间:2014-05-16 16:31:30

标签: php web smarty

在我网站的某个页面上(使用PHP和智能模板框架),我有一个显示信息的世界地图。我向用户提出了几种类型的颜色托盘,以帮助显示所显示信息的可见性。每次用户更改颜色托盘的选择时,我都会通过更改URL中的参数来重新加载页面。例如,

www.mywebsite.com/home.php?id=norm_d_maps&mpn=norms&FromMonth=05&FromDay=16&v=1&**palette=1**&labels=0&intervals=10&min=&max=&lon=-7836935.6349316&lat=6193233.778916&zoom=5

将成为

www.mywebsite.com/home.php?id=norm_d_maps&mpn=norms&FromMonth=05&FromDay=16&v=1&**palette=2**&labels=0&intervals=10&min=&max=&lon=-7836935.6349316&lat=6193233.778916&zoom=5

为了捕获该更改,如前所述,我使用新URL重新加载页面并捕获其每个参数并重新显示页面,如下所示:

$page = Map::fromId('468BE166-A38D-43C9-B61B-3AA72BC50210');

echo '<h1>' . fct_traduire('txt_norm_d_maps') . '</h1>';

$page->tplEngine->assign('LANGUAGE', $session->lang);
$page->tplEngine->assign('LOGGED_IN', $session->isLoggedIn());
$page->tplEngine->assign('MENU', generate_navigation( $GLOBALS['g_section'] ));
**$page->tplEngine->assign('PALETTE', $_GET['palette']);**
$page->tplEngine->assign('MIN', $_GET['min']);
$page->tplEngine->assign('MAX', $_GET['max']);
$page->openlayers_DailyNormalsAndExtremes($_GET['FromMonth'], $_GET['FromDay'], $_GET['v'], $_GET['labels'], $_GET['palette'], $_GET['intervals'], $_GET['lon'], $_GET['lat'], $_GET['zoom'], $_GET['clustered'], $_GET['min'], $_GET['max']);
$page->tplEngine->display('extends:map_layout.html|' . $page->display());

我使用这些选项的map_layout.html部分具有以下结构:

<div>
    <table>
        <tbody>
            <tr>
                **{if $PALETTE == 1}**
                <td with a certain background color>
                **{else}**
                <td with another background color>
                **{/if}**
                ...
            </tr>
            ...
        </tbody>
    </table>
</div>

不幸的是,即使URL中的palette参数是2,td节点每次都具有第一个if条件的背景颜色(因此,当它实际上= = 2时,它就像调色板== 1)。稍后在我的代码中,我使用MIN和MAX参数,每当我使用用户选择的新值重新加载页面时,它们似乎都会正确更改。

我在这里做错了什么?

编辑:我刚刚在我的网页上显示了调色板,最小和最大参数的值,而最小值和最大值确实是用户选择的好值,调色板参数是&#34;调色板&#34;而不是1或2或用户选择的任何其他整数..什么可能导致这个?

3 个答案:

答案 0 :(得分:0)

您应该仔细检查所有作业。您的代码似乎一切正常。 在将其分配给Smarty之前,您还应该检查$_GET['palette']的值。

使用简单的代码:

PHP中的

$smarty->assign('PALETTE', $_GET['palette']);

$smarty->display('index.tpl');

一切正常:

<div>
    <table>
        <tbody>
            <tr>
                {if $PALETTE == 1}
                <td with a certain background color>
                PALETTE 1
                {else}
                PALETTE 2
                <td with another background color>
                {/if}
                ...
            </tr>
            ...
        </tbody>
    </table>
</div>

答案 1 :(得分:0)

避免循环数据逻辑并获得相同结果的一种方法是使用CSS类。例如:

<style>
.palette_unknown { background-color: crimson; } /* if you see red, problem */
.palette_1 { background-color: orange; }
.palette_2 { background-color: limegreen; }
</style>

<table>
    <tr>
        <td class="palette_{$palette|default:'unknown'}">...</td>
    </tr>
</table>

避免使用逻辑块的一般思想是,您永远不必修改逻辑来更新样式。您可以使用一组不同的数据属性来智能地突出显示数据表或其他元素。

以这种方式做事会将您的问题与PHP文件隔离开来:分配不存在。

如果您的数据键/值/等包含对CSS类名称不起作用的不方便符号,则只需获取md5数据。例如,如果您的$palette恰好包含多行,例如"Hello this is a palette\n\nSecond sentence underneath it.",您可以这样做:

<td class="palette_{$palette|default:'unknown'|md5}">...</td>

定义这些样式是一些额外的步骤,但是,不会失败。或者至少它会优雅地降级。

<style>
.palette_ad921d60486366258809553a3db49a4a { color: crimson } /* red = bad :/ */
.palette_adaaa186794a24c85f591464121c0f7e { color: orange } /* big sentence */
</style>

请记住为所有CSS类添加前缀,因为md5哈希可以以数字开头。

答案 2 :(得分:0)

这里的问题是变量PALETTE已经被框架和/或代码中的其他地方所采用。一个简单的变量重命名修复它。