Новости Joomla

0 Пользователей и 1 Гость просматривают эту тему.
  • 74 Ответов
  • 3322 Просмотров
*

zeus07

  • Давно я тут
  • 723
  • 9 / 0
Здравствуйте!

Пишу модуль для вывода отзывов с сайта http://freelancehunt.com, использую их API. В настройках модуля есть вывод даты отзыва. Хочу сделать возможность выбора формата даты.

В модуле это реализовано вот так: http://clip2net.com/s/3uT31cZ. Суть в том,  что все даты отзывов лежат в массиве.
Вопрос: как делать выборку из массива, преобразовывать в нужный формат, и перезаписывать обратно в массив?

Подскажите пожалуйста.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Вопросом на вопрос
А пользовательский формат в приведенном скрине, что делает?
*

zeus07

  • Давно я тут
  • 723
  • 9 / 0
Это возможность пользователю прописать свой формат даты. По сути эти возможности из компонента Zoo (элемент date) уж очень понравилась эта возможность. Но вот как это в модуле сделать, пока не разберусь
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
если вы не будете использовать все значения массива то даты лучше преобразовывать перед выводом
в другом же случае foreach самый быстрый цикл в php
Код: php-brief
foreach($arr as &$value){
    $value['date'] = 'new date';
}
*

zeus07

  • Давно я тут
  • 723
  • 9 / 0
Наверное будет проще, если вы увидите кусок моего кода. Вот этот код отвечает за переключатель, который выводит дату:
Код
// Вывод времени отзыва 
$review_time = $params->get('review_time');
    if ($review_time == 1) {
    $rev_time_array = array();
    for ($i = 0; $i <= $reviews_count; $i++) {
        $rev_time = $json['reviews'][$i]['review_time'];
        // Добавляем в массив время отзывов
        $rev_time_array[] = $rev_time;
        // В массиве могут оказаться пустые значения, избавляемся от них
        $rev_time_array = array_diff($rev_time_array, $array_empty);
        }
    }

И вот у нас есть массив в таком формате:
Код
Array ( [0] => 2015-05-07T16:42:14+03:00 [1] => 2014-10-31T22:22:02+02:00 )

И мне бы хотелось, чтобы у пользователя была возможность выбрать нужный формат даты. В моём примере в массиве дата выводится в полном формате.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Код: php-brief
print_r(date_parse('2015-05-07T16:42:14+03:00'));
дальше из массива собирайте как вам нужно
или так
Код: php-brief
$date = date_create('2015-05-07T16:42:14+03:00');
echo date_format($date, "Y/m/d H:i:s");
*

zeus07

  • Давно я тут
  • 723
  • 9 / 0
Код: php-brief
print_r(date_parse('2015-05-07T16:42:14+03:00'));
дальше из массива собирайте как вам нужно

А как мне через date_parse взять элемент из массива именно?
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Код: php-brief
foreach($json['reviews'] as &$review){
    if(empty($review['review_time'])) continue;
    $review['review_time'] = date_format(date_create($review['review_time']), "Y/m/d H:i:s"); //нужный формат здесь задаем
}
*

zeus07

  • Давно я тут
  • 723
  • 9 / 0
Ага, Спасибо. И последнюю строку уже можно изменять по условию как я понимаю
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
да
Код: php
$format = 'Y/m/d H:i:s';
foreach($json['reviews'] as &$review){
    if(empty($review['review_time'])) continue;
    $review['review_time'] = date_format(date_create($review['review_time']), $format);
}
*

zeus07

  • Давно я тут
  • 723
  • 9 / 0
Нет, наверное всё-таки немного не так.
Дело в том,  что у меня уже есть чистый массив $rev_time_array и мне надо из него брать дату, преобразовывать в нужном формате, и перезаписывать элемент массива
*

buyanov

  • Захожу иногда
  • 188
  • 29 / 1
  • Сайты 74
Привет, а даты приходят в таком формате из API?
Почему бы не использовать для всего этого колдовства с датами стандартные возможности Joomla например класс JDateTime и JText?
Создание сайтов, интернет-магазинов, оптимизация, продвижение, хостинг, безопасность, лечение от вирусов - мой сайт, телега, Хостинг
*

zeus07

  • Давно я тут
  • 723
  • 9 / 0
Привет, а даты приходят в таком формате из API?
Почему бы не использовать для всего этого колдовства с датами стандартные возможности Joomla например класс JDateTime и JText?

Привет. Да, вот я в сообщении указал, в каком виде у меня массив с датами получается. Спасибо, почитаю про JDateTime. В PHP пока что начинающий, поэтому не всё ещё понимаю)
*

buyanov

  • Захожу иногда
  • 188
  • 29 / 1
  • Сайты 74
Попробуйте так

JHtml::date(JFactory::getDate('2015-05-07T16:42:14+03:00'), JText::_('DATE_FORMAT_LC1'));

Форматы в русской локализации Joomla

DATE_FORMAT_LC="d.m.Y"
DATE_FORMAT_LC1="d.m.Y"
DATE_FORMAT_LC2="d.m.Y H:i"
DATE_FORMAT_LC3="d F Y"
DATE_FORMAT_LC4="d.m.Y"
DATE_FORMAT_JS1="d.m.y"

UPD а если хочется давать возможность пользователю задавать свой формат, то дату лучше хранить в юнкс формате
Создание сайтов, интернет-магазинов, оптимизация, продвижение, хостинг, безопасность, лечение от вирусов - мой сайт, телега, Хостинг
*

zeus07

  • Давно я тут
  • 723
  • 9 / 0
Вот в этой строке JHtml::date(JFactory::getDate('2015-05-07T16:42:14+03:00') мне нужно получается выбирать именно элемент массива.

Получается надо как-то так: JHtml::date(JFactory::getDate('$rev_time_array[$i]')?
*

buyanov

  • Захожу иногда
  • 188
  • 29 / 1
  • Сайты 74
Да JFactory::getDate первым аргументом принимает дату для преобразования, да и вообще много чего можно туда скормить даже например такое 'now +1 day' =)
Создание сайтов, интернет-магазинов, оптимизация, продвижение, хостинг, безопасность, лечение от вирусов - мой сайт, телега, Хостинг
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
А почему это
Код: php-brief
print_r(date_parse('2015-05-07T16:42:14+03:00'));
дальше из массива собирайте как вам нужно
или так
Код: php-brief
$date = date_create('2015-05-07T16:42:14+03:00');
echo date_format($date, "Y/m/d H:i:s");
вас не устраивает?
Не будь паразитом, сделай что-нибудь самостоятельно!
*

zeus07

  • Давно я тут
  • 723
  • 9 / 0
А почему этовас не устраивает?

Подскажите как это правильно применить к массиву?
*

buyanov

  • Захожу иногда
  • 188
  • 29 / 1
  • Сайты 74
echo date_format(date_create('2015-05-07T16:42:14+03:00'), "d.m.Y H:i");
echo date_format(date_create('2015-05-07T16:42:14'), "d.m.Y H:i");

Вернут одно и тоже!
Создание сайтов, интернет-магазинов, оптимизация, продвижение, хостинг, безопасность, лечение от вирусов - мой сайт, телега, Хостинг
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Подскажите как это правильно применить к массиву?
А вы хоть делали
Код: php-brief
print_r(date_parse('2015-05-07T16:42:14+03:00'));
?
Не будь паразитом, сделай что-нибудь самостоятельно!
*

buyanov

  • Захожу иногда
  • 188
  • 29 / 1
  • Сайты 74
Код: php
$user_format = 'd.m.Y H:i';
$date_arr = $params->get('date_arr', array());
if (!empty($date_arr))
{
foreach($date_arr as &$date)
{
$date = (string) JFactory::getDate($date)->format($user_format);
}
}
$params->set('date_arr', $date_arr);

Сразу обращу внимание что Joomla преобразует время в этой дате к гринвичу, чтобы учесть еще и время которое указано в настройках нужно ей сказать об этом добавив аргумент команде format

Код: php
$date = (string) JFactory::getDate($date)->format($user_format, true);
« Последнее редактирование: 28.02.2016, 22:16:14 от buyanov »
Создание сайтов, интернет-магазинов, оптимизация, продвижение, хостинг, безопасность, лечение от вирусов - мой сайт, телега, Хостинг
*

zeus07

  • Давно я тут
  • 723
  • 9 / 0
А вы хоть делали
Код: php-brief
print_r(date_parse('2015-05-07T16:42:14+03:00'));
?

Пробовал, выводит такой массив:
Код
Array ( [year] => 2015 [month] => 5 [day] => 7 [hour] => 16 [minute] => 42 [second] => 14 [fraction] => 0 [warning_count] => 0 [warnings] => Array ( ) [error_count] => 0 [errors] => Array ( ) [is_localtime] => 1 [zone_type] => 1 [zone] => -180 [is_dst] => ) 

Я читал об этой функции. НО! Ведь мне нужно сделать так, чтобы у меня в этой строке подставлялось содержимое элемента массива. Как это сделать? И как потом собрать дату так, как мне необходимо?
*

zeus07

  • Давно я тут
  • 723
  • 9 / 0
Код: php
$user_format = 'd.m.Y H:i';
$date_arr = $params->get('date_arr', array());
if (!empty($date_arr))
{
foreach($date_arr as &$date)
{
$date = (string) JFactory::getDate($date)->format($user_format);
}
}
$params->set('date_arr', $date_arr);

Сразу обращу внимание что Joomla преобразует время в этой дате к гринвичу, чтобы учесть еще и время которое указано в настройках нужно ей сказать об этом добавив аргумент команде format

Код: php
$date = (string) JFactory::getDate($date)->format($user_format, true);

А можно попросить немного прокомментировать код? А то не работал с объектом этим ни разу.
*

buyanov

  • Захожу иногда
  • 188
  • 29 / 1
  • Сайты 74
Код: php
// Это я чисто для примера взял формат типа от пользователя строчка
$user_format = 'd.m.Y H:i';
// $params это наверно объект класса \Joomla\Registry\Registry
// если это так то вытаскиваю параметры из моей выдуманной переменной date_arr (какая у тебя я не знаю)
// но предполагаю там найти массив, а если не нахожу то передаю значение по умолчанию array() можно 0
// передать что хочешь лишь бы проверить
$date_arr = $params->get('date_arr', array());
// проверяю есть ли в массиве данные
if (!empty($date_arr))
{
// из массива извлекаю элементы
// & - амперсанд - значит что я хочу чтобы PHP передавал значение по ссылке
// читаем тут http://php.net/manual/ru/language.references.pass.php
foreach($date_arr as &$date)
{
// JFactory - это фабрика объектов в Joomla она нам и вернет объект для преобразования даты
// format это метод объекта для преобразования даты
$date = (string) JFactory::getDate($date)->format($user_format);
}
}
// Преобразованный массив вернем на место
$params->set('date_arr', $date_arr);
Создание сайтов, интернет-магазинов, оптимизация, продвижение, хостинг, безопасность, лечение от вирусов - мой сайт, телега, Хостинг
*

zeus07

  • Давно я тут
  • 723
  • 9 / 0
Благодарю за комментарии, буду разбираться сейчас
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Я читал об этой функции.
Тогда сомневаюсь, что вы понимаете, для чего она нужна.
Код: php-brief
$date=date_parse('2015-05-07T16:42:14+03:00');
echo 'Год: '.$date['year'].'<br/>';
echo 'Месяц: '.$date['month'].'<br/>';
echo 'День: '.$date['day'].'<br/>';
Не будь паразитом, сделай что-нибудь самостоятельно!
*

zeus07

  • Давно я тут
  • 723
  • 9 / 0
Функция раскладывает дату на составляющие так сказать. И потом уже из них составляешь дату в том формате, в котором надо.
Это я понимаю.
Я не понимаю как мне использовать эту функцию таким образом, чтобы дата бралась из определённого элемента моего массива, то есть чтобы в этой строке я указал как-то так:
Код
$date=date_parse('$rev_time_array[$i]');
так можно сделать? Функция поймёт такую запись? Или это неверно?
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Код: php-brief
$date=date_parse($rev_time_array[$i]);
так можно сделать? Функция поймёт такую запись? Или это неверно?
Я бы на вашем месте уже 100 раз сам пробовал и делал выводы.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

zeus07

  • Давно я тут
  • 723
  • 9 / 0
Код: php-brief
$date=date_parse($rev_time_array[$i]);
Я бы на вашем месте уже 100 раз сам пробовал и делал выводы.


Такая запись не работает, массив выводится пустой.
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Значит, $rev_time_array[$i] у вас пустая или в неправильном формате. Сами ищите, где делали ошибку, модуль ваш или наш?
Не будь паразитом, сделай что-нибудь самостоятельно!
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться