¿Cómo paso una variable de un módulo personalizado a su archivo de plantilla?

8

Necesito saber el método más simple para pasar la variable del módulo personalizado a su archivo de plantilla. Creé el custom.module y coloqué custom.tpl.php en la carpeta del módulo.

function custom_menu(){
  $items = array();

  $items['custom'] = array(
    'title' => t('custom!'),
    'page callback' => 'custom_page',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

  return $items;
}

function custom_page() {

    $setVar = 'this is custom module';
    return theme('custom', $setVar);    
}

He agregado la función de tema pero no funciona, ¿alguien puede sugerirme qué está mal con este código?

function theme_custom($arg) {
  return $arg['output'];
}

function custom_theme() {
  return array(
    'Bluemarine' => array(
        'variables' => 'output',
        'template' => 'Bluemarine',
     ),
  );
}
Kamran Akhter
fuente

Respuestas:

6

Independientemente de la versión de Drupal para la que está escribiendo el módulo, hay dos errores en su código:

  • Usted define "Bluemarine" como función de tema, pero luego llama theme('custom'), lo que llamaría la función de tema "personalizado"
  • Si define "personalizado" como una función de tema que utiliza un archivo de plantilla, theme_custom()nunca se llama

Si está escribiendo código para Drupal 6, entonces el código debe ser similar al siguiente. Supongo que el nombre de la función del tema es custom.

function custom_menu(){
  $items = array();

  $items['custom'] = array(
    'title' => t('custom!'),
    'page callback' => 'custom_page',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

  return $items;
}

function custom_theme() {
  return array(
    'custom' => array(
      'arguments' => array('output' => NULL),
      'template' => 'custom',
     ),
  );
}

function custom_page() {
    $output = 'This is a custom module';
    return theme('custom', $output);    
}

function theme_custom($output) {
}

El archivo de plantilla tendrá acceso a $output, y a cualquier variable establecida template_preprocess_custom(), si su módulo lo implementa.

Por ejemplo, podría implementar un código similar al siguiente:

function template_preprocess_custom(&$variables) {
  if ($variables['output'] == 'This is a custom module') {
    $variables['append'] = ' and I wrote it myself.";
  }
}

Con este código, el archivo de plantilla tiene acceso a $outputy $append.

Como ejemplo de función de tema que usa un archivo de plantilla, puede mirar theme_node () , que está definido en node_theme () , y que usa node.tpl.php como archivo de plantilla; la función de preproceso implementada por el módulo Node para esa función de tema es template_preprocess_node () .

kiamlaluno
fuente
Gracias Kiam, obviamente se perdió el primer comentario de OP sobre el uso de D6. +1
Laxman13
Gracias Kiam, template_preprocess_custom (& $ variables) hizo el truco
Kamran Akhter
Ahora quiero mover tpl a la carpeta de temas, ¿cómo puedo hacer eso?
Kamran Akhter
@KamranAkhter Esa es una pregunta diferente. :-)
kiamlaluno
3

Está llamando a la función de tema incorrecta. En lugar de function theme_customeso debería ser function theme_Bluemarine. También debe pasar una matriz a la pieza de variables de hook_theme () . Vea un ejemplo simple aquí .

Usando su ejemplo (después de cambiar la plantilla y la función del tema a custom):

function custom_menu(){
  $items = array();

  $items['custom'] = array(
    'title' => t('custom!'),
    'page callback' => 'custom_page',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

  return $items;
}

function custom_page() {
  $setVar = 'this is custom module';
  return theme('custom', array('output' => $setVar));
}

function custom_theme() {
  $path = drupal_get_path('module', 'custom');
  return array(
    'custom' => array(
        'variables' => array('output' => null),
        'template' => 'custom',
     ),
  );
}

Ahora en custom.tpl.php solo necesito <?php print $output; ?>

Laxman13
fuente
Gracias por responder, el ejemplo que dio es un módulo de nodo y tengo un módulo que no es de nodo. Solo necesito una forma de pasar la variable al archivo tpl, estoy usando la ayuda de drupal 6.plz
Kamran Akhter
Gracias por responder, me está dando el error No existe tal archivo o directorio, en realidad está esperando que el archivo custom.tpl.php en la carpeta del módulo que ya tengo en el código bluemarine sea respondido por personalizado. Bluemarine es el tema de Drupal que estoy usando.
Kamran Akhter el
cambiado el código de arriba y darme la pantalla en blanco blanco ¿Qué debo hacer ayuda PLZ
Kamran Akhter
Cambié el código y lo tengo funcionando en mi sitio.
Laxman13
Solo copie y pegue el código anterior, pero no funciona
Kamran Akhter