Exemple #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;
 }
Exemple #2
0
 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']);
     }
 }
Exemple #3
0
 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;
 }
Exemple #4
0
    }
    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) {
Exemple #5
0
 //$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;
Exemple #6
0
    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) {
Exemple #7
0
 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;
 }
Exemple #8
0
 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);
 }
Exemple #9
0
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;
}
Exemple #10
0
 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;
     });
 }
Exemple #11
0
 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;
     });
 }
Exemple #12
0
 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'] = '&nbsp;';
         }
         if ($n == $page) {
             $num['active'] = true;
         }
         $r = null;
         return $r;
     });
     if (sizeof($ar) < 2) {
         return false;
     }
     $prev = array('num' => $page - 1, 'title' => '&laquo;');
     if ($page <= 1) {
         $prev['empty'] = true;
     }
     array_unshift($ar, $prev);
     $next = array('num' => $page + 1, 'title' => '&raquo;');
     if ($page >= $pages) {
         $next['empty'] = true;
     }
     array_push($ar, $next);
     return $ar;
 }