Отобразить дату в ноде

Главные вкладки

Аватар пользователя alexbelkevich alexbelkevich 18 ноября 2013 в 16:43

Добрый день! Подскажите, как мне программно вывести дату создания ноды? Например анонс я вывожу так:

<div><?php print $node->title; ?></div>
<div><?php print render($content['body']) ?></div>

А какой параметр передать для даты?

Комментарии

Аватар пользователя alexbelkevich alexbelkevich 19 ноября 2013 в 10:15

Поменял в Конфигурации -> Дата и Время вывод даты... В ноде прописываю

<?php print $node->submitted; ?>

и пусто.. ничего нет. По идее же так тоже должно работать?

Аватар пользователя alexbelkevich alexbelkevich 19 ноября 2013 в 10:56

А такой еще вопрос. Мне надо разбить $date на 2 подстроки... Делаю так:
<?php $date=preg_split('/ /'$date);?>
А потом пытаюсь вывести <?phpprint $date[0].' ';?>
Но дата не выводится. А мне надо обязательно переменную разбить на две части, так как у меня строка "18 ноября". И число должно быть одним шрифтом, а месяц - другим..

Аватар пользователя alexbelkevich alexbelkevich 19 ноября 2013 в 11:19

А что не так? Локально я так делал, все нормально работает.. Или я где-то упустил что-то? Есть другое решение проблемы?

Аватар пользователя alexbelkevich alexbelkevich 19 ноября 2013 в 11:52

Хорошо. Спасибо. Просто я с друпалом настолько близко не работал. Не писал хуки и т.п. Думал, это можно как то обойти

Аватар пользователя alexbelkevich alexbelkevich 19 ноября 2013 в 13:47

Создал файл preprocess-node.inc. Там вписал

 switch ($date_put) {
    case 'small':
      $format = variable_get('date_format_short', 'd F');
      break;
    case 'large':
      $format = variable_get('date_format_long', 'd F');
      break;
    case 'custom':
      // No change to format.
      break;
    case 'medium':
    default:
      $format = variable_get('date_format_medium', 'd F');
  }
 
 

Вызываю переменную $date_put. Ничего не получается. Уверен, что сделал что-то не так. Но где?

Аватар пользователя alexbelkevich alexbelkevich 19 ноября 2013 в 13:55
function format_date($timestamp, $type = 'medium', $format = '', $timezone = NULL, $langcode = NULL) {
  if (!isset($timezone)) {
    global $user;
    if (variable_get('configurable_timezones', 1) && $user->uid && strlen($user->timezone)) {
      $timezone = $user->timezone;
    }
    else {
      $timezone = variable_get('date_default_timezone', 0);
    }
  }

  $timestamp += $timezone;

  switch ($type) {
    case 'small':
      $format = variable_get('date_format_short', 'm/d/Y - H:i');
      break;
    case 'large':
      $format = variable_get('date_format_long', 'l, F j, Y - H:i');
      break;
    case 'custom':
      // No change to format.
      break;
    case 'medium':
    default:
      $format = variable_get('date_format_medium', 'D, m/d/Y - H:i');
  }

  $max = strlen($format);
  $date_put = '';
  for ($i = 0; $i < $max; $i++) {
    $c = $format[$i];
    if (strpos('AaDlM', $c) !== FALSE) {
      $date_put .= t(gmdate($c, $timestamp), array(), $langcode);
    }
    else if ($c == 'F') {
      // Special treatment for long month names: May is both an abbreviation
      // and a full month name in English, but other languages have
      // different abbreviations.
      $date_put .= trim(t('!long-month-name ' . gmdate($c, $timestamp), array('!long-month-name' => ''), $langcode));
    }
    else if (strpos('BdgGhHiIjLmnsStTUwWYyz', $c) !== FALSE) {
      $date_put .= gmdate($c, $timestamp);
    }
    else if ($c == 'r') {
      $date_put .= format_date($timestamp - $timezone, 'custom', 'D, d M Y H:i:s O', $timezone, $langcode);
    }
    else if ($c == 'O') {
      $date_put .= sprintf('%s%02d%02d', ($timezone < 0 ? '-' : '+'), abs($timezone / 3600), abs($timezone % 3600) / 60);
    }
    else if ($c == 'Z') {
      $date_put .= $timezone;
    }
    else if ($c == '\\') {
      $date_put .= $format[++$i];
    }
    else {
      $date_put .= $c;
    }
  }

  return $date;
}

наверное все таки вот так правильней... Всю функцию ж надоь изменить. Но тоже толку ноль

Аватар пользователя serega111 serega111 19 ноября 2013 в 13:56

"alexbelkevich" wrote:
Создал файл preprocess-node.inc.

Боже мой, да предложите вы кому нибудь 300р на пиво и через пару часов у вас вывод даты так, как вы хотите. У вас же явно душа к программированию не лежит. Не насилуйте ни свой, ни коллективный мозг.

Аватар пользователя alexbelkevich alexbelkevich 19 ноября 2013 в 14:02

То есть если человек что-то не догоняет, то сразу "душа не лежит к программированию"? Мне надо, чтобы мне объяснили. Я из себя гуру не делаю. Мне научиться хочется. А не фрилансерам давать. С друпалом я недавно работаю. Эту бы задачу я спокойно решил бы стандартными PHP-функциями.

Аватар пользователя alexbelkevich alexbelkevich 19 ноября 2013 в 14:27

Изначально я вызывал функцию и передавал параметры

<?php
$date_f 
'format_date';
$date_f($timestamp'medium''d F'NULLNULL)
?>

Но это также не работало.

Аватар пользователя serega111 serega111 19 ноября 2013 в 14:28

"alexbelkevich" wrote:
Мне надо, чтобы мне объяснили.

1. Я вам скинул ссылку, где описаны все доступные переменные в файле node.tpl.php.
2. Ваш комментарий
"alexbelkevich" wrote:
Получилось вывести с помощью вот такой нехитрой конструкции

<?php print $date; ?>


3. Идем по моей ссылке и смотрим описание этой самой переменной $date
Quote:
$date: Formatted creation date. Preprocess functions can reformat it by calling format_date() with the desired parameters on the $created variable.

Там же описание $created
Quote:
$created: Time the node was published formatted in Unix timestamp.

4. Из описания $date узнаем, что можно в каких-то препроцесс функциях поменять формат даты. поиск по d.org и в гугл легко найдет нужный док для того, чтобы понять, что это такой. По моей ссылку смотрим комменты, там даже есть пример нужной нам препроцесс функции https://api.drupal.org/comment/51188#comment-51188
5. Смотрим описание функции format_date, ссылку вам даже в комментариях скинули.
6. Вам еще нужно разбить дату на две части. В гугле по запросу 'php разбить строку' первой ссылкой идет http://www.php.su/functions/?explode. Но вы же выбрали самый нестандартный вариант. Хотя в описании к preg_split есть примечание
Quote:

Если вам не нужна мощь регулярных выражений, вы можете выбрать более быстрые (хоть и простые) альтернативы наподобие explode() или str_split().

Вы не смогли выбрать всю эту инфу из комментов и доков, поэтому я и сказал, что

"serega111" wrote:
У вас же явно душа к программированию не лежит.

При этом, если перечитать комменты, можно еще с десяток разных способов найти, как вывести вашу дату.

Аватар пользователя serega111 serega111 19 ноября 2013 в 14:31

"alexbelkevich" wrote:

<?php
$date_f = 'format_date';
$date_f($timestamp, 'medium', 'd F', NULL, NULL)
?>

Извините за издевку, но это гениально, я считаю )

Аватар пользователя k_dmitry k_dmitry 19 ноября 2013 в 14:38

можно так:

    <?php if ($submitted) { ?>
     
    <div class="date-in-parts">
    <span class="day"><?php echo date("j"$node->created); ?></span>
    <span class="month"><?php echo date("M"$node->created); ?></span>
    <span class="year"><?php echo date("Y"$node->created); ?></span>
    </div><!--//date-in-parts -->
     
    <?php ?>

Аватар пользователя drupby drupby 19 ноября 2013 в 14:40

"alexbelkevich" wrote:
<?php
$date_f = 'format_date';
$date_f($timestamp, 'medium', 'd F', NULL, NULL)
?>
Но это также не работало.

мало того что точку с запятой не поставил , так еще результат выполнения функции никуда не записал
и документацию читать надо- если указываешь medium или другой формат кроме custom , третий параметр не имеет смысла указывать и 2 последних параметра необязательные - их указывают только в случае переопределения