コード例 #1
0
 /**
  * Disconnects the $slot from the $signal with identifier $identifier..
  *
  * If the priority is given it will try to disconnect a slot with that priority.
  * If no such slot is found no slot will be disconnected.
  *
  * If no priority is given it will disconnect the matching slot with the lowest priority.
  *
  * @param string $identifier
  * @param string $signal
  * @param callback $slot
  * @param int $priority
  * @return void
  */
 public function disconnect($identifier, $signal, $slot, $priority = null)
 {
     if (!isset($this->connections[$identifier]) || !isset($this->connections[$identifier][$signal])) {
         return;
     }
     if ($priority === null) {
         $allKeys = array_keys($this->connections[$identifier][$signal]);
         rsort($allKeys, SORT_NUMERIC);
         foreach ($allKeys as $priority) {
             foreach ($this->connections[$identifier][$signal][$priority] as $key => $callback) {
                 if (ezcSignalCallbackComparer::compareCallbacks($slot, $callback)) {
                     unset($this->properties['connections'][$identifier][$signal][$priority][$key]);
                     // if the priority is empty now it should be unset
                     if (count($this->properties['connections'][$identifier][$signal][$priority]) == 0) {
                         unset($this->properties['connections'][$identifier][$signal][$priority]);
                     }
                     return;
                 }
             }
         }
     } else {
         if (isset($this->connections[$identifier][$signal][$priority])) {
             foreach ($this->connections[$identifier][$signal][$priority] as $key => $callback) {
                 if (ezcSignalCallbackComparer::compareCallbacks($slot, $callback)) {
                     unset($this->properties['connections'][$identifier][$signal][$priority][$key]);
                     // if the priority is empty now it should be unset
                     if (count($this->properties['connections'][$identifier][$signal][$priority]) == 0) {
                         unset($this->properties['connections'][$identifier][$signal][$priority]);
                     }
                     return;
                 }
             }
         }
     }
 }
コード例 #2
0
ファイル: signal_collection.php プロジェクト: bmdevel/ezc
 /**
  * Disconnects the $slot from the $signal.
  *
  * If the priority is given it will try to disconnect a slot with that priority.
  * If no such slot is found no slot will be disconnected.
  *
  * If no priority is given it will disconnect the matching slot with the lowest priority.
  *
  * @throws ezcSignalSlotException if the signals options has been set and $signal is not in the list of signals.
  * @param string $signal
  * @param callback $slot
  * @param int $priority
  * @return void
  */
 public function disconnect($signal, $slot, $priority = null)
 {
     // if the the signals option is set we must check if the signal exists
     if ($this->options->signals != null && !in_array($signal, $this->options->signals)) {
         throw new ezcSignalSlotException("No such signal {$signal}");
     }
     if ($priority === null) {
         $priorityKeys = array();
         if (isset($this->priorityConnections[$signal])) {
             $priorityKeys = array_keys($this->priorityConnections[$signal]);
         }
         $allPriorities = array_unique(array_merge($priorityKeys, array(1000)));
         rsort($allPriorities, SORT_NUMERIC);
         foreach ($allPriorities as $priority) {
             if ($priority === 1000) {
                 if (isset($this->defaultConnections[$signal])) {
                     foreach ($this->defaultConnections[$signal] as $key => $callback) {
                         if (ezcSignalCallbackComparer::compareCallbacks($slot, $callback)) {
                             unset($this->defaultConnections[$signal][$key]);
                             return;
                         }
                     }
                 }
             } else {
                 if (isset($this->priorityConnections[$signal]) && isset($this->priorityConnections[$signal][$priority])) {
                     foreach ($this->priorityConnections[$signal][$priority] as $key => $callback) {
                         if (ezcSignalCallbackComparer::compareCallbacks($slot, $callback)) {
                             unset($this->priorityConnections[$signal][$priority][$key]);
                             // if the priority is empty now it should be unset
                             if (count($this->priorityConnections[$signal][$priority]) == 0) {
                                 unset($this->priorityConnections[$signal][$priority]);
                             }
                             return;
                         }
                     }
                 }
             }
         }
     } else {
         if ($priority === 1000) {
             if (isset($this->defaultConnections[$signal])) {
                 foreach ($this->defaultConnections[$signal] as $key => $callback) {
                     if (ezcSignalCallbackComparer::compareCallbacks($slot, $callback)) {
                         unset($this->defaultConnections[$signal][$key]);
                         return;
                     }
                 }
             }
         } else {
             if (isset($this->priorityConnections[$signal]) && isset($this->priorityConnections[$signal][$priority])) {
                 foreach ($this->priorityConnections[$signal][$priority] as $key => $callback) {
                     if (ezcSignalCallbackComparer::compareCallbacks($slot, $callback)) {
                         unset($this->priorityConnections[$signal][$priority][$key]);
                         // if the priority is empty now it should be unset
                         if (count($this->priorityConnections[$signal][$priority]) == 0) {
                             unset($this->priorityConnections[$signal][$priority]);
                         }
                         return;
                     }
                 }
             }
         }
     }
 }