D7 core patch?

moshe weitzman - June 22, 2009 - 14:30
Project:User Display API
Version:5.x-1.x-dev
Component:Code
Category:task
Priority:normal
Assigned:Unassigned
Status:active
Description

Would be great to put this API into core now that the build_modes patch is in. One hitch I see is that this module works upon extending theme('username') but it should not work at theme layer in d7/ it should work during a 'build' layer in order to use build_modes.

Hopefully someone will take this on.

#1

sun - June 23, 2009 - 01:02

yeah, the "how" is the tricky part. yched already created #499192: add $build_mode param to term display, which is a prerequisite for all of this.

Braindump:

a) Straight mapping of this module's terminology to core:

- "decorator" == "field"

- "user display style" == "build mode"

- "user display class" == non-existing

b) Display classes, i.e. an additional argument to theme('username') and theme('user_picture') is still required to make this work. Classes are specified by developers, to specify the logical appearance of a user. In many cases, __FUNCTION__ might work as well though. Classes do not specify the build mode -- the site administrator maps available classes to build modes instead.

c) Given b), hook_user_display($op == 'classes') would still be required in modules. That said, I'm not entirely sure whether all possible display style elements can be replaced with fields:

<?php
/**
* Implementation of hook_user_display().
*/
function user_visits_user_display($op) {
  switch (
$op) {
    case
'elements':
     
$items['user_visits_visited'] = array(
       
'#type' => 'select',
       
'#title' => t('Display last visit time'),
       
'#options' => drupal_map_assoc(range(1, 6)),
       
'#default_value' => 1,
       
'#description' => t('Enter the granularity as option; see !format_interval.', array('!format_interval' => l('format_interval()', 'http://api.drupal.org/api/function/format_interval'))),
       
'#category' => 'decorators',
      );
      return
$items;

    case
'classes':
     
$classes['user_visits_block'] = array(
       
'name' => t('User Visits'),
       
'description' => t('This class applies to users shown in the User Visits block.')
      );
      return
$classes;
  }
}

function
custom_user_display($op) {
  switch (
$op) {
    case
'elements':
     
$items['buddylist_remove'] = array(
       
'#title' => t('Display buddylist remove link'),
       
'#category' => 'decorators',
      );
      return
$items;

    case
'classes':
     
$classes['custom_user_info'] = array(
       
'name' => t('User info block'),
       
'description' => t('This class applies to users shown in the user info block.')
      );
      return
$classes;
  }
}
?>

d) The (currently non-existing) UI to map classes to build modes could live in contrib, if that turns out to be not suitable for core. Although that's also the least complicated part:

<?php
// 'class' => 'style id' ("build_mode")
$conf['user_display_classes'] = array(
 
'comment' => 1,
 
'node_event_page' => 1,
 
'node_forum_page' => 1,
 
'user_block_new' => 1,
 
'user_block_online' => 1,
 
'user_visits_block' => 8,
);
?>

e) Markup. For flexible theming in different locations and states, depending on the user display style and its elements, one needs a fair amount of markup and CSS classes. I could imagine that this flexibility is not needed on all Drupal sites or in all situations of a Drupal site - that's why User Display API falls back to theme_username()'s regular output when none of its styles shall be rendered.

<div class="user-display user-picture user-user_medium user-status user-offline user-name user-links user-25 user-links-processed">
  <div class="user-picture"><a title="" href="/user/sun"><img class="imagecache imagecache-user_medium" title="" alt="sun's picture" src="/files/imagecache/user_medium/pictures/avatar-default.png" /></a></div>
  <div class="user-status"><img height="12" width="12" alt="Offline" src="/themes/foo/images/icon_offline.png" /></div>
  <span class="user-name"><a title="" href="/user/sun">sun</a></span>
</div>

f) In correlation with c) and e): For proper theming, it's pretty important to be able to re-order all elements in a style. Fields could probably be re-ordered via build mode UI already, but when considering that above mentioned elements/decorators are rather auto-generated information and links from modules, it gets a bit complicated. Since there is no UI currently, ordering is done hard-coded:

<?php
$conf
['user_display_styles'] = array(
 
1 => array(
   
'name' => 'Review', // Only used internally.
   
'elements' => array(
      array(
'user_display_imagecache', array('user_small')),
      array(
'user_display_onlinestatus'),
      array(
'user_display_username'),
      array(
'user_display_comments'), // Stats: Displays # of comments.
     
array('user_display_nodes', array('review')), // Stats: Displays # of nodes of type 'review' by user.
     
array('user_display_links'),
    ),
  ),
);
?>

g) Technically, theme('user_picture') is superfluous with User Display API's approach and could be nuked.

#2

guix - July 14, 2009 - 14:11

Subscribe

 
 

Drupal is a registered trademark of Dries Buytaert.