2016-02-27 3 views
1

Хотя данный код является PHP, мне нужен второй взгляд, общий алгоритм, псевдокод или что-то подобное решению.Список событий в таблице за каждый день недели

У меня есть коллекция объектов ($events) со свойствами:

  • event_name
  • date_from
  • date_to

У меня есть таблица с рабочими днями:

  Mon Tue Wed Thu Fri Sat Sun 
Starts *  *  *  *  *  *  * 
Ends  *  *  *  *  *  *  * 

ту же таблицу в HTML:

<table> 
     <thead> 
     <tr> 
      <th></th> 
      <th>Mon</th> 
      <th>Tue</th> 
      <th>Wed</th> 
      <th>Thu</th> 
      <th>Fri</th> 
      <th>Sat</th> 
      <th>Sun</th> 
     </tr> 
     </thead> 
     <tbody> 
     <tr> 
      <td><strong>Starts</strong></td> 
      <td>*</td> 
      <td>*</td> 
      <td>*</td> 
      <td>*</td> 
      <td>*</td> 
      <td>*</td> 
      <td>*</td> 
     </tr> 
     <tr> 
      <td><strong>Ends</strong></td> 
      <td>*</td> 
      <td>*</td> 
      <td>*</td> 
      <td>*</td> 
      <td>*</td> 
      <td>*</td> 
      <td>*</td> 
     </tr> 
     </tbody> 
    </table> 

Звездочка является просто заполнителем, и это не имеет значения.

Я бы хотел (а) показать event_name под эгидой. Среда, если событие начнется или закончится в среду. Конечно, если он начнется в среду (date_from - среда), я бы хотел его в строке Starts с понедельника, и если он закончится в среду (date_to - среда), мне бы это понравилось в строке Ends под Wed.

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

Решением было считать, что HTML и положить в каждой <td>*</td> вместо звездочки этих строки PHP (пример понедельник <td>):

<td> 
    foreach($events as $event) { 
    if($event->date_to == $week_start) { //Monday is start of the week 
     echo $event->name; 
    } 
    } 
</td> 

для вторника <td>, это было бы что-то вроде:

<td> 
    foreach($events as $event) { 
    if($event->date_to == $week_start + 1) { //Tuesday is start of the week + 1 day 
     echo $event->name; 
    } 
    } 
</td> 

... и так далее, но 14 из них foreach и if для каждого дня раз в два ряда, вероятно, так же глупо, как и получается :). Конечно, для Ends строка I сравнивает date_to недвижимость на день в вопросе.

Есть ли у кого есть концептуальный ответ? Как лучше подходить к этой проблеме?

P.S. Я работаю в Laravel, PHP MVC framework, поэтому я создаю коллекцию в контроллере и передаю ее в представление. Даты - это Carbon экземпляры, которые являются расширением PHP API для DateTime, поэтому доступны различные удобные методы определения дней (addDay(), startOfWeek() и т. Д.). HTML, о котором идет речь, может быть изменен, так как может быть структурой коллекции $events, если необходимо.

Благодарим вас за ваши идеи.

EDIT: Бонусные баллы за запятую после каждого event_name кроме последнего, в ячейке таблицы (<td>).

+0

Почему вы не используете лезвия шаблонизатор? – Enrico

+0

Укажите каждый «*» с помощью div/id и сразу установите значения из OnLoad fn или некоторого AJAX. (Нет - это не совсем то, о чем вы просите, но это может заставить вас начать) – ethrbunny

+0

@ Enrico - Я, но я удалил его здесь, чтобы сохранить его как можно более концептуальным. @ foreach и @ if используются. Есть ли у вас какая-либо другая идея, которая использовала бы вариант Blade, о котором я мог бы не знать? – TommyZG

ответ

0

1) PHP язык шаблонов единственным решением

прутик:

{% set days = ["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"] %} 

{% set event_1 = {"name":"event_1","date_from" : "monday", "date_to" : "monday"} %} 
{% set event_2 = {"name":"event_2","date_from" : "friday", "date_to" : "thursday"} %} 
{% set event_3 = {"name":"event_3","date_from" : "wednesday", "date_to" : "tuesday"} %} 
{% set event_4 = {"name":"event_4","date_from" : "saturday", "date_to" : "monday"} %} 
{% set event_5 = {"name":"event_5","date_from" : "sunday", "date_to" : "thursday"} %} 

{% set event_list = [event_1, event_2, event_3, event_4, event_5] %} 


<div class="container"> 
    <table class="table table-striped"> 
     <thead> 
     <tr> 
      {% for day in days %} 
       <th>{{ day }}</th> 
      {% endfor %} 
     </tr> 
     </thead> 
     <tbody> 
      <tr> 
       {% for day in days %} 
        <td> 
         {% for ev in event_list %} 
          {% if ev.date_from == day %} 
           {{ ev.name }} 
          {% endif %} 
         {% endfor %} 
        </td> 
       {% endfor %} 
      </tr> 
      <tr> 
       {% for day in days %} 
        <td> 
         {% for ev in event_list %} 
          {% if ev.date_to == day %} 
           {{ ev.name }} 
          {% endif %} 
         {% endfor %} 
        </td> 
       {% endfor %} 
      </tr> 
     </tbody> 
    </table> 
</div> 

2) Шаблон PHP язык + JQuery решение

прут

{% set days = ["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"] %} 


<div class="container"> 
    <table class="table table-striped"> 
     <thead> 
     <tr> 
      {% for day in days %} 
       <th>{{ day }}</th> 
      {% endfor %} 
     </tr> 
     </thead> 
     <tbody> 
      <tr id="event_start"> 
       {% for day in days %} 
        <td name="{{ day }}"> 
        </td> 
       {% endfor %} 
      </tr> 
      <tr id="event_end"> 
       {% for day in days %} 
        <td name="{{ day }}"> 
        </td> 
       {% endfor %} 
      </tr> 
     </tbody> 
    </table> 
</div> 

JQuery:

<script> 
    $(document).ready(function(){ 

     var event_list = { 
      event_1 : {event_name : "event_1", date_from : "monday", date_end : "sunday"}, 
      event_2 : {event_name : "event_2", date_from : "wednesday", date_end : "tuesday"}, 
      event_3 : {event_name : "event_3", date_from : "thursday", date_end : "friday"}, 
      event_4 : {event_name : "event_4", date_from : "saturday", date_end : "saturday"}, 
      event_5 : {event_name : "event_5", date_from : "friday", date_end : "tuesday"}, 
      event_6 : {event_name : "event_6", date_from : "monday", date_end : "thursday"} 
     }; 

     var first_row = $("#event_start"); 
     var second_row = $("#event_end"); 

     function loop (row, date) { 
      row.find("td").each(function(){ 
       var t = $(this); 
       var name = $(this).attr("name"); 
       $.each(event_list, function(key, value) { 
        if (value[date] == name) { 
         t.text(value.event_name); 
        } 
       }); 
      }); 
     } 

     loop(first_row, "date_from"); 
     loop(second_row, "date_end"); 

    }); 
</script> 
+1

Спасибо. Да, Blade имеет почти полностью такой же синтаксис. Это то же самое решение, оно все еще сводится к 14 'foreach''s и' if''s, за исключением, как вы сказали, это легче поддерживать. Я буду ждать еще немного, если у кого-то есть другой концептуальный подход, чтобы избежать этого множества циклов и условий. Если нет, я буду отмечать ваш ответ как наиболее полезный. Благодарю. – TommyZG

+0

Другим решением было бы заполнить таблицу через ajax. Использование методов DOM, которые можно сделать с меньшим кодом – Enrico

+0

Может ли это быть жизнеспособным решением для вас? – Enrico

Смежные вопросы