За последние 24 часа нас посетили 19006 программистов и 1615 роботов. Сейчас ищут 737 программистов ...

Сложный календарь, как реализовать?

Тема в разделе "Вопросы от блондинок", создана пользователем morbid, 19 июн 2008.

  1. morbid

    morbid Активный пользователь

    С нами с:
    19 июн 2008
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    Almaty
    hello world!, стоит задача написать календарь для турнирной таблицы по гольфу включающий себя вот эти пункты:
    • - Переключение между месяцами
      - 3 типа подсветки данных (Начало турнира - красным, каждое промежное число - серым, Конец турнира - белым)
      - Начало турнира являеться ссылкой
      - при наведении на начало турнира всплывает окошко с краткой информацией
    при условии что:
    • - в одном месяце может быть несколько турниров
      - данные беруться из mysql,и записаны они так:
    [sql]id name starttime stoptime description
    1 Отборочный тур 2008-5-05 2008-5-12 Бла-Бла
    1 Призовой турнир 2008-5-27 2008-6-04 Бла-Бла
    [/sql]

    визуально это выглядит вот так:
    [​IMG]

    вот третий день не могу представить как можно реализовать рабочий алгоритм постройки такого календаря, поппробывал много способов но ничего невыходит, может ктонить тут есть кто может щелчком пальца решить такую задачку? заранее оч благодарен ; )
     
  2. Anonymous

    Anonymous Guest

    Какова оплата щелчка пальцами? ;)
     
  3. morbid

    morbid Активный пользователь

    С нами с:
    19 июн 2008
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    Almaty
    миллион йен!
     
  4. dAllonE

    dAllonE Guest

    Ты на JS планируешь календарь строить или на php ?
     
  5. morbid

    morbid Активный пользователь

    С нами с:
    19 июн 2008
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    Almaty
    php, js только для вывода окошка с инфой при наведении
     
  6. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    70% могут решить тебе эту задачу... но не решат - это займет самое ценное - время!!
    Время которое оплачивается другими. Если хочешь - назначь цену и может кто-то, кто посвободнее тебе поможет! ;-)
     
  7. morbid

    morbid Активный пользователь

    С нами с:
    19 июн 2008
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    Almaty
    да я сам думаю решу я просто прошу помочь с тем как это примерно должно функционировать чтобы я уже додумал)
     
  8. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    В чём конкретно проблема? То что ты написал, не должно вызывать затруднений.
     
  9. morbid

    morbid Активный пользователь

    С нами с:
    19 июн 2008
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    Almaty
    ну вот сейчас у меня это вот так:

    PHP:
    1.         $f="0";
    2.                 $daysInMonth = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    3.                 for($i=1;$i<$daysInMonth[5];$i++){
    4.                     $start_dat = intval(substr($row['starttime'],-2));
    5.                     $stop_dat = intval(substr($row['stoptime'],-2));
    6.                    
    7. if($start_dat==$i){ $a='<span style="font-weight: bold; color: #636363;">'; $b="</span>"; }else { $a = ""; $b = "";}
    8. if($stop_dat==$i){ $c='<span style="font-weight: bold; color: #636363;">'; $d="</span>"; }else { $c = ""; $d = "";}
    9. if($start_dat==$i)  $e='style="font-weight: bold; color: #c21244;"'; else $e = "";
    10. if($stop_dat==$i)   $g='style="font-weight: bold; color: #ffffff;"'; else $g = "";
    11.    
    12.             echo '<div class="date" '.$e.$g.'>'.$a.$c.''.$i.''.$b.$d.'</div>';
    13.                    
    14. $f++;
    15.             if($f>7) {
    16.             echo '<div class="clear">&nbsp;</div>';
    17.             $f="0";                    
    18.             }
    19.         }
    20.  
    но он не подствечивает промежные числа при условии что они находяться с 27ого мая по 4 июня, он ужирняет 4 на тойже странице в мае [/code]
     
  10. Anonymous

    Anonymous Guest

    А ты думаешь, денег стоят усилия по нажатию клавиш для набора кода? Или денег стоит как раз - «подумать»?
     
  11. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    morbid
    Начни с изучения функция для работы с датами и временем - тебя ждет много чудных открытий! ;-)
     
  12. dAllonE

    dAllonE Guest

    я,например, похожий ваяю на JS из PHP только через AJAJ подгружаю события за текущий месяц.....
     
  13. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    PHP:
    1. <?php
    2. $date   = mktime(0, 0, 0, $_GET['месяц'], 1, $_GET['год']);
    3. $days   = date('t', $date);
    4. $offset = date('w', $date) - 1;
    5. $weeks  = ceil(($days + $offset) / 7);
    6.  
    7. $calendar['months']['this']['name'] = strftime('%B', $date);
    8. $calendar['months']['this']['link'] = date('Y/m', $date);
    9.  
    10. $prev = strtotime('-1 month', $date);
    11. $calendar['months']['prev']['name'] = strftime('%B', $prev);
    12. $calendar['months']['prev']['link'] =  date('Y/m', $prev);
    13.  
    14. $next = strtotime('+1 month', $date);
    15. $calendar['months']['next']['name'] = strftime('%B', $next);
    16. $calendar['months']['next']['link'] =  date('Y/m', $next);
    17.  
    18.  
    19. for ($i = 0; $i < $weeks; $i++)
    20.     for ($j = 1; $j <= 7; $j++){
    21.         $day = ($i * 7 + $j - $offset);
    22.  
    23.         if ($day > 0 and $day <= $days)
    24.             $calendar['days'][$day] = ($j >= 6 ? 'weekend' : 'workday');
    25.         else
    26.             $calendar['days'][($day - 100)] = false;
    27.     }
    28. ?>
    $calendar - это массив. $calendar['days'] - массив дней, а $calendar['months'] - месяцев (текущий, предыдущий, следующий).

    PHP:
    1. <?php
    2. foreach ($calendar['days']  as $day => $class)
    3. if ($day <= 0)
    4. //рисуем пустату
    5. else
    6. // рисуем ячейку таблицы с class="$class" - ибо это рабочий день или выходной
    Разберёшься, пологаю.

    Теперь нам нужен tooltip (всплывающая шняга). Я делал для себя с Prototype.js:
    [js]Event.observe(window, 'load', function(){
    var titles = $A(document.all || document.getElementsByTagName('*'));

    titles.find(function(node){
    if (node.tagName == 'IMG' && node.alt && !node.title)
    node.title = node.alt;

    if (node.tagName == 'A' && node.target == '_blank')
    node.title += (node.title ? ' ' : '') + '(откроется в новом окне)';

    if (node.title){
    var div = document.createElement('DIV');
    var object = Try.these(function(){
    return eval(node.title);
    })

    Element.extend(div);
    document.body.appendChild(div);

    div.setAttribute('id', 'tooltip');
    div.setStyle({'position': 'absolute', 'width': 'auto'}).hide();

    if (object){
    div.appendChild(object);
    object.show();
    } else {
    div.update(node.title.gsub(/\\n/, '<br />'));
    }

    node.removeAttribute('title');

    Event.observe(node, 'mousemove', function(event){
    if (!event.pageX && !event.pageY){
    var body = document.body;

    event.pageX = (event.clientX + body.scrollLeft + node.scrollLeft);
    event.pageY = (event.clientY + body.scrollTop + node.scrollTop);
    }

    div.setStyle({'left': (event.pageX + 15), 'top': (event.pageY + 15)}).show();
    })

    Event.observe(node, 'mouseout', function(event){
    div.hide();
    })
    }
    })
    })[/js]

    CSS тултипа:
    [css]#tooltip {
    background: #fff;
    border: 1px solid #000;
    color: #000;
    font-family: verdana, arial, helvetica, sans-serif;
    font-size: 11px;
    margin: 0;
    padding: 2px;
    }[/css]

    В итоге масивы готовые к использованию и впоне неплохой тултип.

    Последнее и самое важное: восхищайся моим гением три-пять минут.
     
  14. morbid

    morbid Активный пользователь

    С нами с:
    19 июн 2008
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    Almaty
    :eek: :eek: :eek:
    СПОСИБОО ВЫ НОСТОЯЙЩИЙ ДРУК! :eek: :eek: :eek:
     
  15. morbid

    morbid Активный пользователь

    С нами с:
    19 июн 2008
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    Almaty
    слушай чювак а подскажи еще как можно сверять по базе данных которую я указал выше и подсвечивать на твоем примере? а то я совсем запутался чтото
     
  16. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    слушай чювак. а может ты за меня всё работу сделаешь?
     
  17. morbid

    morbid Активный пользователь

    С нами с:
    19 июн 2008
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    Almaty
    ты такой милый!
     
  18. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Ты тоже ничего.
     
  19. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Трындец. Вот так и получают новички по 40к на работе. А чего? Начальник видит - работа сделана. На бабло.
     
  20. nimistar

    nimistar Активный пользователь

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    вспоминая фильм "Не грози южному централу" - с интересом жду развития событий :)
     
  21. morbid

    morbid Активный пользователь

    С нами с:
    19 июн 2008
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    Almaty
    у нас в казахстане за ето немного плотят)
     
  22. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Народ, да ладно вам. Мне просто хочется поделиться с миром своим гением. :)

    Руками и функцией вроде array_diff() или in_array() и т.д. смотри http://php.net.