0

I have a simple module that is extracting names from database table. I can display that names in hook_block_view like this:

function example_block_view($delta = '') {

  // $result - an array containing names
  // $names - a string containing names from $result array

  $block = array();

  switch ($delta) {
    case 'xxxxxx':

      $block['title']   = t('Example header');
      $block['content'] = $names;
      break;      

  }

  return $block;
}

This will output string with names. But I want to use theme() function for outputting names. So I am continuing by this documentation page: https://www.drupal.org/node/722174

Therefore I edited my code to:

  $block['content'] = array(
    '#theme' => 'example',
    '#header' => 'Example header',
    '#rows' => $result, 
  );

But I can't manage out by documentation what should I do next. What is the simplest example of displaying names by custom theme function in my case? Should I do something in template.php of my theme folder, or should I make an hook_theme() in my module? How could I theme the list of names stored in $result array?

closed as too broad by kiamlaluno Apr 19 '15 at 7:02

Please edit the question to limit it to a specific problem with enough detail to identify an adequate answer. Avoid asking multiple distinct questions at once. See the How to Ask page for help clarifying this question. If this question can be reworded to fit the rules in the help center, please edit the question.

  • 1
    A few things that may or may not be right depending on what you're trying to accomplish...#header should be an array (of column headers), #rows should be an array of rows with the same dimensions as the column header array, and the theme should be '#theme' => 'table', – Clive Apr 8 '15 at 15:23
  • I completely don't understand :). Header of what columns? I don't have any columns. I though rows are the items I want to display, and what is referencing the 'table'? I don't want a table, I just want names displayed one by one by my own theme function where I can define look of items/names. – Incredible Apr 8 '15 at 15:26
  • How to write a theme function is a bit too broad question; I am not sure what benefit would be in duplicating here what the Drupal documentation says. Using a module or a theme depends from what you need to do. How you could theme a list depends on what you need, since a theme function can do everything PHP allows. – kiamlaluno Apr 19 '15 at 7:02
1

You could use hook_theme to register your theme function, but it sounds like you're wanting output an item list which can be done with theme_item_list:

  $names = array('one','two','three');
  $block['content'] = theme('item_list', array(
    'items' => $names,
    'title' => t('My Names'),
  ));

This will fill in your block's content with this:

<div class="item-list">
  <h3>My Names</h3>
  <ul><li class="first">one</li><li>two</li><li class="last">three</li></ul>
</div>
  • Thanks. But What if I will need my own theme? Instead of theme('item_list', ...) I'd like to use theme('example_list', ...)'. Where could I define example_list`? – Incredible Apr 9 '15 at 6:30
  • 1
    Then you'll be generating your own theme functions. Check out this tutorial; it looks like exactly what you're doing. – Shawn Conn Apr 9 '15 at 7:03
1

I was experimenting a little bit with examples from @Shawn Conn and managed the minimum that needs to be done is to call theme() function in hook_block_view() and pass variables or arrays into it that will be used in example.tpl.php file:

$block['content'] = theme('example', array('items' => $result));

Then there must be theme_hook in module registered. There is no need for any additional parameters:

function hook_theme() {

    return array('example' => array());     
}

And finally create example.tpl.php in current theme folder:

<div>

<?php foreach($items as $item) { ?>

        <div>
            <?php print $item['name']; ?>
        </div>

<?php } ?>

</div>
1

Have a look at Examples for Developers and the theming_example module that is included in the package.

Register your module's theme implementations.

/**
 * Implements hook_theme().
 *
 * Defines the theming capabilities provided by this module.
 */
function theming_example_theme() {
  return array(
    'theming_example_list' => array(
      // We use 'variables' when the item to be passed is an array whose
      // structure must be described here.
      'variables' => array(
        'title' => NULL,
        'items' => NULL,
      ),
    ),        
  );
}

The theme function.

/**
 * Theming a simple list.
 *
 * This is just a simple wrapper around theme('item_list') but it's worth
 * showing how a custom theme function can be implemented.
 *
 * @see theme_item_list()
 */
function theme_theming_example_list($variables) {
  $title = $variables['title'];
  $items = $variables['items'];

  // Add the title to the list theme and
  // state the list type. This defaults to 'ul'.
  // Add a css class so that you can modify the list styling.
  // We'll just call theme('item_list') to render.
  $variables = array(
    'items' => $items,
    'title' => $title,
    'type' => 'ol',
    'attributes' => array('class' => 'theming-example-list'),
  );
  $output = theme('item_list', $variables);
  return $output;
}

An example where the theme function is used.

/**
 * The list page callback.
 *
 * An example page where the output is supplied as an array which is themed
 * into a list and styled with css.
 *
 * In this case we'll use the core-provided theme_item_list as a #theme_wrapper.
 * Any theme need only override theme_item_list to change the behavior.
 */
function theming_example_list_page() {
  $items = array(
    t('First item'),
    t('Second item'),
    t('Third item'),
    t('Fourth item'),
  );

  // First we'll create a render array that simply uses theme_item_list.
  $title = t("A list returned to be rendered using theme('item_list')");
  $build['render_version'] = array(
    // We use #theme here instead of #theme_wrappers because theme_item_list()
    // is the classic type of theme function that does not just assume a
    // render array, but instead has its own properties (#type, #title, #items).
    '#theme' => 'item_list',
    // '#type' => 'ul',  // The default type is 'ul'
    // We can easily make sure that a css or js file is present using #attached.
    '#attached' => array('css' => array(drupal_get_path('module', 'theming_example') . '/theming_example.css')),
    '#title' => $title,
    '#items' => $items,
    '#attributes' => array('class' => array('render-version-list')),
  );

  // Now we'll create a render array which uses our own list formatter,
  // theme('theming_example_list').
  $title = t("The same list rendered by theme('theming_example_list')");
  $build['our_theme_function'] = array(
    '#theme' => 'theming_example_list',
    '#attached' => array('css' => array(drupal_get_path('module', 'theming_example') . '/theming_example.css')),
    '#title' => $title,
    '#items' => $items,
  );
  return $build;
}

Not the answer you're looking for? Browse other questions tagged or ask your own question.