2011-06-30 18 views
5

Quiero crear un formato de fecha php dinámico. Ejemplo: muestre la hora del nodo si se publicó hoy y solo el día/mes cuando es más antiguo que el día de hoy. Quiero que este formato esté disponible en Drupal como los otros formatos de fecha predefinidos en Drupal (no solo en el nivel de tema).Formato de fecha personalizado (devolución de llamada con lógica php)

Encontré el gancho (solo D7) para hook_date_format_types pero incluso ese no parece permitir una devolución de llamada donde podría definir esta lógica de PHP.

¿Alguien sabe qué gancho haría esto posible? O un módulo que hace esto?

+0

Si está mostrando esta fecha como un campo en una vista, entonces se podría usar el archivo plantilla de campo de una vista para manejar la lógica de PHP es necesario para obtener su salida deseada Por otro lado, si este no es un campo de fecha en una vista, y solo está usando el tiempo creado para el nodo, podría usar un archivo de plantilla de nodo para formatear la fecha. Yo soy sin tener en cuenta ninguna función de devolución de llamada que se pueda usar para formatos de fecha, es una idea interesante y definitivamente puedo ver algunas aplicaciones para ella. –

+0

Sí, sé que podría lograr esto a nivel de plantilla/preproceso, pero sería mucho limpio si pudiera crear un formato de fecha personalizado global real ... –

Respuesta

1

En Drupal6, format_date() tiene las fechas y horas codificadas. Además, format_date() no permite devoluciones de llamada, pero sí permite una cadena personalizada. Ahí es donde puedes aplicar un truco: en lugar de codificar la cadena allí, llamas a una función que devuelve una cadena.

function mydate_format($timestamp) { 
    $now = time(); 
    if (($now - $timestamp) < (60*60*24)) { 
    return "H:i"; 
    } 
    else { 
    return "d:m:Y"; 
    } 
} 

print format_date($timestamp, 'custom', mydate_format($timestamp)); 

La segunda opción es volver a definir una fecha-marca de tiempo, pero que es a la vez hacker y limitado. Los formatos de fecha se definen con variable_get(), pero no pasan la marca de tiempo junto con; por lo tanto, su ejemplo de cambio de formatos basado en el valor de la marca de tiempo no es posible de esta manera.

En settings.php:

$conf['date_format_long'] = $conf['debug'] ? 'r' : 'l, F j, Y - H:i'; 

Esto cambiará a partir de un valor a otro, en función de si su settings.php tiene una bandera "depuración" establecido en TRUE o no. Como se mencionó: el uso para esto es limitado, ya que no se puede obtener ningún contexto.

La tercera alternativa es usar Date API que ofrece formatos de tiempo configurables en línea. Pero eso es torpe e inseguro (ingresa PHP ejecutable en tu base de datos). También depende de un gran conjunto de módulos. Y tiene el mismo inconveniente que la primera solución: no puede usar format_date, pero debe usar una llamada de función modificada, en lugar de format_date(). Ver todas las opciones en The Drupal.org date themeing handbook.

GOTCHA En todos los casos, Drupal no llamará a esta función para el contenido en caché. Si desea que las fechas sean realmente dinámicas, debe evitar el almacenamiento en caché o implementar el formato de fecha en el cliente javascript.

TL; DR: No puede tener formatos de fecha dinámicos sin cambiar parte del código en el nivel de tema. Usar una función de devolución de llamada para generar el formato de fecha "personalizado" es la solución más simple y funcional.

0

Puede usar el módulo de API de fecha para agregar su formato de fecha personalizado. El módulo de API de fecha está dentro del módulo de fecha. Después de habilitar el módulo API de fecha, puede ir a la ruta "admin/settings/date-time/formats/add" para agregar su formato personalizado.

"admin/settings/date-time/formats/configure" es la ruta para configurar los formatos de fecha.

Eche un vistazo a estos. Feliz codificación.

Gracias RT

+0

Conozco el módulo API de fecha, pero esto no es lo que estoy buscando. Por favor revise la pregunta: Quiero agregar un formato que utiliza una devolución de llamada con alguna lógica php. NO es un formato simple que utiliza la sintaxis php date(). –

0

Usted puede ir a node.tpl.php (posiblemente en sites/all/themes/nombre_tema/node.tpl.php). Aquí puede encontrar la variable $ created, para reformatear la fecha en la que puede usar su función personalizada y cambiar el $ creado como desee. Después de esto, todos los nodos usarán las fechas formateadas.

Regatds, Chintan.

+0

Soy consciente de esto, pero esto todavía no es lo que estoy pidiendo. Quiero crear un formato personalizado php dinámico que se pueda usar en drupal. Su solución está en el nivel de plantilla y solo en un tpl específico. –

+0

¡¡Hola !! deberías modificar tu pregunta, es un poco confuso. Usted está pidiendo cambiar el formato de fecha para los nodos de todo el sitio, vea la parte en negrita es confusa. – Chintan

+0

Gracias, lo modifiqué un poco. Espero que sea más claro ahora. –

0

Utilice el módulo de funciones. Crea una característica.

En el módulo de características resultante, en el archivo [feature] .module, cree una función hook_nodeapi y formatee el campo con una declaración condicional que tenga en cuenta la fecha actual() de cómo se mostrará la fecha y aliméntela en el $ node-> contenido var.

Y esa es la forma rockstars lo harían (-;

+0

Me permito diferir – stefgosselin

Cuestiones relacionadas