Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

FilterComposite.php

Zuletzt modifiziert: 09.10.2024, 12:58 - Dateigröße: 5.77 KiB


 001  <?php
 002  /**
 003   * Zend Framework (http://framework.zend.com/)
 004   *
 005   * @link           http://github.com/zendframework/zf2 for the canonical source repository
 006   * @copyright      Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
 007   * @license        http://framework.zend.com/license/new-bsd New BSD License
 008   */
 009  namespace Zend\Stdlib\Hydrator\Filter;
 010   
 011  use ArrayObject;
 012  use Zend\Stdlib\Exception\InvalidArgumentException;
 013   
 014  class FilterComposite implements FilterInterface
 015  {
 016      /**
 017       * @var ArrayObject
 018       */
 019      protected $orFilter;
 020   
 021      /**
 022       * @var ArrayObject
 023       */
 024      protected $andFilter;
 025   
 026      /**
 027       * Constant to add with "or" conditition
 028       */
 029      const CONDITION_OR = 1;
 030   
 031      /**
 032       * Constant to add with "and" conditition
 033       */
 034      const CONDITION_AND = 2;
 035   
 036      /**
 037       * Define default Filter
 038       *
 039       * @param  array $orFilter
 040       * @param  array $andFilter
 041       * @throws InvalidArgumentException
 042       */
 043      public function __construct($orFilter = array(), $andFilter = array())
 044      {
 045          array_walk(
 046              $orFilter,
 047              function ($value, $key) {
 048                  if (!is_callable($value) && !$value instanceof FilterInterface) {
 049                      throw new InvalidArgumentException(
 050                          'The value of ' . $key . ' should be either a callable or ' .
 051                          'an instance of Zend\Stdlib\Hydrator\Filter\FilterInterface'
 052                      );
 053                  }
 054              }
 055          );
 056   
 057          array_walk(
 058              $andFilter,
 059              function ($value, $key) {
 060                  if (!is_callable($value) && !$value instanceof FilterInterface) {
 061                      throw new InvalidArgumentException(
 062                          'The value of ' . $key . '  should be either a callable or ' .
 063                          'an instance of Zend\Stdlib\Hydrator\Filter\FilterInterface'
 064                      );
 065                  }
 066              }
 067          );
 068   
 069          $this->orFilter = new ArrayObject($orFilter);
 070          $this->andFilter = new ArrayObject($andFilter);
 071      }
 072   
 073      /**
 074       * Add a filter to the composite. Has to be indexed with $name in
 075       * order to identify a specific filter.
 076       *
 077       * This example will exclude all methods from the hydration, that starts with 'getService'
 078       * <code>
 079       * $composite->addFilter('exclude',
 080       *     function ($method) {
 081       *         if (preg_match('/^getService/', $method) {
 082       *             return false;
 083       *         }
 084       *         return true;
 085       *     }, FilterComposite::CONDITION_AND
 086       * );
 087       * </code>
 088       *
 089       * @param  string                   $name
 090       * @param  callable|FilterInterface $filter
 091       * @param  int                      $condition Can be either FilterComposite::CONDITION_OR or FilterComposite::CONDITION_AND
 092       * @throws InvalidArgumentException
 093       * @return FilterComposite
 094       */
 095      public function addFilter($name, $filter, $condition = self::CONDITION_OR)
 096      {
 097          if (!is_callable($filter) && !($filter instanceof FilterInterface)) {
 098              throw new InvalidArgumentException(
 099                  'The value of ' . $name . ' should be either a callable or ' .
 100                  'an instance of Zend\Stdlib\Hydrator\Filter\FilterInterface'
 101              );
 102          }
 103   
 104          if ($condition === self::CONDITION_OR) {
 105              $this->orFilter[$name] = $filter;
 106          } elseif ($condition === self::CONDITION_AND) {
 107              $this->andFilter[$name] = $filter;
 108          }
 109   
 110          return $this;
 111      }
 112   
 113      /**
 114       * Remove a filter from the composition
 115       *
 116       * @param $name string Identifier for the filter
 117       * @return FilterComposite
 118       */
 119      public function removeFilter($name)
 120      {
 121          if (isset($this->orFilter[$name])) {
 122              unset($this->orFilter[$name]);
 123          }
 124   
 125          if (isset($this->andFilter[$name])) {
 126              unset($this->andFilter[$name]);
 127          }
 128   
 129          return $this;
 130      }
 131   
 132      /**
 133       * Check if $name has a filter registered
 134       *
 135       * @param $name string Identifier for the filter
 136       * @return bool
 137       */
 138      public function hasFilter($name)
 139      {
 140          return isset($this->orFilter[$name]) || isset($this->andFilter[$name]);
 141      }
 142   
 143      /**
 144       * Filter the composite based on the AND and OR condition
 145       * Will return true if one from the "or conditions" and all from
 146       * the "and condition" returns true. Otherwise false
 147       *
 148       * @param $property string Parameter will be e.g. Parent\Namespace\Class::method
 149       * @return bool
 150       */
 151      public function filter($property)
 152      {
 153          $andCount = count($this->andFilter);
 154          $orCount = count($this->orFilter);
 155          // return true if no filters are registered
 156          if ($orCount === 0 && $andCount === 0) {
 157              return true;
 158          } elseif ($orCount === 0 && $andCount !== 0) {
 159              $returnValue = true;
 160          } else {
 161              $returnValue = false;
 162          }
 163   
 164          // Check if 1 from the or filters return true
 165          foreach ($this->orFilter as $filter) {
 166              if (is_callable($filter)) {
 167                  if ($filter($property) === true) {
 168                      $returnValue = true;
 169                      break;
 170                  }
 171                  continue;
 172              } else {
 173                  if ($filter->filter($property) === true) {
 174                      $returnValue = true;
 175                      break;
 176                  }
 177              }
 178          }
 179   
 180          // Check if all of the and condition return true
 181          foreach ($this->andFilter as $filter) {
 182              if (is_callable($filter)) {
 183                  if ($filter($property) === false) {
 184                      return false;
 185                  }
 186                  continue;
 187              } else {
 188                  if ($filter->filter($property) === false) {
 189                      return false;
 190                  }
 191              }
 192          }
 193   
 194          return $returnValue;
 195      }
 196  }
 197