PHP / Smarty - Как проверить массив для объектов с определенными значениями и создать временный массив этих объектов - PullRequest
4 голосов
/ 17 июля 2010

Первый таймер, надеюсь, я объясню это достаточно хорошо ...

PHP / Smarty, я работаю над разделом страницы, в котором отображаются маркированные списки заметок, связанных либо с общей страницей, либо с отдельными местами на этой странице. В некоторых местах нет заметок. Что-то вроде:

Общее

  • примечание 1

Нью-Йорк

  • примечание 2
  • примечание 3

Boston

  • примечание 4

У меня есть два массива, назначенных для .tpl, с которыми я работаю, и заполненных классом пользовательского интерфейса: $ place и $ notes

$ place содержит объекты объектов, каждый из которых уникален по 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 и не беспокоиться о порядке)

1 Ответ

2 голосов
/ 17 июля 2010

Хотя я предполагаю, что это можно сделать в 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 - если вы хотите, чтобы она выполнялась в более старых версиях, переместите функцию в ее собственную именованную функцию и используйте тип Callback)

Затем вы получите два массива, которые вы легко зацикливаете, используя isset ($ notes_places. $ Curr_place_id) в цикле Places, чтобы выяснить, есть ли у места какие-либо заметки.

Кроме того, вы забыли {} вокруг вызовов get_text ().

Я быстро набрал образец, который можно найти по адресу: http://gist.github.com/479392 - надеюсь, это поможет?

Кстати: ваш вопрос был очень ясным и объяснил, что вы хотите сделать, даже подробно описав решение, которое вы делали, когда это было не сразу очевидно - так что впервые: отличный вопрос!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...