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; }
public static function isParent(&$layer, &$parent) { while ($layer) { if (Each::isEqual($parent, $layer)) { return true; } $layer =& $layer['parent']; } return false; }
public static function update($name) { $conf = Config::get($name); Each::exec($conf['dependencies'], function &($name) { $r = null; Update::update($name); return $r; }); if (!empty($conf['update'])) { Path::req('-' . $name . '/' . $conf['update']); } }
public static function check(&$layer) { if (!isset($layer['css'])) { return; } if (static::$ready[$css]) { return; } Each::fora($layer['css'], function ($css) use(&$layer) { Css::$ready[$css] = true; $code = Load::loadTEXT($css); View::html('<style>' . $code . '</style>', $layer['div']); $r = null; return $r; }); }
public static function getExpires() { $conf = static::$conf; $time = time() + $conf["max-age-stat"]; Each::exec($conf["expires-year"], function &($dm) use(&$time) { $r = null; $p = explode('.', $dm); $year = date('Y'); $day = (int) $p[0]; $month = (int) $p[1]; $t = mktime(0, 0, 0, $month, $day, $year); if ($t < time()) { return $r; } if ($t < $time) { $time = $t; } return $r; }); Each::exec($conf["expires-month"], function &($dm) use(&$time) { $r = null; $year = date('Y'); $day = $dm; $n = date('d'); $month = date('n'); if ($day < $n) { $month += 1; } $t = mktime(0, 0, 0, $month, $day, $year); if ($t < $time) { $time = $t; } return $r; }); Each::exec($conf["expires-str"], function &($dm) use(&$time) { $r = null; $t = strtotime($dm); if ($t < time()) { return $r; } if ($t < $time) { $time = $t; } return $r; }); return $time; }
public static function checkExt(&$layer, &$external) { if (!$external) { return; } unset($layer['external']); Each::fora($external, function &(&$exter) use(&$layer) { if (is_string($exter)) { $external =& Load::loadJSON($exter); } else { $external = $exter; } if ($external) { foreach ($external as $i => &$v) { external::merge($layer, $external, $i); } } $r = null; return $r; }); }
if (empty($conf[$name]['tester'])) { continue; } $list[$name] = []; Each::exec($conf[$name]['tester'], function &($tsrc) use(&$list, $name, $c) { $r = null; $tsrc = Path::theme('-' . $name . '/' . $tsrc); if (!$tsrc) { echo '<pre>'; print_r($c); throw new \Exception('Tester. Некорректно указан путь до теста.'); } if (Path::isDir($tsrc)) { $files = scandir($tsrc); foreach ($files as $file) { if ($file[0] == '.') { continue; } if (!is_file($tsrc . $file)) { continue; } $list[$name][] = Path::pretty($tsrc . $file); } } else { $list[$name][] = Path::pretty($tsrc); } return $r; }); } $data = array('list' => array()); $errors = array(); foreach ($list as $name => $files) {
private static function pubclean($part) { if (empty($part['pub'])) { return null; } $newpart = array(); Each::exec($part['pub'], function &($pub) use(&$newpart, &$part) { $r = null; if (!isset($part[$pub])) { return $r; } $newpart[$pub] = $part[$pub]; return $r; }); return $newpart; }
public function testEach() { /** * Проверка на ассоциативный массив. * Метод возвращает true только в том случае, если массив ассоциативный. */ $elements = ['9' => '42', 8, 4, 5, 3]; $res = Each::isAssoc($elements); $this->assertTrue($res); $elements = 10; $res = Each::isAssoc($elements); $this->assertTrue(null === $res); $elements = [9, 8, 4, 5, 3]; $res = Each::isAssoc($elements); $this->assertTrue(false === $res); /** * Проверка на число. * Если передано число в текстовом формате, то метод должен отработать * с этим аргументом как с числом. */ $el = ''; $res = Each::isInt($el); $this->assertTrue(false === $res); $el = 12; $res = Each::isInt($el); $this->assertTrue(true === $res); $el = '12'; $res = Each::isInt($el); $this->assertTrue(true === $res); $el = '12 '; $res = Each::isInt($el); $this->assertTrue(false === $res); /** * Проверка ссылок друг на друга. * Метод возвращает true, когда две переменные являются ссылками друг на друга. */ $a = 1; $b = 1; $res = Each::isEqual($a, $b); $this->assertTrue(false === $res); $a = 1; $b = $a; $res = Each::isEqual($a, $b); $this->assertTrue(false === $res); $a = 1; $b =& $a; $res = Each::isEqual($a, $b); $this->assertTrue(true === $res); /** * Проверяем, количество вызовов и на какой элемент попадаем при определенном количестве вызовов. * Для индексного массива количество итераций анонимной функции должно равняться количеству элементов в массиве. * Если в индексном массиве находится вложенный индексный массив, то анонимная функция должна вызываться и * для каждого индекса вложенного массива. * Если методу передан простой элемент или ассоциативный массив, вызов анонимной функции * должен произойти только один раз. */ $counter = 0; $el = ['oduvanio', 'mail']; Each::exec($el, function &() use(&$counter) { $r = null; $counter++; return $r; }); $this->assertTrue(2 === $counter); $counter = 0; $el = [2, [4, 6], 5]; Each::exec($el, function ($b) use(&$counter) { $counter++; if ($counter === 3) { $this->assertTrue(6 === $b); } }); $this->assertTrue(4 === $counter); $counter = 0; $el = 1; Each::exec($el, function () use(&$counter) { $counter++; }); $this->assertTrue(1 === $counter); $el = 'test'; Each::exec($el, function () use(&$counter) { $counter++; }); $this->assertTrue(2 === $counter); $el = ['name' => 'oduvanio', 'email' => 'mail']; Each::exec($el, function () use(&$counter) { $counter++; }); $this->assertTrue(3 === $counter); }
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; } } if (@$layer['sub']) { //if(@!$layer['div'])$layer['div']=$key; if (@(!$layer['tpl'])) { $layer['tpl'] = $layer['parent']['tpl'];
if ($el == 4) { return new Fix('del'); } //пробовал передавать не new infra_Fix, а просто infra_Fix массив удалялся полностью, ну или просто функция неправильно срабатывала. }); if ($res !== null) { return Ans::err($ans, 'Странный результат'); } if ($count3 != $len) { return Ans::err($ans, 'Неожиданное количество выполненией'); } if ($ar3[3] == 4) { return Ans::err($ans, 'Не работает удаление'); } //Протестировать back $ar = array(1, 2, 3, 4, 5, 6); $count = 0; $res = Each::forr($ar, function ($el) use(&$count) { return new Fix('del', false); }, true); if (isset($ar[5])) { return Ans::err($ans, 'Не работает back'); } $ar = array(1, 2, 3, 4, 5, 6); $res = Each::forr($ar, function ($el) { return $el; }, true); if ($res != 6) { return Ans::err($ans, 'Не работает back'); } return Ans::ret($ans, 'Всё ок');
$src = str_replace('..', '-', $src); if (strlen($src) > 100) { $src = md5($src); } $src = $dir . 'seo-' . $src . '.json'; if (!$submit) { $seo = Load::loadJSON($src); $ans['seo'] = $seo; } else { $dir = autoedit_createPath($dir); $seo = $_POST['seo']; $def = $_POST['def']; $keys = array(); Each::foro($seo, function ($val, $key) use(&$seo, &$def, &$keys) { if ($seo[$key] == $def[$key]) { return; } $keys[$key] = $val; }); if (sizeof($keys) == 0) { $r = unlink($src); } else { $keys['page'] = $id; $keys['time'] = time(); $r = file_put_contents($src, Load::json_encode($keys)); } if ($r) { return Ans::ret($ans, 'SEO-данные сохранены'); } return Ans::err($ans, 'Ошибка. SEO-данные не сохранены'); } } elseif ($type === 'corfile') {
} Each::fora($layer['child'], function &(&$l) use(&$name) { $r = null; Crumb::set($l, 'crumb', $name); return $r; }); }, '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) {
public static function loadCSS(&$js, $name) { $c = Config::get($name); if (empty($c['css'])) { return; } if (!empty($c['off'])) { return; } if (!empty($c['dependencies'])) { Each::exec($c['dependencies'], function &($name) use(&$js) { Collect::loadCSS($js, $name); $r = null; return $r; }); } if (!empty(Collect::$cssed[$name])) { return; } Collect::$cssed[$name] = true; $root = !empty($c['-collect']) && $c['-collect'] == 'root'; Each::exec($c['css'], function &($path) use($name, &$js, $root) { $r = null; if ($root) { $src = $path; } else { $src = '-' . $name . '/' . $path; } $js .= "\n\n" . '/*load css ' . $src . "*/\r\n"; if (!Path::theme($src)) { echo '<pre>'; throw new \Exception('Не найден файл ' . $src); } $js .= Load::loadTEXT('-csspath/?src=' . $src); return $r; }); }
} //obj back ret $ar = array('a' => 111, 'b' => 222, 'c' => 333, 'e' => 444); $count = 0; Each::foro($ar, function ($v, $key) use(&$count) { ++$count; if ($key == 'b') { return new Fix('del', true); } }, true); if ($count == 3 && sizeof($ar) == 3 && !isset($ar['b'])) { } else { $result = false; } //obj ret $ar = array('a' => 111, 'b' => 222, 'c' => 333, 'e' => 444); $count = 0; Each::foro($ar, function ($v, $key) use(&$count) { ++$count; if ($key == 'b') { return new Fix('del', true); } }); if ($count == 2 && sizeof($ar) == 3 && !isset($ar['b'])) { } else { $result = false; } if (!$result) { return Ans::err($ans, 'err'); } return Ans::ret($ans, 'ret');
//if($arr!=false)return Ans::err($ans,'функция infra_isAssoc вернула неверный результат, переданный массив является индексным'); //Проверить, являются ли переданые переменные ссылкой друг на друга $a = 15; // создаем переменную a $b = $a; // записываем копию переменной a в переменную b $equal = Each::isEqual($a, $b); if ($equal !== false) { return Ans::err($ans, 'Функция infra_isEqual работает неверно $b не является ссылкой на $a'); } $b =& $a; // делаем b ссылкой на a $equal = Each::isEqual($a, $b); if ($equal !== true) { return Ans::err($ans, 'Функция infra_isEqual работает неверно $b является ссылкой на $a'); } $a = array(1, 2, 4, 7); // интересно получается, так как раннее мы $b=&$a то уже здесь, даже если присваивать массивы этим переменным, то всё равно при изменении $b всё записывается в $a $b = array(1, 2, 4, 11); $equal = Each::isEqual($a, $b); if ($equal !== true) { return Ans::err($ans, 'Функция infra_isEqual работает неверно $b является ссылкой на $a'); } $b = array(1, 2, 4, 15); $c = array(1, 2, 4, 11); //print_r($a); $equal = Each::isEqual($b, $c); if ($equal !== false) { return Ans::err($ans, 'Функция infra_isEqual работает не правильно, массив $с не является ссылкой на $b'); } return Ans::ret($ans, 'Всё ок');
public static function checkinit(&$layer) { if (empty($layer['envs'])) { return; } Each::forx($layer['envs'], function (&$l, $env) { //Из-за забегания вперёд external не применился а в external могут быть вложенные слои $l['env'] = $env; $l['envtochild'] = true; }); }
//$ans['orignews']=$news; if ($news) { $ans['news'] = $news; Each::fora($ans['news'], function &(&$n) use($list, &$ans) { $n['value'] = Load::json_decode($n['value'], true); $n['name'] = Sequence::right($n['name']); $r = Each::exec($list, function &($item) use(&$n, &$ans) { //Устанавливаемое значение ищим в новости $r = null; //найдено совпадение новости с устанавливаемым значением.. новость удаляем $a = Sequence::contain($item['name'], $n['name']); if ($a || $a == array()) { $r = true; return $r; //news Длиннее... и часть новости изменена в устанавливаемом значение } $ans['a'] = $a; //Новость ищим в устанавливаемом значение $right = Sequence::contain($n['name'], $item['name']); if ($right) { $n['value'] = Sequence::set($n['value'], $right, $item['value']); //Новость осталась но она включает устанавливаемые данные } return $r; }); if ($r) { $del = new Fix('del'); return $del; } $r = null; return $r;
public static function numbers($page, $pages, $plen = 11) { //$plen=11;//Только нечётные и больше 6 - количество показываемых циферок /* $pages=10 $plen=6 (1)2345-10 1(2)345-10 12(3)45-10 123(4)5-10 1-4(5)6-10 1-5(6)7-10 1-6(7)8910 1-67(8)910 1-678(9)10 1-6789(10) $lside=$plen/2+1=4//Последняя цифра после которой появляется переход слева $rside=$pages-$lside-1=6//Первая цифра после которой справа появляется переход $islspace=$page>$lside//нужна ли пустая вставка слева $isrspace=$page<$rside $nums=$plen/2-2;//Количество цифр показываемых сбоку от текущей когда есть $islspace далее текущая */ if ($pages <= $plen) { $ar = array_fill(0, $pages + 1, 1); $ar = array_keys($ar); array_shift($ar); } else { $plen = $plen - 1; $lside = $plen / 2 + 1; //Последняя цифра после которой появляется переход слева $rside = $pages - $lside - 1; //Первая цифра после которой справа появляется переход $islspace = $page > $lside; $isrspace = $page < $rside + 2; $ar = array(1); if ($isrspace && !$islspace) { for ($i = 0; $i < $plen - 2; $i++) { $ar[] = $i + 2; } $ar[] = 0; $ar[] = $pages; } else { if (!$isrspace && $islspace) { $ar[] = 0; for ($i = 0; $i < $plen - 1; $i++) { $ar[] = $pages - $plen / 2 + $i - 3; } } else { if ($isrspace && $islspace) { $nums = $plen / 2 - 2; //Количество цифр показываемых сбоку от текущей когда есть $islspace далее текущая $ar[] = 0; for ($i = 0; $i < $nums * 2 + 1; $i++) { $ar[] = $page - $plen / 2 + $i + 2; } $ar[] = 0; $ar[] = $pages; } } } } Each::exec($ar, function &(&$num) use($page) { $n = $num; $num = array('num' => $n, 'title' => $n); if (!$num['num']) { $num['empty'] = true; $num['num'] = ''; $num['title'] = ' '; } if ($n == $page) { $num['active'] = true; } $r = null; return $r; }); if (sizeof($ar) < 2) { return false; } $prev = array('num' => $page - 1, 'title' => '«'); if ($page <= 1) { $prev['empty'] = true; } array_unshift($ar, $prev); $next = array('num' => $page + 1, 'title' => '»'); if ($page >= $pages) { $next['empty'] = true; } array_push($ar, $next); return $ar; }
} if ($obj->parent !== $parent) { return Ans::err($ans, 'Некорректно определён parent'); } Crumb::change('test/hi'); $obj = Crumb::getInstance('test'); if (!$obj->is) { return Ans::err($ans, 'Не применилась крошка на втором уровне'); } $root = Crumb::getInstance(); Crumb::change(''); $crumb = Crumb::getInstance(''); $f = $crumb->query; Crumb::change('test'); $s =& Crumb::getInstance('some'); $s2 =& Crumb::getInstance('some'); $r = Each::isEqual($s, $s2); $s = Crumb::$childs; $r2 = Each::isEqual($s[''], Crumb::getInstance()); $r = $r && $r2; $crumb = Crumb::getInstance('test'); $crumb2 = Crumb::getInstance('test2'); if (!($f == null && $r && !is_null($crumb->value) && is_null($crumb2->value))) { return Ans::err($ans, 'Изменения крошек'); } Crumb::change('test/test'); $inst = Crumb::getInstance('test/test/test'); Crumb::change($query); Layer::$start_id = 1; Layer::$ids = array(); return Ans::ret($ans);
public static function writeNews($list, $session_id) { if (!$list) { return; } $db =& Db::pdo(); global $infra_session_lasttime; $isphp = !!$infra_session_lasttime; $sql = 'insert into `ses_records`(`session_id`, `name`, `value`, `time`) VALUES(?,?,?,FROM_UNIXTIME(?))'; $stmt = $db->prepare($sql); $sql = 'delete from `ses_records` where `session_id`=? and `name`=? and `time`<=FROM_UNIXTIME(?)'; $delstmt = $db->prepare($sql); Each::exec($list, function &($rec) use($isphp, &$delstmt, &$stmt, $session_id) { $r = null; if (!$isphp && $rec['name'][0] == 'safe') { return $r; } $name = Sequence::short($rec['name']); $delstmt->execute(array($session_id, $name, $rec['time'])); $stmt->execute(array($session_id, $name, Load::json_encode($rec['value']), $rec['time'])); if (!$isphp && !$name) { //Сохранится safe Session::clear(); } return $r; }); }
$test.='b'; },'',$obj); $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');
public static function addFiles($root, &$pos, $dir = false) { $props = array('producer', 'article'); if (!isset($pos['images'])) { $pos['images'] = array(); } if (!isset($pos['texts'])) { $pos['texts'] = array(); } if (!isset($pos['files'])) { $pos['files'] = array(); } if (!$dir) { $dir = array(); $pth = Path::resolve($root); if (Each::forr($props, function &($name) use(&$dir, &$pos) { $rname = Sequence::right($name); $val = Sequence::get($pos, $rname); if (!$val) { return true; } $dir[] = $val; $r = null; return $r; })) { return; } if ($dir) { $dir = implode('/', $dir) . '/'; $dir = $pth . $dir; } else { $dir = $pth; } } else { $dir = $root . $dir; } $dir = Path::theme($dir); if (!$dir) { return false; } if (is_dir($dir)) { $paths = glob($dir . '*'); } elseif (is_file($dir)) { $paths = array($dir); $p = Load::srcInfo($dir); $dir = $p['folder']; } Each::forr($paths, function &($p) use(&$pos, $dir) { $d = explode('/', $p); $name = array_pop($d); $n = mb_strtolower($name); $fd = Load::nameInfo($n); $ext = $fd['ext']; //if(!$ext)return; if (!is_file($dir . $name)) { return; } //$name=preg_replace('/\.\w{0,4}$/','',$name); /*$p=pathinfo($p); $name=$p['basename']; $ext=strtolower($p['extension']);*/ if ($name[0] == '.') { return; } $dir = Path::pretty($dir); $name = Path::toutf($dir . $name); $im = array('png', 'gif', 'jpg'); $te = array('html', 'tpl', 'mht', 'docx'); if (in_array($ext, $im)) { $pos['images'][] = $name; } else { if (in_array($ext, $te)) { $pos['texts'][] = $name; } else { if ($ext != 'db') { $pos['files'][] = $name; } } } $r = null; return $r; }); $pos['images'] = array_unique($pos['images']); $pos['texts'] = array_unique($pos['texts']); $pos['files'] = array_unique($pos['files']); }
private function rksort(&$data) { ksort($data); foreach ($data as &$v) { if (!is_array($v)) { continue; } if (Each::isAssoc($v) === true) { self::rksort($v); } //else sort($v); } }
public static function _getHtml(&$layer) { //Вызывается как для основных так и для подслойв tpls frame. Расширяется в tpltpl.prop.js if (@$layer['data'] || @$layer['json'] || @$layer['tpls'] || @$layer['tplroot']) { $tpls = Template::make($layer['tpl']); //С кэшем перепарсивания Template::includes($tpls); $repls = array(); //- подшаблоны для замены, Важно, что оригинальный распаршеный шаблон не изменяется Each::fora($layer['tplsm'], function &($tm) use(&$repls) { //mix tpl $t = Template::make($tm); //С кэшем перепарсивания array_push($repls, $t); //for(var i in t)repls[i]=t[i];//Нельзя подменять в оригинальном шаблоне, который в других местах может использоваться без подмен //^ из-за этого обработчики указанные в tplsm срабатывают постоянно, так как нельзя поставить отметку о том что обработчик сохранён $r = null; return $r; }); $layer['data'] =& self::getData($layer); //подменили строку data на объект data $alltpls = array(&$repls, &$tpls); $html = Template::exec($alltpls, $layer, @$layer['tplroot'], @$layer['dataroot']); } else { $tpl = self::getTpl($layer); $html = $tpl; } if (!$html) { $html = ''; } return $html; }