public function importProcessAction() { $success = true; $parentId = $this->getParam("parentId"); $job = $this->getParam("job"); $id = $this->getParam("id"); $mappingRaw = \Zend_Json::decode($this->getParam("mapping")); $class = Object\ClassDefinition::getById($this->getParam("classId")); $skipFirstRow = $this->getParam("skipHeadRow") == "true"; $fields = $class->getFieldDefinitions(); $file = PIMCORE_SYSTEM_TEMP_DIRECTORY . "/import_" . $id; // currently only csv supported // determine type $dialect = Tool\Admin::determineCsvDialect(PIMCORE_SYSTEM_TEMP_DIRECTORY . "/import_" . $id . "_original"); $count = 0; if (($handle = fopen($file, "r")) !== false) { $data = fgetcsv($handle, 0, $dialect->delimiter, $dialect->quotechar, $dialect->escapechar); } if ($skipFirstRow && $job == 1) { //read the next row, we need to skip the head row $data = fgetcsv($handle, 0, $dialect->delimiter, $dialect->quotechar, $dialect->escapechar); } $tmpFile = $file . "_tmp"; $tmpHandle = fopen($tmpFile, "w+"); while (!feof($handle)) { $buffer = fgets($handle); fwrite($tmpHandle, $buffer); } fclose($handle); fclose($tmpHandle); unlink($file); rename($tmpFile, $file); // prepare mapping foreach ($mappingRaw as $map) { if ($map[0] !== "" && $map[1] && !empty($map[2])) { $mapping[$map[2]] = $map[0]; } else { if ($map[1] == "published (system)") { $mapping["published"] = $map[0]; } else { if ($map[1] == "type (system)") { $mapping["type"] = $map[0]; } } } } // create new object $className = "\\Pimcore\\Model\\Object\\" . ucfirst($this->getParam("className")); $className = Tool::getModelClassMapping($className); $parent = Object::getById($this->getParam("parentId")); $objectKey = "object_" . $job; if ($this->getParam("filename") == "id") { $objectKey = null; } else { if ($this->getParam("filename") != "default") { $objectKey = File::getValidFilename($data[$this->getParam("filename")]); } } $overwrite = false; if ($this->getParam("overwrite") == "true") { $overwrite = true; } if ($parent->isAllowed("create")) { $intendedPath = $parent->getFullPath() . "/" . $objectKey; if ($overwrite) { $object = Object::getByPath($intendedPath); if (!$object instanceof Object\Concrete) { //create new object $object = new $className(); } else { if ($object instanceof Object\Concrete and !$object instanceof $className) { //delete the old object it is of a different class $object->delete(); $object = new $className(); } else { if ($object instanceof Object\Folder) { //delete the folder $object->delete(); $object = new $className(); } else { //use the existing object } } } } else { $counter = 1; while (Object::getByPath($intendedPath) != null) { $objectKey .= "_" . $counter; $intendedPath = $parent->getFullPath() . "/" . $objectKey; $counter++; } $object = new $className(); } $object->setClassId($this->getParam("classId")); $object->setClassName($this->getParam("className")); $object->setParentId($this->getParam("parentId")); $object->setKey($objectKey); $object->setCreationDate(time()); $object->setUserOwner($this->getUser()->getId()); $object->setUserModification($this->getUser()->getId()); if (in_array($data[$mapping["type"]], ["object", "variant"])) { $object->setType($data[$mapping["type"]]); } else { $object->setType("object"); } if ($data[$mapping["published"]] === "1") { $object->setPublished(true); } else { $object->setPublished(false); } foreach ($class->getFieldDefinitions() as $key => $field) { $value = $data[$mapping[$key]]; if (array_key_exists($key, $mapping) and $value != null) { // data mapping $value = $field->getFromCsvImport($value); if ($value !== null) { $object->setValue($key, $value); } } } try { $object->save(); $this->_helper->json(array("success" => true)); } catch (\Exception $e) { $this->_helper->json(array("success" => false, "message" => $object->getKey() . " - " . $e->getMessage())); } } $this->_helper->json(array("success" => $success)); }
/** * Imports translations from a csv file * The CSV file has to have the same format as an Pimcore translation-export-file * * @static * @param $file - path to the csv file * @param bool $replaceExistingTranslations * @throws \Exception */ public static function importTranslationsFromFile($file, $replaceExistingTranslations = true, $languages = null) { $delta = []; if (is_readable($file)) { if (!$languages || empty($languages) || !is_array($languages)) { $languages = Tool::getValidLanguages(); } //read import data $tmpData = file_get_contents($file); //replace magic excel bytes $tmpData = str_replace("", "", $tmpData); //convert to utf-8 if needed $tmpData = Tool\Text::convertToUTF8($tmpData); //store data for further usage $importFile = PIMCORE_SYSTEM_TEMP_DIRECTORY . "/import_translations"; File::put($importFile, $tmpData); $importFileOriginal = PIMCORE_SYSTEM_TEMP_DIRECTORY . "/import_translations_original"; File::put($importFileOriginal, $tmpData); // determine csv type $dialect = Tool\Admin::determineCsvDialect(PIMCORE_SYSTEM_TEMP_DIRECTORY . "/import_translations_original"); //read data if (($handle = fopen(PIMCORE_SYSTEM_TEMP_DIRECTORY . "/import_translations", "r")) !== false) { while (($rowData = fgetcsv($handle, 0, $dialect->delimiter, $dialect->quotechar, $dialect->escapechar)) !== false) { $data[] = $rowData; } fclose($handle); } //process translations if (is_array($data) and count($data) > 1) { $keys = $data[0]; // remove wrong quotes in some export/import constellations $keys = array_map(function ($value) { return trim($value, '""'); }, $keys); $data = array_slice($data, 1); foreach ($data as $row) { $keyValueArray = []; for ($counter = 0; $counter < count($row); $counter++) { $rd = str_replace(""", '"', $row[$counter]); $keyValueArray[$keys[$counter]] = $rd; } $textKey = $keyValueArray["key"]; if ($textKey) { $t = static::getByKey($textKey, true); $dirty = false; foreach ($keyValueArray as $key => $value) { if (in_array($key, $languages)) { $currentTranslation = $t->getTranslation($key); if ($replaceExistingTranslations) { $t->addTranslation($key, $value); if ($currentTranslation != $value) { $dirty = true; } } else { if (!$t->getTranslation($key)) { $t->addTranslation($key, $value); if ($currentTranslation != $value) { $dirty = true; } } elseif ($t->getTranslation($key) != $value && $value) { $delta[] = ["lg" => $key, "key" => $textKey, "text" => $t->getTranslation($key), "csv" => $value]; } } } } if ($dirty) { if ($keyValueArray['creationDate']) { $t->setCreationDate($keyValueArray['creationDate']); } $t->setModificationDate(time()); //ignore modificationDate from file $t->save(); } } } Model\Translation\AbstractTranslation::clearDependentCache(); } else { throw new \Exception("less than 2 rows of data - nothing to import"); } } else { throw new \Exception("{$file} is not readable"); } return $delta; }