%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/landing/lib/internals/ |
Current File : /home/bitrix/www/bitrix/modules/landing/lib/internals/landing.php |
<?php namespace Bitrix\Landing\Internals; use \Bitrix\Main\Localization\Loc; use \Bitrix\Main\Entity; use \Bitrix\Landing\Landing; use \Bitrix\Landing\Manager; use \Bitrix\Landing\TemplateRef; Loc::loadMessages(__FILE__); class LandingTable extends Entity\DataManager { /** * For save callbacks. */ const ACTION_TYPE_ADD = 'add'; /** * For save callbacks. */ const ACTION_TYPE_UPDATE = 'update'; /** * Stored fields for save separate. * @var array */ protected static $additionalFields = array(); /** * Returns DB table name for entity. * @return string */ public static function getTableName() { return 'b_landing'; } /** * Returns entity map definition. * @return array */ public static function getMap() { return array( 'ID' => new Entity\IntegerField('ID', array( 'primary' => true, 'autocomplete' => true, 'title' => 'ID' )), 'CODE' => new Entity\StringField('CODE', array( 'title' => Loc::getMessage('LANDING_TABLE_FIELD_LANDING_CODE') )), 'RULE' => new Entity\StringField('RULE', array( 'title' => Loc::getMessage('LANDING_TABLE_FIELD_RULE') )), 'ACTIVE' => new Entity\StringField('ACTIVE', array( 'title' => Loc::getMessage('LANDING_TABLE_FIELD_LANDING_ACTIVE'), 'default_value' => 'Y' )), 'DELETED' => new Entity\StringField('DELETED', array( 'title' => Loc::getMessage('LANDING_TABLE_FIELD_SITE_DELETED'), 'default_value' => 'N' )), 'PUBLIC' => new Entity\StringField('PUBLIC', array( 'title' => Loc::getMessage('LANDING_TABLE_FIELD_LANDING_PUBLIC'), 'default_value' => 'Y' )), 'TITLE' => new Entity\StringField('TITLE', array( 'title' => Loc::getMessage('LANDING_TABLE_FIELD_LANDING_TITLE'), 'required' => true )), 'XML_ID' => new Entity\StringField('XML_ID', array( 'title' => Loc::getMessage('LANDING_TABLE_FIELD_XML_ID') )), 'DESCRIPTION' => new Entity\StringField('DESCRIPTION', array( 'title' => Loc::getMessage('LANDING_TABLE_FIELD_DESCRIPTION') )), 'TPL_ID' => new Entity\IntegerField('TPL_ID', array( 'title' => Loc::getMessage('LANDING_TABLE_FIELD_TPL_ID') )), 'TPL_CODE' => new Entity\StringField('TPL_CODE', array( 'title' => Loc::getMessage('LANDING_TABLE_FIELD_TPL_CODE') )), 'SITE_ID' => new Entity\IntegerField('SITE_ID', array( 'title' => Loc::getMessage('LANDING_TABLE_FIELD_SITE_ID'), 'required' => true )), 'SITE' => new Entity\ReferenceField( 'SITE', 'Bitrix\Landing\Internals\SiteTable', array('=this.SITE_ID' => 'ref.ID') ), 'SITEMAP' => new Entity\StringField('SITEMAP', array( 'title' => Loc::getMessage('LANDING_TABLE_FIELD_LANDING_SITEMAP'), 'default_value' => 'N' )), 'FOLDER' => new Entity\StringField('FOLDER', array( 'title' => Loc::getMessage('LANDING_TABLE_FIELD_FOLDER'), 'default_value' => 'N' )), 'FOLDER_ID' => new Entity\IntegerField('FOLDER_ID', array( 'title' => Loc::getMessage('LANDING_TABLE_FIELD_FOLDER_ID') )), 'CREATED_BY_ID' => new Entity\IntegerField('CREATED_BY_ID', array( 'title' => Loc::getMessage('LANDING_TABLE_FIELD_CREATED_BY_ID'), 'required' => true )), 'CREATED_BY' => new Entity\ReferenceField( 'CREATED_BY', 'Bitrix\Main\UserTable', array('=this.CREATED_BY_ID' => 'ref.ID') ), 'MODIFIED_BY_ID' => new Entity\IntegerField('MODIFIED_BY_ID', array( 'title' => Loc::getMessage('LANDING_TABLE_FIELD_MODIFIED_BY_ID'), 'required' => true )), 'MODIFIED_BY' => new Entity\ReferenceField( 'MODIFIED_BY', 'Bitrix\Main\UserTable', array('=this.MODIFIED_BY_ID' => 'ref.ID') ), 'DATE_CREATE' => new Entity\DatetimeField('DATE_CREATE', array( 'title' => Loc::getMessage('LANDING_TABLE_FIELD_DATE_CREATE'), 'required' => true )), 'DATE_MODIFY' => new Entity\DatetimeField('DATE_MODIFY', array( 'title' => Loc::getMessage('LANDING_TABLE_FIELD_DATE_MODIFY'), 'required' => true )), 'DATE_PUBLIC' => new Entity\DatetimeField('DATE_PUBLIC', array( 'title' => Loc::getMessage('LANDING_TABLE_FIELD_DATE_PUBLIC') )) ); } /** * Set additional access filter. * @param mixed $params ORM params. * @return mixed */ public static function setAccessFilter($params) { /*if ( !isset($params['filter']) || !is_array($params['filter']) ) { $params['filter'] = array(); } $params['filter'][] = array( 'ID' => array(251, 260) );*/ return $params; } /** * Prepare change to save. * @param Entity\Event $event Event instance. * @param string $actionType Action type: add / update. * @return Entity\EventResult */ protected static function prepareChange(Entity\Event $event, $actionType) { $result = new Entity\EventResult(); $primary = $event->getParameter('primary'); $fields = $event->getParameter('fields'); $modifyFields = array(); // if delete, set unpublic always if (isset($fields['DELETED'])) { $modifyFields['ACTIVE'] = 'N'; } // additional fields save after if (array_key_exists('ADDITIONAL_FIELDS', $fields)) { self::$additionalFields = $fields['ADDITIONAL_FIELDS']; $result->unsetFields(array('ADDITIONAL_FIELDS')); } else { self::$additionalFields = array(); } // slash in CODE is not allowed if ( array_key_exists('CODE', $fields) && strpos($fields['CODE'], '/') !== false ) { $result->setErrors(array( new Entity\EntityError( Loc::getMessage('LANDING_TABLE_ERROR_SLASH_IS_NOT_ALLOWED'), 'SLASH_IS_NOT_ALLOWED' ) )); return $result; } // CODE can't be empty elseif ( array_key_exists('CODE', $fields) && $fields['CODE'] == '' ) { $result->setErrors(array( new Entity\EntityError( Loc::getMessage('LANDING_TABLE_ERROR_CANT_BE_EMPTY'), 'CANT_BE_EMPTY' ) )); return $result; } elseif ( $actionType == self::ACTION_TYPE_ADD && array_key_exists('TITLE', $fields) && (!array_key_exists('CODE', $fields) || trim($fields['CODE']) == '') ) { $fields['CODE'] = \CUtil::translit( trim($fields['TITLE']), LANGUAGE_ID, array( 'replace_space' => '', 'replace_other' => '' )); $modifyFields['CODE'] = $fields['CODE']; } // check rights for landing site if (array_key_exists('SITE_ID', $fields)) { // for check rights call upper level $res = \Bitrix\Landing\Site::getList(array( 'select' => array( 'ID' ), 'filter' => array( 'ID' => $fields['SITE_ID'] ) )); if (!$res->fetch()) { $result->setErrors(array( new Entity\EntityError( Loc::getMessage('LANDING_TABLE_ERROR_SITE_NOT_FOUND'), 'SITE_NOT_FOUND' ) )); } } // check CODE unique in site group if (array_key_exists('CODE', $fields)) { // get site id if no exists if (!array_key_exists('SITE_ID', $fields) && $primary) { $site = self::getById($primary['ID'])->fetch(); $fields['SITE_ID'] = $site['SITE_ID']; } Landing::disableCheckDeleted(); $i = 0; do { $newCode = $fields['CODE'] . ($i++ > 0 ? $i : ''); $res = self::getList(array( 'select' => array( 'ID' ), 'filter' => array( '!ID' => $primary ? $primary['ID'] : 0, 'SITE_ID' => $fields['SITE_ID'], '=CODE' => $newCode ) )); } while ($res->fetch()); Landing::enableCheckDeleted(); $fields['CODE'] = $newCode; $modifyFields['CODE'] = $fields['CODE']; } $result->modifyFields($modifyFields); // all code blocks below promptly return result ! // check if folder_id is folder if ( array_key_exists('FOLDER_ID', $fields) && $fields['FOLDER_ID'] > 0 ) { $res = self::getList(array( 'select' => array( 'FOLDER' ), 'filter' => array( 'ID' => $fields['FOLDER_ID'], '=FOLDER' => 'Y' ) )); if (!$res->fetch()) { $result->setErrors(array( new Entity\EntityError( Loc::getMessage('LANDING_TABLE_ERROR_ISNOT_FOLDER'), 'ISNOT_FOLDER' ) )); return $result; } } // subfolder disabled if ( array_key_exists('FOLDER', $fields) && $fields['FOLDER'] == 'Y' ) { if (!array_key_exists('FOLDER_ID', $fields)) { $fields['FOLDER_ID'] = 0; if ($primary) { $row = self::getList(array( 'select' => array( 'FOLDER_ID' ), 'filter' => array( 'ID' => $primary['ID'] ) ))->fetch(); $fields['FOLDER_ID'] = $row['FOLDER_ID']; } } if ($fields['FOLDER_ID'] > 0) { $result->setErrors(array( new Entity\EntityError( Loc::getMessage('LANDING_TABLE_ERROR_SUBFOLDER_DISABLED'), 'SUBFOLDER_DISABLED' ) )); return $result; } } return $result; } /** * Get entity rows. * @param array $params Params array. * @return \Bitrix\Main\ORM\Query\Result */ public static function getList(array $params = array()) { if (Landing::checkDeleted()) { if ( !isset($params['filter']) || !is_array($params['filter']) ) { $params['filter'] = array(); } if ( !isset($params['filter']['DELETED']) && !isset($params['filter']['=DELETED']) ) { $params['filter']['=DELETED'] = 'N'; } if ( !isset($params['filter']['SITE.DELETED']) && !isset($params['filter']['=SITE.DELETED']) ) { $params['filter']['=SITE.DELETED'] = 'N'; } } return parent::getList($params); } /** * Before add handler. * @param Entity\Event $event Event instance. * @return Entity\EventResult */ public static function OnBeforeAdd(Entity\Event $event) { // check page limit if (!Manager::checkFeature(Manager::FEATURE_CREATE_PAGE)) { $result = new Entity\EventResult(); $result->unsetFields(array('ADDITIONAL_FIELDS')); $result->setErrors(array( new Entity\EntityError( Loc::getMessage('LANDING_TABLE_ERROR_PAGE_LIMIT_REACHED'), 'ERROR_PAGE_LIMIT_REACHED' ) )); return $result; } return self::prepareChange($event, self::ACTION_TYPE_ADD); } /** * Before update handler. * @param Entity\Event $event Event instance. * @return Entity\EventResult */ public static function OnBeforeUpdate(Entity\Event $event) { return self::prepareChange($event, self::ACTION_TYPE_UPDATE); } /** * Before delete handler. * @param Entity\Event $event Event instance. * @return Entity\EventResult */ public static function OnBeforeDelete(Entity\Event $event) { $result = new Entity\EventResult(); $primary = $event->getParameter('primary'); if ($primary) { $res = self::getList(array( 'select' => array( 'ID' ), 'filter' => array( 'FOLDER_ID' => $primary['ID'] ), 'limit' => 1 )); if ($res->fetch()) { $result->setErrors(array( new Entity\EntityError( Loc::getMessage('LANDING_TABLE_ERROR_PAGE_FOLDER_NOT_EMPTY'), 'ERROR_PAGE_FOLDER_NOT_EMPTY' ) )); } } return $result; } /** * Save additional fields after add / update. * @param Entity\Event $event Event instance. * @return Entity\EventResult */ protected static function saveAdditionalFields(Entity\Event $event) { $result = new Entity\EventResult(); if (!empty(self::$additionalFields)) { $primary = $event->getParameter('primary'); Landing::saveAdditionalFields( $primary['ID'], self::$additionalFields ); } return $result; } /** * After add handler. * @param Entity\Event $event Event instance. * @return Entity\EventResult */ public static function OnAfterAdd(Entity\Event $event) { $primary = $event->getParameter('primary'); $fields = $event->getParameter('fields'); // set current landing as index, if this is single page if ($primary && isset($fields['SITE_ID'])) { $res = self::getList(array( 'select' => array( 'ID' ), 'filter' => array( 'SITE_ID' => $fields['SITE_ID'] ), 'limit' => 2 )); if (count($res->fetchAll()) == 1) { SiteTable::update($fields['SITE_ID'], array( 'LANDING_ID_INDEX' => $primary['ID'] )); } } return self::saveAdditionalFields($event); } /** * After update handler. * @param Entity\Event $event Event instance. * @return Entity\EventResult */ public static function OnAfterUpdate(Entity\Event $event) { // for B24 we must update domain $fields = $event->getParameter('fields'); if ( array_key_exists('SITE_ID', $fields) && Manager::isB24() ) { \Bitrix\Landing\Site::update( $fields['SITE_ID'], array() ); } return self::saveAdditionalFields($event); } /** * After delete handler. * @param Entity\Event $event Event instance. * @return void */ public static function OnAfterDelete(Entity\Event $event) { $primary = $event->getParameter('primary'); if (isset($primary['ID'])) { \Bitrix\Landing\File::deleteFromLanding($primary['ID']); \Bitrix\Landing\Syspage::deleteForLanding($primary['ID']); \Bitrix\Landing\Hook::deleteForLanding($primary['ID']); \Bitrix\Landing\TemplateRef::deleteArea($primary['ID']); \Bitrix\Landing\TemplateRef::setForLanding($primary['ID'], array()); // if delete index page, make new page is index $res = \Bitrix\Landing\Site::getList(array( 'select' => array( 'ID' ), 'filter' => array( 'LANDING_ID_INDEX' => $primary['ID'] ) )); if ($site = $res->fetch()) { $res = Landing::getList(array( 'select' => array( 'ID' ), 'filter' => array( 'SITE_ID' => $site['ID'], '=ACTIVE' => 'Y' ), 'order' => array( 'ID' => 'asc' ) )); while ($page = $res->fetch()) { if (!TemplateRef::landingIsArea($page['ID'])) { \Bitrix\Landing\Site::update( $site['ID'], array( 'LANDING_ID_INDEX' => $page['ID'] ) ); break; } } } } } }