Current Path : /var/www/www-root/data/www/monolith-realty.ru/bitrix/modules/landing/lib/publicaction/ |
Current File : /var/www/www-root/data/www/monolith-realty.ru/bitrix/modules/landing/lib/publicaction/site.php |
<?php namespace Bitrix\Landing\PublicAction; use \Bitrix\Landing\Manager; use \Bitrix\Landing\File; use \Bitrix\Landing\Rights; use \Bitrix\Landing\Landing; use \Bitrix\Landing\Site as SiteCore; use \Bitrix\Landing\PublicActionResult; use \Bitrix\Main\Localization\Loc; Loc::loadMessages(__FILE__); class Site { /** * Clear disallow keys from add/update fields. * @param array $fields Array fields. * @return array */ protected static function clearDisallowFields(array $fields) { $disallow = ['ACTIVE', 'SPECIAL', 'TPL_CODE']; if (is_array($fields)) { foreach ($fields as $k => $v) { if (in_array($k, $disallow)) { unset($fields[$k]); } } } return $fields; } /** * Get additional fields of site. * @param int $id Id of site. * @return \Bitrix\Landing\PublicActionResult */ public static function getAdditionalFields($id) { $result = new PublicActionResult(); $id = (int)$id; if (($fields = SiteCore::getAdditionalFields($id))) { foreach ($fields as $key => $field) { $fields[$key] = $field->getValue(); if (!$fields[$key]) { unset($fields[$key]); } } $result->setResult( $fields ); } return $result; } /** * Gets public url of site (or sites). * @param int[] $id Site id or array of ids. * @return \Bitrix\Landing\PublicActionResult */ public static function getPublicUrl($id) { static $mixedParams = ['id']; $result = new PublicActionResult(); $result->setResult(SiteCore::getPublicUrl($id)); return $result; } /** * Returns site's preview (index page's preview). * @param int $id Site id. * @return PublicActionResult */ public static function getPreview(int $id): PublicActionResult { $result = new PublicActionResult(); $result->setResult(SiteCore::getPreview($id)); return $result; } /** * Get available sites. * @param array $params Params ORM array. * @param string $initiator Initiator code. * @return \Bitrix\Landing\PublicActionResult */ public static function getList(array $params = [], $initiator = null) { $result = new PublicActionResult(); $params = $result->sanitizeKeys($params); $getPublicUrl = false; $getPreviewPicture = false; $getPhone = false; $mobileHit = $initiator === 'mobile'; if ($mobileHit) { \Bitrix\Landing\Connector\Mobile::forceMobile(); } // necessary params for us if ( !isset($params['select']) || !is_array($params['select']) ) { $params['select'] = ['*']; } if ( !isset($params['filter']) || !is_array($params['filter']) ) { $params['filter'] = []; } // fix for smn sites if ( isset($params['filter']['=TYPE']) && $params['filter']['=TYPE'] == 'STORE' ) { $params['filter']['=TYPE'] = [ $params['filter']['=TYPE'], 'SMN' ]; } if ( isset($params['filter']['TYPE']) && $params['filter']['TYPE'] == 'STORE' ) { $params['filter']['TYPE'] = [ $params['filter']['TYPE'], 'SMN' ]; } if (isset($params['filter']['CHECK_PERMISSIONS'])) { unset($params['filter']['CHECK_PERMISSIONS']); } // extend select's param if (is_array($params['select'])) { if (in_array('DOMAIN_NAME', $params['select'])) { $params['select']['DOMAIN_NAME'] = 'DOMAIN.DOMAIN'; } if (in_array('PUBLIC_URL', $params['select'])) { $getPublicUrl = true; } if (in_array('PREVIEW_PICTURE', $params['select'])) { $getPreviewPicture = true; } if (in_array('PHONE', $params['select'])) { $getPhone = true; $params['select'][] = 'ID'; } // delete this keys for ORM $deleted = ['DOMAIN_NAME', 'PUBLIC_URL', 'PREVIEW_PICTURE', 'PHONE']; foreach ($params['select'] as $k => $code) { if (in_array($code, $deleted)) { unset($params['select'][$k]); } } } // set additional select fields if ( $getPreviewPicture && !in_array('LANDING_ID_INDEX', $params['select']) ) { $params['select'][] = 'LANDING_ID_INDEX'; } if (!in_array('ID', $params['select'])) { $params['select'][] = 'ID'; } if (!in_array('TYPE', $params['select'])) { $params['select'][] = 'TYPE'; } // get ORM data $data = []; $landingIndexes = []; $res = SiteCore::getList($params); while ($row = $res->fetch()) { if (isset($row['DATE_CREATE'])) { $row['DATE_CREATE'] = (string) $row['DATE_CREATE']; } if (isset($row['DATE_MODIFY'])) { $row['DATE_MODIFY'] = (string) $row['DATE_MODIFY']; } if ($row['LANDING_ID_INDEX'] && $getPreviewPicture) { $landingIndexes[$row['ID']] = $row['LANDING_ID_INDEX']; } if ($getPublicUrl) { $row['PUBLIC_URL'] = ''; } if ($getPreviewPicture) { $row['PREVIEW_PICTURE'] = ''; } if ($getPhone) { $row['PHONE'] = \Bitrix\Landing\Connector\Crm::getContacts( $row['ID'] )['PHONE'] ?? null; } $data[$row['ID']] = $row; } // gets public url for sites if ($getPublicUrl || $getPreviewPicture) { $urls = SiteCore::getPublicUrl(array_keys($data), true, !$mobileHit); foreach ($urls as $siteId => $url) { $data[$siteId]['PUBLIC_URL'] = $url; } } // get preview pictures if ($landingIndexes) { $landing = Landing::createInstance(0); foreach ($landingIndexes as $siteId => $landingId) { $data[$siteId]['PREVIEW_PICTURE'] = $landing->getPreview( $landingId, false, $data[$siteId]['PUBLIC_URL'] ); } } // set and return result $result->setResult( array_values($data) ); return $result; } /** * Create new site. * @param array $fields Site data. * @return \Bitrix\Landing\PublicActionResult */ public static function add(array $fields) { $result = new PublicActionResult(); $error = new \Bitrix\Landing\Error; $fields = self::clearDisallowFields($fields); $fields['ACTIVE'] = 'N'; $res = SiteCore::add($fields); if ($res->isSuccess()) { $result->setResult($res->getId()); } else { $error->addFromResult($res); $result->setError($error); } return $result; } /** * Update site. * @param int $id Site id. * @param array $fields Site new data. * @return \Bitrix\Landing\PublicActionResult */ public static function update($id, array $fields) { $result = new PublicActionResult(); $error = new \Bitrix\Landing\Error; $fields = self::clearDisallowFields($fields); $res = SiteCore::update($id, $fields); if ($res->isSuccess()) { $result->setResult(true); } else { $error->addFromResult($res); $result->setError($error); } return $result; } /** * Delete site. * @param int $id Site id. * @return \Bitrix\Landing\PublicActionResult */ public static function delete($id) { $result = new PublicActionResult(); $error = new \Bitrix\Landing\Error; $res = SiteCore::delete($id); if ($res->isSuccess()) { $result->setResult(true); } else { $error->addFromResult($res); $result->setError($error); } return $result; } /** * Mark site as deleted. * @param int $id Site id. * @param boolean $mark Mark. * @return \Bitrix\Landing\PublicActionResult */ public static function markDelete($id, $mark = true) { $result = new PublicActionResult(); $error = new \Bitrix\Landing\Error; $id = (int)$id; if ($mark) { $res = SiteCore::markDelete($id); } else { $res = SiteCore::markUnDelete($id); } if ($res->isSuccess()) { $result->setResult($res->getId()); } else { $error->addFromResult($res); $result->setError($error); } return $result; } /** * Mark site as undeleted. * @param int $id Site id. * @return \Bitrix\Landing\PublicActionResult */ public static function markUnDelete($id) { return self::markDelete($id, false); } /** * Creates folder into the site. * @param int $siteId Site id. * @param array $fields Folder's fields. * @return \Bitrix\Landing\PublicActionResult */ public static function addFolder(int $siteId, array $fields): PublicActionResult { $result = new PublicActionResult(); $error = new \Bitrix\Landing\Error; if (!($fields['PARENT_ID'] ?? null)) { $fields['PARENT_ID'] = null; } $addResult = SiteCore::addFolder($siteId, $fields); if ($addResult->isSuccess()) { $result->setResult($addResult->getId()); } else { $error->addFromResult($addResult); $result->setError($error); } return $result; } /** * Updates folder into the site. * @param int $siteId Site id. * @param int $folderId Folder id. * @param array $fields Folder's fields. * @return PublicActionResult */ public static function updateFolder(int $siteId, int $folderId, array $fields): PublicActionResult { $result = new PublicActionResult(); $error = new \Bitrix\Landing\Error; if (!($fields['PARENT_ID'] ?? null)) { $fields['PARENT_ID'] = null; } $addResult = SiteCore::updateFolder($siteId, $folderId, $fields); if ($addResult->isSuccess()) { $result->setResult(true); } else { $error->addFromResult($addResult); $result->setError($error); } return $result; } /** * Move folder. * @param int $folderId Current folder id. * @param int|null $toFolderId Destination folder id (or null for root folder of current folder's site). * @param int|null $toSiteId Destination site id (if different from current). * @return PublicActionResult */ public static function moveFolder(int $folderId, ?int $toFolderId, ?int $toSiteId = null): PublicActionResult { $result = new PublicActionResult(); $error = new \Bitrix\Landing\Error; $moveResult = SiteCore::moveFolder($folderId, $toFolderId ?: null, $toSiteId ?: null); if ($moveResult->isSuccess()) { $result->setResult($moveResult->getId()); } else { $error->addFromResult($moveResult); $result->setError($error); } return $result; } /** * Public all folder's breadcrumb. * @param int $folderId Folder id. * @param bool $mark Publication / depublication. * @return PublicActionResult */ public static function publicationFolder(int $folderId, bool $mark = true): PublicActionResult { $result = new PublicActionResult(); $error = new \Bitrix\Landing\Error; $publicationResult = SiteCore::publicationFolder($folderId, $mark); if ($publicationResult->isSuccess()) { $result->setResult($publicationResult->isSuccess()); } else { $error->addFromResult($publicationResult); $result->setError($error); } return $result; } /** * Unpublic all folder's breadcrumb. * @param int $folderId Folder id. * @return PublicActionResult */ public static function unPublicFolder(int $folderId): PublicActionResult { return self::publicationFolder($folderId, false); } /** * Returns folder's list of site. * @param int $siteId Site id. * @param array $filter Folder's filter. * @return PublicActionResult */ public static function getFolders(int $siteId, array $filter = []): PublicActionResult { $result = new PublicActionResult(); if (array_key_exists('PARENT_ID', $filter) && !($filter['PARENT_ID'] ?? null)) { $filter['PARENT_ID'] = null; } $rows = array_values(SiteCore::getFolders($siteId, $filter)); foreach ($rows as &$row) { if (isset($row['DATE_CREATE'])) { $row['DATE_CREATE'] = (string) $row['DATE_CREATE']; } if (isset($row['DATE_MODIFY'])) { $row['DATE_MODIFY'] = (string) $row['DATE_MODIFY']; } } unset($row); $result->setResult($rows); return $result; } /** * Mark folder as deleted. * @param int $id Folder id. * @param boolean $mark Mark. * @return \Bitrix\Landing\PublicActionResult */ public static function markFolderDelete(int $id, bool $mark = true): PublicActionResult { $result = new PublicActionResult(); $error = new \Bitrix\Landing\Error; if ($mark) { $res = SiteCore::markFolderDelete($id); } else { $res = SiteCore::markFolderUnDelete($id); } if ($res->isSuccess()) { $result->setResult(true); } else { $error->addFromResult($res); $result->setError($error); } return $result; } /** * Mark folder as undeleted. * @param int $id Folder id. * @return \Bitrix\Landing\PublicActionResult */ public static function markFolderUnDelete(int $id): PublicActionResult { return self::markFolderDelete($id, false); } /** * Makes site public. * @param int $id Site id. * @param bool $mark Mark. * @return PublicActionResult */ public static function publication(int $id, bool $mark = true): PublicActionResult { $result = new PublicActionResult(); $error = new \Bitrix\Landing\Error; if ($mark) { $res = SiteCore::publication($id); } else { $res = SiteCore::unpublic($id); } if ($res->isSuccess()) { $result->setResult($res->getId()); } else { $error->addFromResult($res); $result->setError($error); } return $result; } /** * Marks site unpublic. * @param int $id Site id. * @return PublicActionResult */ public static function unpublic(int $id): PublicActionResult { return self::publication($id, false); } /** * Full export of the site. * @param int $id Site id. * @param array $params Params array. * @return \Bitrix\Landing\PublicActionResult */ public static function fullExport($id, array $params = array()) { $result = new PublicActionResult(); $result->setResult( SiteCore::fullExport($id, $params) ); return $result; } /** * Set rights for site. * @param int $id Site id. * @param array $rights Array of rights for site. * @return \Bitrix\Landing\PublicActionResult */ public static function setRights($id, $rights = []) { static $mixedParams = ['rights']; $result = new PublicActionResult(); $error = new \Bitrix\Landing\Error; $result->setResult(false); $id = (int)$id; if (!is_array($rights)) { $rights = []; } // check access for set rights if (!Rights::isAdmin()) { $error->addError( 'IS_NOT_ADMIN', Loc::getMessage('LANDING_IS_NOT_ADMIN_ERROR') ); $result->setError($error); } else if (!Manager::checkFeature(Manager::FEATURE_PERMISSIONS_AVAILABLE)) { $error->addError( 'FEATURE_NOT_AVAIL', \Bitrix\Landing\Restriction\Manager::getSystemErrorMessage( 'limit_sites_access_permissions' ) ); $result->setError($error); } // set rights else { $result->setResult( Rights::setOperationsForSite( $id, $rights ) ); } return $result; } /** * Get rights about site. * @param int $id Site id. * @return \Bitrix\Landing\PublicActionResult */ public static function getRights($id) { $result = new PublicActionResult(); $error = new \Bitrix\Landing\Error; $result->setResult([]); $id = (int)$id; // check access for get rights if (!Manager::checkFeature(Manager::FEATURE_PERMISSIONS_AVAILABLE)) { $error->addError( 'FEATURE_NOT_AVAIL', \Bitrix\Landing\Restriction\Manager::getSystemErrorMessage( 'limit_sites_access_permissions' ) ); $result->setError($error); } // get rights else { $result->setResult( Rights::getOperationsForSite( $id ) ); } return $result; } /** * Upload file by url or from FILE. * @param int $id Site id. * @param string $picture File url / file array. * @param string $ext File extension. * @param array $params Some file params. * @param bool $temp This is temporary file. * @return PublicActionResult */ public static function uploadFile($id, $picture, $ext = false, array $params = [], $temp = false): PublicActionResult { static $internal = true; static $mixedParams = ['picture']; $result = new PublicActionResult(); $result->setResult(false); $error = new \Bitrix\Landing\Error; $id = (int)$id; $res = SiteCore::getList(array( 'filter' => array( 'ID' => $id ) )); if ($res->fetch()) { $file = Manager::savePicture($picture, $ext, $params); if ($file) { File::addToSite($id, $file['ID'], Utils::isTrue($temp)); $result->setResult(array( 'id' => $file['ID'], 'src' => $file['SRC'] )); } else { $error->addError( 'FILE_ERROR', Loc::getMessage('LANDING_FILE_ERROR') ); $result->setError($error); } } return $result; } /** * Sets scope for work with module. * @param string $type Scope code. * @return \Bitrix\Landing\PublicActionResult */ public static function setScope($type) { \Bitrix\Landing\Site\Type::setScope($type); return new PublicActionResult(); } /** * Binds or unbinds site with specific menu or Group. * @param int $id Site id. * @param \Bitrix\Landing\Binding\Entity $binding Binding instance. * @param bool $bind Bind or unbind to menu (true or false). * @return PublicActionResult */ protected static function binding(int $id, \Bitrix\Landing\Binding\Entity $binding, bool $bind): PublicActionResult { $result = new PublicActionResult(); if (Rights::hasAccessForSite($id, Rights::ACCESS_TYPES['read']) && !$binding->isForbiddenBindingAction()) { if ($bind) { $result->setResult($binding->bindSite($id)); } else { $result->setResult($binding->unbindSite($id)); } } else { $result->setResult(false); } return $result; } /** * Binds site with specific menu. * @param int $id Site id. * @param string $menuCode Menu code. * @return PublicActionResult */ public static function bindingToMenu(int $id, string $menuCode): PublicActionResult { \Bitrix\Landing\Site\Type::setScope('KNOWLEDGE'); $binding = new \Bitrix\Landing\Binding\Menu($menuCode); return self::binding($id, $binding, true); } /** * Unbinds site with specific menu. * @param int $id Site id. * @param string $menuCode Menu code. * @return PublicActionResult */ public static function unbindingFromMenu(int $id, string $menuCode): PublicActionResult { \Bitrix\Landing\Site\Type::setScope('KNOWLEDGE'); $binding = new \Bitrix\Landing\Binding\Menu($menuCode); return self::binding($id, $binding, false); } /** * Binds site with specific socialnetwork group. * @param int $id Site id. * @param int $groupId Group id. * @return PublicActionResult */ public static function bindingToGroup(int $id, int $groupId): PublicActionResult { \Bitrix\Landing\Site\Type::setScope('KNOWLEDGE'); if ( \Bitrix\landing\Connector\SocialNetwork::canCreateNewBinding($groupId) && !\Bitrix\landing\Binding\Group::getList($groupId) ) { $binding = new \Bitrix\Landing\Binding\Group($groupId); $result = self::binding($id, $binding, true); if ($result->getResult()) { Rights::setGlobalOff(); \Bitrix\Landing\Site::update($id, [ 'TYPE' => 'GROUP' ]); Rights::setGlobalOn(); } return $result; } $result = new PublicActionResult(); $result->setResult(false); return $result; } /** * Unbinds site with specific socialnetwork group. * @param int $id Site id. * @param int $groupId Group id. * @return PublicActionResult */ public static function unbindingFromGroup(int $id, int $groupId): PublicActionResult { \Bitrix\Landing\Site\Type::setScope('GROUP'); if (\Bitrix\landing\Connector\SocialNetwork::canCreateNewBinding($groupId)) { $binding = new \Bitrix\Landing\Binding\Group($groupId); $result = self::binding($id, $binding, false); if ($result->getResult()) { Rights::setGlobalOff(); \Bitrix\Landing\Site::update($id, [ 'TYPE' => 'KNOWLEDGE' ]); Rights::setGlobalOn(); } return $result; } $result = new PublicActionResult(); $result->setResult(false); return $result; } /** * Removes empty binding. * @param array $bindings Bindings array. * @return array */ protected static function removeEmptyBindings(array $bindings): array { // if PUBLIC_URL is empty user don't have read access foreach ($bindings as $i => $binding) { if (!$binding['PUBLIC_URL']) { unset($bindings[$i]); } } return array_values($bindings); } /** * Returns exists bindings. * @param string|null $menuCode Menu code (only for this menu). * @return PublicActionResult */ public static function getMenuBindings(?string $menuCode = null): PublicActionResult { $result = new PublicActionResult(); \Bitrix\Landing\Site\Type::setScope('KNOWLEDGE'); $bindings = \Bitrix\Landing\Binding\Menu::getList($menuCode); $result->setResult(self::removeEmptyBindings($bindings)); return $result; } /** * Returns exists bindings. * @param int|null $groupId Group id (only for this group). * @return PublicActionResult */ public static function getGroupBindings(?int $groupId = null): PublicActionResult { $result = new PublicActionResult(); \Bitrix\Landing\Site\Type::setScope('GROUP'); $bindings = \Bitrix\Landing\Binding\Group::getList($groupId); $result->setResult(self::removeEmptyBindings($bindings)); return $result; } }