Файл: concrete5.7.5.6/concrete/src/File/FileList.php
Строк: 209
<?php
namespace ConcreteCoreFile;
use ConcreteCoreSearchItemListDatabaseAttributedItemList as DatabaseItemList;
use ConcreteCoreSearchPermissionableListItemInterface;
use ConcreteCoreSearchPaginationPermissionablePagination;
use Database;
use Core;
use DoctrineDBALQuery;
use PagerfantaAdapterDoctrineDbalAdapter;
use ConcreteCoreSearchPaginationPagination;
use FileAttributeKey;
class FileList extends DatabaseItemList implements PermissionableListItemInterface
{
/** @var Closure | integer | null */
protected $permissionsChecker;
protected $paginationPageParameter = 'ccm_paging_fl';
/**
* Columns in this array can be sorted via the request.
* @var array
*/
protected $autoSortColumns = array(
'fv.fvFilename',
'fv.fvTitle',
'f.fDateAdded',
'fv.fvDateAdded',
'fv.fvSize'
);
protected function getAttributeKeyClassName()
{
return '\Concrete\Core\Attribute\Key\FileKey';
}
public function setPermissionsChecker(Closure $checker)
{
$this->permissionsChecker = $checker;
}
public function ignorePermissions()
{
$this->permissionsChecker = -1;
}
public function createQuery()
{
$this->query->select('f.fID')
->from('Files', 'f')
->innerJoin('f', 'FileVersions', 'fv', 'f.fID = fv.fID and fv.fvIsApproved = 1')
->leftJoin('f', 'FileSearchIndexAttributes', 'fsi', 'f.fID = fsi.fID')
->leftJoin('f', 'Users', 'u', 'f.uID = u.uID');
}
public function getTotalResults()
{
$u = new User();
if ($this->permissionsChecker === -1) {
$query = $this->deliverQueryObject();
return $query->select('count(distinct f.fID)')->setMaxResults(1)->execute()->fetchColumn();
} else {
return -1; // unknown
}
}
protected function createPaginationObject()
{
$u = new User();
if ($this->permissionsChecker === -1) {
$adapter = new DoctrineDbalAdapter($this->deliverQueryObject(), function ($query) {
$query->select('count(distinct f.fID)')->setMaxResults(1);
});
$pagination = new Pagination($this, $adapter);
} else {
$pagination = new PermissionablePagination($this);
}
return $pagination;
}
/**
* @param $queryRow
* @return ConcreteCoreFileFile
*/
public function getResult($queryRow)
{
$f = File::getByID($queryRow['fID']);
if (is_object($f) && $this->checkPermissions($f)) {
return $f;
}
}
public function checkPermissions($mixed)
{
if (isset($this->permissionsChecker)) {
if ($this->permissionsChecker === -1) {
return true;
} else {
return call_user_func_array($this->permissionsChecker, array($mixed));
}
}
$fp = new Permissions($mixed);
return $fp->canViewFile();
}
public function filterByType($type)
{
$this->filter('fvType', $type);
}
public function filterByExtension($extension)
{
$this->query->andWhere('fv.fvExtension = :fvExtension');
$this->query->setParameter('fvExtension', $extension);
}
/**
* Filters by "keywords" (which searches everything including filenames,
* title, users who uploaded the file, tags)
*/
public function filterByKeywords($keywords)
{
$expressions = array(
$this->query->expr()->like('fv.fvFilename', ':keywords'),
$this->query->expr()->like('fv.fvDescription', ':keywords'),
$this->query->expr()->like('fv.fvTitle', ':keywords'),
$this->query->expr()->like('fv.fvTags', ':keywords'),
$this->query->expr()->eq('uName', ':keywords')
);
$keys = FileAttributeKey::getSearchableIndexedList();
foreach ($keys as $ak) {
$cnt = $ak->getController();
$expressions[] = $cnt->searchKeywords($keywords, $this->query);
}
$expr = $this->query->expr();
$this->query->andWhere(call_user_func_array(array($expr, 'orX'), $expressions));
$this->query->setParameter('keywords', '%' . $keywords . '%');
}
public function filterBySet($fs)
{
$table = 'fsf' . $fs->getFileSetID();
$this->query->leftJoin('f', 'FileSetFiles', $table, 'f.fID = ' . $table . '.fID');
$this->query->andWhere($table . '.fsID = :fsID' . $fs->getFileSetID());
$this->query->setParameter('fsID' . $fs->getFileSetID(), $fs->getFileSetID());
}
public function filterByNoSet()
{
$this->query->leftJoin('f', 'FileSetFiles', 'fsex', 'f.fID = fsex.fID');
$this->query->andWhere('fsex.fsID is null');
}
/**
* Filters the file list by file size (in kilobytes)
*/
public function filterBySize($from, $to)
{
$this->query->andWhere('fv.fvSize >= :fvSizeFrom');
$this->query->andWhere('fv.fvSize <= :fvSizeTo');
$this->query->setParameter('fvSizeFrom', $from * 1024);
$this->query->setParameter('fvSizeTo', $to * 1024);
}
/**
* Filters by public date
* @param string $date
*/
public function filterByDateAdded($date, $comparison = '=')
{
$this->query->andWhere($this->query->expr()->comparison('f.fDateAdded', $comparison, $this->query->createNamedParameter($date)));
}
public function filterByOriginalPageID($ocID)
{
$this->query->andWhere('f.ocID = :ocID');
$this->query->setParameter('ocID', $ocID);
}
/**
* filters a FileList by the uID of the approving User
* @param int $uID
* @return void
*/
public function filterByApproverUserID($uID)
{
$this->query->andWhere('fv.fvApproverUID = :fvApproverUID');
$this->query->setParameter('fvApproverUID', $uID);
}
/**
* filters a FileList by the uID of the owning User
* @param int $uID
* @return void
* @since 5.4.1.1+
*/
public function filterByAuthorUserID($uID)
{
$this->query->andWhere('fv.fvAuthorUID = :fvAuthorUID');
$this->query->setParameter('fvAuthorUID', $uID);
}
/**
* Filters by "tags" only.
*/
public function filterByTags($tags)
{
$this->query->andWhere(
$this->query->expr()->andX(
$this->query->expr()->like('fv.fvTags', ':tags')
)
);
$this->query->setParameter('tags', '%' . $tags . '%');
}
/**
* Sorts by filename in ascending order.
*/
public function sortByFilenameAscending()
{
$this->query->orderBy('fv.fvFilename', 'asc');
}
/**
* Sorts by file set display order in ascending order.
*/
public function sortByFileSetDisplayOrder()
{
$this->query->orderBy('fsDisplayOrder', 'asc');
}
}