4

第一次来这里,我希望我解释得足够好......

PHP/Smarty,我正在处理页面的一部分,该部分显示与一般页面或该页面上的各个位置相关联的注释的项目符号列表。有些地方没有注释。就像是:

一般的

  • 注1

纽约

  • 笔记2
  • 注3

波士顿

  • 注4

我有两个数组分配给我正在使用并由 UI 类填充的 .tpl:$places 和 $notes

$places包含地点对象,每个对象由 place_id 唯一

$notes包含唯一标识的笔记对象,每个对象可能有也可能没有 place_id 作为属性之一

这就是我的想法:

{if (**ANY NOTES EXIST IN $notes WITH NO place_id**)}
    <ul id="list-general">
        <h4>General</h4>
        {foreach from=**[NOTES WITH NO place_id]** item=note}
            <li id="note-{$note->get_id()}">$note->get_text()</li> 
    {/foreach}
    </ul>
{else}
    <ul id="list-general" class="hide">
        <h4>General</h4>
    </ul>
{/if}

{foreach from=$places item=place}
     {assign var=curr_place_id value=$place->get_id()}
     {if (**ANY NOTES EXIST IN $notes WHERE place_id == $curr_place_id**)}
     <ul id="list-{$curr_place_id}">
             <h4>{$place->get_name()}</h4>
             {foreach from=**[NOTES WHERE place_id == $curr_place_id]** item=note}
                 <li id="note-{$note->get_id()}">$note->get_text()</li> 
         {/foreach}
         </ul>
     {else}
        <ul id="list-{$curr_place_id}" class="hide">
            <h4>{$place->get_name()}</h4> 
        </ul>
     {/if}
{/foreach}

我对这一切都很陌生,而且我很难使用CAPS中的项目......所以,我的问题是:评估两个不同数组中对象属性的最佳方法是什么,以及可能构建仅包含我需要的注释的临时数组。

(如果您想知道,我正在创建隐藏节点,这样我就可以通过 javascript 访问它们而不必担心顺序)

4

1 回答 1

2

虽然我猜测在 Smarty 中可以做到这一点,但您似乎确实在此处混合了业务逻辑和表示逻辑。就个人而言,我会考虑在调用此模板的 PHP 中将您的数组拼接成两部分(一般和位置)。

$placesNotes = array();
$generalNotes = array();

array_filter($notes, function($note) {
    global $placesNotes, $generalNotes;
    if($note->get_place_id() == null) {
        $generalNotes[] = $note;
    } else {
        $placesNotes[$note->get_place_id()][] = $note;
    }
});

(注意:这使用匿名函数,因此仅 >5.3 - 如果您希望它在旧版本上运行,请将函数移动到它自己的命名函数并使用回调类型)

然后你会得到两个你可以轻松循环的数组,在 Places-loop 中使用 isset($notes_places.$curr_place_id) 来确定这个地方是否有任何注释。

此外,您忘记了 get_text() 调用周围的 {}。

我已经制作了一个快速示例,可以在以下位置找到:http: //gist.github.com/479392 - 希望有帮助吗?

顺便说一句:您的问题非常清楚,并解释了您想做什么,甚至详细说明了您所做的决定背后的决定,而这并不是很明显 - 所以第一次:很好的问题!

于 2010-07-17T09:11:42.877 回答