php - suggestions - template drupal 7
Drupal 7: ¿Cuál es la variable en template.php que dicta qué plantilla de página se usa? (2)
Ok, lo encontré: http://drupal.org/node/223440#comment-991840
$alias = drupal_get_path_alias($_GET[''q'']);
if ($alias != $_GET[''q'']) {
$template_filename = ''page'';
foreach (explode(''/'', $alias) as $path_part) {
$template_filename = $template_filename . ''-'' . $path_part;
$variables[''template_files''][] = $template_filename;
}
}
El crédito a esta función va al usuario mfb.
Tuve muchos problemas con esto, así que lo explicaré aquí en caso de que alguien lo encuentre útil.
Esta función va en su template.php
. Tiene que ser parte de la función <theme name>_preprocess_page
. Lo que hace es tomar el alias y luego explotarlo en un grupo de diferentes componentes. Por ejemplo, si estás en una página con el alias ?q=blog/blog-post-title
, se explotaría en blog
y blog-post-title
. A continuación, convierte cada componente en un nombre para una sugerencia de plantilla . Pone cada sugerencia de plantilla en la matriz template_files[]
(dentro de la matriz $variables[]
) de modo que la página ahora tiene dos nuevas sugerencias de plantilla:
page-blog
, y page-blog-blog-post-title
Las sugerencias de plantilla son archivos de plantilla alternativos. En este caso, son para páginas, pero no necesariamente tienen que serlo. Puede tener sugerencias de plantilla para cualquier cosa que pueda pensar incluyendo bloques, nodos y similares. No dejes que el nombre "sugerencia de plantilla" te engañe. Las sugerencias de plantilla se utilizarán sobre las plantillas predeterminadas, siempre que existan. No sé por qué fue nombrado así. Creo que debería ser renombrado.
Lo que hace, entonces, ahora que ha configurado Drupal para buscar una sugerencia de plantilla que apunte a su alias, es crear un nuevo archivo de plantilla donde el resto esté en su tema. En este caso, digamos que quiero tema toda mi sección de blog. En la carpeta de plantillas debería crear un archivo llamado page--blog.tpl.php
(tenga en cuenta el --double hyphens--) con el diseño que quiero.
Drupal usará la sugerencia de plantilla más específica que pueda encontrar, así que si quisieras, podrías hacer que una publicación de blog se vea completamente diferente al resto del sitio, siempre que crees una plantilla para la page--blog--blog-post-title
nombre page--blog--blog-post-title
y ponerlo en el directorio de plantillas de su tema. (nuevamente, tenga en cuenta los guiones dobles).
Ok, este es el trato: estoy construyendo un sitio web de Drupal que tiene varias secciones diferentes. Cada sección es una vista que muestra un tipo de contenido. (Cada sección tiene su propio tipo de contenido) Por ejemplo, tengo una vista que apunta a ?q=blog
que muestra el tipo de contenido blog
.
Todas las secciones se ven un poco diferentes entre sí. No es como ''sitio web dentro de un sitio web'' diferente pero lo suficientemente diferente como para que no todos puedan usar el mismo archivo de plantilla y cada uno se modifique con CSS. Cada sección necesita su propia page.tpl.php
.
Desafortunadamente, los archivos .info de AFAIK Drupal theme solo pueden asignar un page.tpl.php
para todo el tema o asignar un page-node-####.tpl.php
para cada nodo. Habrá un montón de contenido en este sitio web, por lo que establecer Drupal para crear un nuevo page-node-####.tpl.php
idéntico page-node-####.tpl.php
para cada nodo creado se volverá incontrolable muy rápido.
Para resolver este problema, voy a usar pathauto para crear un alias para cada tipo de contenido. Por ejemplo, a todos los nodos del blog
tipo de contenido se les asigna un alias ?q=blog/[post title]
. Modifique template.php
para usar page-blog.tpl.php
para cualquier página cuyo alias comience con la palabra ''blog''.
Otras personas han intentado hacer este tipo de cosas y han creado funciones como la descrita. Lamentablemente, todos los que he visto son para Drupal 6 o inferior. Intenté modificar los existentes sin éxito. Hasta ahora, sin embargo, creo que está en el camino correcto:
function basic_preprocess_page(&$vars, $hook) {
...
if( module_exists(''path'') ) {
$alias = drupal_get_path_alias( $_GET[''q''] );
$site_section = "blog";
if( strpos( $alias, $site_section ) === 0 ) {
$VARIABLE_THAT_TELLS_THE_PAGE_WHAT_TEMPLATE_TO_USE = "/path/to/page-blog.php";
}
}
}
No puedo encontrar $VARIABLE_THAT_TELLS_THE_PAGE_WHAT_TEMPLATE_TO_USE
¿Alguien sabe de qué se trata?
Tal vez mi sitio está mal estructurado. Si alguien sabe cómo reestructurar mi sitio para que pueda crear más fácilmente un tema con secciones separadas, ¡por favor comparta cómo!
¡Un millón de gracias! (c:
EDITAR: Quizás necesito usar sugerencias de plantilla en su lugar. ¿Alguien sabe la función o variable que se utilizará para configurar esto?
Cambiaron el nombre de esta clave de matriz en D7 y no la he visto documentada en ninguna parte. Finalmente me di cuenta de esto después de una buena depuración. Puede anular la plantilla de tema en template.php con un hook_preprocess_page () como sigue:
function myTheme_preprocess_page(&$vars) {
global $node;
if ($node->type == ''blog'') {
$vars[''theme_hook_suggestions''] = array(''my__blog_template''); // use my--blog-template.tpl.php, note ''-'' = ''_''
}
elseif ($node->type == ''articles'') {
$vars[''theme_hook_suggestions''] = array(''article__node_template''); // use article--node-template.tpl.php
}
}
Ah, y no te olvides de limpiar los cachés de Drupal después de hacer cambios en tu template.php.