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; }
private static function execute($fire, &$list) { $omit = false; for ($i = 0; $i < sizeof($list['list']); $i++) { //Подписка на ходу $handler =& $list['list'][$i]; if (!empty($handler['executed'][$fire['objid']])) { continue; } if (!is_null($handler['obj']) && $handler['objid'] !== $fire['objid']) { continue; } else { //Объекта у подписки не указан //fire с объктом, подписка без объекта //подписка должна выполниться для всех объектов fire. Проходим дальше } if (empty($handler['keystik'])) { Event::keystik($handler); } $iskeys = array_diff($handler['keystik'], $list['readykeys'][$fire['objid']]); //Проверили выполнены ли все существующие ключи if (sizeof($iskeys) && (sizeof($iskeys) != 1 || is_null($handler['key']) || !in_array($handler['key'], $handler['keys']))) { $omit = array('keys' => $iskeys, 'handler' => $handler, 'fire' => $fire); continue; //Найден неудовлетворённый ключ.. может быть выход из цикла и на ислкючение } if (empty($list['readyobj'][$fire['objid']][$handler['key']])) { $list['readyobj'][$fire['objid']][$handler['key']] = 0; } $list['readyobj'][$fire['objid']][$handler['key']]++; if (static::hv($handler['key'])) { //Если есть ключ if (!in_array($handler['key'], $list['readykeys'][$fire['objid']])) { //И этого ключа ещё не было //Если выполнено по объекту столько же сколько всего обработчиков if ($list['readyobj'][$fire['objid']][$handler['key']] === sizeof($list['keys'][$handler['key']])) { $list['readykeys'][$fire['objid']][] = $handler['key']; } } } $handler['executed'][$fire['objid']] = true; $moment = array("fire" => $fire, "handler" => $handler, "parent" => static::$moment, "list" => $list, "i" => $i); static::$moment = $moment; $r = $handler['callback']($fire['obj']); static::$moment = $moment['parent']; if (!static::is($r)) { return $r; } $r = static::execute($fire, $list); return $r; } if ($omit) { echo '<pre>'; unset($fire['obj']); print_r($omit); echo '<hr>'; print_r($list); throw new \Exception('Рекурсивная зависимость подписчиков. ' . implode(',', $omit['keys'])); } }
<?php namespace infrajs\layer\seojson; use infrajs\path\Path; use infrajs\controller\Layer; use infrajs\controller\Tpl; use infrajs\event\Event; Event::handler('layer.onshow', function (&$layer) { if (Layer::pop($layer, 'onlyclient')) { return; } Seojson::check($layer); }, 'seojson:tpl');
}); $r = Event::fire('onfoo'); if ($r) { return Ans::err($ans, 'Самозависимость'); } if ($test != '12') { return Ans::err($ans, 'Динамическое управление порядком'); } Event::handler('ohoho', function () use(&$test) { }, 'foo:bar'); Event::handler('ohoho', function () use(&$test) { }, 'bar:foo'); $r = false; try { ob_start(); Event::fire('ohoho'); } catch (\Exception $e) { ob_end_clean(); $r = true; } if (!$r) { return Ans::err($ans, 'Должно было сработать рекурсивное исключение'); } Event::handler('ohoho2', function () use(&$test) { $test = 'asdf'; }, 'some:some'); Event::fire('ohoho2'); if ($test != 'asdf') { return Ans::err($ans, 'Сам себя не может заблокировать'); } return Ans::ret($ans);
<?php namespace infrajs\ascroll; use infrajs\event\Event; use infrajs\view\View; use infrajs\infra\Infra; Event::handler('onjs', function () { View::js('-ascroll/ascroll.js'); View::js('-ascroll/infra.js'); });
$ans = array(); $ans['title'] = 'Проверка ключей событий'; $test = ''; Event::handler('ontestkeys', function () use(&$test) { $test .= 3; }, 'some:test'); Event::handler('ontestkeys', function () use(&$test) { $test .= 1; }, 'test'); Event::handler('ontestkeys', function () use(&$test) { $test .= 2; }, 'test'); Event::fire('ontestkeys'); if ($test != '123') { return Ans::err($ans, 'Группа событий не сработало в нужном порядке ' . $test); } $test = ''; Event::handler('oh.ontestkeys', function () use(&$test) { $test .= 2; }); Event::handler('oh.ontestkeys', function () use(&$test) { $test .= 3; }, 'test'); Event::handler('oh.ontestkeys', function () use(&$test) { $test .= 1; }, 'oh'); Event::fire('oh.ontestkeys'); if ($test != '123') { return Ans::err($ans, 'Имя класса - ключ по умаолчанию ' . $test); } return Ans::ret($ans);
} } 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'); } $r = Event::fire('layer.ontest', $obj3); if (!$r) { return Ans::err($ans, 'Событие анализирую объект возвращает true'); } $r = Event::fire('layer.ontest', $obj1); if ($r) { return Ans::err($ans, 'Кэш. Событие анализирую объект возвращает false'); } $r = Event::fire('layer.ontest', $obj3); if (!$r) { return Ans::err($ans, 'Кэш. Событие анализирую объект возвращает true'); } if ($test != '22133') { return Ans::err($ans, 'События должны кэшироваться ' . $test); } return Ans::ret($ans);
<?php namespace infrajs\external; use infrajs\event\Event; use infrajs\path\Path; //isAdd('check' отфильтровываются нерабочие слои Path::reqif('*controller/infra.php'); Event::listeng('layer.oninit', function (&$layer) { External::check($layer); });
}, 'tpl:div,is'); Event::handler('layer.isshow', function (&$layer) { //tpl depricated if (Layer::pop($layer, 'onlyclient')) { return; } return Tpl::jsoncheck($layer); }, 'tpl:div,is'); Event::handler('layer.onshow', function (&$layer) { if (Layer::pop($layer, 'onlyclient')) { return; } $layer['html'] = Tpl::getHtml($layer); }, 'tpl:div'); Event::handler('layer.onshow', function (&$layer) { //tpl if (Layer::pop($layer, 'onlyclient')) { return; } if (!empty($layer['div'])) { $div = $layer['div']; } else { $div = null; } $r = View::html($layer['html'], $div); if (!$r && (!isset($layer['divcheck']) || !$layer['divcheck'])) { echo 'Не найден div ' . $layer['div'] . ' infra_html<br>'; } unset($layer['html']); //нефиг в памяти весеть }, 'tpl:div');
<?php namespace infrajs\controller; use infrajs\path\Path; use infrajs\event\Event; Event::handler('oninit', function () { ext\parsed::init(); });
<?php namespace infrajs\layer\config; use infrajs\event\Event; use infrajs\path\Path; use infrajs\config\Config; Config::get('controller'); Event::handler('Infrajs.oninit', function () { Lconfig::init(); }); Event::handler('layer.oninit', function (&$layer) { Lconfig::configinherit($layer); }, 'config'); Event::handler('layer.oncheck', function (&$layer) { Lconfig::configtpl($layer); }, 'config:external');
<?php namespace infrajs\event; use infrajs\ans\Ans; if (!is_file('vendor/autoload.php')) { chdir('../../../../'); require_once 'vendor/autoload.php'; } $ans = array(); $ans['title'] = 'Последовательность событий'; $obj1 = array('id' => 'a'); $obj2 = array('id' => 'b'); Event::$classes['testlayer'] = function ($obj) { return $obj['id']; }; $test = ''; Event::handler('testlayer.oncheck', function (&$obj) use(&$test) { $test .= '2:' . $obj['id'] . "#"; }, 'env:external'); Event::handler('testlayer.oncheck', function (&$obj) use(&$test) { $test .= '1:' . $obj['id'] . '-'; }, 'external'); Event::fire('testlayer.oncheck', $obj1); Event::fire('testlayer.oncheck', $obj2); Event::clear('testlayer'); if ($test !== '1:a-2:a#1:b-2:b#') { return Ans::err($ans, 'Некорректный порядок ' . $test); } return Ans::ret($ans);
return Ans::err($ans, 'Некорректное выполнение ' . implode('', $test)); } //Звонок в дверь Event::fire('Звонок в дверь'); $res = null; Event::handler('Звонок в дверь', function () use(&$res) { $res = true; return false; }, 'Anton:Vika'); Event::handler('Звонок в дверь', function () use(&$res) { $res = false; return false; }, 'Vika'); if (!$res) { return Ans::err($ans, 'Звонок в дверь не выполнен'); } //Звонок по телефону $res = null; Event::handler('Звонок по телефону', function () use(&$res) { $res = false; return false; }, 'Anton:Vika'); Event::handler('Звонок по телефону', function () use(&$res) { $res = true; return false; }, 'Vika'); Event::fire('Звонок по телефону'); if (!$res) { return Ans::err($ans, 'Звонок по телефону не выполнен'); } return Ans::ret($ans);
<?php use infrajs\event\Event; use infrajs\view\View; use infrajs\access\Access; use WyriHaximus\HtmlCompress; Event::one('Controller.onshow', function () { if (Access::debug()) { return; } $html = View::html(); $parser = HtmlCompress\Factory::construct(); $html = $parser->compress($html); View::html($html, true); });
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; } } if (@$layer['sub']) { //if(@!$layer['div'])$layer['div']=$key; if (@(!$layer['tpl'])) { $layer['tpl'] = $layer['parent']['tpl']; } if (@(!$layer['tplroot'])) { $layer['tplroot'] = $layer['div']; } } }, 'subs:external,div');
public static function fire($name, &$obj = null) { /** * Уникальность очереди событий определяется именем события содержащей имя класса события. * Все подписки хранятся в классе и объект не меняется **/ $fire = Event::createFire($name, $obj); $list =& $fire['list']; $data =& $fire['data']; /** * TODO: Реализация is isshow... нужно сбрасывать события **/ if (isset($list['result'][$fire['objid']]) && !is_null($list['result'][$fire['objid']])) { return $list['result'][$fire['objid']]; } if (isset($data['executed']) && $data['executed'] === false) { return true; } //Защита от рекурсий вложенный вызов вернёт true $data['executed'] = false; if (!isset($list['readykeys'][$fire['objid']])) { $list['readykeys'][$fire['objid']] = array(); } if (!isset($list['readyobj'][$fire['objid']])) { $list['readyobj'][$fire['objid']] = array(); } // TODO: проверить обработку несуществующих ключей for ($i = 0, $l = sizeof($list['list']); $i < $l; $i++) { //Подписка на ходу Event::keystik($list['list'][$i]); } $r = Event::execute($fire, $list); if (Event::is($r)) { $r = true; } else { $r = false; } $list['result'][$fire['objid']] = $r; $data['executed'] = true; return $list['result'][$fire['objid']]; }
}); }, 'crumb'); Event::handler('Layer.oninit', function (&$layer) { if (empty($layer['childs'])) { return; } foreach ($layer['childs'] as $key => &$v) { Each::exec($v, function &(&$l) use($key) { $r = null; if (!empty($l['crumb'])) { return $r; } Crumb::set($l, 'crumb', $key); return $r; }); } }, 'crumb'); Event::handler('Layer.ischeck', function ($layer) { if (empty($layer['parent'])) { return; } if (!Event::fire('Layer.ischeck', $layer['parent'])) { return false; } }, 'layer'); Event::handler('Layer.ischeck', function (&$layer) { if (!$layer['crumb']->is) { return false; } }, 'crumb'); Crumb::init();
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; }
<?php namespace infrajs\layer\css; use infrajs\controller\Layer; use infrajs\event\Event; Event::handler('layer.onshow', function (&$layer) { if (Layer::pop($layer, 'onlyclient')) { return; } Css::check($layer); }, 'css');
<?php namespace infrajs\controller; use infrajs\path\Path; use infrajs\event\Event; Event::handler('oninit', function () { ext\unick::init(); }); Event::handler('layer.oninit:external', function (&$layer) { ext\unick::check($layer); }, 'unick');
use infrajs\sequence\Sequence; use infrajs\path\Path; use infrajs\path\URN; use infrajs\view\view; //Template::$conf['root']=URN::getAbsRoot(); //Sequence::set(Template::$scope, array('~root'), Template::$conf['root']); Template::$fs['load'] = function ($src) { return Load::loadTEXT($src); }; $fn2 = function ($name = null) { return $conf = Config::pub($name); }; Sequence::set(Template::$scope, array('infra', 'config'), $fn2); Sequence::set(Template::$scope, array('Config', 'get'), $fn2); Event::one('Controller.oninit', function () { Template::$scope['~conf'] = Config::get(); }); $fn3 = function () { return View::getPath(); }; Sequence::set(Template::$scope, array('infra', 'view', 'getPath'), $fn3); $fn4 = function () { return View::getHost(); }; Sequence::set(Template::$scope, array('infra', 'view', 'getHost'), $fn4); $fn5 = function ($s) { return Sequence::short($s); }; Sequence::set(Template::$scope, array('infra', 'seq', 'short'), $fn5); $fn6 = function ($s) { return Sequence::right($s);
<?php namespace infrajs\activelink; use infrajs\event\Event; use infrajs\view\View; Event::handler('onjs', function () { View::js('-activelink/activelink.js'); View::js('-activelink/infra.js'); });
<?php namespace infrajs\layer\env; use infrajs\path\Path; use infrajs\event\Event; use infrajs\controller\Layer; use infrajs\config\Config; Config::get('controller'); Event::handler('Infrajs.oninit', function () { Env::init(); Layer::parsedAdd('envval'); }); Event::handler('layer.oncheck', function (&$layer) { Env::checkinit($layer); }, 'env:config,external'); Event::handler('layer.oncheck', function (&$layer) { Env::envtochild($layer); }, 'env:config,external'); Event::handler('layer.oncheck', function (&$layer) { Env::envframe($layer); }, 'env:config,external'); Event::handler('layer.oncheck', function (&$layer) { Env::envframe2($layer); }, 'env:config,external'); Event::handler('layer.oncheck', function (&$layer) { Env::envmytochild($layer); }, 'env:config,external'); Event::handler('layer.isshow', function (&$layer) { return Env::check($layer); }, 'env:counter,tpl,div,is');
<?php use infrajs\event\Event; Event::handler('layer.ischeck', function ($layer) { if (!isset($layer['deep'])) { return; } $deep = (int) $layer['deep']; if (!$deep) { return; } $state =& $layer['crumb']; while ($deep && $state->child) { $deep--; $state =& $state->child; } if ($deep) { $layer['is_save_branch'] = false; return false; } }, 'deep:div');
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\path\Path; use infrajs\event\Event; Path::req('*controller/infra.php'); Event::handler('oninit', function () { ext\layers::init(); });