예제 #1
0
파일: Docx.php 프로젝트: infrajs/files
 /**
  * Кэширумеая функция, основной разбор.
  */
 public static function parse($src)
 {
     $args = array($src);
     $param = Cache::exec(array($src), 'docx_parse', function ($src, $re) {
         $conf = Docx::$conf;
         $imgmaxwidth = $conf['imgmaxwidth'];
         $previewlen = $conf['previewlen'];
         $cachename = Path::tofs(Path::encode($src));
         $cacheFolder = Path::mkdir(Docx::$conf['cache'] . $cachename . '/');
         //В винде ингда вылетает о шибка что нет прав удалить какой-то файл в папке и как следствие саму папку
         //Обновление страницы проходит уже нормально
         //Полагаю в линукс такой ошибки не будет хз почему возникает
         Cache::fullrmdir($cacheFolder);
         $path = Path::theme($src);
         if (!$path) {
             return array('html' => false);
         }
         $xmls = docx_getTextFromZippedXML($path, 'word/document.xml', $cacheFolder, $re);
         $rIds = array();
         $param = array('folder' => $cacheFolder, 'imgmaxwidth' => $imgmaxwidth, 'previewlen' => $previewlen, 'rIds' => $rIds);
         if ($xmls[0]) {
             $xmlar = docx_dom_to_array($xmls[0]);
             $xmlar2 = docx_dom_to_array($xmls[1]);
             foreach ($xmlar2['Relationships']['Relationship'] as $v) {
                 $rIds[$v['Id']] = $v['Target'];
             }
             $param['rIds'] = $rIds;
             $html = docx_each($xmlar, '\\infrajs\\doc\\docx_analyse', $param);
         } else {
             $param['rIds'] = array();
             $html = '';
         }
         $param['html'] = $html;
         return $param;
     }, $args, isset($_GET['re']));
     unset($param['rIds']);
     unset($param['type']);
     unset($param['imgmaxwidth']);
     unset($param['previewlen']);
     unset($param['isli']);
     unset($param['isul']);
     unset($param['imgnum']);
     unset($param['folder']);
     return $param;
 }
예제 #2
0
파일: Mem.php 프로젝트: infrajs/mem
 public static function delete($key)
 {
     $conf = static::$conf;
     $mem =& static::memcache();
     if ($mem) {
         $r = $mem->delete($key);
     } else {
         $conf = static::$conf;
         $key = Path::encode($key);
         $dir = Path::theme($conf['cache']);
         if (!$dir) {
             echo '<pre>';
             throw new \Exception('Not found dir for cache "' . $conf['cache'] . '"');
         }
         if (!Path::$conf['fs']) {
             echo '<pre>';
             throw new \Exception('Filesystem protected by Path::$conf[fs]=false set it on true');
         }
         $r = @unlink($dir . $key . '.ser');
     }
     return $r;
 }
예제 #3
0
파일: search.php 프로젝트: infrajs/catalog
     //is!, descr!, text!, name!, breadcrumbs!
     $ans['is'] = 'producer';
     $name = Catalog::getProducer($producer);
     $ans['name'] = $name;
     $ans['title'] = $name;
     $conf = Config::get('catalog');
     $ans['breadcrumbs'][] = array('title' => $conf['title'], 'add' => 'producer:');
     $menu = Load::loadJSON('-catalog/menu.json');
     $ans['breadcrumbs'][] = array('href' => 'producers', 'title' => $menu['producers']['title']);
     $ans['breadcrumbs'][] = array('add' => 'producer::producer.' . $name . '=1', 'title' => $name);
     $ans['breadcrumbs'][sizeof($ans['breadcrumbs']) - 1]['active'] = true;
 } else {
     if (!$md['group'] && $md['search']) {
         $ans['is'] = 'search';
         $ans['name'] = $md['search'];
         $ans['title'] = Path::encode($md['search']);
         $ans['breadcrumbs'][] = array('title' => $conf['title'], 'add' => 'search:');
         $menu = Load::loadJSON('-catalog/menu.json');
         $ans['breadcrumbs'][] = array('href' => 'find', 'title' => $menu['find']['title']);
         $ans['breadcrumbs'][] = array('title' => $ans['name']);
         $ans['breadcrumbs'][sizeof($ans['breadcrumbs']) - 1]['active'] = true;
     } else {
         //is!, descr!, text!, name!, breadcrumbs!, title
         if ($md['group']) {
             foreach ($md['group'] as $group => $v) {
                 break;
             }
         } else {
             $group = false;
         }
         $group = Catalog::getGroup($group);
예제 #4
0
파일: conth.php 프로젝트: infrajs/contacts
    $mdata['testmail'] = true;
} else {
    $mdata['testmail'] = false;
    session_start();
    if (empty($_SESSION['submit_time'])) {
        $_SESSION['submit_time'] = 0;
    }
    if (time() - $_SESSION['submit_time'] < 60) {
        return Ans::err($ans, 'Письмо уже отправлено! Новое сообщение можно будет отправить через 1 минуту!');
    }
    $_SESSION['submit_time'] = time();
}
$ans['testmail'] = $mdata['testmail'];
if ($maildir) {
    $folder = Path::theme($maildir);
    $name = Path::tofs(Path::encode($data['name']));
    $fname = date('Y F j H-i') . ' ' . $name . ' ' . time();
    if ($conf['file'] && $file) {
        $src = $folder . $fname . '.' . Path::tofs($file['name']);
        $r = move_uploaded_file($file['tmp_name'], $src);
        if (!$r) {
            return Ans::err($ans, 'Неудалось загрузить файл');
        }
        $data['file'] = Path::toutf(Path::pretty($src));
    }
}
$body = Template::parse('-contacts/mail.tpl', $data);
if (!$body) {
    $body = 'Ошибка. Не найден шаблон письма!';
}
if ($maildir) {
예제 #5
0
파일: filters.php 프로젝트: infrajs/catalog
     $poss = $res['list'];
     foreach ($poss as &$pos) {
         if (preg_match("/[:]/", $pos[$prop['posid']])) {
             continue;
         }
         if (!Xlsx::isSpecified($pos[$prop['posid']])) {
             continue;
         }
         $r = false;
         if ($prop['separator']) {
             $arval = explode($prop['separator'], $pos[$prop['posid']]);
         } else {
             $arval = array($pos[$prop['posid']]);
         }
         foreach ($arval as $i => $value) {
             $idi = Path::encode($value);
             $id = mb_strtolower($idi);
             if (!Xlsx::isSpecified($id)) {
                 continue;
             }
             $r = true;
             $params[$k]['option'][$idi]['filter']++;
         }
         if ($r) {
             $params[$k]['filter']++;
         }
         //Позиций с этим параметром
     }
 }
 //У скольки позиций в выборке у которых этот параметр не указан
 $params[$k]['nofilter'] = sizeof($poss) - $params[$k]['filter'];
예제 #6
0
파일: index.php 프로젝트: infrajs/imager
     //новый src уже на серую картинку
 }
 $data = Imager::scale($src, $w, $h, $crop, $top);
 if (!$data) {
     die('Resize Error');
 }
 if ($type == 'png') {
     $data = Imager::optipng($data, md5($src . $w . $h . $crop . $top));
     if (!$data) {
         die('Optipng Error');
     }
 }
 $br = infra_imager_browser();
 $name = preg_replace("/(.*\\/)*/", '', $isrc);
 if (!$name) {
     $name = Path::encode($isrc);
 }
 $name = Imager::toutf($name);
 if (!preg_match('/ff/', $br)) {
     $name = rawurlencode($name);
 }
 if (preg_match('/ie6/', $br)) {
     $name = preg_replace("/\\s/", '%20', $name);
 }
 if (!$type) {
     $type = 'image/jpeg';
 }
 $ans = array('name' => $name, 'type' => $type);
 //return $data;
 //}, $args, isset($_GET['re']));
 //)
예제 #7
0
파일: Xlsx.php 프로젝트: infrajs/excel
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;
}
예제 #8
0
파일: Imager.php 프로젝트: infrajs/imager
 public static function remote($src)
 {
     $conf = static::$conf;
     $t = $conf['remotecachehour'];
     $dir = $conf['cache'] . 'remote/';
     $dir = Path::theme($dir);
     if (!$dir) {
         die('Not Found ' . $conf['cache'] . 'remote/');
     }
     $esrc = $dir . Path::encode($src);
     $remotecache = Path::theme($esrc);
     if ($remotecache && !isset($_GET['re'])) {
         $cachetime = filemtime($remotecache);
         $now = time();
         if ($now - $t * 60 * 60 < $cachetime) {
             return $esrc;
         }
     }
     $filecontent = file_get_contents($src);
     file_put_contents($esrc, $filecontent);
     return $esrc;
 }
예제 #9
0
파일: Catalog.php 프로젝트: infrajs/catalog
 public static function filtering(&$poss, $md)
 {
     if (!sizeof($poss)) {
         return;
     }
     $params = Catalog::getParams();
     $filters = array();
     foreach ($params as $prop) {
         if ($prop['more']) {
             if (empty($md['more'])) {
                 continue;
             }
             //Filter more
             if (empty($md['more'][$prop['mdid']])) {
                 continue;
             }
             //Filter more
             $valtitles = array();
             $val = $md['more'][$prop['mdid']];
             foreach ($val as $value => $one) {
                 $valtitles[$value] = $value;
             }
             $filter = array('title' => $prop['title'], 'name' => Sequence::short(array('more', Catalog::urlencode($prop['mdid']))));
             $poss = array_filter($poss, function ($pos) use($prop, $val, &$valtitles) {
                 foreach ($val as $value => $one) {
                     $option = $pos['more'][$prop['posid']];
                     if ($value === 'yes' && Xlsx::isSpecified($option)) {
                         return true;
                     }
                     if ($value === 'no' && !Xlsx::isSpecified($option)) {
                         return true;
                     }
                     $titles = $pos['more'][$prop['posname']];
                     if ($prop['separator']) {
                         $option = explode($prop['separator'], $option);
                         $titles = explode($prop['separator'], $titles);
                     } else {
                         $option = array($option);
                         $titles = array($titles);
                     }
                     foreach ($option as $k => $opt) {
                         $id = Path::encode($opt);
                         if (strcasecmp($value, $id) == 0) {
                             $valtitles[$value] = $titles[$k];
                             return true;
                         }
                     }
                 }
                 return false;
             });
             if ($val['no']) {
                 unset($val['no']);
                 $val['Не указано'] = 1;
             }
             if ($val['yes']) {
                 unset($val['yes']);
                 $val['Указано'] = 1;
             }
             $filter['value'] = implode(', ', array_values($valtitles));
             $filters[] = $filter;
         } else {
             if (empty($md[$prop['mdid']])) {
                 continue;
             }
             $valtitles = array();
             $val = $md[$prop['mdid']];
             foreach ($val as $value => $one) {
                 $valtitles[$value] = $value;
             }
             $filter = array('title' => $prop['title'], 'name' => Sequence::short(array(Catalog::urlencode($prop['mdid']))));
             $poss = array_filter($poss, function ($pos) use($prop, $val, &$valtitles) {
                 foreach ($val as $value => $one) {
                     $option = $pos[$prop['posid']];
                     $titles = $pos[$prop['posname']];
                     if ($value === 'yes' && Xlsx::isSpecified($option)) {
                         return true;
                     }
                     if ($value === 'no' && !Xlsx::isSpecified($option)) {
                         return true;
                     }
                     if ($prop['separator']) {
                         $option = explode($prop['separator'], $option);
                         $titles = explode($prop['separator'], $titles);
                     } else {
                         $option = array($option);
                         $titles = array($titles);
                     }
                     foreach ($option as $k => $opt) {
                         $id = Path::encode($opt);
                         if (strcasecmp($value, $id) == 0) {
                             $valtitles[$value] = $titles[$k];
                             return true;
                         }
                     }
                 }
                 return false;
             });
             if ($val['no']) {
                 unset($val['no']);
                 $val['Не указано'] = 1;
             }
             if ($val['yes']) {
                 unset($val['yes']);
                 $val['Указано'] = 1;
             }
             $filter['value'] = implode(', ', array_values($valtitles));
             $filters[] = $filter;
         }
     }
     //Filter group
     $key = 'group';
     if (!empty($md[$key])) {
         $title = 'Группа';
         $val = $md[$key];
         $filter = array('title' => $title, 'name' => Sequence::short(array(Catalog::urlencode($key))));
         $poss = array_filter($poss, function ($pos) use($key, $val) {
             $prop = $pos[$key];
             foreach ($val as $value => $one) {
                 if ($value === 'yes') {
                     return true;
                 }
                 foreach ($pos['path'] as $path) {
                     if ((string) $value === $path) {
                         return true;
                     }
                 }
             }
             return false;
         });
         if ($val['no']) {
             unset($val['no']);
             $val['Не указано'] = 1;
         }
         if ($val['yes']) {
             unset($val['yes']);
             $val['Указано'] = 1;
         }
         $filter['value'] = implode(', ', array_keys($val));
         if ($md['search']) {
             $filters[] = $filter;
         }
     }
     //Filter search
     if (!empty($md['search'])) {
         $v = preg_split("/\\s+/", mb_strtolower($md['search']));
         foreach ($v as $i => $s) {
             $v[$i] = preg_replace("/ы\$/", "", $s);
         }
         $poss = array_filter($poss, function ($pos) use($v) {
             return Catalog::searchTest($pos, $v);
         });
         $filters[] = array('title' => 'Поиск', 'name' => 'search', 'value' => $md['search']);
     }
     //Extend::filtering($poss, $md, $filters);
     return $filters;
 }
예제 #10
0
use infrajs\load\Load;
use infrajs\access\Access;
use infrajs\template\Template;
use infrajs\mail\Mail;
$ans = array();
$ans['popup'] = true;
$conf = Config::get('subscribe');
if (empty($_REQUEST['email'])) {
    return Ans::err($ans, $conf['msg']);
}
if (strlen($_REQUEST['email']) > 1000) {
    return Ans::err($ans, 'Слишком много данных. ' . $conf['msg']);
}
$email = strip_tags($_REQUEST['email']);
$email = trim($email);
$email = Path::encode($email);
$agent = $_SERVER['HTTP_USER_AGENT'];
$ip = $_SERVER['REMOTE_ADDR'];
session_start();
if (empty($_SESSION['submit_time'])) {
    $_SESSION['submit_time'] = 0;
}
if (time() - $_SESSION['submit_time'] < 60) {
    return Ans::err($ans, 'Письмо уже отправлено! Новое сообщение можно будет отправить через 1 минуту!');
}
$_SESSION['submit_time'] = time();
$data = array('email' => $email, 'agent' => $agent, 'ip' => $ip, 'host' => $_SERVER['HTTP_HOST']);
$body = Template::parse('-subscribe/subscribe.mail.tpl', $data);
Mail::toAdmin('Запрос ' . $data['host'] . ' ' . $email, 'noreplay@' . $data['host'], $body);
$src = Path::resolve('~.subscribe.json');
$subs = Load::loadJSON($src);