Пример #1
0
 public static function isParent(&$layer, &$parent)
 {
     while ($layer) {
         if (Each::isEqual($parent, $layer)) {
             return true;
         }
         $layer =& $layer['parent'];
     }
     return false;
 }
Пример #2
0
 public static function merge(&$layer, &$external, $i)
 {
     //Используется в configinherit
     if (Each::isEqual($external[$i], $layer[$i])) {
         //Иначе null равено null но null свойство есть и null свойства нет разные вещи
     } elseif (isset(static::$props[$i])) {
         $func = static::$props[$i];
         while (is_string($func)) {
             //Указана не сама обработка а свойство с такойже обработкой
             $func = static::$props[$func];
         }
         $layer[$i] = call_user_func_array($func, array(&$layer[$i], &$external[$i], &$layer, &$external, $i));
     } else {
         if (is_null($layer[$i])) {
             $layer[$i] = $external[$i];
         }
     }
 }
Пример #3
0
	$test.='b';
},'',$obj);
$r=Event::fire('test.ontest', $obj);
if($test!='ab'||!$r) return Ans::err($ans,'Событие с объектом '.$test);
*/
$obj1 = array('id' => 1);
$obj2 = array('id' => 2);
$obj3 = array('id' => 3);
Event::$classes['layer'] = function ($obj) {
    return $obj['id'];
};
$test = '';
Event::handler('layer.ontest', function (&$obj) use(&$test, &$obj2) {
    $test .= $obj['id'];
    if ($obj['id'] == $obj2['id']) {
        if (!Each::isEqual($obj, $obj2)) {
            return;
        }
    }
    if ($obj['id'] === 1) {
        return false;
    }
    $test .= $obj['id'];
});
$r = Event::fire('layer.ontest', $obj2);
if (!$r) {
    return Ans::err($ans, 'Событие анализирую объект возвращает true');
}
$r = Event::fire('layer.ontest', $obj1);
if ($r) {
    return Ans::err($ans, 'Событие анализирую объект возвращает false');
Пример #4
0
	}
}, 'layer');
*/
Event::handler('Layer.isshow', function (&$layer) {
    //Если не указан див и указан родитель, не показываем ничего
    //Отсутсвие дива не запрещает показ
    //Такой слой игнорируется, события onshow не будет, но обработка пройдёт дальше у других дивов
    if (empty($layer['div'])) {
        return;
    }
    $start = false;
    if ($master = Run::exec(Controller::$layers, function &(&$l) use(&$layer, &$start) {
        //Пробежка не по слоям на ветке, а по всем слоям обрабатываемых после.. .то есть и на других ветках тоже
        $r = null;
        if (!$start) {
            if (Each::isEqual($layer, $l)) {
                $start = true;
            }
            return $r;
        }
        if (empty($l['div'])) {
            return $r;
        }
        if (empty($l['tpl'])) {
            return $r;
        }
        if ($l['div'] !== $layer['div']) {
            return $r;
        }
        //ищим совпадение дивов впереди
        if (Event::fire('layer.isshow', $l)) {
}
if ($obj->parent !== $parent) {
    return Ans::err($ans, 'Некорректно определён parent');
}
Crumb::change('test/hi');
$obj = Crumb::getInstance('test');
if (!$obj->is) {
    return Ans::err($ans, 'Не применилась крошка на втором уровне');
}
$root = Crumb::getInstance();
Crumb::change('');
$crumb = Crumb::getInstance('');
$f = $crumb->query;
Crumb::change('test');
$s =& Crumb::getInstance('some');
$s2 =& Crumb::getInstance('some');
$r = Each::isEqual($s, $s2);
$s = Crumb::$childs;
$r2 = Each::isEqual($s[''], Crumb::getInstance());
$r = $r && $r2;
$crumb = Crumb::getInstance('test');
$crumb2 = Crumb::getInstance('test2');
if (!($f == null && $r && !is_null($crumb->value) && is_null($crumb2->value))) {
    return Ans::err($ans, 'Изменения крошек');
}
Crumb::change('test/test');
$inst = Crumb::getInstance('test/test/test');
Crumb::change($query);
Layer::$start_id = 1;
Layer::$ids = array();
return Ans::ret($ans);
Пример #6
0
 public function testEach()
 {
     /**
      * Проверка на ассоциативный массив.
      * Метод возвращает true только в том случае, если массив ассоциативный.
      */
     $elements = ['9' => '42', 8, 4, 5, 3];
     $res = Each::isAssoc($elements);
     $this->assertTrue($res);
     $elements = 10;
     $res = Each::isAssoc($elements);
     $this->assertTrue(null === $res);
     $elements = [9, 8, 4, 5, 3];
     $res = Each::isAssoc($elements);
     $this->assertTrue(false === $res);
     /**
      * Проверка на число.
      * Если передано число в текстовом формате, то метод должен отработать
      * с этим аргументом как с числом.
      */
     $el = '';
     $res = Each::isInt($el);
     $this->assertTrue(false === $res);
     $el = 12;
     $res = Each::isInt($el);
     $this->assertTrue(true === $res);
     $el = '12';
     $res = Each::isInt($el);
     $this->assertTrue(true === $res);
     $el = '12 ';
     $res = Each::isInt($el);
     $this->assertTrue(false === $res);
     /**
      * Проверка ссылок друг на друга.
      * Метод возвращает true, когда две переменные являются ссылками друг на друга.
      */
     $a = 1;
     $b = 1;
     $res = Each::isEqual($a, $b);
     $this->assertTrue(false === $res);
     $a = 1;
     $b = $a;
     $res = Each::isEqual($a, $b);
     $this->assertTrue(false === $res);
     $a = 1;
     $b =& $a;
     $res = Each::isEqual($a, $b);
     $this->assertTrue(true === $res);
     /**
      * Проверяем, количество вызовов и на какой элемент попадаем при определенном количестве вызовов.
      * Для индексного массива количество итераций анонимной функции должно равняться количеству элементов в массиве.
      * Если в индексном массиве находится вложенный индексный массив, то анонимная функция должна вызываться и
      * для каждого индекса вложенного массива.
      * Если методу передан простой элемент или ассоциативный массив, вызов анонимной функции
      * должен произойти только один раз.
      */
     $counter = 0;
     $el = ['oduvanio', 'mail'];
     Each::exec($el, function &() use(&$counter) {
         $r = null;
         $counter++;
         return $r;
     });
     $this->assertTrue(2 === $counter);
     $counter = 0;
     $el = [2, [4, 6], 5];
     Each::exec($el, function ($b) use(&$counter) {
         $counter++;
         if ($counter === 3) {
             $this->assertTrue(6 === $b);
         }
     });
     $this->assertTrue(4 === $counter);
     $counter = 0;
     $el = 1;
     Each::exec($el, function () use(&$counter) {
         $counter++;
     });
     $this->assertTrue(1 === $counter);
     $el = 'test';
     Each::exec($el, function () use(&$counter) {
         $counter++;
     });
     $this->assertTrue(2 === $counter);
     $el = ['name' => 'oduvanio', 'email' => 'mail'];
     Each::exec($el, function () use(&$counter) {
         $counter++;
     });
     $this->assertTrue(3 === $counter);
 }
Пример #7
0
function xls_processGroupFilter(&$data)
{
    $all = array();
    xls_runGroups($data, function &(&$gr) use(&$all) {
        $title = mb_strtolower($gr['title']);
        //echo $title.'<br>';
        if (!isset($all[$title])) {
            $all[$title] = array('orig' => &$gr, 'list' => array());
        } else {
            //Ну вот и нашли повторение
            $all[$title]['list'][] =& $gr;
            //xls_merge($all[$title],$gr);
            //у некой прошлой группы появляются новые childs.. но мы всё ещё бежим по какому-то его childs и новые добавленные будут проигнорированны
            //return new Fix('del');
        }
        $r = null;
        return $r;
    });
    Each::foro($all, function &(&$des) {
        Each::forr($des['list'], function &(&$gr) use($des) {
            xls_merge($des['orig'], $gr);
            Each::forr($gr['parent']['childs'], function &(&$g) use(&$gr) {
                if (Each::isEqual($g, $gr)) {
                    $r = new Fix('del', true);
                    return $r;
                }
                $r = null;
                return $r;
            });
            $r = null;
            return $r;
        });
        $r = null;
        return $r;
    });
    /*//$cat=$data['childs'][0];
    	$cat=$data;
    	unset($cat['parent']);
    	Each::forr($cat['childs'],function(&$g){
    		//if(!is_string($g['parent']))
    		$g['parent']=&$g['parent']['title'];
    		//unset($g['parent']);
    		$g['childs']=sizeof($g['childs']);
    		$g['data']=sizeof($g['data']);
    	});
    	echo '<pre>';
    	print_r($cat);
    	exit;
    	/*
    	xls_runGroups($data,function(&$gr,$i,&$group){//Удаляем пустые группы
    		if(!$group) return;//Кроме верхней группы
    		if(!sizeof($gr['childs'])&&!sizeof($gr['data'])){
    			array_splice($group,$i,1);
    		}
    	},array(),true);
    	*/
}
Пример #8
0
//if($arr!=false)return Ans::err($ans,'функция infra_isAssoc вернула неверный результат, переданный массив является индексным');
//Проверить, являются ли переданые переменные ссылкой друг на друга
$a = 15;
// создаем переменную a
$b = $a;
// записываем копию переменной a в переменную b
$equal = Each::isEqual($a, $b);
if ($equal !== false) {
    return Ans::err($ans, 'Функция infra_isEqual работает неверно $b не является ссылкой на $a');
}
$b =& $a;
// делаем b ссылкой на a
$equal = Each::isEqual($a, $b);
if ($equal !== true) {
    return Ans::err($ans, 'Функция infra_isEqual работает неверно $b является ссылкой на $a');
}
$a = array(1, 2, 4, 7);
// интересно получается, так как раннее мы $b=&$a то уже здесь, даже если присваивать массивы этим переменным, то всё равно при изменении $b всё записывается в $a
$b = array(1, 2, 4, 11);
$equal = Each::isEqual($a, $b);
if ($equal !== true) {
    return Ans::err($ans, 'Функция infra_isEqual работает неверно $b является ссылкой на $a');
}
$b = array(1, 2, 4, 15);
$c = array(1, 2, 4, 11);
//print_r($a);
$equal = Each::isEqual($b, $c);
if ($equal !== false) {
    return Ans::err($ans, 'Функция infra_isEqual работает не правильно, массив $с не является ссылкой на $b');
}
return Ans::ret($ans, 'Всё ок');
Пример #9
0
 public static function check(&$layer)
 {
     if (!isset($layer['env'])) {
         return;
     }
     $r = null;
     //Слои myenv надо показывать тогдаже когда и показывается сам слой
     $myenv = null;
     $ll = null;
     Run::exec(Controller::$layers, function (&$l) use(&$layer, &$myenv, &$ll) {
         //Есть окружение и мы не нашли ни одного true для него
         if (!isset($l['myenv'])) {
             return;
         }
         if (!Event::fire('layer.ischeck', $l)) {
             return;
         }
         //В back режиме выйти нельзя.. смотрятся все слои
         if (Each::isEqual($l, $layer)) {
             return;
         }
         //Значение по умолчанию смотрится отдельно
         if (!isset($l['myenv'][$layer['env']])) {
             return;
         }
         if (is_null($l['myenv'][$layer['env']])) {
             return;
         }
         if (Event::fire('layer.isshow', $l)) {
             //Ищим последнюю установку на счёт env
             $myenv = $l['myenv'][$layer['env']];
             $ll =& $l;
         }
     });
     if (!is_null($myenv)) {
         //Если слой скрываем слоем окружения который у него в родителях числиться он после этого сам всё равно должен показаться
         if ($myenv) {
             //Значение по умолчанию смотрим только если myenv undefined
             $r = true;
         } else {
             $r = false;
             $layer['is_save_branch'] = !!Layer::isParent($ll, $layer);
             //infrajs_isSaveBranch($layer,false);
         }
     }
     if (is_null($r) && @$layer['myenv']) {
         //Значение по умолчанию
         $myenv = $layer['myenv'][$layer['env']];
         if (!is_null($myenv)) {
             //Оо есть значение по умолчанию для самого себя
             if ($myenv) {
                 $r = true;
             } else {
                 //Если слой по умолчанию скрыт его детей не показываем
                 $r = false;
                 $layer['is_save_branch'] = false;
             }
         }
     }
     $layer['envval'] = $myenv;
     if ($r) {
         return !!$myenv;
     }
     return false;
 }