public static function &exec(&$layers, $callback, &$parent = null) { $props =& static::$props; $r =& Each::exec($layers, function &(&$layer) use(&$parent, $callback, $props) { $r =& $callback($layer, $parent); if (!is_null($r)) { return $r; } $r =& Each::foro($layer, function &(&$val, $name) use(&$layer, $callback, $props) { $r = null; if (isset($props['list'][$name])) { $r =& Run::exec($val, $callback, $layer); if (!is_null($r)) { return $r; } } else { if (isset($props['keys'][$name])) { $r =& Each::foro($val, function &(&$v, $i) use(&$layer, $callback) { return Run::exec($v, $callback, $layer); }); if (!is_null($r)) { return $r; } } } return $r; }); return $r; }); return $r; }
/** * Поиск слоя по значению свойства **/ public static function &find($name, $value) { $right = Sequence::right($name); return Run::exec(Controller::$layers, function &(&$layer) use($right, $value) { if (Sequence::get($layer, $right) == $value) { return $layer; } $r = null; return $r; }); }
public static function check(&$layers) { static::$layers =& $layers; //Пробежка по слоям Event::tik('Infrajs'); Event::tik('layer'); Event::fire('Infrajs.oninit'); //сборка событий Run::exec(static::$layers, function &(&$layer, &$parent) { //Запускается у всех слоёв в работе $r = null; if ($parent) { $layer['parent'] =& $parent; } Event::fire('layer.oninit', $layer); if (!Event::fire('layer.ischeck', $layer)) { return $r; } Event::fire('layer.oncheck', $layer); return $r; }); //разрыв нужен для того чтобы можно было наперёд определить показывается слой или нет. oncheck у всех. а потом по порядку. Event::fire('oncheck'); //момент когда доступны слои по getUnickLayer Run::exec(static::$layers, function &(&$layer) { //С чего вдруг oncheck у всех слоёв.. надо только у активных $r = null; if (Event::fire('layer.isshow', $layer)) { //Событие в котором вставляется html Event::fire('layer.onshow', $layer); //при клике делается отметка в конфиге слоя и слой парсится... в oncheck будут подстановки tpl и isRest вернёт false //onchange показанный слой не реагирует на изменение адресной строки, нельзя привязывать динамику интерфейса к адресной строке, только черещ перепарсивание } return $r; }); //у родительского слоя showed будет реальное а не старое Event::fire('Infrajs.onshow'); //loader, setA, seo добавить в html, можно зациклить check $html = View::html(); //View::html('',true); return $html; }
return; } $layer['div'] = Template::parse(array($layer['divtpl']), $layer); }, 'div:env,config,external'); Event::handler('layer.isshow', function (&$layer) { if (empty($layer['div']) && !empty($layer['parent'])) { return false; } //Такой слой игнорируется, события onshow не будет, но обработка пройдёт дальше у других дивов $start = false; if (Run::exec(Controller::$layers, function (&$l) use(&$layer, &$start) { //Пробежка не по слоям на ветке, а по всем слоям обрабатываемых после.. .то есть и на других ветках тоже if (!$start) { if (Each::isEqual($layer, $l)) { $start = true; } return; } if (@$l['div'] !== @$layer['div']) { return; } //ищим совпадение дивов впереди if (Controller::fire('layer.isshow', $l)) { $layer['is_save_branch'] = Layer::isParent($l, $layer); return true; //Слой который дальше показывается в томже диве найден } })) { return false; } }, 'div:is');
<?php namespace infrajs\controller; use infrajs\controller\Controller; use infrajs\controller\Run; use infrajs\view\View; use infrajs\ans\Ans; use infrajs\path\Path; if (!is_file('vendor/autoload.php')) { chdir('../../../../'); require_once 'vendor/autoload.php'; } $ans = array(); $ans['title'] = 'isEqual'; $l = array('tpl' => 'asdf', 'test' => 'bad'); $layers = array(&$l); $msg = 'Maybe good'; $layer =& Run::exec($layers, function &(&$layer) use($msg) { $layer['test'] = $msg; return $layer; }); $l['test'] = 'Good'; if ($l['test'] != $layer['test']) { return Ans::err($ans, 'err'); } return Ans::ret($ans, 'ret');
//Мы не можем делать проверку пока другой плагин не подменит tpl $res = Load::loadTEXT($layer['tpl']); if (!$res) { return false; } } }, 'tplcheck:is'); Event::handler('Layer.isshow', function (&$layer) { //tpl depricated if (Layer::pop($layer, 'onlyclient')) { return; } return Tpl::jsoncheck($layer); }, 'jsoncheck:is'); Run::runAddKeys('childs'); Run::runAddList('child'); Event::handler('Layer.oninit', function () { $root = Crumb::getInstance(); if (!$root->is) { throw new \Exception('Crumb нужно инициализировать до запуска контроллера'); } Sequence::set(Template::$scope, Sequence::right('infra.Crumb.query'), $root->query); Sequence::set(Template::$scope, Sequence::right('infra.Crumb.params'), Crumb::$params); Sequence::set(Template::$scope, Sequence::right('infra.Crumb.get'), Crumb::$get); $cl = function ($mix = null) { return ext\Crumb::getInstance($mix); }; Sequence::set(Template::$scope, Sequence::right('infra.Crumb.getInstance'), $cl); External::add('child', 'layers'); External::add('crumb', function (&$now, &$ext, &$layer, &$external, $i) { //проверка external в onchange
<?php namespace infrajs\controller; use infrajs\path\Path; use infrajs\event\Event; use infrajs\each\Each; Event::handler('Infrajs.oninit', function () { Run::runAddKeys('subs'); //if (!class_exists('External')) return; //External::add('subs', 'divs'); }, 'subs:external,div'); Event::handler('layer.oncheck', function (&$layer) { if (@(!$layer['parent'])) { return; } if (@$layer['parent']['subs']) { //forx бежим по свойствам объекта, как по массивам. Массивы могут быть вложенные //var_dump($layer['parent']['subs']); $key = Each::forx($layer['parent']['subs'], function (&$l, $key) use(&$layer) { //Такую пробежку у родителя сразу для всех детей делать не нельзя, так как external у детей ещё не сделан. if (Each::isEqual($layer, $l)) { return $key; } //Ага, текущей слой описан у родителя в subs. Любой return останавливает цикл и возвращает иначе key был бы undefined. }); if ($key) { //Так так теперь предопределяем свойства //div не круче external.(но в external div не указывается) в tpl и tplroot не круче $layer['div'] = $key; $layer['sub'] = true;
<?php namespace infrajs\controller; use infrajs\router\Router; use infrajs\load\Load; if (!is_file('vendor/autoload.php')) { chdir('../../../../'); require_once 'vendor/autoload.php'; Router::init(); } $data = Controller::$conf['index']; Run::exec($data, function &(&$layer) { while (@$layer['external'] && !Layer::pop($layer, 'onlyclient')) { $ext =& $layer['external']; External::checkExt($layer, $ext); } $r = null; return $r; }); $data = Load::json_encode($data); ?> infrajs.checkAdd(<?php echo $data; ?> ); Event.handler('Crumb.onchange', function () { infrajs.check(); }, 'infrajs');<?php
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; }