formateando campos cck en un template

Cuando utilizaba un template (.tpl.php) para hacer el theming de un node creado a partir de un tipo de contenido cualquiera, solia imprimir los campos de esta manera:

<?
 php print $node->field_location[0]['value'];
?>

pero ...
en primer lugar, eso funciona bien para los campos texto, pero no todos son texto..
algunos son taxonomias.. que se mostrarian asi:

    <?php
      $term = taxonomy_get_term($node->field_city[0]['value']);
      print $term->name;
    ?>

pero ... (segundo pero) entonces tenemos los campos que son un date.
ahh, parece facil... pero no lo es, esta la cuestion del formato...

primer intento

<?php
  print content_format('field_date', $node->field_birthday[0], 'iso');
?>

nop...

segundo intento

// referenciado aca http://drupal.org/node/221151#comment-744973
// workaround here http://drupal.org/node/115706#comment-504436
$eventtime = strtotime($node->field_birthday[0]['value']);
$eventtime = $eventtime - 28800; //this is -8 hours for my timezone
echo date('m/d/Y \a\t g:ia', $eventtime);
 

este estaba mejor .. pero eso de restar el timezone era pan para hoy y
hambre para mañana....
segui investigando...
para hacer una historia larga corta, al final se muestra asi:

<?php
print format_date($node->field_birthday[0]['value'], 'custom','F j, Y');
?>

Los tipos de formato que aceptan las fechas son  "small", "medium", "large", y "custom" (como ya alguien dijo, similar a las pizzas ;).

custom utiliza la funcion del php, ejemplos:

<?php
// Assuming today is March 10th, 2001, 5:16:18 pm, and that we are in the
// Mountain Standard Time (MST) Time Zone

$today = date("F j, Y, g:i a");                 // March 10, 2001, 5:16 pm
$today = date("m.d.y");                         // 03.10.01
$today = date("j, n, Y");                       // 10, 3, 2001
$today = date("Ymd");                           // 20010310
$today = date('h-i-s, j-m-y, it is w Day');     // 05-16-18, 10-03-01,
1631 1618 6 Satpm01
$today = date('\i\t \i\s \t\h\e jS \d\a\y.');   // it is the 10th day.
$today = date("D M j G:i:s T Y");               // Sat Mar 10 17:16:18 MST 2001
$today = date('H:m:s \m \i\s\ \m\o\n\t\h');     // 17:03:18 m is month
$today = date("H:i:s");                         // 17:16:18
?>
 

mas referencias en

A tener en cuenta cuando trabajemos con fechas ...
Use drupals format_date to avoid localization issues

Instead of using php's date, use drupal's format_date to avoid problems with non-english dates.

format_date vs. date

To be simple and straight to the point: why

<?php
format_date(1238536800, 'custom', 'Y-m-d');
?>

and

<?php
date('Y-m-d', 1238536800);
?>

have different results? First one is 2009-03-31 (which is wrong), second one is 2009-04-01 (which is right).
Found a workaround:
http://drupal.org/node/187449

<?php
   $my_date = strtotime($node->field_date[0]['value']);
   $tz_offset = strtotime(date("M d Y H:i:s")) - strtotime(gmdate("M
d Y H:i:s"));
   $my_date += $tz_offset;
   print format_date($my_date, 'custom', 'D d F Y', NULL);
?>

Seems to fix the problem.

Aca se muestra otra forma que permite definir todo esto a traves de la interface web del drupal
http://www.leveltendesign.com/blog/dustin-currie/format-dates-drupal
sin embargo, no logre que me funcionara y no tuve tiempo para investigar que pasaba.

Retomando el inicio y para imprimir los campos se recomienda content_format()

INCORRECTO:

print $node->field_content_something[0]['value'];

CORRECTO:

print content_format('field_content_something', $node->field_content_something, $formatter = 'default', $node = NULL);

acorde a Greggles
http://growingventuresolutions.com/blog/drupal-security

con lo que el ejemplo inicial, quedaría asi:

 if ($node->field_location[0]['value']) {
     print content_format('field_location',$node->field_location[0], $text_formatter, $node);
   }