465 lines
14 KiB
PHP
465 lines
14 KiB
PHP
<?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;
|
|
}
|
|
?>
|