diff --git render_example/render_example.info render_example/render_example.info new file mode 100644 index 0000000..e3e0e20 --- /dev/null +++ render_example/render_example.info @@ -0,0 +1,6 @@ +; $Id$ +name = Render example +description = Demonstrates drupal_render's capabilities and altering render arrays +core = 7.x +files[] = render_example.module +dependencies[] = devel diff --git render_example/render_example.install render_example/render_example.install new file mode 100644 index 0000000..dec07f7 --- /dev/null +++ render_example/render_example.install @@ -0,0 +1,17 @@ + 'Render Array Example', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('render_example_demo_form'), + 'access callback' => TRUE, + ); + + return $items; +} + + +/** + * Builds the form that offers options of what items to show. + */ +function render_example_demo_form($form, &$form_state) { + $form['description'] = array( + '#type' => 'markup', + '#markup' => t('This example shows what render arrays look like in the building of a page. It will not work unless the user running it has the "access devel information" privilege.'), + ); + + $form['show_arrays'] = array( + '#type' => 'fieldset', + '#title' => t('Show render arrays'), + ); + + foreach (array('block', 'page') as $type) { + $form['show_arrays']['render_example_show_' . $type] = array( + '#type' => 'checkbox', + '#title' => t('Show @type render arrays', array('@type' => $type)), + '#default_value' => variable_get('render_example_show_' . $type, FALSE), + ); + } + + $form['page_fiddling'] = array( + '#type' => 'fieldset', + '#title' => t('Make changes on page via hook_page_alter()'), + ); + $form['page_fiddling']['render_example_reverse_sidebar'] = array( + '#title' => t('Reverse ordering of sidebar_first elements (if it exists)'), + '#type' => 'checkbox', + '#default_value' => variable_get('render_example_reverse_sidebar', FALSE), + ); + $form['page_fiddling']['render_example_note_about_render_arrays'] = array( + '#title' => t('Add a note about render arrays to top of sidebar_first (if it exists)'), + '#type' => 'checkbox', + '#default_value' => variable_get('render_example_note_about_render_arrays', FALSE), + ); + $form['page_fiddling']['render_example_move_navigation_menu'] = array( + '#title' => t('Move the navigation menu to the top of the content area'), + '#type' => 'checkbox', + '#default_value' => variable_get('render_example_move_navigation_menu', FALSE), + ); + + return system_settings_form($form); +} + +/** + * Alters the page to add to the footer a demonstration of the render + * array that built it. + */ +function render_example_page_alter(&$page) { + + // Re-sort the sidebar. + if (variable_get('render_example_reverse_sidebar', FALSE) && !empty($page['sidebar_first'])) { + $page['sidebar_first'] = array_reverse($page['sidebar_first']); + foreach(element_children($page['sidebar_first']) as $element) { + // Reverse the weights if they exist. + if (!empty($page['sidebar_first'][$element]['#weight'])) { + $page['sidebar_first'][$element]['#weight'] *= -1; + } + } + unset($page['sidebar_first']['#sorted']); + } + + // Add a list of items to the top of sidebar_first. + if (variable_get('render_example_note_about_render_arrays', FALSE) && !empty($page['sidebar_first'])) { + $items = array( + t('Render arrays are everywhere in D7'), + t('Leave content unrendered as much as possible'), + t('This allows rearrangement and alteration very late in page cycle'), + ); + + $note = array( + '#title' => t('Render Array Example'), + '#items' => $items, + '#theme' => 'item_list', + '#weight' => -9999, + ); + $page['sidebar_first']['render_array_note'] = $note; + unset($page['sidebar_first']['#sorted']); + } + + + // Move the navigation menu into the content area. + if (variable_get('render_example_move_navigation_menu', FALSE) && !empty($page['sidebar_first']['system_navigation']) && !empty($page['content'])) { + $page['content']['system_navigation'] = $page['sidebar_first']['system_navigation']; + $page['content']['system_navigation']['#weight'] = -99999; + unset($page['content']['#sorted']); + unset($page['sidebar_first']['system_navigation']); + } + + // Show the render array used to build the page at the bottom of the page. + if (variable_get('render_example_show_page', FALSE)) { + $form['render_example_page_fieldset'] = array( + '#type' => 'fieldset', + '#title' => t('Page render array'), + '#collapsible' => TRUE, + '#collapsed' => TRUE, + '#weight' => 1000, + ); + $form['render_example_page_fieldset']['markup'] = array( + '#markup' => kpr($page, TRUE), + ); + $page['footer']['page_render_array'] = drupal_get_form('render_example_embedded_form', $form); + } +} + +/** + * Alters block to add the render array that built it. + */ +function render_example_block_view_alter(&$block, $block_info) { + if (variable_get('render_example_show_block', FALSE) && !empty($block['content']) && is_array($block['content'])) { + $form['render_example_block_fieldset'] = array( + '#type' => 'fieldset', + '#title' => t('Block render array'), + '#collapsible' => TRUE, + '#collapsed' => TRUE, + '#weight' => 999, + ); + $display = $block; + if (!empty($display['content']['render_example_form_fieldset'])) { + unset($display['content']['render_example_form_fieldset']); + } + $form['render_example_block_fieldset']['markup'] = array( + '#markup' => kpr($display, TRUE), + ); + $block['content']['content_block_render_array'] = drupal_get_form('render_example_embedded_form', $form); + } +} + +/** + * Utility function to build a named form given a set of form elements. + * This is a standard form builder function that takes an additional array, + * which is itself a form. + * + * @param $form + * @param $form_state + * @param $form_items + * The form items to be included in this form. + */ +function render_example_embedded_form($form, &$form_state, $form_items) { + return $form_items; +} \ No newline at end of file