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; }
$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);
}); }, '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\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('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);