Русскоязычный форум, посвященный фреймворку Kohana

Все о фреймворке Kohana. Обсуждение уроков, документации.
Текущее время: 13 ноя 2018, 10:41

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
СообщениеДобавлено: 12 окт 2012, 07:56 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
В общем слегка расширил хелпер Date, дополнив его константой ZERO и 2-мя полезными методами:

Код:
<?php defined('SYSPATH') or die('No direct script access.');

/**
 * Kohana Date Class Helper
 *
 * @package    Sskin
 * @category   Helpers
 * @author     Sergey Yakovlev
 * @copyright  (c) 2012 Anterra Group
 */
class Date extends Kohana_Date {
  const ZERO = 0;

  /**
   * New timestamp format for formatted_time
   * Example: D, d M Y H:i:s
   *
   * @var  string
   */
  protected static $_new_format = NULL;

  /**
   * Tries to read the date format settings from the configuration file.
   * Returns a date/time string with the specified timestamp format
   *     $time = Date::get_timestam_format();
   *
   * @link http://www.php.net/manual/datetime.construct Returns new DateTime object
   * @param string $config Configuration file
   * @param string $key The key in the configuration file that contains the date format
   * @uses Config Loads config form file
   * @return string Datetime format
   */
  public static function get_timestamp_format($config = 'site', $key = 'date_format')
  {
    if (is_null(self::$_new_format))
    {
      if (! Kohana::find_file('config', $config))
      {
        throw new Kohana_Exception('Configuration file not exists');
      }
      $app_config = Kohana::$config->load($config);
      self::$_new_format = ($app_config[$key]) ? $app_config[$key]: parent::$timestamp_format;
    }

    return self::$_new_format;
  }

  /**
   * Returns a datetime string with the specified timestamp format
   *
   *     $time = Date::formatted_datetime(time());
   *
   * @link    http://www.php.net/manual/datetime.construct
   * @param   string  $datetime_str       datetime string
   * @param   string  $timestamp_format   timestamp format
   * @return  string  Formated datetime
   */
  public static function formatted_datetime($datetime_str = NULL, $timestamp_format = NULL)
  {
    $datetime_str = (is_null($datetime_str)) ? time() : $datetime_str;
    $timestamp_format = (is_null($timestamp_format)) ? self::get_timestamp_format() : $timestamp_format;

    return date($timestamp_format, $datetime_str);
  }

} // End Date


Хелпер должен лежать в по адресу application/classes.

По порядку:
ZERO - я использую эту константу для удобства и читаемости в конфигурационных файлах. Например:
Код:
<?php defined('SYSPATH') or die('No direct script access.');

return array (
  'cookie_lifetime' => Date::WEEK,
  'session_lifetime' => Date::ZERO,
  'native_lifetime' => Date::HOUR,
);

Хотя это больше эстетическое улучшение, чем практическое.

get_timestamp_format - статичный метод для формирования формата даты. читает формат с конфигурационного файла $config и ключа $key. Например такой конфиг:
Код:
<?php defined('SYSPATH') or die('No direct script access.');

return array
(
  'cookie_lifetime' => Date::WEEK,
  'session_lifetime' => Date::ZERO,
  'native_lifetime' => Date::HOUR,
  'date_format' => 'Y.m.d',
);


В данном случае в $_new_format попадёт 'Y.m.d'. Если в конфиге 'date_format' пустой или не существует, тогда в $_new_format попадёт значение из родительского поля $timestamp_format. Если файл конфигов не найден - выскочит исключение. Обратите внимание на указанные мною значения по умолчанию

formatted_datetime - возвращает дату и/или время в отформатированном виде. Например вам нужно указать дату создания заказа в магазине, и есть некая переменная $order (инстанс ORM::factory('order')):
Код:
<?php echo Date::formatted_datetime($order->created) ?>


Все данные кешируются. С файла конфигов прочтётся один раз и далее будет использоваться статическое поле.
Вот и всё :ugeek:

P.S. Ах, да, забыл совсем :)
Имея такой хелпер, можно не заморачиваться с хранением дат в MySQL. И не нагружать вашу СУБД лишними телодвижениями.
Поле $order->created должно быть int и записи там должны быть типа 1350005555. Записать дату в таком формате можно так time(). Да что я вам говорю, подробнее здесь: http://www.php.net/manual/ru/function.time.php


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 12 окт 2012, 08:10 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
Если будет время (и я не забуду :lol: ), в следующий раз расширю хелпер Text, портировав в него возможность т.н. срезов из Python


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 12 окт 2012, 10:36 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 05 июн 2012, 03:08
Сообщения: 213
Че-то сложно для простого форматирования даты))

Зачем get_timestamp_format() с параметрами, если в formatted_datetime() он используется только так: self::get_timestamp_format() ?

Т.е. если get_timestamp_format() - хелпер - в нашем случае предполагается использование в шаблоне. Зачем нам в шаблоне get_timestamp_format() если там мы используем formatted_datetime() ?

А если не в шаблоне - зачем нам он нужен, когда формат можно прочитать из конфига, Kohana::$config->load($config) и то он скорее всего уже есть где-то выше в базовом контроллере и скорее всего можно сделать типа $this->config['timestamp_format'];

_________________
http://de-en.info (работает на Kohana 3.3)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 13 окт 2012, 04:24 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
AmberLEX писал(а):
Че-то сложно для простого форматирования даты))

Зачем get_timestamp_format() с параметрами, если в formatted_datetime() он используется только так: self::get_timestamp_format() ?

Т.е. если get_timestamp_format() - хелпер - в нашем случае предполагается использование в шаблоне. Зачем нам в шаблоне get_timestamp_format() если там мы используем formatted_datetime() ?

А если не в шаблоне - зачем нам он нужен, когда формат можно прочитать из конфига, Kohana::$config->load($config) и то он скорее всего уже есть где-то выше в базовом контроллере и скорее всего можно сделать типа $this->config['timestamp_format'];


Вообще, функцией get_timestamp_format() не подразумевалось пользоваться. По хорошему её надо скрыть из области видимости public. Я лишь показал, как она у меня реализована. Зачем она мне в шаблоне?

В шаблоне нужна formatted_datetime() и я лишь указал в get_timestamp_format() значения по дефолту. хотя конечно, можно доработать хелпер и сделать статические поля - аргументы-значения для get_timestamp_format() которые буду например инициализироваться в конструкторе


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 13 окт 2012, 11:32 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 05 июн 2012, 03:08
Сообщения: 213
Я уже себе так написал (так нагляндее):
Код:
class Date extends Kohana_Date
{
    public  static $config_name = 'app';
    private static $_app_config = NULL;

    /**
     * Возвращает время в формате из конфига
     *
     * @param null $timestamp
     * @return string
     */
    static function format_time($timestamp = NULL)
    {
        return self::_get_format('format_time', $timestamp);
    }

    /**
     * Возвращает дату в формате из конфига
     *
     * @param null $timestamp
     * @return string
     */
    static function format_date($timestamp = NULL)
    {
        return self::_get_format('format_date', $timestamp);
    }

    /**
     * Возвращает дату и время в формате из конфига
     *
     * @param null $timestamp
     * @return string
     */
    static function format_date_time($timestamp = NULL)
    {
        return self::_get_format('format_date_time', $timestamp);
    }

    /**
     * Возвращаем отформатированное по конфигу значение
     *
     * @param $key_format
     * @param $timestamp
     *
     * @return string
     * @throws Kohana_Exception
     */
    private static function _get_format($key_format, $timestamp)
    {
        if (self::$_app_config === NULL)
        {
            if ( ! Kohana::find_file('config', self::$config_name))
            {
                throw new Kohana_Exception('Configuration file not exists');
            }

            self::$_app_config = Kohana::$config->load(self::$config_name);
        }

        if ($timestamp === NULL)
            $timestamp = time();

        return date(self::$_app_config[$key_format], $timestamp);
    }
 
Если нужен формат не из конфига, используем функцию php date() и не морочим голову)
В конфиге
Код:
   'format_date_time' => 'd.m.Y H:i:s',
   'format_date' => 'd.m.Y',
   'format_time' => 'H:i:s',

Используем:
Date::format_date_time();
Date::format_date();
Date::format_time();

_________________
http://de-en.info (работает на Kohana 3.3)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 13 окт 2012, 12:05 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
Всё правильно сделал


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Все о фреймворке Kohana  | 
Powered by phpBB® Forum Software © phpBB Group