public function onCreate($strTable, $insertID, $arrSet, \DataContainer $dc) { if (($objModel = SubmissionArchiveModel::findByPk($insertID)) === null) { return; } if (($uuid = Submissions::getDefaultAttachmentSRC()) !== null && \Validator::isUuid($uuid)) { $objModel->attachmentUploadFolder = class_exists('Contao\\StringUtil') ? \StringUtil::uuidToBin($uuid) : \String::uuidToBin($uuid); } $objModel->save(); }
public static function findByUuidAndPidAndUrl($strUuid, $intPid, $strUrl, array $arrOptions = array()) { $t = static::$strTable; // Convert UUIDs to binary if (\Validator::isStringUuid($strUuid)) { $strUuid = \StringUtil::uuidToBin($strUuid); } $arrColumns = array("{$t}.uuid=UNHEX(?) AND {$t}.pid=? AND {$t}.url=?"); return static::findBy($arrColumns, array(bin2hex($strUuid), $intPid, $strUrl), $arrOptions); }
/** * Import images and other media file for products * * @return string */ public function generate() { $objTree = new \FileTree(\FileTree::getAttributesFromDca($GLOBALS['TL_DCA']['tl_iso_product']['fields']['source'], 'source', null, 'source', 'tl_iso_product')); // Import assets if (\Input::post('FORM_SUBMIT') == 'tl_iso_product_import' && \Input::post('source') != '') { $objFolder = \FilesModel::findByUuid(\StringUtil::uuidToBin(\Input::post('source'))); if (null !== $objFolder) { $this->importFromPath($objFolder->path); } } // Return form return ' <div id="tl_buttons"> <a href="' . ampersand(str_replace('&key=import', '', \Environment::get('request'))) . '" class="header_back" title="' . specialchars($GLOBALS['TL_LANG']['MSC']['backBT']) . '">' . $GLOBALS['TL_LANG']['MSC']['backBT'] . '</a> </div> <h2 class="sub_headline">' . $GLOBALS['TL_LANG']['tl_iso_product']['import'][1] . '</h2> <div class="tl_message"><div class="tl_info">' . $GLOBALS['TL_LANG']['tl_iso_product']['importAssetsDescr'] . '</div></div> ' . \Message::generate() . ' <form action="' . ampersand(\Environment::get('request'), true) . '" id="tl_iso_product_import" class="tl_form" method="post"> <div class="tl_formbody_edit iso_importassets"> <input type="hidden" name="FORM_SUBMIT" value="tl_iso_product_import"> <input type="hidden" name="REQUEST_TOKEN" value="' . REQUEST_TOKEN . '"> <div class="tl_tbox block"> <h3><label for="source">' . $GLOBALS['TL_LANG']['tl_iso_product']['source'][0] . '</label></h3> ' . $objTree->generate() . (strlen($GLOBALS['TL_LANG']['tl_iso_product']['source'][1]) ? ' <p class="tl_help">' . $GLOBALS['TL_LANG']['tl_iso_product']['source'][1] . '</p>' : '') . ' </div> </div> <div class="tl_formbody_submit"> <div class="tl_submit_container"> <input type="submit" name="save" id="save" class="tl_submit" alt="import product assets" accesskey="s" value="' . specialchars($GLOBALS['TL_LANG']['tl_iso_product']['import'][0]) . '"> </div> </div> </form>'; }
/** * Return an array if the "multiple" attribute is set * * @param mixed $varInput * * @return mixed */ protected function validator($varInput) { // Store the order value if ($this->orderField != '') { $arrNew = array_map('StringUtil::uuidToBin', explode(',', \Input::post($this->strOrderName))); // Only proceed if the value has changed if ($arrNew !== $this->{$this->orderField}) { $this->Database->prepare("UPDATE {$this->strTable} SET tstamp=?, {$this->orderField}=? WHERE id=?")->execute(time(), serialize($arrNew), $this->activeRecord->id); $this->objDca->createNewVersion = true; // see #6285 } } // Return the value as usual if ($varInput == '') { if ($this->mandatory) { $this->addError(sprintf($GLOBALS['TL_LANG']['ERR']['mandatory'], $this->strLabel)); } return ''; } elseif (strpos($varInput, ',') === false) { $varInput = \StringUtil::uuidToBin($varInput); return $this->multiple ? array($varInput) : $varInput; } else { $arrValue = array_filter(explode(',', $varInput)); return $this->multiple ? array_map('StringUtil::uuidToBin', $arrValue) : \StringUtil::uuidToBin($arrValue[0]); } }
/** * Run the controller and parse the template */ public function run() { /** @var \BackendTemplate|object $objTemplate */ $objTemplate = new \BackendTemplate('be_picker'); $objTemplate->main = ''; // Ajax request if ($_POST && \Environment::get('isAjaxRequest')) { $this->objAjax = new \Ajax(\Input::post('action')); $this->objAjax->executePreActions(); } $strTable = \Input::get('table'); $strField = \Input::get('field'); // Define the current ID define('CURRENT_ID', \Input::get('table') ? $this->Session->get('CURRENT_ID') : \Input::get('id')); $this->loadDataContainer($strTable); $strDriver = 'DC_' . $GLOBALS['TL_DCA'][$strTable]['config']['dataContainer']; $objDca = new $strDriver($strTable); $objDca->field = $strField; // Set the active record if ($this->Database->tableExists($strTable)) { /** @var \Model $strModel */ $strModel = \Model::getClassFromTable($strTable); if (class_exists($strModel)) { $objModel = $strModel::findByPk(\Input::get('id')); if ($objModel !== null) { $objDca->activeRecord = $objModel; } } } // AJAX request if ($_POST && \Environment::get('isAjaxRequest')) { $this->objAjax->executePostActions($objDca); } $this->Session->set('filePickerRef', \Environment::get('request')); $arrValues = array_filter(explode(',', \Input::get('value'))); // Convert UUIDs to binary foreach ($arrValues as $k => $v) { // Can be a UUID or a path if (\Validator::isStringUuid($v)) { $arrValues[$k] = \StringUtil::uuidToBin($v); } } // Call the load_callback if (is_array($GLOBALS['TL_DCA'][$strTable]['fields'][$strField]['load_callback'])) { foreach ($GLOBALS['TL_DCA'][$strTable]['fields'][$strField]['load_callback'] as $callback) { if (is_array($callback)) { $this->import($callback[0]); $arrValues = $this->{$callback[0]}->{$callback[1]}($arrValues, $objDca); } elseif (is_callable($callback)) { $arrValues = $callback($arrValues, $objDca); } } } /** @var \FileSelector $strClass */ $strClass = $GLOBALS['BE_FFL']['fileSelector']; /** @var \FileSelector $objFileTree */ $objFileTree = new $strClass($strClass::getAttributesFromDca($GLOBALS['TL_DCA'][$strTable]['fields'][$strField], $strField, $arrValues, $strField, $strTable, $objDca)); $objTemplate->main = $objFileTree->generate(); $objTemplate->theme = \Backend::getTheme(); $objTemplate->base = \Environment::get('base'); $objTemplate->language = $GLOBALS['TL_LANGUAGE']; $objTemplate->title = specialchars($GLOBALS['TL_LANG']['MSC']['filepicker']); $objTemplate->charset = \Config::get('characterSet'); $objTemplate->addSearch = false; $objTemplate->search = $GLOBALS['TL_LANG']['MSC']['search']; $objTemplate->action = ampersand(\Environment::get('request')); $objTemplate->value = $this->Session->get('file_selector_search'); $objTemplate->manager = $GLOBALS['TL_LANG']['MSC']['fileManager']; $objTemplate->managerHref = 'contao/main.php?do=files&popup=1'; $objTemplate->breadcrumb = $GLOBALS['TL_DCA']['tl_files']['list']['sorting']['breadcrumb']; if (\Input::get('switch')) { $objTemplate->switch = $GLOBALS['TL_LANG']['MSC']['pagePicker']; $objTemplate->switchHref = str_replace('contao/file.php', 'contao/page.php', ampersand(\Environment::get('request'))); } \Config::set('debugMode', false); $objTemplate->output(); }
/** * Find multiple files by UUID and a list of extensions * * @param array $arrUuids An array of file UUIDs * @param array $arrExtensions An array of file extensions * @param array $arrOptions An optional options array * * @return Model\Collection|FilesModel[]|FilesModel|null A collection of models or null of there are no matching files */ public static function findMultipleByUuidsAndExtensions($arrUuids, $arrExtensions, array $arrOptions = array()) { if (!is_array($arrUuids) || empty($arrUuids) || !is_array($arrExtensions) || empty($arrExtensions)) { return null; } foreach ($arrExtensions as $k => $v) { if (!preg_match('/^[a-z0-9]{2,5}$/i', $v)) { unset($arrExtensions[$k]); } } $t = static::$strTable; foreach ($arrUuids as $k => $v) { // Convert UUIDs to binary if (\Validator::isStringUuid($v)) { $v = \StringUtil::uuidToBin($v); } $arrUuids[$k] = "UNHEX('" . bin2hex($v) . "')"; } if (!isset($arrOptions['order'])) { $arrOptions['order'] = "{$t}.uuid!=" . implode(", {$t}.uuid!=", $arrUuids); } return static::findBy(array("{$t}.uuid IN(" . implode(",", $arrUuids) . ") AND {$t}.extension IN('" . implode("','", $arrExtensions) . "')"), null, $arrOptions); }
/** * Get an image object from id/uuid and an optional size configuration * * @param int|string $id ID, UUID string or binary * @param string|array $size [width, height, mode] optionally serialized * @param int $maxSize Gets passed to addImageToTemplate as $intMaxWidth * @param string $lightboxId Gets passed to addImageToTemplate as $strLightboxId * @param array $item Gets merged and passed to addImageToTemplate as $arrItem * @return object Image object (similar as addImageToTemplate) */ public function getImageObject($id, $size = null, $maxSize = null, $lightboxId = null, $item = array()) { global $objPage; if (!$id) { return null; } if (strlen($id) === 36) { $id = \StringUtil::uuidToBin($id); } if (strlen($id) === 16) { $image = \FilesModel::findByUuid($id); } else { $image = \FilesModel::findByPk($id); } if (!$image) { return null; } try { $file = new \File($image->path, true); if (!$file->exists()) { return null; } } catch (\Exception $e) { return null; } $imageMeta = $this->getMetaData($image->meta, $objPage->language); if (is_string($size) && trim($size)) { $size = deserialize($size); } if (!is_array($size)) { $size = array(); } $size[0] = isset($size[0]) ? $size[0] : 0; $size[1] = isset($size[1]) ? $size[1] : 0; $size[2] = isset($size[2]) ? $size[2] : 'crop'; $image = array('id' => $image->id, 'uuid' => isset($image->uuid) ? $image->uuid : null, 'name' => $file->basename, 'singleSRC' => $image->path, 'size' => serialize($size), 'alt' => $imageMeta['title'], 'imageUrl' => $imageMeta['link'], 'caption' => $imageMeta['caption']); $image = array_merge($image, $item); $imageObject = new \FrontendTemplate('rsce_image_object'); $this->addImageToTemplate($imageObject, $image, $maxSize, $lightboxId); $imageObject = (object) $imageObject->getData(); if (empty($imageObject->src)) { $imageObject->src = $imageObject->singleSRC; } return $imageObject; }
/** * Move temp files. If DBAFS support is enabled add entries to the dbafs. * * @CtoCommunication Enable * * @param array $arrFileList List with files for moving. * * @param boolean $blnIsDbafs Flag if we have to change the dbafs system. * * @return array The list with some more information about the moving of the file. */ public function moveTempFile($arrFileList, $blnIsDbafs) { foreach ($arrFileList as $key => $value) { try { $blnMovedFile = false; $strTempFile = $this->objSyncCtoHelper->standardizePath($GLOBALS['SYC_PATH']['tmp'], "sync", $value["path"]); // Check if the tmp file exists. if (!file_exists(TL_ROOT . DIRECTORY_SEPARATOR . $strTempFile)) { $arrFileList[$key]['saved'] = false; $arrFileList[$key]['error'] = sprintf($GLOBALS['TL_LANG']['ERR']['unknown_file'], $strTempFile); $arrFileList[$key]['skipreasons'] = $GLOBALS['TL_LANG']['ERR']['missing_file_information']; continue; } // Generate the folder if not already there. $strFolderPath = dirname($value["path"]); if ($strFolderPath != ".") { $objFolder = new Folder($strFolderPath); unset($objFolder); } // Build folders. $strFileSource = $this->objSyncCtoHelper->standardizePath($GLOBALS['SYC_PATH']['tmp'], "sync", $value["path"]); $strFileDestination = $this->objSyncCtoHelper->standardizePath($value["path"]); // DBAFS support. Check if we have the file already in the locale dbafs system. if ($blnIsDbafs) { // Get the information from the dbafs. /** @var \Model $objLocaleData */ $objLocaleData = \FilesModel::findByPath($strFileDestination); // If we have no entry in the dbafs just overwrite the current file and add the entry to the dbafs. if ($objLocaleData == null) { // Move file. $blnMovedFile = $this->objFiles->copy($strFileSource, $strFileDestination); // If success add file to the database. if ($blnMovedFile) { // First add it to the dbafs. $objLocaleData = \Dbafs::addResource($strFileDestination); // PHP 7 compatibility // See #309 (https://github.com/contao/core-bundle/issues/309) if (version_compare(VERSION . '.' . BUILD, '3.5.5', '>=')) { $objLocaleData->uuid = \StringUtil::uuidToBin($value['tl_files']['uuid']); } else { $objLocaleData->uuid = \String::uuidToBin($value['tl_files']['uuid']); } $objLocaleData->meta = $value['tl_files']['meta']; $objLocaleData->save(); // Add a status report for debugging and co. $arrFileList[$key]['dbafs']['msg'] = 'Moved file and add to database.'; $arrFileList[$key]['dbafs']['state'] = SyncCtoEnum::DBAFS_CREATE; } } else { // PHP 7 compatibility // See #309 (https://github.com/contao/core-bundle/issues/309) if (version_compare(VERSION . '.' . BUILD, '3.5.5', '>=')) { // Get the readable UUID for the work. $strLocaleUUID = \StringUtil::binToUuid($objLocaleData->uuid); } else { // Get the readable UUID for the work. $strLocaleUUID = \String::binToUuid($objLocaleData->uuid); } // Okay it seems we have already a file with this values. if ($strLocaleUUID == $value['tl_files']['uuid']) { // Move file. $blnMovedFile = $this->objFiles->copy($strFileSource, $strFileDestination); // If success add file to the database. if ($blnMovedFile) { $objLocaleData->hash = $value['checksum']; $objLocaleData->meta = $value['tl_files']['meta']; $objLocaleData->save(); // Add a status report for debugging and co. $arrFileList[$key]['dbafs']['msg'] = 'UUID same no problem found. Update database with new hash.'; $arrFileList[$key]['dbafs']['state'] = SyncCtoEnum::DBAFS_SAME; } } elseif ($strLocaleUUID != $value['tl_files']['uuid']) { // Get information about the current file information. $arrDestinationInformation = pathinfo($strFileDestination); // Try to rename it to _1 or _2 and so on. $strNewDestinationName = null; $intFileNumber = 1; for ($i = 1; $i < 100; $i++) { $strNewDestinationName = sprintf('%s' . DIRECTORY_SEPARATOR . '%s_%s.%s', $arrDestinationInformation['dirname'], $arrDestinationInformation['filename'], $i, $arrDestinationInformation['extension']); if (!file_exists(TL_ROOT . DIRECTORY_SEPARATOR . $strNewDestinationName)) { $intFileNumber = $i; break; } } // Move the current file to another name, that we have space for the new one. $this->objFiles->copy($strFileDestination, $strNewDestinationName); $objRenamedLocaleData = \Dbafs::moveResource($strFileDestination, $strNewDestinationName); // Move the tmp file. $blnMovedFile = $this->objFiles->copy($strFileSource, $strFileDestination); // If success add file to the database. if ($blnMovedFile) { // First add it to the dbafs. $objLocaleData = \Dbafs::addResource($strFileDestination); // PHP 7 compatibility // See #309 (https://github.com/contao/core-bundle/issues/309) if (version_compare(VERSION . '.' . BUILD, '3.5.5', '>=')) { $objLocaleData->uuid = \StringUtil::uuidToBin($value['tl_files']['uuid']); } else { $objLocaleData->uuid = \String::uuidToBin($value['tl_files']['uuid']); } $objLocaleData->meta = $value['tl_files']['meta']; $objLocaleData->save(); // Add a status report for debugging and co. $arrFileList[$key]['dbafs']['msg'] = $GLOBALS['TL_LANG']['ERR']['dbafs_uuid_conflict']; $arrFileList[$key]['dbafs']['error'] = sprintf($GLOBALS['TL_LANG']['ERR']['dbafs_uuid_conflict_rename'], $intFileNumber); $arrFileList[$key]['dbafs']['rename'] = $strNewDestinationName; $arrFileList[$key]['dbafs']['state'] = SyncCtoEnum::DBAFS_CONFLICT; } } } } else { $blnMovedFile = $this->objFiles->copy($strFileSource, $strFileDestination); } // Check the state at moving and add a msg to the return array. if ($blnMovedFile) { $arrFileList[$key]['saved'] = true; $arrFileList[$key]['transmission'] = SyncCtoEnum::FILETRANS_MOVED; } else { $arrFileList[$key]['saved'] = false; $arrFileList[$key]['error'] = sprintf($GLOBALS['TL_LANG']['ERR']['cant_move_file'], $strFileSource, $strFileDestination); $arrFileList[$key]['transmission'] = SyncCtoEnum::FILETRANS_SKIPPED; $arrFileList[$key]['skipreason'] = $GLOBALS['TL_LANG']['ERR']['cant_move_files']; } } catch (Exception $e) { $arrFileList[$key]['saved'] = false; $arrFileList[$key]['error'] = sprintf('Can not move file - %s. Exception message: %s', $value["path"], $e->getMessage()); $arrFileList[$key]['transmission'] = SyncCtoEnum::FILETRANS_SKIPPED; $arrFileList[$key]['skipreason'] = $GLOBALS['TL_LANG']['ERR']['cant_move_files']; } } return $arrFileList; }
/** * Dispatch an AJAX request * @param string * @param \DataContainer */ public function dispatchAjaxRequest($strAction, \DataContainer $dc) { switch ($strAction) { // Upload the file /** @noinspection PhpMissingBreakStatementInspection */ case 'fineuploader_upload': $arrData['strTable'] = $dc->table; $arrData['id'] = $dc->id; // @todo what was $this->strAjaxName for? $arrData['name'] = \Input::post('name'); /** @var FineUploaderWidget $objWidget */ $objWidget = new $GLOBALS['BE_FFL']['fineUploader']($arrData, $dc); $strFile = $objWidget->validateUpload(); if ($objWidget->hasErrors()) { $arrResponse = array('success' => false, 'error' => $objWidget->getErrorAsString(), 'preventRetry' => true); } else { $arrResponse = array('success' => true, 'file' => $strFile); } $response = new \Haste\Http\Response\JsonResponse($arrResponse); $response->send(); // no break, response exits script // Reload the widget // no break, response exits script // Reload the widget case 'fineuploader_reload': $intId = \Input::get('id'); $strField = $dc->field = \Input::post('name'); // Handle the keys in "edit multiple" mode if (\Input::get('act') == 'editAll') { $intId = preg_replace('/.*_([0-9a-zA-Z]+)$/', '$1', $strField); $strField = preg_replace('/(.*)_[0-9a-zA-Z]+$/', '$1', $strField); } // The field does not exist if (!isset($GLOBALS['TL_DCA'][$dc->table]['fields'][$strField])) { System::log('Field "' . $strField . '" does not exist in DCA "' . $dc->table . '"', __METHOD__, TL_ERROR); header('HTTP/1.1 400 Bad Request'); die('Bad Request'); } $objRow = null; $varValue = null; // Load the value if ($GLOBALS['TL_DCA'][$dc->table]['config']['dataContainer'] == 'File') { $varValue = $GLOBALS['TL_CONFIG'][$strField]; } elseif ($intId > 0 && Database::getInstance()->tableExists($dc->table)) { $objRow = Database::getInstance()->prepare("SELECT * FROM " . $dc->table . " WHERE id=?")->execute($intId); // The record does not exist if ($objRow->numRows < 1) { System::log('A record with the ID "' . $intId . '" does not exist in table "' . $dc->table . '"', __METHOD__, TL_ERROR); header('HTTP/1.1 400 Bad Request'); die('Bad Request'); } $varValue = $objRow->{$strField}; $dc->activeRecord = $objRow; } // Call the load_callback if (is_array($GLOBALS['TL_DCA'][$dc->table]['fields'][$strField]['load_callback'])) { foreach ($GLOBALS['TL_DCA'][$dc->table]['fields'][$strField]['load_callback'] as $callback) { if (is_array($callback)) { $varValue = System::importStatic($callback[0])->{$callback}[1]($varValue, $dc); } elseif (is_callable($callback)) { $varValue = $callback($varValue, $dc); } } } $varValue = \Input::post('value', true); // Convert the selected values if ($varValue != '') { $varValue = trimsplit(',', $varValue); foreach ($varValue as $k => $v) { if (\Validator::isUuid($v) && !is_file(TL_ROOT . '/' . $v)) { $varValue[$k] = \StringUtil::uuidToBin($v); } } $varValue = serialize($varValue); } // Build the attributes based on the "eval" array $arrAttribs = $GLOBALS['TL_DCA'][$dc->table]['fields'][$strField]['eval']; $arrAttribs['id'] = $dc->field; $arrAttribs['name'] = $dc->field; $arrAttribs['value'] = $varValue; $arrAttribs['strTable'] = $dc->table; $arrAttribs['strField'] = $strField; $arrAttribs['activeRecord'] = $dc->activeRecord; $objWidget = new $GLOBALS['BE_FFL']['fineUploader']($arrAttribs); $response = new \Haste\Http\Response\HtmlResponse($objWidget->parse()); $response->send(); } }
/** * Field load callback * * Finds the current value for the field * * @param string $value Current value * @param \DataContainer $dc Data container * @return string Current value for the field */ public function loadCallback($value, $dc) { if ($value !== null) { return $value; } $value = $this->getNestedValue($dc->field); if ($value === null && isset($GLOBALS['TL_DCA'][$dc->table]['fields'][$dc->field]['default'])) { $value = $GLOBALS['TL_DCA'][$dc->table]['fields'][$dc->field]['default']; } if (version_compare(VERSION, '3.2', '>=') && $value && ($GLOBALS['TL_DCA'][$dc->table]['fields'][$dc->field]['inputType'] === 'fileTree' || $GLOBALS['TL_DCA'][$dc->table]['fields'][$dc->field]['inputType'] === 'fineUploader')) { // Multiple files if (substr($value, 0, 2) === 'a:') { $value = serialize(array_map(function ($value) { if (strlen($value) === 36) { $value = \StringUtil::uuidToBin($value); } else { if (is_numeric($value) && ($file = \FilesModel::findByPk($value))) { // Convert 3.1 format into 3.2 format $value = $file->uuid; } } return $value; }, deserialize($value))); } else { if (strlen($value) === 36) { $value = \StringUtil::uuidToBin($value); } else { if (is_numeric($value) && ($file = \FilesModel::findByPk($value))) { // Convert 3.1 format into 3.2 format $value = $file->uuid; } } } } return $value; }
/** * Validate a single file. * * @param mixed * @param string * @return mixed */ protected function validatorSingle($varFile, $strDestination) { // Move the temporary file if (!\Validator::isStringUuid($varFile) && is_file(TL_ROOT . '/' . $varFile)) { $varFile = $this->moveTemporaryFile($varFile, $strDestination); } // Convert uuid to binary format if (\Validator::isStringUuid($varFile)) { $varFile = \StringUtil::uuidToBin($varFile); } return $varFile; }
public function validator($varInput) { if ($varInput == '' || $varInput == '[]') { $varInput = '[]'; } $arrFiles = json_decode($varInput); $arrDeleted = json_decode($this->getPost('deleted_' . $this->strName)); $blnEmpty = false; if (is_array($arrFiles) && is_array($arrDeleted)) { $blnEmpty = empty(array_diff($arrFiles, $arrDeleted)); } if ($this->mandatory && $blnEmpty) { if ($this->strLabel == '') { $this->addError($GLOBALS['TL_LANG']['ERR']['mdtryNoLabel']); } else { $this->addError(sprintf($GLOBALS['TL_LANG']['ERR']['mandatory'], $this->strLabel)); } // do no delete last file if mandatory return; } $this->deleteScheduledFiles($arrDeleted); if (is_array($arrFiles)) { foreach ($arrFiles as $k => $v) { if (!\Validator::isUuid($v)) { $this->addError($GLOBALS['TL_LANG']['ERR']['invalidUuid']); return; } // cleanup non existing files on save if (($objFile = Files::getFileFromUuid($v)) === null || !$objFile->exists()) { unset($arrFiles[$k]); continue; } $arrFiles[$k] = \StringUtil::uuidToBin($v); } } else { if (!\Validator::isUuid($arrFiles)) { $this->addError($GLOBALS['TL_LANG']['ERR']['invalidUuid']); return; } // cleanup non existing files on save if (($objFile = Files::getFileFromUuid($arrFiles)) === null || !$objFile->exists()) { return; } $arrFiles = \StringUtil::uuidToBin($arrFiles); } return $arrFiles; }
public function onsubmitCallback(\DataContainer $dc) { if ($dc->id && substr($dc->id, -5) === '.base') { $type = 'html'; if (substr($dc->id, -9, 4) === '.css') { $type = 'css'; } list($data, $template) = static::parseBaseFile(file_get_contents(TL_ROOT . '/' . $dc->id), $type); // Check if parsing the file was successful if (empty($data) || empty($data['fileHash']) || empty($data['templateVars']) || !trim($template)) { $this->redirect('contao/main.php?act=error'); return; } if (\Input::post('variations') && substr(\Input::post('variations'), 0, 9) === 'variation') { $variation = (int) substr(\Input::post('variations'), 9); foreach ($data['templateVars'] as $key => $var) { if (isset($data['templateVars'][$key]['defaultValues'][$variation])) { $data['templateVars'][$key]['value'] = $data['templateVars'][$key]['defaultValues'][$variation]; } elseif (isset($data['templateVars'][$key]['defaultValues'][0])) { $data['templateVars'][$key]['value'] = $data['templateVars'][$key]['defaultValues'][0]; } } } else { foreach ($data['templateVars'] as $key => $var) { if (\Input::post($key) === null) { continue; } $value = \Input::post($key); if ($data['templateVars'][$key]['type'] === 'color') { if (strlen($value) === 6) { $value = '#' . strtolower($value); } else { $value = $data['templateVars'][$key]['value']; } } elseif ($data['templateVars'][$key]['type'] === 'boolean') { $value = (bool) $value; } elseif ($data['templateVars'][$key]['type'] === 'image') { $file = null; if (trim($value)) { if (version_compare(VERSION, '3.2', '<')) { $file = \FilesModel::findByPk($value); } else { $file = \FilesModel::findByUuid(\StringUtil::uuidToBin($value)); } } if ($file) { $value = substr($file->path, strlen($GLOBALS['TL_CONFIG']['uploadPath']) + 1); } else { $value = ''; } } elseif ($data['templateVars'][$key]['type'] === 'background-image') { $file = null; if (trim($value)) { if (version_compare(VERSION, '3.2', '<')) { $file = \FilesModel::findByPk($value); } else { $file = \FilesModel::findByUuid(\StringUtil::uuidToBin($value)); } } if ($file) { $value = 'url("' . static::getRelativePath(dirname($dc->id), $file->path) . '")'; } else { $value = 'none'; } } elseif ($data['templateVars'][$key]['type'] === 'length') { if (is_array($value)) { $value['value'] = empty($value['value']) ? '0' : $value['value']; $value['unit'] = empty($value['unit']) ? '' : $value['unit']; $value = trim($value['value']) . trim($value['unit']); } else { if (is_string($value) && trim($value)) { $value = trim($value); } else { $value = '0'; } } } elseif ($data['templateVars'][$key]['type'] === 'set') { if (count($value) === 1) { $emptyValues = true; foreach ($value[0] as $setValue) { if ($setValue) { $emptyValues = false; break; } } if ($emptyValues) { $value = array(); } } } $data['templateVars'][$key]['value'] = $value; } } $rendered = $this->renderTemplate($template, $data, $type); if (!$rendered) { $this->log('Parse error in Theme Assistant template "' . $dc->id . '"', 'MadeYourDay\\Contao\\ThemeAssistant::onsubmitCallback', TL_ERROR); return $this->redirect('contao/main.php?act=error'); } file_put_contents(TL_ROOT . '/' . substr($dc->id, 0, -5), $rendered); $data['fileHash'] = md5_file(TL_ROOT . '/' . substr($dc->id, 0, -5)); if ($type === 'css') { $template = "/*" . json_encode($data) . "*/\n" . $template; } else { $template = "<!--" . json_encode($data) . "-->\n" . $template; } file_put_contents(TL_ROOT . '/' . $dc->id, $template); if (substr($dc->id, 0, strlen($GLOBALS['TL_CONFIG']['uploadPath'])) === $GLOBALS['TL_CONFIG']['uploadPath']) { $file = new \File($dc->id); $fileRecord = \FilesModel::findByPath($dc->id); $fileRecord->hash = $file->hash; $fileRecord->save(); } } else { $this->redirect('contao/main.php?act=error'); } }