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 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 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; }
} 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) {
//$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;
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); }
function &xls_init($path, $config = array()) { //Возвращает полностью гототовый массив //if(Each::isAssoc($path)===true)return $path;//Это если переданы уже готовые данные вместо адреса до файла данных $parent = false; $ar = array(); $isonefile = true; Each::exec($path, function &($path) use(&$isonefile, &$ar) { $p = Path::theme($path); if ($p && !is_dir($p)) { if ($isonefile === true) { $isonefile = $p; } else { $isonefile = false; } $ar[] = $path; } elseif ($p) { $isonefile = false; array_map(function ($file) use(&$ar, $p, $path) { if ($file[0] == '.') { return; } $fd = Load::nameInfo($file); if (in_array($fd['ext'], array('xls', 'xlsx'))) { $ar[] = $path . Path::toutf($file); } }, scandir($p)); } $r = null; return $r; }); if (empty($config['root'])) { if ($isonefile) { $d = Load::srcInfo($isonefile); $config['root'] = Path::toutf($d['name']); } else { $config['root'] = 'Каталог'; } } $data = _xls_createGroup($config['root'], $parent, 'set'); //Сделали группу в которую объединяются все остальные $data['miss'] = true; //Если в группе будет только одна подгруппа она удалится... подгруппа поднимится на уровень выше Each::forr($ar, function &($path) use(&$data) { $d =& xls_make($path); if (!$d) { return; } $d['parent'] =& $data; $data['childs'][] =& $d; $r = null; return $r; }); //Реверс записей на листе foreach ($data['childs'] as $book => $v) { foreach ($data['childs'][$book]['childs'] as $list => $vv) { $data['childs'][$book]['childs'][$list]['data'] = array_reverse($data['childs'][$book]['childs'][$list]['data']); } } xls_processDescr($data); if (!isset($config['Сохранить head'])) { $config['Сохранить head'] = false; } xls_processPoss($data, $config['Сохранить head']); if (!isset($config['Переименовать колонки'])) { $config['Переименовать колонки'] = array(); } if (!isset($config['Удалить колонки'])) { $config['Удалить колонки'] = array(); } if (!isset($config['more'])) { $config['more'] = false; } xls_runPoss($data, function &(&$pos) use(&$config) { $r = null; foreach ($config['Удалить колонки'] as $k) { if (isset($pos[$k])) { unset($pos[$k]); } } foreach ($config['Переименовать колонки'] as $k => $v) { if (isset($pos[$k])) { $pos[$v] = $pos[$k]; unset($pos[$k]); } } return $r; }); if (!isset($config['Имя файла'])) { $config['Имя файла'] = 'Производитель'; } //Группа остаётся, а производитель попадает в описание каждой позиции if ($config['Имя файла'] == 'Производитель') { xls_processClass($data, 'Производитель', true); } //Должен быть обязательно miss раставляется xls_runPoss($data, function &(&$pos, $i, &$group) { // пустая позиция $r = null; if (sizeof($pos) == 2) { //group_title Производитель unset($group['data'][$i]); return $r; } return $r; }); xls_processGroupFilter($data); //Объединяются группы с одинаковым именем, Удаляются пустые группы xls_processGroupMiss($data); //Группы miss(производители) расформировываются //xls_processGroupCalculate($data);//Добавляются свойства count groups сколько позиций и групп группы должны быть уже определены... почищены... xls_runGroups($data, function &(&$gr, $i, &$parent) { //Имя листа или файла короткое и настоящие имя группы прячется в descr. но имя листа или файла также остаётся в title if (!empty($gr['descr']['Наименование'])) { $gr['name'] = $gr['descr']['Наименование']; //name крутое правильное Наименование группы } if (empty($gr['name'])) { $gr['name'] = $gr['title']; } //title то как называется файл или какое имя используется в адресной строке if (empty($gr['tparam'])) { $gr['tparam'] = $parent['tparam']; } //tparam наследуется Оборудование:что-то, что-то if (!empty($gr['descr']['Производитель'])) { for ($i = 0, $il = sizeof($gr['data']); $i < $il; ++$i) { if (!empty($gr['data'][$i]['Производитель'])) { continue; } $gr['data'][$i]['Производитель'] = $gr['descr']['Производитель']; $gr['data'][$i]['producer'] = Path::encode($gr['descr']['Производитель']); } } $r = null; return $r; }); if (@(!is_array($config['Подготовить для адреса']))) { $config['Подготовить для адреса'] = array('Артикул' => 'article', 'Производитель' => 'producer'); } xls_processPossFS($data, $config['Подготовить для адреса']); //Заменяем левые символы в свойстве if (empty($config['Обязательные колонки'])) { $config['Обязательные колонки'] = array('article', 'producer'); } xls_runGroups($data, function &(&$group) use($config) { $r = null; if (empty($group['data'])) { return $r; } for ($i = 0, $l = sizeof($group['data']); $i < $l; ++$i) { foreach ($config['Обязательные колонки'] as $propneed) { if (empty($group['data'][$i][$propneed])) { unset($group['data'][$i]); break; } } } $group['data'] = array_values($group['data']); return $r; }); if (@(!$config['Известные колонки'])) { $config['Известные колонки'] = array('Производитель', 'Наименование', 'Описание', 'Артикул'); } $config['Известные колонки'][] = 'parent'; foreach ($config['Подготовить для адреса'] as $k => $v) { $config['Известные колонки'][] = $v; $config['Известные колонки'][] = $k; } if (@$config['more']) { xls_processPossMore($data, $config['Известные колонки']); //позициям + more } xls_runGroups($data, function &(&$group) { $group['group'] = $group['parent']['title']; if (!empty($group['descr']['Наименование'])) { $group['Группа'] = $group['descr']['Наименование']; } else { $group['Группа'] = $group['title']; } $r = null; return $r; }); xls_runPoss($data, function &(&$pos, $i, $group) { $r = null; $pos['group'] = $group['title']; $pos['Группа'] = $group['Группа']; return $r; }); if (empty($config['Ссылка parent'])) { xls_runGroups($data, function &(&$group) { $r = null; unset($group['parent']); return $r; }); xls_runPoss($data, function &(&$pos, $i) { $r = null; unset($pos['parent']); return $r; }); } xls_runGroups($data, function &(&$data, $i, &$group) { //path $r = null; if (!$group) { $data['path'] = array(); } else { $data['path'] = $group['path']; $data['path'][] = $data['title']; } return $r; }); xls_runPoss($data, function &(&$pos, $i, &$group) { $r = null; $pos['path'] = $group['path']; return $r; }); return $data; }
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; }); }
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; }); }
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; }