Hola, estoy armando una pagina de noticias. Necesito que sobre el campo title (prederteminado de drupal) aparezca un campo de texto para poner lo que seria una volanta. Desde tipos de contenidos inserte un campo, pero no puedo lograr que se imprima sobre el title. Espero que me puedan ayudar.
La próxima vez que
La próxima vez que actualices drupal, te cargarás la "volanta". Es más que aconsejable, imprescindible, que te crees tu propio template.php si no quieres tener problemas.
listo la bendita volante
gracias chicos,
para la presentación como "teasers", añadi un campo, cree "node-notas.tpl.php" desde donde llame la volanta.
Para las "full pages", use el views, segun las indicaciones de mauro72. Para mostrar el bloque sobre el titulo cree una región, como mi tema no tiene un template.php, lo agregue en:
"/themes/engine/phptemplate" busque la funcion 'phptemplate_regions' y agrege:
'volanta' => t('volanta'),
y en "page.tpl.php" agrege esto sobre el title:
<?phpprint $volanta;
?>
Me alegra saber la
Me alegra saber la información te haya sido útil, sin embargo te aconsejo crear tu propio archivo "template.php" dentro de la carpeta del tema que estas usando, es mas conveniente de ese modo.
Suerte.
Hola siav; Imprimir el
Hola siav;
Imprimir el contenido de un campo sobre el titulo del nodo puede hacerse de varias formas. Primero te explico porque el campo que creaste no aparece sobre el titulo, la forma en que drupal imprime en pantalla una pagina viene dada por el código que aparece en el archivo "page.tpl.php", si abres ese archivo veras que el titulo del nodo se imprime antes que el contenido, como el campo que agregaste a tu cck es parte del contenido del nodo, siempre se imprime después del titulo.
Por otra parte, los nodos en drupal traen por defecto dos formas de ser mostrados, como "teasers" o como "page", teaser en la versión podríamos decir que abreviada del nodo y page es la versión completa. El código que controla la forma en que se verá el nodo se encuentra en el archivo "node.tpl.php".
Los archivos "page.tpl.php" y "node.tpl.php" se encuentran dentro de la carpeta del tema que estas usando, todos los temas de drupal traen esos archivos(garland, bluemarine, etc...).
Ejemplo:
Pero como un ejemplo vale mas que mil palabras y tiene casi la misma cantidad(de palabras digo), vamos a desarrollar tu pedido en un ejemplo.
Primero te voy a pedir que instales el Devel module en tu sitio, es muy útil para este tipo de asuntos.
Supongamos que utilizamos el cck "Story" que viene por defecto en drupal para nuestra págian de artículos. Por defecto Story trae dos fields "title" y "body", agregamos entonces un field mas al que lo llamamos "volanta". A continuación creamos una noticia y ponemos algún contenido en el field volanta.
Ahora vamos a necesitar meter mano sobre los archivos "page.tpl.php" y "node.tpl.php", para eso necesitamos abrir algún programa que nos permita acceder a ellos(yo uso el plugin de fireftp para firefox, pero tu puedes usar el que mas te guste). No se cual tema estas usando en tu sitio pero supongamos que sea "garland", entonces abrimos la carpeta "garland" que esta dentro de la carpeta "themes" y allí vamos a encontrar los archivos que estábamos buscando.
Abrimos el archivo "node.tpl.php" y esto es lo que vemos:
<?php
<div id="node-<?php print $node->nid; ?>" class="node<?php if ($sticky) { print ' sticky'; } ?><?php if (!$status) { print ' node-unpublished'; } ?>">
<?php print $picture ?>
<?php if ($page == 0): ?>//$page == 0 significa que estamos en el "teaser", el titulo es un link al page
<h2><a href="<?php print $node_url ?>" title="<?php print $title ?>"><?php print $title ?></a></h2>
<?php endif; ?>
<?php if ($submitted): ?>
<span class="submitted"><?php print t('!date — !username', array('!username' => theme('username', $node), '!date' => format_date($node->created))); ?></span>
<?php endif; ?>
<div class="content">
<?php print $content ?>
</div>
<div class="clear-block clear">
<div class="meta">
<?php if ($taxonomy): ?>
<div class="terms"><?php print $terms ?></div>
<?php endif;?>
</div>
<?php if ($links): ?>
<div class="links"><?php print $links; ?></div>
<?php endif; ?>
</div>
</div>
?>
Si quisisieras agregar tu "volanta" tan solo cuando se muestra el teaser del nodo bastaría con imprimir el contenido del campo "volanta"(field_volanta) antes que el titulo, en nuestro caso sería modificando el "node.tpl.php" en la parte que muestra el teaser:
<?php<?php if ($page == 0): ?>
<?php print $node->content['field_volanta']['#value']; ?>
<h2><a href="<?php print $node_url ?>" title="<?php print $title ?>"><?php print $title ?></a></h2>
<?php endif; ?>
?>
lo que hemos agregado es :
<?php print $node->content['field_testing']['#value']; ?>, es información la obtengo del modulo Devel. Si el devel module ya esta instalado y habilitado, cuando veamos el nodo de nuetra noticias en las pestañas de administracion aparecerán dos nuevas pestañas "dev load" y "dev render". Haciendo click sobre "devel render", podremos ver toda la información que necesitamos del nodo en este caso:<?php[field_volanta] => Array
(
[#weight] => 0
[#value] => <div class="field field-type-text field-field-testing"><div class="field-items"><div class="field-item">Estudie para dentista, deje a todos con la boca abierta.
</div></div></div>
[#access] => 1
)
?>
Allí podemos ver que el texto que queremos mostrar sobre el titulo esta en [field_volanta]['#value']. Para mayor seguridad podemos agregar un "check_markup", que es una función que se encarga de filtrar el texto que le enviamos, el codigo con "check_markup2 nos quedaría de este modo:
<?php<?php if ($page == 0): ?>
<?php print check_markup($node->content['field_testing']['#value'], $node->format, false); ?>
<h2><a href="<?php print $node_url ?>" title="<?php print $title ?>"><?php print $title ?></a></h2>
<?php endif; ?>
?>
Si ahora quisieramos ocultar la volanta cuando se ve el nodo en modalidad "page", habria que sacarlo del contenido del nodo, es decir tendríamos que cambiar esto:
<?php<div class="content">
<?php print $content; ?>
</div>
?>
por esto otro:
<?php<div class="content">
<?php print check_markup($node->content['body']['#value'], $node->format, false); ?>
</div>
?>
donde caben las mismas observaciones que hacíamos para el caso anterior.
El nuevo nodo se vería de este modo:
<?php
<?php phptemplate_comment_wrapper(NULL, $node->type); ?>
<div id="node-<?php print $node->nid; ?>" class="node<?php if ($sticky) { print ' sticky'; } ?><?php if (!$status) { print ' node-unpublished'; } ?>">
<?php print $picture ?>
<?php if ($page == 0): ?>
<?php print check_markup($node->content['field_volanta']['#value'], $node->format, false); ?>
<h2><a href="<?php print $node_url ?>" title="<?php print $title ?>"><?php print $title ?></a></h2>
<?php endif; ?>
<?php if ($submitted): ?>
<span class="submitted"><?php print t('!date — !username', array('!username' => theme('username', $node), '!date' => format_date($node->created))); ?></span>
<?php endif; ?>
<div class="content">
<?php print check_markup($node->content['body']['#value'], $node->format, false); ?>
</div>
<div class="clear-block clear">
<div class="meta">
<?php if ($taxonomy): ?>
<div class="terms"><?php print $terms ?></div>
<?php endif;?>
</div>
<?php if ($links): ?>
<div class="links"><?php print $links; ?></div>
<?php endif; ?>
</div>
</div>
?>
Cambiando el "node.tpl.php" por "node-story.tpl.php".
En general no es bueno modificar el node.tpl.php cuando queremos aplicar esos cambios a un cck especifico, porque los cambios afectarían a todos los cck. Entonces es necesario crear un archivo "node-cck_name.tpl.php", de manera que los cambios que hemos hecho solo afecten al tipo de cck deseado, en nuestro caso como hemos usado para las noticias el CCKde Story el código lo pondríamos en un archivo "node-story.tpl.php". Si nuetro CCK se llamara "noticias" el archivo debería llamarse "node-noticias.tpl.php", de este modo drupal asignara al tipo e contenido "noticias" ese archivo automáticamente.
Espero que te sirva.
http://organicsa.net
Estoy con fmanaya, Te lo
Estoy con fmanaya,
Te lo has currado genial, son este tipo de contenidos lo que merece la pena ser rescatado y subidos a la documentación del portal.
Un saludo
Oskar
gestión del conocimiento y de la información con software libre
Gracias mauro72,
hice todo lo que me dijiste, hasta instale el devel, pero sigo igual que antes... en los teasers lo veo bien, pero en la page no... En esta quiero que tambien se vea la volanta y sobre el titulo. Tendre que agregar algo en el page.tpl.php... Decias que debiamos meter mano tambien en este archivo, pero en tu excelente explicación no encontre el como???
vamos a lo sencillo. Si
vamos a lo sencillo.
Si tenemos instalao el cck, y queremos modificar la presentación de un tipo de contenido, vamos a:
http://www.midominio.com/admin/content/types
o si lo prefieres
administrar / gestión de contenidos / tipo de contenido /
Pinchamos en la opción de editar del tipo de contenido que queremos modificar, pongamos por caso Noticia.
Arriba tenemos diferentes opciones, una de ellas es manage fields (creo que esta traducido por gestionar campos), pinchamos en la opción y vemos que nos aparecen los diferentes campos del formulario del tipo de contenido.
El campo title tiene un peso de -5, para poner algún campo por encima de este, le damos un valor comprendido entre -6 - 9.
Y ya tienes modificado el teaser y el full node del tipo de contenido.
Un saludo
Oskar
gestión del conocimiento y de la información con software libre
Es cierto que existe un
Es cierto que existe un campo "weight" que controla el lugar en el que se muestra el campo, sin embargo, si le damos un valor -6, por ejemplo, el campo solo aparecerá por encima del título en el formulario del CCK, no cuando se vea la versión "full" del nodo.
Siguiendo el ejemplo de la volanta, si quisiéramos poner el contenido del field volanta por sobre el titulo del nodo cuando se ve la "full page", una forma de hacerlo, no digo que sea la única ni la mejor, seria:
Primero creamos un page especifico para el cck story(zen trae por defecto que poniendo "page-story.tpl.php" drupal carga ese template para stories automáticamente), esto se hace en el "template.php"
<?php/**
* Override or insert PHPTemplate variables into the templates.
*/
function _phptemplate_variables($hook, $vars) {
if ($hook == 'page') {
if($vars['node']->type == 'story') {
$vars['template_file'] = 'page-story';
}
?>
en esta sección del archivo "template.php" se pueden generar variables para los archivos template(node, page, comment, etc). Básicamente lo que hacemos aquí es decirle a drupal que, si se trata de un cck 'story' queremos que se use el template 'page-story.tpl.php" para mostrarlo.
en la misma sección del "template.php" creamos una variable donde cargamos el contenido del field volanta:
<?php/**
* Override or insert PHPTemplate variables into the templates.
*/
function _phptemplate_variables($hook, $vars) {
if ($hook == 'page') {
if($vars['node']->type == 'story') {
$vars['volanta'] = check_markup($vars['node']->field_volanta[0]['value'],$vars['node']->format, false);
$vars['template_file'] = 'page-story';
}
?>
ahora vamos a tener en la variable $volanta, el contenido del field volanta.
lo que falta es poner esta variable en el "page-story.tpl.php", como queremos que aparezca por sobre el titulo, es ahi donde lo ponemos. No copio todo el page-story.tpl.php, solo la parte que nos importa.
<?php<?php print $volanta; ?>
<?php if ($title): print '<h2'. ($tabs ? ' class="with-tabs"' : '') .'>'. $title .'</h2>'; endif; ?>
<?php if ($tabs): print $tabs .'</div>'; endif; ?>
?>
para facilitarnos el trabajo con el CSS lo podemos poner dentro de un div, y con un "if", para que no lo muestre si el campo esta vacío:
<?php<?php if ($volanta): print '<div class="volanta">'. $volanta .'</div>'; endif; ?>
<?php if ($title): print '<h2'. ($tabs ? ' class="with-tabs"' : '') .'>'. $title .'</h2>'; endif; ?>
<?php if ($tabs): print $tabs .'</div>'; endif; ?>
?>
como dije no es la única y seguramente tampoco la mejor, pero es una forma de hacerlo.
Suerte.
Fe de Erratas
Unas observaciones sobre el comentario para el teaser del nodo. Probando el código localmente he detectado algunos errores que me parece prudente aclarar.
1. En lugar de:
<?php print check_markup($node->content['body']['#value'], $node->format, false); ?>conviene dejar:
<?php print $content ?>eso si, tenemos que editar el CCK content type y poner como "hidden" al field volanta para cuando vemos el nodo como "full page" y como "teaser"(pestaña de display field). Esto es para que no aparezca dos veces.
Esta corrección evita problemas con los filtros.
2. También se podría cambiar esta parte:
<?php print check_markup($node->content['field_volanta']['#value'], $node->format, false); ?>por esto otro:
<?php print $node->field_testing[0]['value']; ?>http://organicsa.net
Mauro, yo en vez de utilizar
Mauro, yo en vez de utilizar page-history.tpl.php suelo hacer node-type.tpl.php, ya que así mantenemos un único archivo de página (page carga todo), y por el contrario tienes un tpl.php por cada uno de los tipos de contenidos del sitio.
Otra cosa, y siguiendo con la política de codigo límpio de drupal ¿no debería ser así?
<?php if ($volanta); ?><div class="volanta">
<?php print $volanta; ?>
</div>
<?php endif; ?>
Por lo demas siguie siendo un genial tutorial para personalizar un tipo de contenido.
Un saludo
Oskar
gestión del conocimiento y de la información con software libre
Es cierto la forma de
Es cierto la forma de escribir el código que indicas es mas limpia, aquí hay un tutorial muy bueno que explica algunas buenas practicas a la hora de trabajar con drupal http://www.lullabot.com/articles/theming-best-practices-garland-gets-a-c....
Con respecto al otro punto de usar page-... o node-..., no se si nos estamos entendiendo, cuando se trata de modificar el aspecto de nodo para un CCK en particular normalmente alcanza modificando el archivo node-cck_name.tpl.php, yo utilizo page-cck_name.tpl.php para este caso en particular porque no puedo mediante el template node-... hacer lo que siav pedía. Para mostrar un campo de CCK por encima del titulo de la página hay que modificar de alguna manera el template page-..., puedo estar equivocado pero honestamente no se como hacerlo echando mano solo del template node-...
Saludos