123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465 |
- <?php
- /**
- * [Discuz!] (C)2001-2099 Comsenz Inc.
- * This is NOT a freeware, use is subject to license terms
- *
- * $Id: portalcp_diy.php 33949 2013-09-05 02:16:25Z laoguozhang $
- */
- if(!defined('IN_DISCUZ')) {
- exit('Access Denied');
- }
- $op = in_array($_GET['op'], array('style', 'diy', 'image', 'export', 'import', 'blockclass')) ? $_GET['op'] : '';
- if (submitcheck('uploadsubmit')) {
- $topicid = intval($_POST['topicid']);
- if($topicid) {
- $topic = C::t('portal_topic')->fetch($topicid);
- if(empty($topic)) {
- topic_upload_error('diy_topic_noexist');
- }
- }
- topic_checkperm($topic);
- $upload = new discuz_upload();
- $upload->init($_FILES['attach'], 'portal');
- $attach = $upload->attach;
- if(!$upload->error()) {
- $upload->save();
- }
- if($upload->error()) {
- topic_upload_error($attach, $upload->error());
- } else {
- if($attach['isimage']) {
- require_once libfile('class/image');
- $image = new image();
- $attach['thumb'] = $image->Thumb($attach['target'], '', '80', '50');
- }
- if(getglobal('setting/ftp/on')) {
- if(ftpcmd('upload', 'portal/'.$attach['attachment'])) {
- if($attach['thumb']) {
- ftpcmd('upload', 'portal/'.getimgthumbname($attach['attachment']));
- }
- $attach['remote'] = 1;
- } else {
- if(getglobal('setting/ftp/mirror')) {
- @unlink($attach['target']);
- @unlink(getimgthumbname($attach['target']));
- topic_upload_error($attach, 'diy_remote_upload_failed');
- }
- }
- }
- $setarr = array(
- 'uid' => $_G['uid'],
- 'username' => $_G['username'],
- 'filename' => $attach['name'],
- 'filepath' => $attach['attachment'],
- 'size' => $attach['size'],
- 'thumb' => $attach['thumb'],
- 'remote' => $attach['remote'],
- 'dateline' => $_G['timestamp'],
- 'topicid' => $topicid
- );
- $setarr['picid'] = C::t('portal_topic_pic')->insert($setarr, true);
- topic_upload_show($topicid);
- }
- } elseif (submitcheck('diysubmit')) {
- require_once libfile('function/portalcp');
- $tpldirectory = getstr($_POST['tpldirectory'], 80);
- $template = getstr($_POST['template'], 50);
- if(dsign($tpldirectory.$template) !== $_POST['diysign']) {
- showmessage('diy_sign_invalid');
- }
- $tpldirectory = ($tpldirectory) ? $tpldirectory : $_G['cache']['style_default']['tpldir'];
- $savemod = getstr($_POST['savemod'], 1);
- $recover = getstr($_POST['recover'], 1);
- $optype = getstr($_POST['optype'],10);
- tpl_checkperm($template);
- list($template, $clonefile) = explode(':', $template);
- list($mod,$file) = explode('/', $template);
- $targettplname = $template;
- if ($savemod == '1' && !empty($clonefile)) {
- $targettplname = $template.'_'.$clonefile;
- }
- $istopic = $iscategory = $isarticle = false;
- if($template == 'portal/portal_topic_content') {
- $template = gettopictplname($clonefile);
- $istopic = true;
- } elseif ($template == 'portal/list') {
- $template = getportalcategorytplname($clonefile);
- $iscategory = true;
- } elseif ($template == 'portal/view') {
- $template = getportalarticletplname($clonefile, $template);
- $isarticle = true;
- }
- if(($istopic || $iscategory || $isarticle) && strpos($template, ':') !== false) {
- list($tpldirectory, $template) = explode(':', $template);
- }
- $checktpl = checkprimaltpl($tpldirectory.':'.$template);
- if($checktpl !== true) {
- showmessage($checktpl);
- }
- if($optype == 'canceldiy') {
- @unlink(DISCUZ_ROOT.'./data/diy/'.$tpldirectory.'/'.$targettplname.'_diy_preview.htm');
- if($targettplname == $template) @unlink(DISCUZ_ROOT.'./data/diy/'.$tpldirectory.'/'.$targettplname.'_'.$clonefile.'_diy_preview.htm');
- showmessage('do_success');
- }
- if ($recover == '1') {
- $file = './data/diy/'.$tpldirectory.'/'.$targettplname.'.htm';
- if (is_file($file.'.bak')) {
- copy ($file.'.bak', $file);
- } else {
- showmessage('diy_backup_noexist');
- }
- } else {
- $templatedata = array();
- checksecurity($_POST['spacecss']);
- $templatedata['spacecss'] = preg_replace("/(\<|\>)/is", '', $_POST['spacecss']);
- $style = empty($_POST['style'])?'':preg_replace("/[^0-9a-z]/i", '', $_POST['style']);
- if($style) {
- $cssfile = DISCUZ_ROOT.'./static/topic/'.$style.'/style.css';
- if(!file_exists($cssfile)) {
- showmessage('theme_does_not_exist');
- } else {
- $templatedata['style'] = "static/topic/$style/style.css";
- }
- }
- $layoutdata = getstr($_POST['layoutdata'],0,0,0,0,1);
- require_once libfile('class/xml');
- $templatedata['layoutdata'] = xml2array($layoutdata);
- if (empty($templatedata['layoutdata'])) showmessage('diy_data_format_invalid');
- $r = save_diy_data($tpldirectory, $template, $targettplname, $templatedata, true, $optype);
- include_once libfile('function/cache');
- updatecache('diytemplatename');
- if ($r && $optype != 'savecache') {
- if (!$iscategory && !$istopic && empty($savemod) && !empty($clonefile)) {
- $delfile = DISCUZ_ROOT.'./data/diy/'.$tpldirectory.'/'.$template.'_'.$clonefile.'.htm';
- if (file_exists($delfile)) {
- unlink($delfile);
- @unlink($delfile.'.bak');
- C::t('common_template_block')->delete_by_targettplname("{$template}_{$clonefile}", $tpldirectory);
- C::t('common_diy_data')->delete("{$template}_{$clonefile}", $tpldirectory);
- include_once libfile('function/cache');
- updatecache('diytemplatename');
- }
- }
- }
- }
- $tourl = empty($_POST['gobackurl']) || strpos($_POST['gobackurl'],'op=add') != false || strpos($_POST['gobackurl'],'&diy=yes') != false ?
- str_replace('&diy=yes','',$_SERVER['HTTP_REFERER']) : $_POST['gobackurl'];
- $tourl = preg_replace('/[\?|&]preview=yes/', '', $tourl);
- showmessage('do_success', $tourl,array('rejs'=>$_POST['rejs']));
- }
- if($op == 'blockclass') {
- loadcache('blockclass');
- } elseif($op == 'style') {
- if(!$_G['group']['allowmanagetopic'] && !$_G['group']['allowdiy'] && !$_G['group']['allowaddtopic']) {
- showmessage('group_nopermission', NULL, array('grouptitle' => $_G['group']['grouptitle']), array('login' => 1));
- }
- $themes = gettheme('topic');
- } elseif ($op == 'diy' || $op == 'image') {
- $topicid = intval($_GET['topicid']);
- $topic = C::t('portal_topic')->fetch($topicid);
- topic_checkperm($topic);
- $perpage = 6;
- $page = max(1, intval($_GET['page']));
- $start= ($page-1) * $perpage;
- $list = array();
- if ($topicid) {
- $count = C::t('portal_topic_pic')->count_by_topicid($topicid);
- if (!empty($count)) {
- foreach(C::t('portal_topic_pic')->fetch_all_by_topicid($topicid, $start, $perpage) as $value) {
- $value['pic'] = pic_get($value['filepath'], 'portal', $value['thumb'], $value['remote']);
- $list[] = $value;
- }
- }
- $multi= multi($count, $perpage, $page, "portal.php?mod=portalcp&ac=diy&op=image&topicid=$topicid");
- }
- } elseif ($op == 'delete') {
- $topicid = intval($_GET['topicid']);
- $topic = C::t('portal_topic')->fetch($topicid);
- topic_checkperm($topic);
- $picid = intval($_GET['picid']);
- } elseif ($op == 'export') {
- if (submitcheck('exportsubmit')) {
- $tpl = $_POST['tpl'];
- $tpldirectory = $_POST['tpldirectory'];
- $frame = $_POST['frame'];
- $type = $_POST['type'];
- if (!empty($tpl)) {
- tpl_checkperm($tpl);
- list($tpl,$id) = explode(':', $tpl);
- $tplname = $id ? $tpl.'_'.$id : $tpl;
- $diydata = C::t('common_diy_data')->fetch($tplname, $tpldirectory);
- if(empty($diydata) && $id) $diydata = C::t('common_diy_data')->fetch($tpl, $tpldirectory);
- if ($diydata) {
- $filename = $diydata['targettplname'];
- $diycontent = dunserialize($diydata['diycontent']);
- if (empty($diycontent)) showmessage('diy_no_export_data');
- if ($frame) {
- $area = '';
- $filename = $frame;
- $framedata = array();
- foreach ($diycontent['layoutdata'] as $key => $value) {
- $framedata = getobjbyname($frame, $value);
- if ($framedata) {
- $area = $key;
- getframeblock(array($framedata['type'].'`'.$frame => $framedata['content']));
- break;
- }
- }
- } else {
- foreach ($diycontent['layoutdata'] as $key => $value) {
- if (!empty($value)) getframeblock($value);
- }
- }
- $diycontent['blockdata'] = block_export($_G['curtplbid']);
- if ($frame) {
- $diycontent['spacecss'] = getcssdata($diycontent['spacecss']);
- $diycontent['layoutdata'] = array();
- $area = empty($area) ? 'diy1' : $area;
- $diycontent['layoutdata'][$area][$framedata['type'].'`'.$frame] = $framedata['content'] ? $framedata['content'] : array();
- }
- dheader('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
- dheader('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
- dheader('Cache-Control: no-cache, must-revalidate');
- dheader('Pragma: no-cache');
- dheader('Content-Encoding: none');
- if ($type == 'txt') {
- $str = serialize($diycontent);
- dheader('Content-Length: '.strlen($str));
- dheader('Content-Disposition: attachment; filename='.$filename.'.txt');
- dheader('Content-Type: text/plant');
- } else {
- require_once libfile('class/xml');
- $str = array2xml($diycontent, true);
- dheader('Content-Length: '.strlen($str));
- dheader('Content-Disposition: attachment; filename='.$filename.'.xml');
- dheader('Content-Type: text/xml');
- }
- echo $str;
- exit();
- } else {
- showmessage('diy_export_no_data','/');
- }
- } else {
- showmessage('diy_export_tpl_invalid','/');
- }
- }
- showmessage('diy_operation_invalid','/');
- } elseif ($op == 'import') {
- $tpl = $_POST['tpl'] ? $_POST['tpl'] : $_GET['tpl'];
- tpl_checkperm($tpl);
- if (submitcheck('importsubmit')) {
- $isinner = false;
- $filename = '';
- if($_POST['importfilename']) {
- $filename = DISCUZ_ROOT.'./template/default/portal/diyxml/'.$_POST['importfilename'].'.xml';
- $isinner = true;
- } else {
- $upload = new discuz_upload();
- $upload->init($_FILES['importfile'], 'temp');
- $attach = $upload->attach;
- if(!$upload->error()) {
- $upload->save();
- }
- if($upload->error()) {
- showmessage($upload->error(),'portal.php',array('status'=>$upload->error()));
- } else {
- $filename = $attach['target'];
- }
- }
- if($filename) {
- $arr = import_diy($filename);
- if(!$isinner) {
- @unlink($filename);
- }
- if (!empty($arr)) {
- $search = array('/\<script/i', '/\<\/script\>/i', "/\r/", "/\n/", '/(\[script [^>]*?)(src=)(.*?\[\/script\])/');
- $replace = array('[script', '[/script]', '', '', '$1[src=]$3');
- $arr['css'] = str_replace(array("\r","\n"),array(''),$arr['css']);
- $jsarr = array('status'=>1,'css'=>$arr['css'],'bids'=>implode(',',$arr['mapping']));
- foreach ($arr['html'] as $key => $value) {
- $value = preg_replace($search,$replace,$value);
- $jsarr['html'][$key] = $value;
- }
- showmessage('do_success','portal.php',$jsarr);
- } else {
- showmessage('do_success','portal.php',array('status'=>0));
- }
- }
- }
- $xmlarr = array();
- if ($_GET['type'] == 1) {
- $xmlfilepath = DISCUZ_ROOT.'./template/default/portal/diyxml/';
- if(($dh = @opendir($xmlfilepath))) {
- while(($file = @readdir($dh)) !== false) {
- if(fileext($file) == 'xml') {
- $xmlarr[substr($file, 0, -4)] = getdiyxmlname($file, $xmlfilepath);
- }
- }
- closedir($dh);
- }
- arsort($xmlarr);
- }
- } else {
- showmessage('undefined_action');
- }
- include_once template("portal/portalcp_diy");
- function topic_upload_error($attach, $msg='') {
- echo '<script>';
- echo 'parent.document.getElementById(\'uploadmsg\').innerHTML = \''.$attach['name'].' '.lang('home/template', 'upload_error').$msg.'\';';
- echo '</script>';
- exit();
- }
- function topic_upload_show($topicid) {
- echo '<script>';
- echo 'parent.ajaxget("portal.php?mod=portalcp&ac=diy&op=image&topicid='.$topicid.'&", "diyimages");';
- echo 'parent.document.uploadpic.attach.value = \'\';';
- echo 'Util.toggleEle(\'upload\')';
- echo '</script>';
- exit();
- }
- function tpl_checkperm($tpl) {
- global $_G;
- list($file,$id) = explode(':', $tpl);
- if ($file == 'portal/portal_topic_content') {
- $topicid = max(0,intval($id));
- $topic = C::t('portal_topic')->fetch($topicid);
- topic_checkperm($topic);
- } elseif($file == 'portal/list'){
- $catid = max(0,intval($id));
- $category = $_G['cache']['portalcategory'][$catid];
- category_checkperm($category);
- } else {
- if(!$_G['group']['allowdiy']) {
- showmessage('diy_nopermission');
- }
- }
- }
- function category_checkperm($category) {
- global $_G;
- if(empty($category)) {
- showmessage('topic_not_exist');
- }
- if($_G['group']['allowdiy']) return true;
- if(!$_G['group']['allowdiy'] && (!$_G['group']['allowaddtopic'] || $_G['uid'] != $topic['uid'])) {
- showmessage('topic_edit_nopermission');
- }
- }
- function topic_checkperm($topic) {
- global $_G;
- if(empty($topic)) {
- showmessage('topic_not_exist');
- }
- if(!$_G['group']['allowmanagetopic'] && (!$_G['group']['allowaddtopic'] || $_G['uid'] != $topic['uid'])) {
- showmessage('topic_edit_nopermission');
- }
- }
- function gettopictplname($topicid) {
- $topicid = max(0,intval($topicid));
- $topic = C::t('portal_topic')->fetch($topicid);
- return !empty($topic) && !empty($topic['primaltplname']) ? $topic['primaltplname'] : getglobal('cache/style_default/tpldir').':portal/portal_topic_content';
- }
- function getportalcategorytplname($catid) {
- global $_G;
- $catid = max(0,intval($catid));
- $category = $_G['cache']['portalcategory'][$catid];
- return !empty($category) && !empty($category['primaltplname']) ? $category['primaltplname'] : getglobal('cache/style_default/tpldir').':portal/list';
- }
- function getportalarticletplname($catid, $primaltplname = ''){
- if(($catid = intval($catid))) {
- if(($category = C::t('portal_category')->fetch($catid))) {
- $primaltplname = $category['articleprimaltplname'];
- }
- if(empty($primaltplname)) {
- $primaltplname = getglobal('cache/style_default/tpldir').':portal/view';
- C::t('portal_category')->update($catid, array('articleprimaltplname' => $primaltplname));
- }
- }
- return $primaltplname;
- }
- function getdiyxmlname($filename, $path) {
- $content = @file_get_contents($path.$filename);
- $name = $filename;
- if($content) {
- preg_match("/\<\!\-\-\[name\](.+?)\[\/name\]\-\-\>/i", trim($content), $mathes);
- if(!empty($mathes[1])) {
- preg_match("/^\{lang (.+?)\}$/", $mathes[1], $langs);
- if(!empty($langs[1])) {
- $name = lang('portalcp', $langs[1]);
- } else {
- $name = dhtmlspecialchars($mathes[1]);
- }
- }
- }
- return $name;
- }
- ?>
|