Exemplo n.º 1
0
 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;
 }
Exemplo n.º 2
0
 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']));
     }
 }
Exemplo n.º 3
0
<?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');
Exemplo n.º 4
0
});
$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);
Exemplo n.º 5
0
<?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');
});
Exemplo n.º 6
0
$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);
Exemplo n.º 7
0
        }
    }
    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);
Exemplo n.º 8
0
<?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);
});
Exemplo n.º 9
0
}, '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');
Exemplo n.º 10
0
<?php

namespace infrajs\controller;

use infrajs\path\Path;
use infrajs\event\Event;
Event::handler('oninit', function () {
    ext\parsed::init();
});
Exemplo n.º 11
0
<?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');
Exemplo n.º 12
0
<?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);
Exemplo n.º 13
0
    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);
Exemplo n.º 14
0
<?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);
});
Exemplo n.º 15
0
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');
Exemplo n.º 16
0
 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']];
 }
Exemplo n.º 17
0
    });
}, '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();
Exemplo n.º 18
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;
 }
Exemplo n.º 19
0
<?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');
Exemplo n.º 20
0
<?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');
Exemplo n.º 21
0
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);
Exemplo n.º 22
0
<?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');
});
Exemplo n.º 23
0
<?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');
Exemplo n.º 24
0
<?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');
Exemplo n.º 25
0
        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');
Exemplo n.º 26
0
<?php

namespace infrajs\controller;

use infrajs\path\Path;
use infrajs\event\Event;
Path::req('*controller/infra.php');
Event::handler('oninit', function () {
    ext\layers::init();
});