Documentation TYPO3 par Ameos |
00001 <?php 00002 /*************************************************************** 00003 * Copyright notice 00004 * 00005 * (c) 2001-2005 Kasper Skaarhoj (kasperYYYY@typo3.com) 00006 * All rights reserved 00007 * 00008 * This script is part of the TYPO3 project. The TYPO3 project is 00009 * free software; you can redistribute it and/or modify 00010 * it under the terms of the GNU General Public License as published by 00011 * the Free Software Foundation; either version 2 of the License, or 00012 * (at your option) any later version. 00013 * 00014 * The GNU General Public License can be found at 00015 * http://www.gnu.org/copyleft/gpl.html. 00016 * A copy is found in the textfile GPL.txt and important notices to the license 00017 * from the author is found in LICENSE.txt distributed with these scripts. 00018 * 00019 * 00020 * This script is distributed in the hope that it will be useful, 00021 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00022 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00023 * GNU General Public License for more details. 00024 * 00025 * This copyright notice MUST APPEAR in all copies of the script! 00026 ***************************************************************/ 00033 require_once(t3lib_extMgm::extPath('kickstarter').'class.tx_kickstarter_compilefiles.php'); 00034 00035 class tx_kickstarter_wizard extends tx_kickstarter_compilefiles { 00036 var $varPrefix = 'kickstarter'; // redundant from 'extrep' 00037 var $siteBackPath = ''; 00038 var $EMmode=1; // If run from Extension Manager, set to 1. 00039 00040 var $wizArray=array(); 00041 00042 var $extKey_nusc = 'myext'; 00043 var $extKey = 'my_ext'; 00044 var $printWOP=0; 00045 var $outputWOP=0; 00046 var $saveKey=''; 00047 var $pObj; 00048 00049 var $afterContent; 00050 00051 var $languages = array( 00052 'dk' => 'Danish', 00053 'de' => 'German', 00054 'no' => 'Norwegian', 00055 'it' => 'Italian', 00056 'fr' => 'French', 00057 'es' => 'Spanish', 00058 'nl' => 'Dutch', 00059 'cz' => 'Czech', 00060 'pl' => 'Polish', 00061 'si' => 'Slovenian', 00062 'fi' => 'Finnish', 00063 'tr' => 'Turkish', 00064 'se' => 'Swedish', 00065 'pt' => 'Portuguese', 00066 'ru' => 'Russian', 00067 'ro' => 'Romanian', 00068 'ch' => 'Chinese', 00069 'sk' => 'Slovak', 00070 'lt' => 'Lithuanian', 00071 'is' => 'Icelandic', 00072 'hr' => 'Croatian', 00073 'hu' => 'Hungarian', 00074 'gl' => 'Greenlandic', 00075 'th' => 'Thai', 00076 'gr' => 'Greek', 00077 'hk' => 'Chinese (Trad)', 00078 'eu' => 'Basque', 00079 'bg' => 'Bulgarian', 00080 'br' => 'Brazilian Portuguese', 00081 'et' => 'Estonian', 00082 'ar' => 'Arabic', 00083 'he' => 'Hebrew', 00084 'ua' => 'Ukrainian', 00085 'lv' => 'Latvian', 00086 'jp' => 'Japanese', 00087 'vn' => 'Vietnamese', 00088 'ca' => 'Catalan', 00089 'ba' => 'Bosnian', 00090 'kr' => 'Korean', 00091 'eo' => 'Esperanto', 00092 'my' => 'Bahasa Malaysia', 00093 ); 00094 var $reservedTypo3Fields='uid,pid,endtime,starttime,sorting,fe_group,hidden,deleted,cruser_id,crdate,tstamp'; 00095 var $mysql_reservedFields='data,table,field,key,desc'; 00096 00097 // Internal: 00098 var $selectedLanguages = array(); 00099 var $usedNames=array(); 00100 var $fileArray=array(); 00101 var $ext_tables=array(); 00102 var $ext_localconf=array(); 00103 var $ext_locallang=array(); 00104 00105 var $color = array('#C8D0B3','#FEE7B5','#EEEEEE'); 00106 00107 var $modData; 00108 00109 function tx_kickstarter_wizard() { 00110 $this->modData = t3lib_div::_POST($this->varPrefix); 00111 } 00112 00113 function initWizArray() { 00114 $inArray = unserialize(base64_decode($this->modData['wizArray_ser'])); 00115 $this->wizArray = is_array($inArray) ? $inArray : array(); 00116 if (is_array($this->modData['wizArray_upd'])) { 00117 $this->wizArray = t3lib_div::array_merge_recursive_overrule($this->wizArray,$this->modData['wizArray_upd']); 00118 } 00119 00120 $lA = is_array($this->wizArray['languages']) ? current($this->wizArray['languages']) : ''; 00121 if (is_array($lA)) { 00122 foreach($lA as $k => $v) { 00123 if ($v && isset($this->languages[$k])) { 00124 $this->selectedLanguages[$k]=$this->languages[$k]; 00125 } 00126 } 00127 } 00128 } 00129 00130 function mgm_wizard() { 00131 $this->wizard =& $this; 00132 $this->initWizArray(); 00133 $this->sections = $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['kickstarter']['sections']; 00134 00135 foreach($this->sections as $k => $v) { 00136 $this->options[$k] = array($v['title'],$v['description']); 00137 } 00138 00139 $saveKey = $this->saveKey = $this->wizArray['save']['extension_key'] = trim($this->wizArray['save']['extension_key']); 00140 $this->outputWOP = $this->wizArray['save']['print_wop_comments'] ? 1 : 0; 00141 00142 if ($saveKey) { 00143 $this->extKey=$saveKey; 00144 $this->extKey_nusc=str_replace('_','',$saveKey); 00145 } 00146 00147 if ($this->modData['viewResult']) { 00148 $this->modData['wizAction']=''; 00149 $this->modData['wizSubCmd']=''; 00150 if ($saveKey) { 00151 $content = $this->view_result(); 00152 } else $content = $this->fw('<strong>Error:</strong> Please enter an extension key first!<BR><BR>'); 00153 } elseif ($this->modData['WRITE']) { 00154 $this->modData['wizAction']=''; 00155 $this->modData['wizSubCmd']=''; 00156 if ($saveKey) { 00157 $this->makeFilesArray($this->saveKey); 00158 $uploadArray = $this->makeUploadArray($this->saveKey,$this->fileArray); 00159 $this->pObj->importExtFromRep(0,$this->modData['loc'],0,$uploadArray,0,0,1); 00160 } else $content = $this->fw('<strong>Error:</strong> Please enter an extension key first!<BR><BR>'); 00161 } elseif ($this->modData['totalForm']) { 00162 $content = $this->totalForm(); 00163 } elseif ($this->modData['downloadAsFile']) { 00164 if ($saveKey) { 00165 $this->makeFilesArray($this->saveKey); 00166 $uploadArray = $this->makeUploadArray($this->saveKey,$this->fileArray); 00167 $backUpData = $this->makeUploadDataFromArray($uploadArray); 00168 $filename='T3X_'.$saveKey.'-'.str_replace('.','_','0.0.0').'.t3x'; 00169 $mimeType = 'application/octet-stream'; 00170 Header('Content-Type: '.$mimeType); 00171 Header('Content-Disposition: attachment; filename='.$filename); 00172 echo $backUpData; 00173 exit; 00174 } else $content = $this->fw('<strong>Error:</strong> Please enter an extension key first!<BR><BR>'); 00175 } else { 00176 $action = explode(':',$this->modData['wizAction']); 00177 if ((string)$action[0]=='deleteEl') { 00178 unset($this->wizArray[$action[1]][$action[2]]); 00179 } 00180 00181 $content = $this->getFormContent(); 00182 } 00183 $wasContent = $content?1:0; 00184 $content = ' 00185 <script language="javascript" type="text/javascript"> 00186 function setFormAnchorPoint(anchor) { 00187 document.'.$this->varPrefix.'_wizard.action = unescape("'.rawurlencode($this->linkThisCmd()).'")+"#"+anchor; 00188 } 00189 </script> 00190 <table border="0" cellpadding="0" cellspacing="0"> 00191 <form action="' . $this->linkThisCmd() . '" method="POST" name="' . $this->varPrefix . '_wizard"> 00192 <tr> 00193 <td valign="top">'.$this->sidemenu().'</td> 00194 <td> </td> 00195 <td valign="top">'.$content.' 00196 <input type="hidden" name="'.$this->piFieldName("wizArray_ser").'" value="'.htmlspecialchars(base64_encode(serialize($this->wizArray))).'" /><BR>'; 00197 00198 if ((string)$this->modData['wizSubCmd']) { 00199 if ($wasContent) $content.='<input name="update2" type="submit" value="Update..."> '; 00200 } 00201 $content.=' 00202 <input type="hidden" name="'.$this->piFieldName("wizAction").'" value="'.$this->modData["wizAction"].'"> 00203 <input type="hidden" name="'.$this->piFieldName("wizSubCmd").'" value="'.$this->modData["wizSubCmd"].'"> 00204 '.$this->cmdHiddenField().' 00205 </td> 00206 </tr> 00207 </form> 00208 </table>' . $this->afterContent; 00209 00210 return $content; 00211 } 00212 00216 function getFormContent() { 00217 00218 if($this->sections[$this->modData['wizSubCmd']]) { 00219 $path = t3lib_div::getFileAbsFileName($this->sections[$this->modData['wizSubCmd']]['filepath']); 00220 require_once($path); 00221 $section = t3lib_div::makeInstance($this->sections[$this->modData['wizSubCmd']]['classname']); 00222 $section->wizard = &$this; 00223 return $section->render_wizard(); 00224 } 00225 } 00226 00230 function totalForm() { 00231 $buf = array($this->printWOP,$this->dontPrintImages); 00232 $this->printWOP = 1; 00233 00234 $lines=array(); 00235 foreach($this->options as $k => $v) { 00236 // Add items: 00237 $items = $this->wizArray[$k]; 00238 if (is_array($items)) { 00239 foreach($items as $k2 => $conf) { 00240 $this->modData['wizSubCmd']=$k; 00241 $this->modData['wizAction']='edit:'.$k2; 00242 $lines[]=$this->getFormContent(); 00243 } 00244 } 00245 } 00246 00247 $this->modData['wizSubCmd']=''; 00248 $this->modData['wizAction']=''; 00249 list($this->printWOP,$this->dontPrintImages) = $buf; 00250 00251 $content = implode('<HR>',$lines); 00252 return $content; 00253 } 00254 00258 function sidemenu() { 00259 #debug($this->modData); 00260 $actionType = $this->modData['wizSubCmd'].':'.$this->modData['wizAction']; 00261 $singles = 'emconf,save,ts,TSconfig,languages'; 00262 $lines=array(); 00263 foreach($this->options as $k => $v) { 00264 // Add items: 00265 $items = $this->wizArray[$k]; 00266 $c=0; 00267 $iLines=array(); 00268 if (is_array($items)) { 00269 foreach($items as $k2=>$conf) { 00270 $dummyTitle = t3lib_div::inList($singles,$k) ? '[Click to Edit]' : '<em>Item '.$k2.'</em>'; 00271 $isActive = !strcmp($k.':edit:'.$k2,$actionType); 00272 $delIcon = $this->linkStr('<img src="'.$this->siteBackPath.'t3lib/gfx/garbage.gif" width="11" height="12" border="0" title="Remove item">','','deleteEl:'.$k.':'.$k2); 00273 $iLines[]='<tr'.($isActive?$this->bgCol(2,-30):$this->bgCol(2)).'><td>'.$this->fw($this->linkStr($this->bwWithFlag($conf['title']?$conf['title']:$dummyTitle,$isActive),$k,'edit:'.$k2)).'</td><td>'.$delIcon.'</td></tr>'; 00274 $c=$k2; 00275 } 00276 } 00277 if (!t3lib_div::inList($singles,$k) || !count($iLines)) { 00278 $c++; 00279 $addIcon = $this->linkStr('<img src="'.$this->siteBackPath.'t3lib/gfx/add.gif" width="12" height="12" border="0" title="Add item">',$k,'edit:'.$c); 00280 } else {$addIcon = '';} 00281 00282 $lines[]='<tr'.$this->bgCol(1).'><td nowrap><strong>'.$this->fw($v[0]).'</strong></td><td>'.$addIcon.'</td></tr>'; 00283 $lines = array_merge($lines,$iLines); 00284 } 00285 00286 $lines[]='<tr><td> </td><td></td></tr>'; 00287 00288 $lines[]='<tr><td width=150> 00289 '.$this->fw('Enter extension key:').'<BR> 00290 <input type="text" name="'.$this->piFieldName('wizArray_upd').'[save][extension_key]" value="'.$this->wizArray['save']['extension_key'].'"> 00291 '.($this->wizArray['save']['extension_key']?'':'<BR><a href="http://typo3.org/1382.0.html" target="_blank"><font color=red>Make sure to enter the right extension key from the beginning here!</font> You can register one here.</a>').' 00292 </td><td></td></tr>'; 00293 # onClick="setFormAnchorPoint(\'_top\')" 00294 $lines[]='<tr><td><input type="submit" value="Update..."></td><td></td></tr>'; 00295 $lines[]='<tr><td><input type="submit" name="'.$this->piFieldName('totalForm').'" value="Total form"></td><td></td></tr>'; 00296 00297 if ($this->saveKey) { 00298 $lines[]='<tr><td><input type="submit" name="'.$this->piFieldName('viewResult').'" value="View result"></td><td></td></tr>'; 00299 $lines[]='<tr><td><input type="submit" name="'.$this->piFieldName('downloadAsFile').'" value="D/L as file"></td><td></td></tr>'; 00300 $lines[]='<tr><td> 00301 <input type="hidden" name="'.$this->piFieldName('wizArray_upd').'[save][print_wop_comments]" value="0"><input type="checkbox" name="'.$this->piFieldName('wizArray_upd').'[save][print_wop_comments]" value="1" '.($this->wizArray['save']['print_wop_comments']?' CHECKED':'').'>'.$this->fw('Print WOP comments').' 00302 </td><td></td></tr>'; 00303 } 00304 00305 /* HOOK: Place a hook here, so additional output can be integrated */ 00306 if(is_array($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['kickstarter']['sidemenu'])) { 00307 foreach($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['kickstarter']['sidemenu'] as $_funcRef) { 00308 $lines = t3lib_div::callUserFunction($_funcRef, $lines, $this); 00309 } 00310 } 00311 00312 $content = '<table border=0 cellpadding=2 cellspacing=2>'.implode('',$lines).'</table>'; 00313 return $content; 00314 } 00315 00319 function view_result() { 00320 $this->makeFilesArray($this->saveKey); 00321 00322 // Empty the array of files to be overwritten 00323 $this->wizArray['save']['overwrite_files'] = array(); 00324 00325 $keyA = array_keys($this->fileArray); 00326 asort($keyA); 00327 00328 $filesOverview1=array(); 00329 $filesOverview2=array(); 00330 $filesContent=array(); 00331 00332 $filesOverview1[]= '<tr'.$this->bgCol(1).'> 00333 <td><strong>' . $this->fw('Filename:') . '</strong></td> 00334 <td><strong>' . $this->fw('Size:') . '</strong></td> 00335 <td><strong>' . $this->fw(' ') . '</strong></td> 00336 <td><strong>' . $this->fw('Overwrite:') . '</strong></td> 00337 </tr>'; 00338 00339 foreach($keyA as $fileName) { 00340 $data = $this->fileArray[$fileName]; 00341 00342 $fI = pathinfo($fileName); 00343 if (t3lib_div::inList('php,sql,txt',strtolower($fI['extension']))) { 00344 $linkToFile='<strong><a href="#'.md5($fileName).'">'.$this->fw(" View ").'</a></strong>'; 00345 $filesContent[]='<tr' .$this->bgCol(1) .'> 00346 <td><a name="' . md5($fileName) . '"></a><strong>' . $this->fw($fileName) . '</strong></td> 00347 </tr> 00348 <tr> 00349 <td>' . $this->preWrap($data['content']) . '</td> 00350 </tr>'; 00351 } else $linkToFile=$this->fw(' '); 00352 00353 $line = '<tr' . $this->bgCol(2) . '> 00354 <td>' . $this->fw($fileName) . '</td> 00355 <td>' . $this->fw(t3lib_div::formatSize($data['size'])) . '</td> 00356 <td>' . $linkToFile . '</td> 00357 <td><input type="checkbox" name="' . $this->piFieldName('wizArray_upd') . '[save][overwrite_files][]" value="' . $fileName . '" checked="checked"></td> 00358 </tr>'; 00359 if (strstr($fileName,'/')) { 00360 $filesOverview2[]=$line; 00361 } else { 00362 $filesOverview1[]=$line; 00363 } 00364 } 00365 00366 $content = '<table border=0 cellpadding=1 cellspacing=2>'.implode('',$filesOverview1).implode('',$filesOverview2).'</table>'; 00367 $content.= $this->fw('<BR><strong>Author name:</strong> '.$GLOBALS['BE_USER']->user['realName'].' 00368 <BR><strong>Author email:</strong> '.$GLOBALS['BE_USER']->user['email']); 00369 00370 00371 $content.= '<BR><BR>'; 00372 if (!$this->EMmode) { 00373 $content.='<input type="submit" name="'.$this->piFieldName('WRITE').'" value="WRITE to \''.$this->saveKey.'\'">'; 00374 } else { 00375 $content.=' 00376 <strong>'.$this->fw('Write to location:').'</strong><BR> 00377 <select name="'.$this->piFieldName('loc').'">'. 00378 ($this->pObj->importAsType('G')?'<option value="G">Global: '.$this->pObj->typePaths['G'].$this->saveKey.'/'.(@is_dir(PATH_site.$this->pObj->typePaths['G'].$this->saveKey)?' (OVERWRITE)':' (empty)').'</option>':''). 00379 ($this->pObj->importAsType('L')?'<option value="L">Local: '.$this->pObj->typePaths['L'].$this->saveKey.'/'.(@is_dir(PATH_site.$this->pObj->typePaths['L'].$this->saveKey)?' (OVERWRITE)':' (empty)').'</option>':''). 00380 '</select> 00381 <input type="submit" name="'.$this->piFieldName('WRITE').'" value="WRITE" onClick="return confirm(\'If the setting in the selectorbox says OVERWRITE\nthen the current extension in that location WILL be overridden! Totally!\nPlease decide if you want to continue.\n\n(Remember, this is a *kickstarter* - not an editor!)\');"> 00382 '; 00383 } 00384 00385 00386 $this->afterContent= '<BR><table border=0 cellpadding=1 cellspacing=2>'.implode('',$filesContent).'</table>'; 00387 return $content; 00388 } 00389 00390 00391 00395 function makeUploadDataFromArray($uploadArray) { 00396 if (is_array($uploadArray)) { 00397 $serialized = serialize($uploadArray); 00398 $md5 = md5($serialized); 00399 00400 $content=$md5.':'; 00401 /* if ($this->gzcompress) { 00402 $content.='gzcompress:'; 00403 $content.=gzcompress($serialized); 00404 } else { 00405 */ $content.=':'; 00406 $content.=$serialized; 00407 // } 00408 } 00409 return $content; 00410 } 00414 function makeUploadArray($extKey,$files) { 00415 $uploadArray=array(); 00416 $uploadArray['extKey']=$extKey; 00417 $uploadArray['EM_CONF']=Array( 00418 'title' => '[No title]', 00419 'description' => '[Enter description of extension]', 00420 'category' => 'example', 00421 'author' => $this->userfield('name'), 00422 'author_email' => $this->userfield('email'), 00423 00424 ); 00425 00426 $uploadArray['EM_CONF'] = array_merge($uploadArray['EM_CONF'],$this->makeEMCONFpreset('')); 00427 00428 if (is_array($this->_addArray)) { 00429 $uploadArray['EM_CONF'] = array_merge($uploadArray['EM_CONF'],$this->_addArray); 00430 } 00431 $uploadArray['misc']['codelines']=0; 00432 $uploadArray['misc']['codebytes']=0; 00433 $uploadArray['techInfo'] = ''; 00434 00435 // Go through overwrite-files list to determine which files are to be written to disk 00436 // This allows to change only certain files on disk while keeping all others 00437 if(is_array($this->wizArray['save']['overwrite_files'])) { 00438 foreach($this->wizArray['save']['overwrite_files'] as $fileName) { 00439 $uploadArray['FILES'][$fileName] = $files[$fileName]; 00440 } 00441 } 00442 return $uploadArray; 00443 } 00444 00445 00446 } 00447 00448 // Include extension? 00449 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/kickstarter/class.tx_kickstarter_wizard.php']) { 00450 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/kickstarter/class.tx_kickstarter_wizard.php']); 00451 } 00452 00453 ?>