芝麻web文件管理V1.00
编辑当前文件:/home/mgatv524/public_html/mctv/lib/Factory/DisplayFactory.php
. */ namespace Xibo\Factory; use Xibo\Entity\Display; use Xibo\Entity\User; use Xibo\Helper\SanitizerService; use Xibo\Service\ConfigServiceInterface; use Xibo\Service\DisplayNotifyServiceInterface; use Xibo\Service\LogServiceInterface; use Xibo\Storage\StorageServiceInterface; use Xibo\Support\Exception\NotFoundException; /** * Class DisplayFactory * @package Xibo\Factory */ class DisplayFactory extends BaseFactory { /** @var DisplayNotifyServiceInterface */ private $displayNotifyService; /** * @var ConfigServiceInterface */ private $config; /** * @var DisplayGroupFactory */ private $displayGroupFactory; /** * @var DisplayProfileFactory */ private $displayProfileFactory; /** @var FolderFactory */ private $folderFactory; /** * Construct a factory * @param StorageServiceInterface $store * @param LogServiceInterface $log * @param SanitizerService $sanitizerService * @param User $user * @param UserFactory $userFactory * @param DisplayNotifyServiceInterface $displayNotifyService * @param ConfigServiceInterface $config * @param DisplayGroupFactory $displayGroupFactory * @param DisplayProfileFactory $displayProfileFactory * @param FolderFactory $folderFactory */ public function __construct($store, $log, $sanitizerService, $user, $userFactory, $displayNotifyService, $config, $displayGroupFactory, $displayProfileFactory, $folderFactory) { $this->setCommonDependencies($store, $log, $sanitizerService); $this->setAclDependencies($user, $userFactory); $this->displayNotifyService = $displayNotifyService; $this->config = $config; $this->displayGroupFactory = $displayGroupFactory; $this->displayProfileFactory = $displayProfileFactory; $this->folderFactory = $folderFactory; } /** * Get the Display Notify Service * @return DisplayNotifyServiceInterface */ public function getDisplayNotifyService() { return $this->displayNotifyService->init(); } /** * Create Empty Display Object * @return Display */ public function createEmpty() { return new Display($this->getStore(), $this->getLog(), $this->config, $this->displayGroupFactory, $this->displayProfileFactory, $this, $this->folderFactory); } /** * @param int $displayId * @param bool|false $showTags * @return Display * @throws NotFoundException */ public function getById($displayId, $showTags = false) { $displays = $this->query(null, ['disableUserCheck' => 1, 'displayId' => $displayId, 'showTags' => $showTags]); if (count($displays) <= 0) throw new NotFoundException(); return $displays[0]; } /** * @param string $licence * @return Display * @throws NotFoundException */ public function getByLicence($licence) { if (empty($licence)) { throw new NotFoundException(__('Hardware key cannot be empty')); } $displays = $this->query(null, ['disableUserCheck' => 1, 'license' => $licence]); if (count($displays) <= 0) throw new NotFoundException(); return $displays[0]; } /** * @param int $displayGroupId * @return Display[] * @throws NotFoundException */ public function getByDisplayGroupId($displayGroupId) { return $this->query(null, ['disableUserCheck' => 1, 'displayGroupId' => $displayGroupId]); } /** * @param array $sortOrder * @param array $filterBy * @return Display[] * @throws NotFoundException */ public function query($sortOrder = null, $filterBy = []) { $parsedBody = $this->getSanitizer($filterBy); if ($sortOrder === null) $sortOrder = ['display']; $newSortOrder = []; foreach ($sortOrder as $sort) { if ($sort == '`clientSort`') { $newSortOrder[] = '`clientType`'; $newSortOrder[] = '`clientCode`'; $newSortOrder[] = '`clientVersion`'; continue; } if ($sort == '`clientSort` DESC') { $newSortOrder[] = '`clientType` DESC'; $newSortOrder[] = '`clientCode` DESC'; $newSortOrder[] = '`clientVersion` DESC'; continue; } if ($sort == '`isCmsTransferInProgress`') { $newSortOrder[] = '`newCmsAddress`'; continue; } if ($sort == '`isCmsTransferInProgress` DESC') { $newSortOrder[] = '`newCmsAddress` DESC'; continue; } $newSortOrder[] = $sort; } $sortOrder = $newSortOrder; // SQL function for ST_X/X and ST_Y/Y dependent on MySQL version $version = $this->getStore()->getVersion(); $functionPrefix = ($version === null || version_compare($version, '5.6.1', '>=')) ? 'ST_' : ''; $entries = []; $params = []; $select = ' SELECT display.displayId, display.display, display.defaultLayoutId, layout.layout AS defaultLayout, display.license, display.licensed, display.licensed AS currentlyLicensed, display.loggedIn, display.lastAccessed, display.auditingUntil, display.inc_schedule AS incSchedule, display.email_alert AS emailAlert, display.alert_timeout AS alertTimeout, display.clientAddress, display.mediaInventoryStatus, display.macAddress, display.macAddress AS currentMacAddress, display.lastChanged, display.numberOfMacAddressChanges, display.lastWakeOnLanCommandSent, display.wakeOnLan AS wakeOnLanEnabled, display.wakeOnLanTime, display.broadCastAddress, display.secureOn, display.cidr, ' . $functionPrefix . 'X(display.GeoLocation) AS latitude, ' . $functionPrefix . 'Y(display.GeoLocation) AS longitude, display.client_type AS clientType, display.client_version AS clientVersion, display.client_code AS clientCode, display.displayProfileId, display.screenShotRequested, display.storageAvailableSpace, display.storageTotalSpace, displaygroup.displayGroupId, displaygroup.description, displaygroup.bandwidthLimit, displaygroup.createdDt, displaygroup.modifiedDt, displaygroup.folderId, displaygroup.permissionsFolderId, `display`.xmrChannel, `display`.xmrPubKey, `display`.lastCommandSuccess, `display`.deviceName, `display`.timeZone, `display`.overrideConfig, `display`.newCmsAddress, `display`.newCmsKey, `display`.orientation, `display`.resolution, `display`.commercialLicence, `display`.teamViewerSerial, `display`.webkeySerial '; if ($parsedBody->getCheckbox('showTags') === 1) { $select .= ', ( SELECT GROUP_CONCAT(DISTINCT tag) FROM tag INNER JOIN lktagdisplaygroup ON lktagdisplaygroup.tagId = tag.tagId WHERE lktagdisplaygroup.displayGroupId = displaygroup.displayGroupID GROUP BY lktagdisplaygroup.displayGroupId ) AS tags '; $select .= ", ( SELECT GROUP_CONCAT(IFNULL(value, 'NULL')) FROM tag INNER JOIN lktagdisplaygroup ON lktagdisplaygroup.tagId = tag.tagId WHERE lktagdisplaygroup.displayGroupId = displaygroup.displayGroupID GROUP BY lktagdisplaygroup.displayGroupId ) AS tagValues "; } $body = ' FROM `display` INNER JOIN `lkdisplaydg` ON lkdisplaydg.displayid = display.displayId INNER JOIN `displaygroup` ON displaygroup.displaygroupid = lkdisplaydg.displaygroupid AND `displaygroup`.isDisplaySpecific = 1 LEFT OUTER JOIN layout ON layout.layoutid = display.defaultlayoutid '; // Restrict to members of a specific display group if ($parsedBody->getInt('displayGroupId') !== null) { $body .= ' INNER JOIN `lkdisplaydg` othergroups ON othergroups.displayId = `display`.displayId AND othergroups.displayGroupId = :displayGroupId '; $params['displayGroupId'] = $parsedBody->getInt('displayGroupId'); } $body .= ' WHERE 1 = 1 '; // Filter by Display ID? if ($parsedBody->getInt('displayId') !== null) { $body .= ' AND display.displayid = :displayId '; $params['displayId'] = $parsedBody->getInt('displayId'); } // Display Profile if ($parsedBody->getInt('displayProfileId') !== null) { if ($parsedBody->getInt('displayProfileId') == -1) { $body .= ' AND IFNULL(displayProfileId, 0) = 0 '; } else { $displayProfileSelected = $this->displayProfileFactory->getById($parsedBody->getInt('displayProfileId')); $displayProfileDefault = $this->displayProfileFactory->getDefaultByType($displayProfileSelected->type); $body .= ' AND (`display`.displayProfileId = :displayProfileId OR (IFNULL(displayProfileId, :displayProfileDefaultId) = :displayProfileId AND display.client_type = :displayProfileType ) ) '; $params['displayProfileId'] = $parsedBody->getInt('displayProfileId'); $params['displayProfileDefaultId'] = $displayProfileDefault->displayProfileId; $params['displayProfileType'] = $displayProfileDefault->type; } } // Filter by Wake On LAN if ($parsedBody->getInt('wakeOnLan') !== null) { $body .= ' AND display.wakeOnLan = :wakeOnLan '; $params['wakeOnLan'] = $parsedBody->getInt('wakeOnLan'); } // Filter by Licence? if ($parsedBody->getString('license') !== null) { $body .= ' AND display.license = :license '; $params['license'] = $parsedBody->getString('license'); } // Filter by authorised? if ($parsedBody->getInt('authorised', ['default' => -1]) != -1) { $body .= ' AND display.licensed = :authorised '; $params['authorised'] = $parsedBody->getInt('authorised'); } // Filter by Display Name? if ($parsedBody->getString('display') != null) { $terms = explode(',', $parsedBody->getString('display')); $this->nameFilter('display', 'display', $terms, $body, $params, ($parsedBody->getCheckbox('useRegexForName') == 1)); } if ($parsedBody->getString('macAddress') != '') { $body .= ' AND display.macaddress LIKE :macAddress '; $params['macAddress'] = '%' . $parsedBody->getString('macAddress') . '%'; } if ($parsedBody->getString('clientAddress') != '') { $body .= ' AND display.clientaddress LIKE :clientAddress '; $params['clientAddress'] = '%' . $parsedBody->getString('clientAddress') . '%'; } if ($parsedBody->getString('clientVersion') != '') { $body .= ' AND display.client_version LIKE :clientVersion '; $params['clientVersion'] = '%' . $parsedBody->getString('clientVersion') . '%'; } if ($parsedBody->getString('clientType') != '') { $body .= ' AND display.client_type = :clientType '; $params['clientType'] = $parsedBody->getString('clientType'); } if ($parsedBody->getString('clientCode') != '') { $body .= ' AND display.client_code LIKE :clientCode '; $params['clientCode'] = '%' . $parsedBody->getString('clientCode') . '%'; } if ($parsedBody->getString('orientation', $filterBy) != '') { $body .= ' AND display.orientation = :orientation '; $params['orientation'] = $parsedBody->getString('orientation', $filterBy); } if ($parsedBody->getInt('mediaInventoryStatus', $filterBy) != '') { if ($parsedBody->getInt('mediaInventoryStatus', $filterBy) === -1) { $body .= ' AND display.mediaInventoryStatus <> 1 '; } else { $body .= ' AND display.mediaInventoryStatus = :mediaInventoryStatus '; $params['mediaInventoryStatus'] = $parsedBody->getInt('mediaInventoryStatus'); } } if ($parsedBody->getInt('loggedIn', ['default' => -1]) != -1) { $body .= ' AND display.loggedIn = :loggedIn '; $params['loggedIn'] = $parsedBody->getInt('loggedIn'); } if ($parsedBody->getDate('lastAccessed', ['dateFormat' => 'U']) !== null) { $body .= ' AND display.lastAccessed > :lastAccessed '; $params['lastAccessed'] = $parsedBody->getDate('lastAccessed',['dateFormat' => 'U'])->format('U'); } // Exclude a group? if ($parsedBody->getInt('exclude_displaygroupid') !== null) { $body .= " AND display.DisplayID NOT IN "; $body .= " (SELECT display.DisplayID "; $body .= " FROM display "; $body .= " INNER JOIN lkdisplaydg "; $body .= " ON lkdisplaydg.DisplayID = display.DisplayID "; $body .= " WHERE lkdisplaydg.DisplayGroupID = :excludeDisplayGroupId "; $body .= " )"; $params['excludeDisplayGroupId'] = $parsedBody->getInt('exclude_displaygroupid'); } // Media ID - direct assignment if ($parsedBody->getInt('mediaId') !== null) { $body .= ' AND display.displayId IN ( SELECT `lkdisplaydg`.displayId FROM `lkmediadisplaygroup` INNER JOIN `lkdgdg` ON `lkdgdg`.parentId = `lkmediadisplaygroup`.displayGroupId INNER JOIN `lkdisplaydg` ON lkdisplaydg.DisplayGroupID = `lkdgdg`.childId WHERE `lkmediadisplaygroup`.mediaId = :mediaId UNION SELECT `lkdisplaydg`.displayId FROM `lklayoutdisplaygroup` INNER JOIN `lkdgdg` ON `lkdgdg`.parentId = `lklayoutdisplaygroup`.displayGroupId INNER JOIN `lkdisplaydg` ON lkdisplaydg.DisplayGroupID = `lkdgdg`.childId WHERE `lklayoutdisplaygroup`.layoutId IN ( SELECT `region`.layoutId FROM `lkwidgetmedia` INNER JOIN `widget` ON `widget`.widgetId = `lkwidgetmedia`.widgetId INNER JOIN `playlist` ON `playlist`.playlistId = `widget`.playlistId INNER JOIN `region` ON `region`.regionId = `playlist`.regionId INNER JOIN layout ON layout.LayoutID = region.layoutId WHERE lkwidgetmedia.mediaId = :mediaId UNION SELECT `layout`.layoutId FROM `layout` WHERE `layout`.backgroundImageId = :mediaId ) ) '; $params['mediaId'] = $parsedBody->getInt('mediaId'); } // Tags if ($parsedBody->getString('tags') != '') { $tagFilter = $parsedBody->getString('tags'); if (trim($tagFilter) === '--no-tag') { $body .= ' AND `displaygroup`.displaygroupId NOT IN ( SELECT `lktagdisplaygroup`.displaygroupId FROM tag INNER JOIN `lktagdisplaygroup` ON `lktagdisplaygroup`.tagId = tag.tagId ) '; } else { $operator = $parsedBody->getCheckbox('exactTags') == 1 ? '=' : 'LIKE'; $body .= " AND `displaygroup`.displaygroupId IN ( SELECT `lktagdisplaygroup`.displaygroupId FROM tag INNER JOIN `lktagdisplaygroup` ON `lktagdisplaygroup`.tagId = tag.tagId "; $tags = explode(',', $tagFilter); $this->tagFilter($tags, $operator, $body, $params); } } // run the special query to help sort by displays already assigned to this display group, we want to run it only if we're sorting by member column. if ($parsedBody->getInt('displayGroupIdMembers') !== null && ($sortOrder == ['`member`'] || $sortOrder == ['`member` DESC'] )) { $members = []; $displayGroupId = $parsedBody->getInt('displayGroupIdMembers'); foreach ($this->getStore()->select($select . $body, $params) as $row) { $displayId = $this->getSanitizer($row)->getInt('displayId'); if ($this->getStore()->exists('SELECT display.display, display.displayId, displaygroup.displayGroupId FROM display INNER JOIN `lkdisplaydg` ON lkdisplaydg.displayId = `display`.displayId AND lkdisplaydg.displayGroupId = :displayGroupId AND lkdisplaydg.displayId = :displayId INNER JOIN `displaygroup` ON displaygroup.displaygroupid = lkdisplaydg.displaygroupid AND `displaygroup`.isDisplaySpecific = 0', [ 'displayGroupId' => $displayGroupId, 'displayId' => $displayId ] )) { $members[] = $displayId; } } } // filter by commercial licence if ($parsedBody->getInt('commercialLicence') !== null) { $body .= ' AND display.commercialLicence = :commercialLicence '; $params['commercialLicence'] = $parsedBody->getInt('commercialLicence'); } if ($parsedBody->getInt('folderId') !== null) { $body .= ' AND displaygroup.folderId = :folderId '; $params['folderId'] = $parsedBody->getInt('folderId'); } $this->viewPermissionSql('Xibo\Entity\DisplayGroup', $body, $params, 'displaygroup.displayGroupId', null, $filterBy, '`displaygroup`.permissionsFolderId'); // Sorting? $order = ''; if (isset($members) && $members != [] ) { $sqlOrderMembers = 'ORDER BY FIELD(display.displayId,' . implode(',', $members) . ')'; foreach ($sortOrder as $sort) { if ($sort == '`member`') { $order .= $sqlOrderMembers; continue; } if ($sort == '`member` DESC') { $order .= $sqlOrderMembers . ' DESC'; continue; } } } if (is_array($sortOrder) && ($sortOrder != ['`member`'] && $sortOrder != ['`member` DESC'] )) { $order .= 'ORDER BY ' . implode(',', $sortOrder); } $limit = ''; // Paging if ($filterBy !== null && $parsedBody->getInt('start') !== null && $parsedBody->getInt('length') !== null) { $limit = ' LIMIT ' . intval($parsedBody->getInt('start', ['default' => 0]), 0) . ', ' . $parsedBody->getInt('length', ['default' => 10]); } $sql = $select . $body . $order . $limit; foreach ($this->getStore()->select($sql, $params) as $row) { $display = $this->createEmpty()->hydrate($row, [ 'intProperties' => [ 'auditingUntil', 'wakeOnLanEnabled', 'numberOfMacAddressChanges', 'loggedIn', 'incSchedule', 'licensed', 'lastAccessed', 'emailAlert', 'alertTimeout', 'mediaInventoryStatus', 'clientCode', 'screenShotRequested', 'lastCommandSuccess', 'bandwidthLimit' ] ]); $display->overrideConfig = ($display->overrideConfig == '') ? [] : json_decode($display->overrideConfig, true); $entries[] = $display; } // Paging if ($limit != '' && count($entries) > 0) { $results = $this->getStore()->select('SELECT COUNT(*) AS total ' . $body, $params); $this->_countLast = intval($results[0]['total']); } return $entries; } }