00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00071 class t3lib_flexformtools {
00072
00073 var $convertCharset = FALSE;
00074 var $reNumberIndexesOfSectionData = FALSE;
00075
00076 var $traverseFlexFormXMLData_DS = array();
00077 var $traverseFlexFormXMLData_Data = array();
00078
00079
00080 var $flexArray2Xml_options = array(
00081 'parentTagMap' => array(
00082 'data' => 'sheet',
00083 'sheet' => 'language',
00084 'language' => 'field',
00085 'el' => 'field',
00086 'field' => 'value',
00087 'field:el' => 'el',
00088 'el:_IS_NUM' => 'section',
00089 'section' => 'itemType'
00090 ),
00091 'disableTypeAttrib' => 2
00092 );
00093
00094
00095 var $callBackObj = NULL;
00096 var $cleanFlexFormXML = array();
00097
00108 function traverseFlexFormXMLData($table,$field,$row,&$callBackObj,$callBackMethod_value) {
00109
00110 if (!is_array($GLOBALS['TCA'][$table]) || !is_array($GLOBALS['TCA'][$table]['columns'][$field])) {
00111 return 'TCA table/field was not defined.';
00112 }
00113
00114 $this->callBackObj = &$callBackObj;
00115
00116
00117 $dataStructArray = t3lib_BEfunc::getFlexFormDS($GLOBALS['TCA'][$table]['columns'][$field]['config'],$row,$table);
00118
00119
00120 if (is_array($dataStructArray)) {
00121
00122
00123 $xmlData = $row[$field];
00124
00125
00126 if ($this->convertCharset) {
00127 $xmlHeaderAttributes = t3lib_div::xmlGetHeaderAttribs($xmlData);
00128 $storeInCharset = strtolower($xmlHeaderAttributes['encoding']);
00129 if ($storeInCharset) {
00130 $currentCharset = $GLOBALS['LANG']->charSet;
00131 $xmlData = $GLOBALS['LANG']->csConvObj->conv($xmlData,$storeInCharset,$currentCharset,1);
00132 }
00133 }
00134
00135 $editData = t3lib_div::xml2array($xmlData);
00136 if (!is_array($editData)) {
00137 return 'Parsing error: '.$editData;
00138 }
00139
00140
00141 $langChildren = $dataStructArray['meta']['langChildren'] ? 1 : 0;
00142 $langDisabled = $dataStructArray['meta']['langDisable'] ? 1 : 0;
00143
00144
00145 if (!is_array($editData['meta'])) {
00146 $editData['meta'] = array();
00147 }
00148 $editData['meta']['currentLangId'] = array();
00149 $languages = $this->getAvailableLanguages();
00150
00151 foreach ($languages as $lInfo) {
00152 $editData['meta']['currentLangId'][] = $lInfo['ISOcode'];
00153 }
00154 if (!count($editData['meta']['currentLangId'])) {
00155 $editData['meta']['currentLangId'] = array('DEF');
00156 }
00157 $editData['meta']['currentLangId'] = array_unique($editData['meta']['currentLangId']);
00158
00159 if ($langChildren || $langDisabled) {
00160 $lKeys = array('DEF');
00161 } else {
00162 $lKeys = $editData['meta']['currentLangId'];
00163 }
00164
00165
00166 if (is_array($dataStructArray['sheets'])) {
00167 $sKeys = array_keys($dataStructArray['sheets']);
00168 } else {
00169 $sKeys = array('sDEF');
00170 }
00171
00172
00173 foreach($lKeys as $lKey) {
00174 foreach($sKeys as $sheet) {
00175 $sheetCfg = $dataStructArray['sheets'][$sheet];
00176 list ($dataStruct, $sheet) = t3lib_div::resolveSheetDefInDS($dataStructArray,$sheet);
00177
00178
00179 if (is_array($dataStruct['ROOT']) && is_array($dataStruct['ROOT']['el'])) {
00180 $lang = 'l'.$lKey;
00181 $PA['vKeys'] = $langChildren && !$langDisabled ? $editData['meta']['currentLangId'] : array('DEF');
00182 $PA['lKey'] = $lang;
00183 $PA['callBackMethod_value'] = $callBackMethod_value;
00184 $PA['table'] = $table;
00185 $PA['field'] = $field;
00186 $PA['uid'] = $row['uid'];
00187
00188 $this->traverseFlexFormXMLData_DS = &$dataStruct;
00189 $this->traverseFlexFormXMLData_Data = &$editData;
00190
00191
00192 $this->traverseFlexFormXMLData_recurse(
00193 $dataStruct['ROOT']['el'],
00194 $editData['data'][$sheet][$lang],
00195 $PA,
00196 'data/'.$sheet.'/'.$lang
00197 );
00198 } else return 'Data Structure ERROR: No ROOT element found for sheet "'.$sheet.'".';
00199 }
00200 }
00201 } else return 'Data Structure ERROR: '.$dataStructArray;
00202 }
00203
00213 function traverseFlexFormXMLData_recurse($dataStruct,$editData,&$PA,$path='') {
00214
00215 if (is_array($dataStruct)) {
00216 foreach($dataStruct as $key => $value) {
00217 if (is_array($value)) {
00218
00219 if ($value['type']=='array') {
00220 if ($value['section']) {
00221
00222 $cc = 0;
00223 if (is_array($editData[$key]['el'])) {
00224
00225 if ($this->reNumberIndexesOfSectionData) {
00226 $temp = array();
00227 $c3=0;
00228 foreach($editData[$key]['el'] as $v3) {
00229 $temp[++$c3] = $v3;
00230 }
00231 $editData[$key]['el'] = $temp;
00232 }
00233
00234 foreach($editData[$key]['el'] as $k3 => $v3) {
00235 $cc=$k3;
00236 $theType = key($v3);
00237 $theDat = $v3[$theType];
00238 $newSectionEl = $value['el'][$theType];
00239 if (is_array($newSectionEl)) {
00240 $this->traverseFlexFormXMLData_recurse(
00241 array($theType => $newSectionEl),
00242 array($theType => $theDat),
00243 $PA,
00244 $path.'/'.$key.'/el/'.$cc
00245 );
00246 }
00247 }
00248 }
00249 } else {
00250 $this->traverseFlexFormXMLData_recurse(
00251 $value['el'],
00252 $editData[$key]['el'],
00253 $PA,
00254 $path.'/'.$key.'/el'
00255 );
00256 }
00257 } elseif (is_array($value['TCEforms']['config'])) {
00258
00259 foreach($PA['vKeys'] as $vKey) {
00260 $vKey = 'v'.$vKey;
00261
00262
00263 if ($PA['callBackMethod_value']) {
00264 $this->callBackObj->$PA['callBackMethod_value'](
00265 $value,
00266 $editData[$key][$vKey],
00267 $PA,
00268 $path.'/'.$key.'/'.$vKey,
00269 $this
00270 );
00271 }
00272 }
00273 }
00274 }
00275 }
00276 }
00277 }
00278
00284 function getAvailableLanguages() {
00285 $isL = t3lib_extMgm::isLoaded('static_info_tables');
00286
00287
00288 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('static_lang_isocode,title,uid', 'sys_language', 'pid=0'.t3lib_BEfunc::deleteClause('sys_language'), '', 'title');
00289
00290
00291 $output = array();
00292 $output[0]=array(
00293 'uid' => 0,
00294 'title' => 'Default language',
00295 'ISOcode' => 'DEF'
00296 );
00297
00298 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
00299 $output[$row['uid']] = $row;
00300
00301 if ($isL && $row['static_lang_isocode']) {
00302 $rr = t3lib_BEfunc::getRecord('static_languages',$row['static_lang_isocode'],'lg_iso_2');
00303 if ($rr['lg_iso_2']) $output[$row['uid']]['ISOcode']=$rr['lg_iso_2'];
00304 }
00305
00306 if (!$output[$row['uid']]['ISOcode']) unset($output[$row['uid']]);
00307 }
00308 return $output;
00309 }
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00334 function cleanFlexFormXML($table,$field,$row) {
00335
00336
00337 $this->cleanFlexFormXML = array();
00338
00339
00340 $flexObj = t3lib_div::makeInstance('t3lib_flexformtools');
00341 $flexObj->reNumberIndexesOfSectionData = TRUE;
00342 $flexObj->traverseFlexFormXMLData($table,$field,$row,$this,'cleanFlexFormXML_callBackFunction');
00343
00344 return $this->flexArray2Xml($this->cleanFlexFormXML, TRUE);
00345 }
00346
00358 function cleanFlexFormXML_callBackFunction($dsArr, $data, $PA, $path, &$pObj) {
00359 #debug(array($dsArr, $data, $PA),$path);
00360
00361 $pObj->setArrayValueByPath($path,$this->cleanFlexFormXML,$data);
00362 }
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00385 function &getArrayValueByPath($pathArray,&$array) {
00386 if (!is_array($pathArray)) {
00387 $pathArray = explode('/',$pathArray);
00388 }
00389 if (is_array($array)) {
00390 if (count($pathArray)) {
00391 $key = array_shift($pathArray);
00392
00393 if (isset($array[$key])) {
00394 if (!count($pathArray)) {
00395 return $array[$key];
00396 } else {
00397 return $this->getArrayValueByPath($pathArray,$array[$key]);
00398 }
00399 } else {
00400 return NULL;
00401 }
00402 }
00403 }
00404 }
00405
00414 function setArrayValueByPath($pathArray,&$array,$value) {
00415 if (isset($value)) {
00416 if (!is_array($pathArray)) {
00417 $pathArray = explode('/',$pathArray);
00418 }
00419 if (is_array($array)) {
00420 if (count($pathArray)) {
00421 $key = array_shift($pathArray);
00422
00423 if (!count($pathArray)) {
00424 $array[$key] = $value;
00425 return TRUE;
00426 } else {
00427 if (!isset($array[$key])) {
00428 $array[$key] = array();
00429 }
00430 return $this->setArrayValueByPath($pathArray,$array[$key],$value);
00431 }
00432 }
00433 }
00434 }
00435 }
00436
00444 function flexArray2Xml($array, $addPrologue=FALSE) {
00445
00446 $options = $GLOBALS['TYPO3_CONF_VARS']['BE']['niceFlexFormXMLtags'] ? $this->flexArray2Xml_options : array();
00447 $spaceInd = ($GLOBALS['TYPO3_CONF_VARS']['BE']['compactFlexFormXML'] ? -1 : 4);
00448 $output = t3lib_div::array2xml($array,'',0,'T3FlexForms', $spaceInd, $options);
00449
00450 if ($addPrologue) {
00451 $output = '<?xml version="1.0" encoding="'.$GLOBALS['LANG']->charSet.'" standalone="yes" ?>'.chr(10).$output;
00452 }
00453
00454 return $output;
00455 }
00456 }
00457
00458 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_flexformtools.php']) {
00459 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_flexformtools.php']);
00460 }
00461 ?>