[TYPO3-dev] How to add custom overlays to Backend sprite icons?

Dirk Wenzel wenzel at webfox03.de
Sat Feb 28 13:14:40 CET 2015


Hi all,
I would like to add a custom overlay to record icons in Backend 
reflecting a certain state of records.

What I achieved so far:
There is a hook called overrideIconOverlay in 
TYPO3\CMS\Backend\Utility\IconUtility::mapRecordOverlayToSpriteIconName(...) 
which allows to add a status.

I added my status field (is_duplicate) to the enablecolumns of its TCA:
$TCA['<tableName>']['ctrl‘]['enablecolumns'] = array(
   'disabled' => 'hidden',
   'starttime' => 'starttime',
   'endtime' => 'endtime',
   'is_duplicate' => 'is_duplicate'
);

implemented a hook method:
class IconUtilityHook {
   /**
   * Override Icon Overlay
   * Sets a status which can be interpreted by the
   * IconUtility for rendering an overlay
   *
   * @param \string $table
   * @param \array $row
   * @param \array $status
   */
   public function overrideIconOverlay(&$table, &$row, &$status) {
     if ((bool)$row['is_duplicate']) {
       $status['isDuplicate'] = TRUE;
     }
   }
}

and registred it:
+$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_iconworks.php']['overrideIconOverlay']['<extensionName>'] 
= '<Vendor>\\<Package>\\Hooks\\IconUtilityHook';

Further I added a priority and name for the overlay
$GLOBALS['TBE_STYLES']['spriteIconApi']['spriteIconRecordOverlayPriorities'][] 
= 'isDuplicate';
$GLOBALS['TBE_STYLES']['spriteIconApi']['spriteIconRecordOverlayNames']['isDuplicate'] 
= 'status-overlay-is-duplicate';

But it seems that the IconUtility does not provide a way to register an 
image for this overlay. In its method getIcon(...) the default enable 
fields are evaluated. If any is set IconUtility::makeIcon(...) is called 
with a matching argument $mode. There is a switch which chooses the 
matching icon file (for known states):

if ($mode) {
  unset($ol_im);
  switch ($mode) {
    case 'deleted':
      $ol_im = self::imagecreatefrom($GLOBALS['BACK_PATH'].
        'gfx/overlay_deleted.gif');
      break;
    case 'futuretiming':
    $ol_im = self::imagecreatefrom($GLOBALS['BACK_PATH'] .
        'gfx/overlay_timing.gif');
      break;
    case 'timing': $ol_im = self::imagecreatefrom($GLOBALS['BACK_PATH'].
       'gfx/overlay_timing.gif');
      break;
    case 'hiddentiming':
       $ol_im = self::imagecreatefrom($GLOBALS['BACK_PATH'] .
        'gfx/overlay_hidden_timing.gif');
      break;
    case 'no_icon_found':
       $ol_im = self::imagecreatefrom($GLOBALS['BACK_PATH'] .
        'gfx/overlay_no_icon_found.gif');
      break;
    case 'disabled': // is already greyed - nothing more
      $ol_im = 0;
      break;
    case 'hidden':
    default:
      $ol_im = self::imagecreatefrom($GLOBALS['BACK_PATH'] .
       'gfx/overlay_hidden.gif');
}
But there is no case for custom overlay icons. This results in 
displaying my state with the no_icon_found overlay.

Did I miss something? Is there any way to register an overlay icon and 
state?

Thanks in advance
Dirk



More information about the TYPO3-dev mailing list