Advertisement
Guest User

mailsystem_get_classes with caching

a guest
Dec 23rd, 2013
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.27 KB | None | 0 0
  1. /**
  2.  * Returns a list of classes which implement MailSystemInterface.
  3.  */
  4. function &mailsystem_get_classes() {
  5.   $mailsystem_classes = &drupal_static(__FUNCTION__);
  6.   if (!isset($mailsystem_classes) && $cache = cache_get('mailsystem_get_classes')) {
  7.       $mailsystem_classes = $cache->data;
  8.   }
  9.   if (!isset($mailsystem_classes)) {
  10.     $mailsystem_classes = array();
  11.     // @todo Is there a better way to find all mail-related classes?
  12.     $declared_classes = get_declared_classes();
  13.     $all_classes = array_combine(
  14.       $declared_classes,
  15.       array_fill(0, count($declared_classes), 0)
  16.     );
  17.     $mail_classes = db_select('registry', 'registry')
  18.       ->distinct()
  19.       ->fields('registry', array('name', 'filename'))
  20.       ->where("type=:type AND ( filename like :filename OR name like :name )",
  21.         // Making the HUGE assumption that all classes which implement
  22.         // MailSystemInterface have filenames containing '.mail.' or
  23.         // classnames ending in 'MailSystem'.
  24.         array(
  25.           ':type' => 'class',
  26.           ':name' => '%MailSystem',
  27.           ':filename' => '%.mail.%',
  28.         )
  29.       )
  30.       ->execute()
  31.       ->fetchAllKeyed();
  32.     foreach ($mail_classes as $classname => $classfile) {
  33.       if ( file_exists($classfile)
  34.         && drupal_autoload_class($classname)
  35.       ) {
  36.         $all_classes[$classname] = 1;
  37.       }
  38.     }
  39.     foreach ($all_classes as $classname => $autoload) {
  40.       if ( ($autoload || preg_match('/MailSystem/', $classname))
  41.         && ($object = new $classname)
  42.         && ($object instanceof MailSystemInterface)
  43.       ) {
  44.         $mailsystem_classes[$classname] = $classname;
  45.       }
  46.       elseif ($autoload) {
  47.         // Clear classes that are no longer available.
  48.         db_delete('registry')
  49.           ->condition('name', $classname)
  50.           ->execute();
  51.       }
  52.     }
  53.     foreach (array_unique(mailsystem_get()) as $classname) {
  54.       if (class_exists($classname)) {
  55.         $mailsystem_classes[$classname] = $classname;
  56.       }
  57.       else {
  58.         mailsystem_clear(array(mailsystem_default_id() => $classname));
  59.       }
  60.     }
  61.     ksort($mailsystem_classes);
  62.     cache_set('mailsystem_get_classes', $mailsystem_classes, 'cache', time() + 3600);
  63.   }
  64.   return $mailsystem_classes;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement