4

ここは初めてなので、これを十分に説明できれば幸いです...

PHP/Smarty、私は、一般的なページまたはそのページの個々の場所に関連付けられたメモの箇条書きリストを表示するページのセクションに取り組んでいます。メモがないところもあります。何かのようなもの:

全般的

  • 注1

ニューヨーク

  • 注2
  • 注3

ボストン

  • 注4

作業中の .tpl に 2 つの配列が割り当てられており、UI クラスによって値が取り込まれています: $places と $notes

$placesには、place_id ごとに一意の場所オブジェクトが含まれます

$notesには一意に識別されたメモ オブジェクトが含まれ、それぞれが属性の 1 つとして 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の項目に苦労しています...だから、私の質問は次のとおりです: 2 つの異なる配列内のオブジェクトの属性を評価する最良の方法は何ですか?必要なメモだけを含む一時配列を構築する可能性があります。

(ご参考までに、隠しノードを作成しているので、javascript 経由でそれらにアクセスでき、順序を気にする必要はありません)

4

1 に答える 1

2

Smarty でこれを行うことは可能だと思いますが、ここでビジネス ロジックとプレゼンテーション ロジックを混在させているようです。個人的には、このテンプレートを呼び出す PHP で配列を 2 つの部分 (一般と場所) にスプライシングすることを検討します。

$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 タイプを使用します)

Places-loop 内で isset($notes_places.$curr_place_id) を使用して、場所にメモがあるかどうかを調べると、簡単にループできる 2 つの配列になります。

また、get_text() 呼び出しの周りの {} を忘れていました。

http://gist.github.com/479392にある簡単なサンプルを作成しました。

ところで:あなたの質問は非常に明確で、あなたが何をしたいのかを説明し、すぐにはわからなかったときにあなたがしていたことの背後にある決定を詳述していました.

于 2010-07-17T09:11:42.877 に答える