Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с section при реализации календаря 
:(
    Опции темы
CoderUA
Дата 20.7.2007, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 17.10.2005
Где: Ukraine

Репутация: нет
Всего: нет



При генерации календаря необходимо некоторые даты сделать ссылками, а остальные обычным текстом.

Существует массив с датами, которые нужно сделать ссылками - $dates.
Далее каждый елемент данного массива сравнивается с конкретной датой и в случае совпадения делает ее ссылкой.

Проблема возникает в следующем: условие проверяется, но даты выводятся по 2, 3, 4 раза, то есть
по столько раз, сколько елементов в массиве с датами событий
Код
code:1 1   2 2   3 3    4 4 



Получается, что

Код

{else}{$date|date_format:"%e"}



выполняется в любом случае.

Возможно нужно сравнивать не массив событий с датой, а дату с массивом событий.

Как это реализовать я не знаю.

Мой код выглядит следующим образом:

Код

<td class="day">
          {* Проверим дату на соответсвие такой же в переданном массиве, чтобы сделать из нее ссылку *}
          {section name=i loop=$dates}
              {if $dates[i].Date_action == $date|date_format:"%Y-%m-%d"}
                  <a href="{$link}{$date|date_format:$url_format}" title="{$dates[i].Title}">{$date|date_format:"%e"}</a>
              {else}
                  {$date|date_format:"%e"}
              {/if}
          {/section}
          </td>


Пробовал применить {debug}
вот основное, что выдает Smarty:

Код

    {$date}
    -------------------
    1185310800


    {$dates}
    --------------------
    Array (2)
    0 => Array (2)
      Date_action => 2007-07-21
      Title => Some action1
    1 => Array (2)
      Date_action => 2007-07-25
      Title => Some action1

PM MAIL ICQ   Вверх
SamDark
Дата 21.7.2007, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


Профиль
Группа: Участник
Сообщений: 1424
Регистрация: 25.7.2006
Где: Voronezh

Репутация: нет
Всего: 38



CoderUA, 
Я бы сделал это на php в виде модификатора и использовал как-то так:
Код

   {$date|linkIfExists}



--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
CoderUA
Дата 22.7.2007, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 17.10.2005
Где: Ukraine

Репутация: нет
Всего: нет



SamDark, можно чуть по-подробнее?
PM MAIL ICQ   Вверх
SamDark
Дата 23.7.2007, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


Профиль
Группа: Участник
Сообщений: 1424
Регистрация: 25.7.2006
Где: Voronezh

Репутация: нет
Всего: 38





--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
CoderUA
  Дата 25.7.2007, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 17.10.2005
Где: Ukraine

Репутация: нет
Всего: нет



Спасибо! Отличная идея! Уже реализовал. 

Может быть, кто-то сталкивался с плагином  Smarty Calendar plugin (автор Michael Yoon)
В нем бы поменять формат недели. Чтобы начиналась с понедельника, а не воскресенья.


Код

/*
 * Smarty plugin
 * -------------------------------------------------------------
 * File:     function.calendar.php
 * Type:     function
 * Name:     calendar
 * Purpose:  outputs a calendar
 * -------------------------------------------------------------
 */
function smarty_function_calendar($params, &$smarty)
{
  // Start input validation
  if (empty($params['url_format'])) {
    trigger_error('mandatory param is empty: url_format', E_USER_ERROR);
  }

  if (empty($params['year'])) {
    trigger_error('mandatory param is empty: year', E_USER_ERROR);
  }

  if (empty($params['month'])) {
    trigger_error('mandatory param is empty: month', E_USER_ERROR);
  }

  // The 'day' param is optional.

  // End input validation

  $url_format = $params['url_format'];
  $year = $params['year'];
  $month = $params['month'];
  $day = $params['day'];

  if ($day != '') {
    $selected_date = mktime(0, 0, 0, $month, $day, $year);
  }

  $prev_month_end = mktime(0, 0, 0, $month, 0, $year);
  $next_month_begin = mktime(0, 0, 0, $month + 1, 1, $year);

  $month_name = strftime('%B', mktime(0, 0, 0, $month, 1, $year));
  $prev_month_abbrev = strftime('%b', $prev_month_end);
  $prev_month_end_info = getdate($prev_month_end);
  $prev_month = $prev_month_end_info['mon'];
  $prev_month_year = $prev_month_end_info['year'];
  $prev_month_url = strftime("$url_format", $prev_month_end);

  $next_month_abbrev = strftime('%b', $next_month_begin);
  $next_month_url = strftime("$url_format", $next_month_begin);

  // TODO: make "week starts on" configurable: Monday vs. Sunday
  $day_of_week_abbrevs = array();
  for ($i = 0; $i < 7; $i++) {
    $day_of_week_abbrevs[] = 
      smarty_function_calendar__day_of_week_abbrev($i);
  }

  // Build a two-dimensional array of UNIX timestamps.
  $calendar = array();

  // Start the first row with the final day(s) of the previous month.
  $week = array();
  $month_begin = mktime(0, 0, 0, $month, 1, $year);
  $month_begin_day_of_week = strftime('%w', $month_begin);
  $days_in_prev_month =
    smarty_function_calendar__days_in_month($prev_month, $prev_month_year);
  for ($day_of_week = 0;
       $day_of_week < $month_begin_day_of_week;
       $day_of_week++) {
    $day = $days_in_prev_month - $month_begin_day_of_week + $day_of_week;
    $week[] =
      mktime(0, 0, 0, $month - 1, $day, $year);
  }

  // Fill in the days of the selected month.
  $days_in_month =
    smarty_function_calendar__days_in_month($month, $year);
  for ($i = 1; $i <= $days_in_month; $i++) {
    if ($day_of_week == 7) {
      $calendar[] = $week;

      // re-initialize $day_of_week and $week
      $day_of_week = 0;
      unset($week);
      $week = array();
    }
    $week[] = mktime(0, 0, 0, $month, $i, $year);
    $day_of_week++;
  }

  // Fill out the last row with the first day(s) of the next month.
  for ($i = 1; $day_of_week < 7; $i++, $day_of_week++) {
    $week[] = mktime(0, 0, 0, $month + 1, $i, $year);
  }
  $calendar[] = $week;

  // Generate the URL for today, which will be null if $selected_date is
  // today.
  $today = getdate();
  $today_date =
    mktime(0, 0, 0, $today['mon'], $today['mday'], $today['year']);
  if ($selected_date == $today_date) {
    $today_url = '';
  } else {
    $today_url = strftime($url_format, $today_date);
  }

  /*
  $calendar_smarty = new Smarty;

  // Copy the configuration of the enclosing Smarty template.
  $calendar_smarty->template_dir = $smarty->template_dir;
  $calendar_smarty->compile_dir = $smarty->compile_dir;
  $calendar_smarty->config_dir = $smarty->config_dir;
  $calendar_smarty->plugins_dir = $smarty->plugins_dir;
  $calendar_smarty->debugging = $smarty->debugging;
  $calendar_smarty->compile_check = $smarty->compile_check;
  $calendar_smarty->force_compile = $smarty->force_compile;
  $calendar_smarty->cache_dir = $smarty->cache_dir;
  $calendar_smarty->cache_dir = $smarty->cache_dir;
  $calendar_smarty->cache_lifetime = $smarty->cache_lifetime;
  */
  $smarty->assign('url_format', $url_format);
  $smarty->assign('month_name', $month_name);
  $smarty->assign('selected_date', $selected_date);
  $smarty->assign('month', $month);
  $smarty->assign('year', $year);
  $smarty->assign('prev_month_end', $prev_month_end);
  $smarty->assign('prev_month_abbrev', $prev_month_abbrev);
  $smarty->assign('next_month_begin', $next_month_begin);
  $smarty->assign('next_month_abbrev', $next_month_abbrev);
  $smarty->assign('day_of_week_abbrevs', $day_of_week_abbrevs);
  $smarty->assign('calendar', $calendar);
  $smarty->assign('today_url', $today_url);
  $smarty->assign('dates', $params['dates']);
  $smarty->assign('link', $params['link']);

  $smarty->display('calendar:month');
}

/* Helper functions for the plugin that replicate a subset of what
 * Date_Calc does (as well as MCAL); required for the plugin to work
 * without Date_Calc or MCAL installed.
 *
 * TODO: make it possible to use Date_Calc or MCAL if installed
 */

function smarty_function_calendar__is_leap_year($year)
{
  return (($year % 4 == 0 && $year % 100 != 0) || $year % 400 == 0);
}

function smarty_function_calendar__days_in_month($month, $year)
{
  switch ($month) {
  case 1:
  case 3:
  case 5:
  case 7:
  case 8:
  case 10:
  case 12:
  case 0: // == 12
    return 31;

  case 4:
  case 6:
  case 9:
  case 11:
    return 30;

  case 2:
    return smarty_function_calendar__is_leap_year($year) ? 29 : 28;

  default:
    assert(false);
  }
}

/**
 * @param int $day_of_week Sunday is 0, Monday is 1, etc.
 * @return string
 */
function smarty_function_calendar__day_of_week_abbrev($day_of_week)
{
  // January 2, 2000 is an arbitrary Sunday that serves as the basis for
  // using strftime() to get the localized name (or abbreviation) of the
  // specified day of week.
  $day = 2 + $day_of_week;
  $timestamp = mktime(0, 0, 0, 1, $day, 2000);

  return strftime('%a', $timestamp);
}
?>


PM MAIL ICQ   Вверх
Anarki
Дата 28.7.2007, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 14.3.2005

Репутация: нет
Всего: 11



Код

function smarty_function_calendar__day_of_week_abbrev($day_of_week)
{
  // January 3, 2000 is an arbitrary Monday that serves as the basis for
  // using strftime() to get the localized name (or abbreviation) of the
  // specified day of week.
  $day = 3 + $day_of_week;
  $timestamp = mktime(0, 0, 0, 1, $day, 2000);

  return strftime('%a', $timestamp);
}

Наверное так.
Найдите три отличия smile


--------------------
PM WWW   Вверх
CoderUA
Дата 30.7.2007, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 17.10.2005
Где: Ukraine

Репутация: нет
Всего: нет



Anarki, действительно, неделя теперь начинается с понедельника, но числа не соответствуют дням!

Это же можно было сделать вот так:
Код

// TODO: make "week starts on" configurable: Monday vs. Sunday
  $day_of_week_abbrevs = array();
  for ($i = 1; $i <= 7; $i++) {
    $day_of_week_abbrevs[] = 
      smarty_function_calendar__day_of_week_abbrev($i);
  }


А вот вопрос с правильностью вывода дат остается открытым...

Это сообщение отредактировал(а) CoderUA - 30.7.2007, 22:32
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Extensions | Следующая тема »


 




[ Время генерации скрипта: 0.0901 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.