public function generateAddActions($arrData, $id, Watchlist $objWatchlist) { global $objPage; if ($objPage === null) { return; } if (\Validator::isUuid($id)) { $objFile = \FilesModel::findByUuid($id); } else { $objFile = \FilesModel::findBy('path', $id); } $objItem = new WatchlistItemModel(); $objItem->pid = Watchlist::getInstance()->getId(); $objItem->uuid = $objFile->uuid; $objItem->pageID = $objPage->id; $objItem->cid = $arrData['id']; $objItem->type = $arrData['type']; $objT = new \FrontendTemplate('watchlist_add_actions'); $objT->addHref = ampersand(\Controller::generateFrontendUrl($objPage->row()) . '?act=' . WATCHLIST_ACT_ADD . '&cid=' . $objItem->cid . '&type=' . $objItem->type . '&id=' . $strUuid . '&title=' . urlencode($objItem->getTitle())); $objT->addTitle = $GLOBALS['TL_LANG']['WATCHLIST']['addTitle']; $objT->addLink = $GLOBALS['TL_LANG']['WATCHLIST']['addLink']; $objT->active = $objWatchlist->isInList($strUuid); $objT->id = $strUuid; return $objT->parse(); }
public function getFileCredits() { $arrOptions = array(); $objFiles = \FilesModel::findBy(array('copyright != ""'), ""); if ($objFiles === null) { return $arrOptions; } $maxLength = 45; while ($objFiles->next()) { $strPath = $objFiles->path; $strLength = strlen($strPath); if ($strLength > $maxLength) { $strPathLeft = substr($strPath, 0, ceil($maxLength / 7)); $strPathRight = substr($strPath, ceil($strLength - $maxLength / (7 / 5)), $strLength); $strPath = $strPathLeft . '…' . $strPathRight; } $arrOptions[$objFiles->id] = $strPath; } return $arrOptions; }
/** * Get array of files for this download (could be multiple for folder selection) * @return array */ public function getFiles() { $objFile = $this->getRelated('singleSRC'); if (null === $objFile) { return array(); } if ($objFile->type == 'folder') { $arrFiles = array(); $objFiles = \FilesModel::findBy(array("pid=?", "type='file'"), array($objFile->id)); if (null !== $objFiles) { while ($objFiles->next()) { $arrFiles[] = $objFiles->current(); } } return $arrFiles; } elseif (is_file(TL_ROOT . '/' . $objFile->path)) { return array($objFile); } return array(); }
/** * Synchronize the file system with the database * * @return string The path to the synchronization log file * * @throws \Exception If a parent ID entry is missing */ public static function syncFiles() { // Try to raise the limits (see #7035) @ini_set('memory_limit', -1); @ini_set('max_execution_time', 0); $objDatabase = \Database::getInstance(); // Lock the files table $objDatabase->lockTables(array('tl_files')); // Reset the "found" flag $objDatabase->query("UPDATE tl_files SET found=''"); // Get a filtered list of all files $objFiles = new \RecursiveIteratorIterator(new \Dbafs\Filter(new \RecursiveDirectoryIterator(TL_ROOT . '/' . \Config::get('uploadPath'), \FilesystemIterator::UNIX_PATHS | \FilesystemIterator::FOLLOW_SYMLINKS | \FilesystemIterator::SKIP_DOTS)), \RecursiveIteratorIterator::SELF_FIRST); $strLog = 'system/tmp/' . md5(uniqid(mt_rand(), true)); // Open the log file $objLog = new \File($strLog, true); $objLog->truncate(); $arrModels = array(); // Create or update the database entries foreach ($objFiles as $objFile) { $strRelpath = str_replace(TL_ROOT . '/', '', $objFile->getPathname()); // Get all subfiles in a single query if ($objFile->isDir()) { $objSubfiles = \FilesModel::findMultipleFilesByFolder($strRelpath); if ($objSubfiles !== null) { while ($objSubfiles->next()) { $arrModels[$objSubfiles->path] = $objSubfiles->current(); } } } // Get the model if (isset($arrModels[$strRelpath])) { $objModel = $arrModels[$strRelpath]; } else { $objModel = \FilesModel::findByPath($strRelpath); } if ($objModel === null) { // Add a log entry $objLog->append("[Added] {$strRelpath}"); // Get the parent folder $strParent = dirname($strRelpath); // Get the parent ID if ($strParent == \Config::get('uploadPath')) { $strPid = null; } else { $objParent = \FilesModel::findByPath($strParent); if ($objParent === null) { throw new \Exception("No parent entry for {$strParent}"); } $strPid = $objParent->uuid; } // Create the file or folder if (is_file(TL_ROOT . '/' . $strRelpath)) { $objFile = new \File($strRelpath, true); $objModel = new \FilesModel(); $objModel->pid = $strPid; $objModel->tstamp = time(); $objModel->name = $objFile->name; $objModel->type = 'file'; $objModel->path = $objFile->path; $objModel->extension = $objFile->extension; $objModel->found = 2; $objModel->hash = $objFile->hash; $objModel->uuid = $objDatabase->getUuid(); $objModel->save(); } else { $objFolder = new \Folder($strRelpath); $objModel = new \FilesModel(); $objModel->pid = $strPid; $objModel->tstamp = time(); $objModel->name = $objFolder->name; $objModel->type = 'folder'; $objModel->path = $objFolder->path; $objModel->extension = ''; $objModel->found = 2; $objModel->hash = $objFolder->hash; $objModel->uuid = $objDatabase->getUuid(); $objModel->save(); } } else { // Check whether the MD5 hash has changed $objResource = $objFile->isDir() ? new \Folder($strRelpath) : new \File($strRelpath); $strType = $objModel->hash != $objResource->hash ? 'Changed' : 'Unchanged'; // Add a log entry $objLog->append("[{$strType}] {$strRelpath}"); // Update the record $objModel->found = 1; $objModel->hash = $objResource->hash; $objModel->save(); } } // Check for left-over entries in the DB $objFiles = \FilesModel::findByFound(''); if ($objFiles !== null) { $arrMapped = array(); $arrPidUpdate = array(); while ($objFiles->next()) { $objFound = \FilesModel::findBy(array('hash=?', 'found=2'), $objFiles->hash); if ($objFound !== null) { // Check for matching file names if the result is ambiguous (see #5644) if ($objFound->count() > 1) { while ($objFound->next()) { if ($objFound->name == $objFiles->name) { $objFound = $objFound->current(); break; } } } // If another file has been mapped already, delete the entry (see #6008) if (in_array($objFound->path, $arrMapped)) { $objLog->append("[Deleted] {$objFiles->path}"); $objFiles->delete(); continue; } $arrMapped[] = $objFound->path; // Store the PID change if ($objFiles->type == 'folder') { $arrPidUpdate[$objFound->uuid] = $objFiles->uuid; } // Add a log entry BEFORE changing the object $objLog->append("[Moved] {$objFiles->path} to {$objFound->path}"); // Update the original entry $objFiles->pid = $objFound->pid; $objFiles->tstamp = $objFound->tstamp; $objFiles->name = $objFound->name; $objFiles->type = $objFound->type; $objFiles->path = $objFound->path; $objFiles->found = 1; // Delete the newer (duplicate) entry $objFound->delete(); // Then save the modified original entry (prevents duplicate key errors) $objFiles->save(); } else { // Add a log entry BEFORE changing the object $objLog->append("[Deleted] {$objFiles->path}"); // Delete the entry if the resource has gone $objFiles->delete(); } } // Update the PID of the child records if (!empty($arrPidUpdate)) { foreach ($arrPidUpdate as $from => $to) { $objChildren = \FilesModel::findByPid($from); if ($objChildren !== null) { while ($objChildren->next()) { $objChildren->pid = $to; $objChildren->save(); } } } } } // Close the log file $objLog->close(); // Reset the found flag $objDatabase->query("UPDATE tl_files SET found=1 WHERE found=2"); // Unlock the tables $objDatabase->unlockTables(); // Return the path to the log file return $strLog; }
protected static function removeCssFileFromGroup($path, $groupId) { $objFileModel = \FilesModel::findBy('path', $path); if ($objFileModel === null) { return false; } $objExtCssFileModel = ExtCssFileModel::findBy('src', $objFileModel->uuid); if ($objExtCssFileModel === null) { return false; } $objExtCssFileModel->delete(); return true; }
/** * Synchronize the file system with the database * @return string */ public function sync() { if (!$this->blnIsDbAssisted) { return ''; } $this->arrMessages = array(); // Reset the "found" flag $this->Database->query("UPDATE tl_files SET found=''"); // Traverse the file system $this->execSync($GLOBALS['TL_CONFIG']['uploadPath']); // Check for left-over entries in the DB $objFiles = \FilesModel::findByFound(''); if ($objFiles !== null) { $arrFiles = array(); $arrFolders = array(); while ($objFiles->next()) { if ($objFiles->type == 'file') { $arrFiles[] = $objFiles->current(); } else { $arrFolders[] = $objFiles->current(); } } // Check whether a folder has moved foreach ($arrFolders as $objFolder) { $objFound = \FilesModel::findBy(array('hash=?', 'found=1'), $objFolder->hash); if ($objFound !== null) { $this->arrMessages[] = '<p class="tl_info">' . sprintf($GLOBALS['TL_LANG']['tl_files']['syncFound'], $objFolder->path, $objFound->path) . '</p>'; // Update the original entry $objFolder->pid = $objFound->pid; $objFolder->tstamp = $objFound->tstamp; $objFolder->name = $objFound->name; $objFolder->type = $objFound->type; $objFolder->path = $objFound->path; $objFolder->save(); // Update the PID of the child records $objChildren = \FilesModel::findByPid($objFound->id); if ($objChildren !== null) { while ($objChildren->next()) { $objChildren->pid = $objFolder->id; $objChildren->save(); } } // Delete the newer (duplicate) entry $objFound->delete(); } else { // Delete the entry if the folder has gone $objFolder->delete(); $this->arrMessages[] = '<p class="tl_error">' . sprintf($GLOBALS['TL_LANG']['tl_files']['syncRemoved'], $objFolder->path) . '</p>'; } } // Check whether a file has moved foreach ($arrFiles as $objFile) { $objFound = \FilesModel::findBy(array('hash=?', 'found=1'), $objFile->hash); if ($objFound !== null) { $this->arrMessages[] = '<p class="tl_info">' . sprintf($GLOBALS['TL_LANG']['tl_files']['syncFound'], $objFile->path, $objFound->path) . '</p>'; // Update the original entry $objFile->pid = $objFound->pid; $objFile->tstamp = $objFound->tstamp; $objFile->name = $objFound->name; $objFile->type = $objFound->type; $objFile->path = $objFound->path; $objFile->save(); // Delete the newer (duplicate) entry $objFound->delete(); } else { // Delete the entry if the file has gone $objFile->delete(); $this->arrMessages[] = '<p class="tl_error">' . sprintf($GLOBALS['TL_LANG']['tl_files']['syncRemoved'], $objFile->path) . '</p>'; } } } $return = ' <div id="tl_buttons"> <a href="' . $this->getReferer(true) . '" class="header_back" title="' . specialchars($GLOBALS['TL_LANG']['MSC']['backBTTitle']) . '" accesskey="b" onclick="Backend.getScrollOffset()">' . $GLOBALS['TL_LANG']['MSC']['backBT'] . '</a> </div> <h2 class="sub_headline">' . $GLOBALS['TL_LANG']['tl_files']['sync'][1] . '</h2> ' . \Message::generate() . ' <div class="tl_message nobg" style="margin-bottom:2em">'; // Add the messages foreach ($this->arrMessages as $strMessage) { $return .= "\n " . $strMessage; } $return .= ' </div> <div class="tl_submit_container"> <a href="' . $this->getReferer(true) . '" class="tl_submit" style="display:inline-block">' . $GLOBALS['TL_LANG']['MSC']['continue'] . '</a> </div> '; return $return; }
public function showAll() { $return = ''; $query = 'SELECT * FROM tl_theme ORDER BY name '; $objRowStmt = $this->Database->prepare($query); $objRow = $objRowStmt->execute(); $themeList = array(); $result = $objRow->fetchAllAssoc(); $this->import('FilesModel'); foreach ($result as $row) { $files = array(); if (version_compare(VERSION, '3.2', '<')) { $folders = \FilesModel::findMultipleByIds(deserialize($row['folders'])); } else { $folders = \FilesModel::findMultipleByUuids(deserialize($row['folders'])); } if ($folders !== null) { foreach ($folders->fetchEach('path') as $folder) { $filesResult = \FilesModel::findBy(array($this->FilesModel->getTable() . '.path LIKE ? AND extension = \'base\''), $folder . '/%'); if ($filesResult === null) { continue; } foreach ($filesResult->fetchEach('path') as $file) { if (!file_exists(TL_ROOT . '/' . substr($file, 0, -5))) { continue; } $extension = explode('.', $file); $extension = $extension[count($extension) - 2]; $files[] = array('id' => $file, 'type' => $extension === 'html5' ? 'html' : $extension, 'name' => substr($file, strlen($folder) + 1, -5)); } } } $templateFiles = scandir(TL_ROOT . '/' . $row['templates']); foreach ($templateFiles as $file) { if (substr($file, -5) === '.base' && file_exists(TL_ROOT . '/' . $row['templates'] . '/' . substr($file, 0, -5))) { $extension = explode('.', $file); $extension = $extension[count($extension) - 2]; $files[] = array('id' => $row['templates'] . '/' . $file, 'type' => $extension === 'html5' ? 'html' : $extension, 'name' => substr($file, 0, -5)); } } if (version_compare(VERSION, '3.2', '<')) { $screenshot = \FilesModel::findByPk($row['screenshot']); } else { $screenshot = \FilesModel::findByUuid($row['screenshot']); } if ($screenshot) { $screenshot = TL_FILES_URL . \Image::get($screenshot->path, 40, 30, 'center_top'); } if (count($files)) { $themeList[] = array('name' => $row['name'], 'files' => $files, 'screenshot' => $screenshot); } } if (!count($themeList)) { return '<p class="tl_empty">' . $GLOBALS['TL_LANG']['MSC']['noResult'] . '</p>'; } $return .= '<div id="tl_buttons">' . $this->generateGlobalButtons() . '</div>' . \Message::generate(true); $return .= '<div class="tl_listing_container list_view">'; $return .= '<table class="tl_listing' . ($GLOBALS['TL_DCA'][$this->strTable]['list']['label']['showColumns'] ? ' showColumns' : '') . '">'; foreach ($themeList as $key => $theme) { if ($key) { $return .= '<tr style="height: 30px;"><td colspan="2"> </td></tr>'; } $return .= '<tr><td colspan="2" class="tl_folder_tlist">'; if ($theme['screenshot']) { $return .= '<img src="' . $theme['screenshot'] . '" alt="" class="theme_preview"> '; } $return .= $theme['name'] . '</td></tr>'; $eoCount = -1; foreach ($theme['files'] as $file) { $return .= '<tr class="' . (++$eoCount % 2 == 0 ? 'even' : 'odd') . '" onmouseover="Theme.hoverRow(this,1)" onmouseout="Theme.hoverRow(this,0)">'; $return .= '<td class="tl_file_list">' . $GLOBALS['TL_LANG']['rocksolid_theme_assistant']['file_types'][$file['type']] . ' (' . $file['name'] . ')</td>'; $return .= '<td class="tl_file_list tl_right_nowrap">' . $this->generateButtons($file, $this->strTable) . '</td>'; $return .= '</tr>'; } } $return .= '</table>'; $return .= '</div>'; return $return; }
/** * Walks the list of pending folders via ToolboxFile::addPath(). * * @return void */ protected function collectFiles() { $table = \FilesModel::getTable(); $conditions = array(); $parameters = array(); if (count($this->pendingIds)) { $conditions[] = $table . '.uuid IN(' . implode(',', array_fill(0, count($this->pendingIds), 'UNHEX(?)')) . ')'; $parameters = array_map('bin2hex', $this->pendingIds); $this->pendingIds = array(); } if (count($this->pendingPaths)) { $slug = $table . '.path LIKE ?'; foreach ($this->pendingPaths as $pendingPath) { $conditions[] = $slug; $parameters[] = $pendingPath . '%'; } $this->pendingPaths = array(); } if (!count($conditions)) { return; } if ($files = \FilesModel::findBy(array(implode(' OR ', $conditions)), $parameters)) { $this->addFileModels($files); } if (count($this->pendingPaths)) { // Run again. $this->collectFiles(); } }