You are here

function render_example_arrays in Examples for Developers 7

Provides a number of render arrays and show what they do.

Each array is keyed by a description; it's returned for rendering at page render time. It's easy to add new examples to this.

The array items in $demos are intended to be raw, normal render arrays that can be experimented with to end up with different outcomes.

Related topics

1 string reference to 'render_example_arrays'
render_example_menu in render_example/render_example.module
Implements hook_menu().

File

render_example/render_example.module, line 64
Demonstrates render arrays.

Code

function render_example_arrays() {

  // Interval in seconds for cache update with #cache.
  $interval = 60;
  $demos = array(
    // Demonstrate the simplest markup, a #markup element.
    t('Super simple #markup') => array(
      '#markup' => t('Some basic text in a #markup (shows basic markup and how it is rendered)'),
    ),
    // Shows how #prefix and #suffix can add markup into an array.
    t('Using #prefix and #suffix') => array(
      '#markup' => t('This one adds a prefix and suffix, which put a div around the item'),
      '#prefix' => '<div><br/>(prefix)<br/>',
      '#suffix' => '<br/>(suffix)</div>',
    ),
    // When #theme is provided, it is the #theme function's job to figure out
    // the meaning of the render array. The #theme function receives the entire
    // element in $variables and must return it, where it will be the content
    // of '#children'. When a #theme or other function is provided, custom
    // properties can be invented and used as needed, as the #separator
    // property provided here.
    //
    // If #theme is not provided, either explicitly or by the underlying
    // element, then the children are rendered using their own properties and
    // the results go into #children.
    t('theme for an element') => array(
      'child' => array(
        t('This is some text that should be put together'),
        t('This is some more text that we need'),
      ),
      // An element we've created which will be used by our theming function.
      '#separator' => ' | ',
      '#theme' => 'render_example_aggregate',
    ),
    // #theme_wrappers provides an array of theme functions which theme the
    // envelope or "wrapper" of a set of child elements. The theme function
    // finds its element children (the sub-arrays) already rendered in
    // '#children'.
    t('theme_wrappers demonstration') => array(
      'child1' => array(
        '#markup' => t('Markup for child1'),
      ),
      'child2' => array(
        '#markup' => t('Markup for child2'),
      ),
      '#theme_wrappers' => array(
        'render_example_add_div',
        'render_example_add_notes',
      ),
    ),
    // Add '#pre_render' and '#post_render' handlers.
    // - '#pre_render' functions get access to the array before it is rendered
    //   and can change it. This is similar to a theme function, but it is a
    //   specific fixed function and changes the array in place rather than
    //   rendering it..
    // - '#post_render' functions get access to the rendered content, but also
    //   have the original array available.
    t('pre_render and post_render') => array(
      '#markup' => '<div style="color:green">' . t('markup for pre_render and post_render example') . '</div>',
      '#pre_render' => array(
        'render_example_add_suffix',
      ),
      '#post_render' => array(
        'render_example_add_prefix',
      ),
    ),
    // Cache an element for $interval seconds using #cache.
    // The assumption here is that this is an expensive item to render, perhaps
    // large or otherwise expensive. Of course here it's just a piece of markup,
    // so we don't get the value.
    //
    // #cache allows us to set
    // - 'keys', an array of strings that will create the string cache key.
    // - 'bin', the cache bin
    // - 'expire', the expire timestamp. Note that this is actually limited
    //   to the granularity of a cron run.
    // - 'granularity', a bitmask determining at what level the caching is done
    //   (user, role, page).
    t('cache demonstration') => array(
      // If your expensive function were to be executed here it would happen
      // on every page load regardless of the cache. The actual markup is
      // added via the #pre_render function, so that drupal_render() will only
      // execute the expensive function if this array has not been cached.
      '#markup' => '',
      '#pre_render' => array(
        'render_example_cache_pre_render',
      ),
      '#cache' => array(
        'keys' => array(
          'render_example',
          'cache',
          'demonstration',
        ),
        'bin' => 'cache',
        'expire' => time() + $interval,
        'granularity' => DRUPAL_CACHE_PER_PAGE | DRUPAL_CACHE_PER_ROLE,
      ),
    ),
  );

  // The rest of this function just places the above arrays in a context where
  // they can be rendered (hopefully attractively and usefully) on the page.
  $page_array = array();
  foreach ($demos as $key => $item) {
    $page_array[$key]['#theme_wrappers'] = array(
      'render_array',
    );
    $page_array[$key]['#description'] = $key;
    $page_array[$key]['unrendered'] = array(
      '#prefix' => '<div class="unrendered-label">' . t('Unrendered array (as plain text and with a krumo version)') . ':</div>',
      '#type' => 'markup',
      '#markup' => htmlentities(drupal_var_export($item)),
    );
    $page_array[$key]['kpr'] = array(
      // The kpr() function is from devel module and is here only allow us
      // to output the array in a way that's easy to explore.
      '#markup' => kpr($item, TRUE),
    );
    $page_array[$key]['hr'] = array(
      '#markup' => '<hr/>',
    );
    $page_array[$key]['rendered'] = array(
      $item,
    );
    $page_array[$key]['rendered']['#prefix'] = '<p><em>Rendered version (light blue)</em>:</p>' . '<div class="rendered">';
    $page_array[$key]['rendered']['#suffix'] = '</div>';
  }
  return $page_array;
}