* @since Version 1.0 */ class sysTranslationsPubManager { public $dir; public $name; public $module; private $core; private $colKeywords = array( 'ID' => 'id', 'MESSAGE' => 'msg_message', ); private $rowInsertLimit = 100; public function __construct(&$coreClass) { $this->core = $coreClass; $this->module = new sysTranslationsPubModule(); } /** * Function to import file data - called directly from file upload * * @author Mareks Keišs * @category CMS Classificator Manager * @param array $file - imported file * @return array of data */ public function importDocDataFromFile($file){ $stats = array( 'n' => 0, 'u' => 0, ); $sFile = __MDIR__ . substr($file['path'], 1) . $file['file']; if(file_exists($sFile)){ //--------------------------------------------------------------------------- // NEW LARGE FILE IMPORT +++ //--------------------------------------------------------------------------- $trimSymbols = " \t\n\r\0\x0B\xC2\xA0"; // Increase time & memory limit if (!isset($GLOBALS['coverage_tests_running'])) { set_time_limit(60*60*3); ini_set('memory_limit', '128M'); } // Create PHP Excel instances $oExcel = new cExcel(); $oReader = $oExcel->createReader($sFile); $chunkFilter = new chunkReadFilter(); $oReader->setReadDataOnly(true); $oReader->setReadFilter($chunkFilter); //--------------------------------------------------------------------------- // LOAD HEADERS //--------------------------------------------------------------------------- $colsToSelect = array(); $colsToSelectTrans = array(); $cRow = 3; // Data located $FIELDS = $this->colKeywords; // set languages to field list $lng = new sysLanguagesModule(); $langs = $lng->getLanguages(true, true); foreach($langs as $val) $langCode[strtoupper($val['lang_code'])] = $val['id']; unset($langs); $chunkFilter->setRows(1, 2); $oWorkbook = $oReader->load($sFile); $oSheet = $oWorkbook->getActiveSheet(); // Associate each column with data column - check first 2x rows for ids $tCols = $oSheet->getHighestDataColumn(); $array = $oSheet->rangeToArray("A1:{$tCols}2"); foreach ($array as $r=>$row) { foreach ($row as $c=>$cell) { $sUpperKey = strtoupper($cell); if(isset($FIELDS[$sUpperKey])){ $colsToSelect[$FIELDS[$sUpperKey]] = $c; }elseif(isset($langCode[$sUpperKey])){ $colsToSelectTrans[$langCode[$sUpperKey]] = $c; } } } $i = 0; $chunkSize = 150; $emptyDefault = $emptyRows = 10; // Get next available msg ID $nextHighestId = $this->module->getMaxId(); while($emptyRows > 0){ $chunkFilter->setRows($cRow, $chunkSize); $oWorkbook = $oReader->load($sFile); $oSheet = $oWorkbook->getActiveSheet(); $array = $oSheet->rangeToArray("A{$cRow}:{$tCols}" . ($cRow+$chunkSize)); //--------------------------------------------------------------------------- // ANALYSE AND CREATE INSERT //--------------------------------------------------------------------------- $insert = array(); $insertDelete = array(); $insertTrans = array(); $insertNew = array(); if(!!$array && is_array($array)){ foreach($array as $row){ // Remove special chars foreach($row as &$v) { $v = trim($v, $trimSymbols); // Spec char replace fix // Excel import copyright fix Ⓒ ascii -> 169 $v = str_replace(array(chr(169)), array('©'), $v); } unset($v); // Generate inserts for messages if(!empty($row[$colsToSelect[$this->colKeywords['MESSAGE']]])){ $msg = $row[$colsToSelect[$this->colKeywords['MESSAGE']]]; //echo "{$msg} \n"; /*if(0 && !empty($row[$colsToSelect[$this->colKeywords['ID']]])){ $msgId = $row[$colsToSelect[$this->colKeywords['ID']]]; $insert[] = array( 'id' => $msgId, 'msg_message' => $msg ); $insertDelete[] = $msgId; foreach($colsToSelectTrans as $kl=>$vl){ $insertTrans[] = array( 'msg_id' => $msgId, 'msg_lang_id' => $kl, 'msg_translation' => $row[$vl] ); } }else{*/ // echo "{$i} - {$msg} \n"; // $i++; // Insert new //pr($msg); $insertNew[$msg] = array( 'id' => ++$nextHighestId, 'msg_message' => $msg ); foreach($colsToSelectTrans as $kl=>$vl){ $insertTrans[] = array( 'msg_id' => &$insertNew[$msg]['id'], 'msg_lang_id' => $kl, 'msg_translation' => $row[$vl] ); } /*}*/ $emptyRows = $emptyDefault; }else{ --$emptyRows; } } } // Add count for new msg $stats['n'] += count($insertNew); // Get all ids for existing $existingIds = $this->module->getMsgIdsByMsg(array_keys($insertNew)); if(!!$existingIds){ foreach($existingIds as $v){ if(isset($insertNew[$v['msg_message']])){ $insertNew[$v['msg_message']]['id'] = $v['id']; $insertDelete[] = $v['id']; $stats['n']--; $stats['u']++; } } } if(!!$insertNew){ $this->module->saveTableImportData('site_pub_msg', $insertNew, array('id' => $insertDelete)); $this->module->saveTableImportData('site_pub_msg_translations', $insertTrans, array('msg_id' => $insertDelete)); $this->module->truncateTable('temp_pub_msg_links'); } $cRow += $chunkSize; $oWorkbook->disconnectWorksheets(); unset($array, $oSheet, $oWorkbook, $insert); } // Clear APC translations $this->core->oApc->setExpiredStartingWith(array('msg_sm')); cJSON::sendOk(array('msg' => str_replace(array('%NCOUNT%', '%UCOUNT%'), array($stats['n'], $stats['u']), "File import successful! New %NCOUNT% & updated %UCOUNT%"))); } cJSON::sendError(array('msg' => 'An error occurred while importing file data!')); } }