Пример #1
0
 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));
 }
Пример #2
0
 /**
  * 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("&quot;", '"', $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;
 }