コード例 #1
0
 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();
 }
コード例 #2
0
 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;
 }
コード例 #3
0
 /**
  * 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();
 }
コード例 #4
0
ファイル: Dbafs.php プロジェクト: iCodr8/core
 /**
  * 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;
 }
コード例 #5
0
 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;
 }
コード例 #6
0
ファイル: DC_Folder.php プロジェクト: rikaix/core
    /**
     * 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">&nbsp;</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;
 }
コード例 #8
0
ファイル: ToolboxFile.php プロジェクト: metamodels/core
 /**
  * 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();
     }
 }