вложенные данные в шаблоне усов

Я новичок в усах, и это мой первый проект, который я пробую. Я использую его с модулем kohana 3.2 и Kostache и PHP-реализацией усов.

У меня есть коллекция спортивных турниров, и в каждом из них есть много событий, и каждое событие имеет 3 объекта, которые я называю «исходом». Моя задача показать их все в одной таблице. Следующий шаблон показывает, как мне нужно, чтобы эта таблица отображалась.

{{#tournaments}}
    <h2>{{name}}</h2>
    <table class="event_list">
        {{#events.find_all}}
            <tr>
                <td>{{day}}</td>
            {{#outcomes.find_all}}
                <td class="outcome">{{name}}</td>
            {{/outcomes.find_all}}
            </tr>
        {{/events.find_all}}
    </table>
{{/tournaments}}

А теперь выходит моя проблема и соответственно вопрос. При показе «результатов» мне нужно прикрепить дополнительные классы к каждому файлу . Итак, я имею в виду, что у меня есть 3 «результата» для каждого события, и поэтому у меня есть 3 разных класса CSS для каждого из них. Но внутри цикла {{#outcomes.find_all}} я понятия не имею, это первая сущность, вторая или третья. Что я могу сделать по этому поводу?

Пытаясь решить эту проблему, я думал об использовании функций. Я подумал о добавлении функции в класс этого представления, которая будет отображать все «исходы» событий, и это может выглядеть так:

{{#tournaments}}
    <h2>{{name}}</h2>
    <table class="event_list">
        {{#events.find_all}}
            <tr>
                <td>{{day}}</td>
                {{print_outcomes}}
            </tr>
        {{/events.find_all}}
    </table>
{{/tournaments}}

Но, очевидно, мне нужно будет передать коллекцию «результатов» в эту функцию, и тогда я понял, что ничего не могу передать в эту функцию. Так как такие проблемы решаются в усах?

Также, если у меня есть очень простая функция, подобная этой:

public function print_outcomes(){
    return "<td>aa</td>";
}

он передаст его через url_encode перед выводом, чтобы я получил

&lt;td&gt;aa&lt;/td&gt;

это можно исправить?


person SET    schedule 08.07.2012    source источник


Ответы (2)


Вы можете попробовать использовать функцию в своей модели представления, подобную этой:

public function outcomes()
{
    $outcomes = ORM::factory('outcome')->find_all();

    $result = array();

    foreach ($outcomes as $outcome) 
    {
        $push = $outcome->object();

        $push['name']  = $outcome->name;
        $push['class'] = 'class_'.$outcome->name;

        $result[] = $push;
     } 
     return $result;
}

Тогда в усах у вас будет что-то вроде этого:

{{#outcomes}}
    <td class="{{class}}">{{name}}</td>
{{/outcomes}}
person dzeno    schedule 25.07.2012

Mustache не содержит логики, то есть вся необходимая вам логика (кроме простых проверок существования и циклов) должна выполняться путем включения логики в JSON, который вы используете в качестве входных данных.

По сути, вам нужно закодировать все переменные (например, классы css) в файл json.

Следуя вашему примеру, см. ниже JSON и шаблон (непроверенные, но это должно помочь вам)

JSON

{      
  tournaments:[
    {
      name: "tournamentA",
      events: [
        {
           day: "day1",
           outcomes:[
             {
                name: "outcomeTypeA",
                cssClass: "classA"
             },
             {
                name: "outcomeTypeB",
                 cssClass: "classB"
             },
             {
                name: "outcomeTypeC",
                cssClass: "classC"
             }
           ]
        },
        {
          //another event of tourA
        }
      ]
    }, 
    {
      //tournamentB, etc .
    }
  ] 
} 

ШАБЛОН

{{#tournaments}}
 <h2>{{name}}</h2>
 <table class="event_list">
     {{#events}}
         <tr>
             <td>{{day}}</td>
             {{#outcomes}}
                <td class="outcome {{cssClass}}">{{name}}</td>
             {{/outcomes}}
         </tr>
     {{/events}}
 </table> 
{{/tournaments}}

Действительно, вы также можете использовать функции аналогичным образом: то есть: вставлять функции в json там, где они вам нужны. В данном случае, хотя это было бы излишеством imho.

Но для ссылки что-то вроде:

JSON

{      
  tournaments:[
    {
      name: "tournamentA",
      events: [
        {
           day: "day1",
           outcomes:[
             {
                name: "outcomeTypeA",
                 cssClass: function(){
                    return "classA";
                 }
             },
             {
                name: "outcomeTypeB",
                 cssClass: function(){
                    return "classB";
                 }
             },
             {
                name: "outcomeTypeC",
                 cssClass: function(){
                    return "classC";
                 }
             }
           ]
        },
        {
          //another event of tourA
        }
      ]
    }, 
    {
      //tournamentB, etc .
    }
  ] 
} 

Поскольку это будет повторяться много раз, вы можете передать его помощнику.

ЯВАСКРИПТ:

 var myHelper = function(param){
   return "class"+param;
 }  

JSON

 .... {
        name: "outcomeTypeA",
        cssClass: function(){
          return myHelper("A");
        }
     },....

Или, возможно, лучше сделать вывод из «имени»

 .... {
        name: "outcomeTypeA",
        cssClass: function(){
          return myHelper(this); //this refers to object literal on this level 
                                 //containing 2 properties: 'name' and 'cssClass'
        }
     },....

А потом:

 var myHelper = function(obj){
   var param = obj.name.substring(obj.name.length-2); //get last char from 'name'-prop
   return "class"+param;
 }
person Geert-Jan    schedule 09.07.2012
comment
Я забыл упомянуть, что я использую PHP-реализацию усов, и я не могу использовать JSON с функциями здесь ( - person SET; 12.07.2012
comment
php реализацию усов вы имеете в виду? Хм, если это так, я предполагаю, что порту не хватает большой функциональности. Боюсь, я не могу вам помочь с этим, кроме как использовать предложенный нефункциональный маршрут, предложенный первым. - person Geert-Jan; 12.07.2012