# #------------------------------------------------------------------------- # CMS - CMS Made Simple is (c) 2005 by Ted Kulp (wishy@cmsmadesimple.org) # This project's homepage is: http://www.cmsmadesimple.org # #------------------------------------------------------------------------- # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # Or read it online: http://www.gnu.org/licenses/licenses.html#GPL # #------------------------------------------------------------------------- if (!($this->CheckPermission('Add Stylesheets') && $this->CheckPermission('Add Templates') && $this->CheckPermission('Add Stylesheet Assoc'))) { $this->DisplayErrorPage($id, $params, $return_id, $this->Lang('accessdenied')); return; } /*--------------------------------------------------------- _cleanupReferences ---------------------------------------------------------*/ function _cleanupReferences( $prefix, $references, &$input ) { $data = $input; foreach( $references as $ref ) { $i=0;$j=0; $olddata = $data; $data = preg_replace( '/\((\S*?)[\\/]'.preg_quote($ref['name']).'[\"\'\`]*\)/i', '('.$prefix."/".$ref['name'].')',$data,-1,$i); $data = preg_replace( '/[\"\'`](\S*?)[\\/]'.preg_quote($ref['name']).'[\"\'\`]/i', '"'.$prefix."/".$ref['name'].'"',$data,-1,$j ); if( $data == '' ) { return false; } } $input = $data; return true; } /*--------------------------------------------------------- _trim_themename ---------------------------------------------------------*/ function _trim_themename( $name ) { $t_name_arr = explode(':',$name); if( count( $t_name_arr ) == 1 ) { $name = trim($t_name_arr[0]); } else { $name = trim($t_name_arr[1]); } return $name; } // // Begin // $fieldName=$id.'input_browse'; if (!isset ($_FILES[$fieldName]) || !isset ($_FILES) || !is_array ($_FILES[$fieldName]) || !$_FILES[$fieldName]['name']) { $this->DisplayErrorPage( $id, $params, $returnid, $this->Lang('error_nofilesuploaded')); return; } $mmmodule = $this->GetModuleInstance('MenuManager'); if( !$mmmodule ) { // nothing to output $this->DisplayErrorPage( $id, $params, $returnid, $this->Lang('error_nomenumanager')); return; } // make sure we have the dtdversion $havedtdversion = false; // normalize the file variable $file = $_FILES[$fieldName]; // $file['tmp_name'] is the file we have to parse $xml = file_get_contents( $file['tmp_name'] ); // load all the stylesheets $styleops = cmsms()->GetStylesheetOperations(); $allstylesheets = $styleops->LoadStylesheets(); // and the templates $templateops = cmsms()->GetTemplateOperations(); $alltemplates = $templateops->LoadTemplates(); // parse the xml stuff $parser = xml_parser_create(); xml_parse_into_struct( $parser, $xml, $val, $idx ); xml_parser_free( $parser ); $theme = ''; $curelement = array(); $templates = array(); $associations = array(); $allreferences = array(); $stylesheets = array(); $mmtemplates = array(); $onemmtemplate = array(); $onetemplate = new Template(); $onesheet = ''; $onereference = array(); $oneassoc = array(); foreach( $val as $elem ) { $value = ''; if( isset( $elem['value'] ) ) $value = $elem['value']; $type = $elem['type']; switch( $elem['tag'] ) { case 'NAME': { if( $type != 'complete' && $type != 'close' ) { continue; } $theme = $value; break; } case 'DTDVERSION': { if( $type != 'complete' && $type != 'close' ) { continue; } if( $value != DTD_VERSION ) { $this->DisplayErrorPage( $id, $params, $returnid, $this->Lang('error_dtdmismatch')); return; } $havedtdversion = true; break; } case 'TNAME': if( $type != 'complete' && $type != 'close' ) continue; $onetemplate->name = $theme.' // '.$value; foreach( $alltemplates as $tmpl ) { if( $tmpl->name == $onetemplate->name ) { // template name exists $this->DisplayErrorPage( $id, $params, $returnid, $this->Lang('error_templateexists',$onetemplate->name)); return; } } break; case 'TENCODING': if( $type != 'complete' && $type != 'close' ) { continue; } $onetemplate->encoding = $value; break; case 'TDATA': if( $type != 'complete' && $type != 'close' ) { continue; } $onetemplate->content = base64_decode($value); break; case 'TEMPLATE': if( $type != 'close' ) { continue; } $onetemplate->active = 1; // changed for CMSMS 1.11. $onetemplate->default = 0; $templates[] = $onetemplate; $onetemplate = new Template(); break; case 'CSSNAME': $onesheet->name = $theme.' // '.$value; foreach( $allstylesheets as $cssobj ) { if( $cssobj->name == $onesheet->name ) { // stylesheet name exists $this->DisplayErrorPage( $id, $params, $returnid, $this->Lang('error_stylesheetexists',$onesheet->name)); return; } } break; case 'CSSMEDIATYPE': $onesheet->media_type = $value; break; case 'CSSDATA': $onesheet->value = base64_decode($value); break; case 'STYLESHEET': if( $type == 'open' ) { $onesheet = new Stylesheet(); } else if( $type == 'close' ) { $stylesheets[] = $onesheet; } case 'ASSOC_TNAME': if( strpos($value,':') !== FALSE ) { list($junk,$value) = explode(':',$value,2); } if( strpos($value,'//') !== FALSE ) { list($junk,$value) = explode('//',$value,2); } $oneassoc['tname'] = trim($value); break; case 'ASSOC_CSSNAME': if( strpos($value,':') !== FALSE ) { list($junk,$value) = explode(':',$value,2); } if( strpos($value,' // ') !== FALSE ) { list($junk,$value) = explode(' // ',$value,2); } $oneassoc['cssname'] = trim($value); break; case 'ASSOC': if( $type != 'close' ) continue; if( count( $oneassoc ) != 2 ) $this->DisplayErrorPage( $id, $params, $returnid, $this->Lang('error_badassoc',$oneassoc['tname'])); $associations[] = $oneassoc; $oneassoc = array(); break; case 'REFNAME': $onereference['name'] = $value; break; case 'REFENCODED': $onereference['encoded'] = $value; break; case 'REFLOCATION': $onereference['location'] = $value; break; case 'REFDATA': $onereference['data'] = $value; break; case 'REFERENCE': if( $type != 'close' ) continue; if( count( $onereference ) != 4 ) { // stylesheet name exists $this->DisplayErrorPage( $id, $params, $returnid, $this->Lang('error_badembed',$onesheet->name)); } $allreferences[] = $onereference; $onereference = array(); break; case 'MMTEMPLATE_NAME': $onemmtemplate['origname'] = $value; $t_arr = explode('.tpl',$value); if( is_array( $t_arr ) ) $value = $t_arr[0]; $onemmtemplate['name'] = $theme.' // '._trim_themename($value); break; case 'MMTEMPLATE_DATA': $onemmtemplate['data'] = base64_decode($value); break; case 'MMTEMPLATE': if( $type != 'close' ) continue; if( count( $onemmtemplate ) != 3 ) { // stylesheet name exists $this->DisplayErrorPage( $id, $params, $returnid, $this->Lang('error_badxml')); } $mmtemplates[] = $onemmtemplate; } } // check the dtd version one last time. if( $havedtdversion == false ) { $this->DisplayErrorPage( $id, $params, $returnid, $this->Lang('error_dtdmismatch')); return; } /*--------------------------------------------------------- _saveEncodedFile ---------------------------------------------------------*/ function _saveEncodedFile( $obj, $prefix, $name, &$location, $encoded, $data ) { // clean up the location if( substr($location,0,1) == '/' ) $location = substr($location,1); if( $encoded ) $data = base64_decode($data); // translate slashes if we have to $newloc = preg_replace( '|\/|', DIRECTORY_SEPARATOR, $location ); $dir = $prefix.DIRECTORY_SEPARATOR.dirname( $location ); if( !file_exists( $dir ) ) { $obj->_mkdirr( $dir ); if( !file_exists( $dir ) ) return 0; } // and put it out there $fn = $prefix.DIRECTORY_SEPARATOR.$newloc; $fp = fopen( $fn, "w" ); if( !$fp ) return 0; fwrite( $fp, $data ); fclose( $fp ); return 1; } // make sure we have at least one stylesheet if( count( $stylesheets ) == 0 ) { $this->DisplayErrorPage( $id, $params, $returnid, $this->Lang('error_nostylesheets')); return; } // clean up the template and stylesheets and adjust everything to their new locations $prefix = parse_url($config['uploads_url'], PHP_URL_PATH)."/".$theme; for( $i = 0; $i < count($stylesheets); $i++ ) { $result = _cleanupReferences( $prefix, $allreferences, $stylesheets[$i]->value ); if( !$result ) { $this->DisplayErrorPage( $id, $params, $returnid, $this->Lang('error_editingproblem')); return; } } $newtemplates = array(); foreach( $templates as $onetemplate ) { $result = _cleanupReferences( $prefix, $allreferences, $onetemplate->content ); if( !$result ) { $this->DisplayErrorPage( $id, $params, $returnid, $this->Lang('error_editingproblem')); return; } $newtemplates[] = $onetemplate; } $templates = $newtemplates; // save our references as files // first we create the destination directory if it doesn't already exist $dest = cmsms()->config['uploads_path'].DIRECTORY_SEPARATOR.$theme; $this->_mkdirr( $dest ); foreach( $allreferences as $ref ) { //$res = _saveEncodedFile( $dest, $ref['name'], $ref['location'], $res = _saveEncodedFile( $this, $dest, $ref['name'], $ref['name'], $ref['encoded'], $ref['data'] ); if( $res != 1 ) { // this could be a problem we could have a bunch o files lying around $this->DisplayErrorPage( $id, $params, $returnid, $this->Lang('error_problemsavingincludes')); return; } } // // now we have some nice, clean templates and stylesheets, do our magic // // stylesheets first $cssids = array(); $styleops = cmsms()->GetStylesheetOperations(); foreach( $stylesheets as $css ) { $newid = $styleops->InsertStylesheet( $css ); if( $newid == -1 ) { // couldn't insert the stylesheet continue; } $cssids[] = array( $css->name, $newid ); } // then the menu manager templates foreach( $mmtemplates as $mmtempl ) { $mmmodule->SetMenuTemplate( $mmtempl['name'], $mmtempl['data'] ); } // then templates foreach( $templates as $onetemplate ) { // have to clean up the template, and give it the // new mmtemplate name if it wants it // replace {cms_module module=menumanager template=something} // with {cms_module module=menumanager template="theme : something"} //$pattern = "/\{cms_module\s+module\s*=\s*[\\\"']{0,1}menumanager[\\\"']{0,1}\s+template\s*=\s*[\\\"']{0,1}(.*?)[\\\"']{0,1}\}/i"; //$replacement = "{cms_module module='menumanager' template='theme : $1'}"; $newcontent = $onetemplate->content; foreach( $mmtemplates as $mmtempl ) { // this grabs all cms_module calls from the page template // then parses them to see if they are menumanager calls, with the specific template we're looking for $pattern = '/{cms_module\s([^}]*)}/'; $pattern2 = '/([a-zA-z0-9]*)=["\']([^"\']+)["\']/'; $matches = array(); $res = preg_match_all($pattern, $newcontent, $matches); if( $res ) { for( $n = 0; $n < count($matches[0]); $n++ ) { $origtags = $matches[0][$n]; $match = $matches[1][$n]; $matches2 = array(); $params = array(); $res2 = preg_match_all($pattern2, $match, $matches2); if( $res2 ) { for( $i = 0; $i < count($matches2[1]); $i++ ) { $params[$matches2[1][$i]] = $matches2[2][$i]; } if( count($params) && isset($params['module']) && strtolower($params['module']) == 'menumanager' ) { // we have a {cms_module ... module=menumanager ... } call if( isset($params['template']) ) { if( strpos($params['template'],' : ') !== FALSE ) { list($tmp1,$tmp2) = explode(' : ',$params['template']); $params['template'] = $tmp2; } else if( strpos($params['template'],' // ') !== FALSE ) { list($tmp1,$tmp2) = explode(' // ',$params['template']); $params['template'] = $tmp2; } } if( isset($params['template']) && $params['template'] == $mmtempl['origname'] ) { // we have found a template call we gotta change. $params['template'] = $mmtempl['name']; $replacement = '{cms_module'; foreach( $params as $key => $value ) { $replacement.= ' '.$key.'="'.$value.'"'; } $replacement .= '}'; // rebuild the tag. $newcontent = str_replace($origtag,$replacement,$newcontent); } } } } } // parse the template for all {menu calls with the template that we are interested in. $pattern = '/{menu\s([^}]*)}/'; $matches = array(); $res = preg_match_all($pattern, $newcontent, $matches); if( $res ) { for( $n = 0; $n < count($matches[0]); $n++ ) { $origtag = $matches[0][$n]; $match = $matches[1][$n]; $matches2 = array(); $params = array(); $res2 = preg_match_all($pattern2, $match, $matches2); if( $res2 ) { for( $i = 0; $i < count($matches2[1]); $i++ ) { $params[$matches2[1][$i]] = $matches2[2][$i]; } if( isset($params['template']) ) { if( strpos($params['template'],' : ') !== FALSE ) { list($tmp1,$tmp2) = explode(' : ',$params['template']); $params['template'] = $tmp2; } else if( strpos($params['template'],' // ') !== FALSE ) { list($tmp1,$tmp2) = explode(' // ',$params['template']); $params['template'] = $tmp2; } } if( isset($params['template']) && $params['template'] == $mmtempl['origname'] ) { // we have found a template call we gotta change. $params['template'] = $mmtempl['name']; $replacement = '{menu'; foreach( $params as $key => $value ) { $replacement.= ' '.$key.'="'.$value.'"'; } $replacement .= '}'; // rebuild the tag. $newcontent = str_replace($origtag,$replacement,$newcontent); } } } } } $onetemplate->content = $newcontent; // insert the template $gCms = cmsms(); $templateops = $gCms->GetTemplateOperations(); $styleops = $gCms->GetStylesheetOperations(); $newtmplid = $templateops->InsertTemplate( $onetemplate ); if( $newtmplid == -1 ) { $db = $this->GetDb(); echo "DEBUG: ".$db->ErrorMsg()."
"; $this->DisplayErrorPage( $id, $params, $returnid, $this->Lang('error_couldnotcreatetemplate')); return; } else { // now associate the stylesheets with this template // only add the associations for this template. foreach( $associations as $assoc ) { $tmp_name = $theme.' // '.$assoc['tname']; if( $tmp_name != $onetemplate->name ) { continue; } foreach( $cssids as $rec ) { $tmp_name2 = $theme.' // '.$assoc['cssname']; if( $tmp_name2 == $rec[0] ) { // have a templateid and a cssid, so go for it. if( !$styleops->AssociateStylesheetToTemplate( $rec[1], $newtmplid ) ) { // really really bad if this didn't work. // cuz theoretically we would have to clean up. $this->DisplayErrorPage( $id, $params, $returnid, $this->Lang('error_couldnotassoccss')); return; } $assoc['used'] = 1; } } } // foreach } // else } // foreach // if we got here, everything should be a-okay $this->Redirect( $id, 'defaultadmin', $returnid ,array("message"=>$this->Lang("import_succeeded"))); ?>