public static function init() { global $infra, $infrajs; Event::handler('Infrajs.oninit', function () { //Обработка envs, envtochild, myenvtochild, envframe External::add('myenv', 'config'); //Обрабатывается также как config //external::add('env', '');//Никак не обрабатывается.. будет установлено только если нечего небыло External::add('envs', 'childs'); //Объединяется так же как childs Run::runAddKeys('envs'); //Теперь бегаем и по envs свойству }); }
}); }, '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();
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 one($name, $callback, $key = '', &$obj = null) { $ready = false; Event::handler($name, function () use(&$ready, $callback) { if ($ready) { return; } $ready = true; return $callback(); }, $key, $obj); }
<?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);
<?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');
}, '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\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);
$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'); } $r = Event::fire('layer.ontest', $obj3); if (!$r) {
<?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');
<?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\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(); });