Exemple #1
0
 /**
  * Проверка объекта соответствию указанному условию
  * <code>
  * [                                   // услвоия поиска объединенные логическим AND
  *    ['uri', '=', '?'],               // сравнение атрибута
  *    ['not', [                        // отрицание всех вложенных условий (в примере одно)
  *         ['value', 'like', '%?%']    // сравнение атрибута value с шаблоном %?%
  *    ]],
  *    ['any', [                        // условия объединенные логическим OR
  *         ['child', [                 // проверка подчиенного объекта
  *             ['name', '=', 'price'], // имя подчиненного объекта (атрибут name)
  *             ['value', '<', 100],
  *         ]]
  *     ]],
  *     ['is', '/library/object']        // кем объект является? проверка наследования
  * )
  * @param array|string $cond Условие как для поиска
  * @throws \Exception
  * @return bool
  */
 function verify($cond)
 {
     if (empty($cond)) {
         return true;
     }
     if (is_string($cond)) {
         $cond = Data::condStringToArray($cond);
     }
     if (count($cond) == 1 && is_array($cond[0])) {
         $cond = $cond[0];
     }
     if (is_array($cond[0])) {
         $cond = array('all', $cond);
     }
     switch (strtolower($cond[0])) {
         case 'all':
             if (count($cond) > 2) {
                 unset($cond[0]);
                 $cond[1] = $cond;
             }
             foreach ($cond[1] as $c) {
                 if (!$this->verify($c)) {
                     return false;
                 }
             }
             return true;
         case 'any':
             if (count($cond) > 2) {
                 unset($cond[0]);
                 $cond[1] = $cond;
             }
             foreach ($cond[1] as $c) {
                 if ($this->verify($c)) {
                     return true;
                 }
             }
             return !sizeof($cond[1]);
         case 'not':
             return !$this->verify($cond[1]);
             // Проверка подчиненного
         // Проверка подчиненного
         case 'child':
             $child = $this->{$cond[1]};
             if ($child->is_exists()) {
                 if (isset($cond[2])) {
                     return $child->verify($cond[2]);
                 }
                 return true;
             }
             return false;
             // Проверка наследника
             //            case 'heir':
             //                $heir = $this->{$cond[1]};
             //                if ($heir->is_exists()){
             //                    if (isset($cond[2])){
             //                        return $heir->verify($cond[2]);
             //                    }
             //                    return true;
             //                }
             //                return false;
             // Эквивалентность указанному объекту
         // Проверка наследника
         //            case 'heir':
         //                $heir = $this->{$cond[1]};
         //                if ($heir->is_exists()){
         //                    if (isset($cond[2])){
         //                        return $heir->verify($cond[2]);
         //                    }
         //                    return true;
         //                }
         //                return false;
         // Эквивалентность указанному объекту
         case 'eq':
             if (is_array($cond[1])) {
                 $cond = $cond[1];
             } else {
                 unset($cond[0]);
             }
             foreach ($cond as $proto) {
                 if ($this->eq($proto)) {
                     return true;
                 }
             }
             return false;
             // Является ли подчиенным для указанного объекта или eq()
         // Является ли подчиенным для указанного объекта или eq()
         case 'in':
             if (is_array($cond[1])) {
                 $cond = $cond[1];
             } else {
                 unset($cond[0]);
             }
             foreach ($cond as $parent) {
                 if ($this->in($parent)) {
                     return true;
                 }
             }
             return false;
             // Является ли наследником указзаного объекта или eq()
         // Является ли наследником указзаного объекта или eq()
         case 'is':
             if (is_array($cond[1])) {
                 $cond = $cond[1];
             } else {
                 unset($cond[0]);
             }
             foreach ($cond as $proto) {
                 if ($this->is($proto)) {
                     return true;
                 }
             }
             return false;
             // in || is
         // in || is
         case 'of':
             if (is_array($cond[1])) {
                 $cond = $cond[1];
             } else {
                 unset($cond[0]);
             }
             foreach ($cond as $obj) {
                 if ($this->of($obj)) {
                     return true;
                 }
             }
             return false;
         case 'child_of':
             if (is_array($cond[1])) {
                 $cond = $cond[1];
             } else {
                 unset($cond[0]);
             }
             foreach ($cond as $parent) {
                 if ($this->child_of($parent)) {
                     return true;
                 }
             }
             return false;
         case 'heir_of':
             if (is_array($cond[1])) {
                 $cond = $cond[1];
             } else {
                 unset($cond[0]);
             }
             foreach ($cond as $proto) {
                 if ($this->heir_of($proto)) {
                     return true;
                 }
             }
             return false;
         case 'is_my':
             return $this->is_my();
         case 'access':
             return $this->is_accessible($cond[1]);
             // Остальные параметры считать условиями на атрибут
         // Остальные параметры считать условиями на атрибут
         default:
             if ($cond[0] == 'attr') {
                 array_shift($cond);
             }
             if (sizeof($cond) < 2) {
                 $cond[1] = '!=';
                 $cond[2] = 0;
             }
             if (isset($this->_attributes[$cond[0]]) || array_key_exists($cond[0], $this->_attributes)) {
                 $value = $this->_attributes[$cond[0]];
             } else {
                 $value = null;
             }
             switch ($cond[1]) {
                 case '=':
                     return $value == $cond[2];
                 case '<':
                     return $value < $cond[2];
                 case '>':
                     return $value > $cond[2];
                 case '>=':
                     return $value >= $cond[2];
                 case '<=':
                     return $value <= $cond[2];
                 case '!=':
                 case '<>':
                     return $value != $cond[2];
                 case 'like':
                     $pattern = strtr($cond[2], array('%' => '*', '_' => '?'));
                     return fnmatch($pattern, $value);
                 case 'in':
                     if (!is_array($cond[2])) {
                         $cond[2] = array($cond[2]);
                     }
                     return in_array($value, $cond[2]);
             }
             return false;
     }
 }