[development] Creating embedded unordered lists of checkboxes

Nancy Wichmann nan_wich at bellsouth.net
Thu Jan 14 01:50:53 UTC 2010


You can build multi-level select lists using the "children" element (read
theme_list for a description). That should allow multi-level checkboxes.
I've never tried it though.

Nancy E. Wichmann, PMP 
 
Injustice anywhere is a threat to justice everywhere. -- Dr. Martin L. King,
Jr.


-----Original Message-----
From: development-bounces at drupal.org [mailto:development-bounces at drupal.org]
On Behalf Of Steve Edwards
Sent: Wednesday, January 13, 2010 7:54 PM
To: Drupal Development
Subject: [development] Creating embedded unordered lists of checkboxes

I have a need to create a two-level unordered list of checkboxes from a two
level taxonomy vocabulary.  So for instance, if my vocabulary is 

- Level 1 term 1
-- Level 2 term 1
-- Level 2 term 2
-- Level 2 term 3
- Level 1 term 2
-- Level 2 term 4
-- Level 2 term 5
- Level 1 term 3

I want to create the following:

<ul>
 <li><input type = checkbox">Level 1 term 1</li>
 <ul>
   <li><input type = checkbox">.Level 2 term 1</li>
   <li><input type = checkbox">Level 2 term 2</li>
   <li><input type = checkbox">Level 2 term 3</li>
 </ul>
 <li><input type = checkbox">Level 1 term 2</li>
 <ul>
   <li><input type = checkbox">Level 2 term 4</li>
   <li><input type = checkbox">Level 2 term 5</li>
 <ul>
 <li><input type = checkbox">Level 1 term 3<li>
</ul>

What is the best way to do this?  Just use a checkboxes element type and
create my own theme function for the form?  Modify something like
theme_item_list?  Or is there a better (and easier) way that I'm missing?

What I tried doing was to create a theme function for my checkboxes element
by setting the #theme property for the element to my custom theme function
(and registering the function in hook_theme).  I then just made a copy of
theme_checkboxes() (and theme_form_element since it's called from
theme_form_checkboxes) and renamed to match hook_theme and the #theme
property.  However, when doing that, none of my checkboxes are rendered at
all.  On stepping through the code, I found the problem in drupal_render
starting at line 2868:

  if (!isset($elements['#children'])) {
    $children = element_children($elements);
    // Render all the children that use a theme function.
    if (isset($elements['#theme']) && empty($elements['#theme_used'])) {
      $elements['#theme_used'] = TRUE;

      $previous = array();
      foreach (array('#value', '#type', '#prefix', '#suffix') as $key) {
        $previous[$key] = isset($elements[$key]) ? $elements[$key] : NULL;
      }
      // If we rendered a single element, then we will skip the renderer.
      if (empty($children)) {
        $elements['#printed'] = TRUE;
      }
      else {
        $elements['#value'] = '';
      }
      $elements['#type'] = 'markup';

      unset($elements['#prefix'], $elements['#suffix']);
      $content = theme($elements['#theme'], $elements);

      foreach (array('#value', '#type', '#prefix', '#suffix') as $key) {
        $elements[$key] = isset($previous[$key]) ? $previous[$key] : NULL;
      }
    }
    // Render each of the children using drupal_render and concatenate them.
    if (!isset($content) || $content === '') {
      foreach ($children as $key) {
        $content .= drupal_render($elements[$key]);
      }
    }
  }

So basically, because I have #theme set for the checkboxes field, it skips
the rendering of the individual checkbox elements.  To me, it makes sense
that I override the theme function for the checkboxes type since that's the
element type, but that doesn't seem to be the case.  So what do I need to do
to be able to simply theme my checkboxes element?

Thanks.

Steve

No virus found in this incoming message.
Checked by AVG - www.avg.com 
Version: 9.0.725 / Virus Database: 270.14.133/2612 - Release Date: 01/13/10
02:35:00



More information about the development mailing list