Drupal 7 - get variables from hook_theme

1k Views Asked by At

I tried to pass a variable from a custom module to a tpl file. In my custom module (named example)

1. I created a route with an argument via hook_menu :

function example_menu() {
  $items['example/fancybox-photos/%'] = array(
        'page callback' => 'example_display_fancybox_photos',
        'page arguments' => array(2),
        'type' => MENU_CALLBACK,
        'access arguments' => array('access content'),
      );
    return $items;
    }

2. I created my page callback function :

function example_display_fancybox_photos($nid) {
  $nodePhoto = node_load($nid);
  $field_photo = field_get_items('node', $nodePhoto, 'field_photo');

  $photo = [
  "field_photo" => $field_photo[0]['uri'],
  ....
  ];

  return theme('example_fancybox_photos', array('infosPhoto' => $photos));
}

3 . I created a hook_theme

function example_theme() {
  $themes = array();

  $themes['example_fancybox_photos'] = array(
    'template' => 'templates/example-fancybox-photos',
    'variables' => array('infosPhoto' => NULL),
  );

  return $themes;
}

4 . I finally created a tpl named "example-fancybox-photos.tpl.php" in templates folder (in theme folder)

<pre><?php print var_dump($infosPhoto); ?></pre>

The result is NULL

I did some researchs but i dont understand why the variable is still NULL.

thanks for your help !

2

There are 2 best solutions below

0
On

You have passed $photos but you have array as $photo. try to change that

Hope the below code helps you.

function example_menu(){
    $items['example/fancybox-photos/%'] = array(
        'page callback' => 'example_display_fancybox_photos',
        'page arguments' => array(2),
        'type' => MENU_CALLBACK,
        'access arguments' => array('access content'),
    );
    return $items;
}

function example_display_fancybox_photos($nid){
    $photos = 'value from example module!';
    return theme('example_fancybox_photos',array('photos' => $photos));
}

function example_theme() {
    $path = drupal_get_path('module', 'example');
    return array(
        'example_fancybox_photos' => array(
            'variables' => array('photos' => null),
            'template' => 'example_fancybox_photos',
            'path' => $path, 
        ),
    );
}

Place your tpl file example_fancybox_photos.tpl.php in your module directory and inside it use the below code.

<?php print $photos; ?>

or

function example_theme() {
    return array(
        'example_fancybox_photos' => array(
            'variables' => array('photos' => null),
            'template' => 'example_fancybox_photos',
        ),
    );
}

Place your tpl file example_fancybox_photos.tpl.php in your theme directory and inside it place the below code

<?php print $photos; ?>
0
On

I finally managed to get the variable from the module to the tpl !

1. I created a route with an argument via hook_menu :

function example_menu() {
  $items['example/fancybox-photos/%'] = array(
        'page callback' => 'example_display_fancybox_photos',
        'page arguments' => array(2),
        'type' => MENU_CALLBACK,
        'access arguments' => array('access content'),
      );
    return $items;
    }

2. I created my page callback function :

function example_display_fancybox_photos($nid) {
  $nodePhoto = node_load($nid);
  $field_photo = field_get_items('node', $nodePhoto, 'field_photo');

  $photos = [
  "field_photo" => $field_photo[0]['uri'],
  ....
  ];

  return theme('example_fancybox_photos', array('infosPhoto' => $photos));
}

3 . I created a hook_theme

function example_theme() {
  $themes = array();

  $themes['example_fancybox_photos'] = array(
    'template' => 'templates/example_fancybox_photos',
    'variables' => array('infosPhoto' => NULL),
  );

  return $themes;
}

4 . I finally created a tpl named "example_fancybox_photos.tpl.php" in templates folder (in MODULE (example) folder)

The problems were that: - the tpl was not named in the same way and with dashes instead of underscore - the tpl was in the template folder of the theme and not of the module