Пример #1
0
 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;
 }
Пример #2
0
 /**
  * Поиск слоя по значению свойства
  **/
 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;
     });
 }
Пример #3
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;
 }
Пример #4
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');
<?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');
Пример #6
0
        //Мы не можем делать проверку пока другой плагин не подменит 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
Пример #7
0
<?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;
Пример #8
0
<?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 
Пример #9
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;
 }