Esempio n. 1
0
 private static function getInstance()
 {
     if (self::$instance) {
         return self::$instance;
     }
     $loader = new BitrixLoader($_SERVER['DOCUMENT_ROOT']);
     $c = Configuration::getInstance();
     $config = $c->get('maximaster');
     $twigConfig = (array) $config['tools']['twig'];
     $defaultConfig = array('debug' => false, 'charset' => SITE_CHARSET, 'cache' => $_SERVER['DOCUMENT_ROOT'] . '/bitrix/cache/maximaster/tools.twig', 'auto_reload' => isset($_GET['clear_cache']) && strtoupper($_GET['clear_cache']) == 'Y', 'autoescape' => false);
     $twigOptions = array_merge($defaultConfig, $twigConfig);
     $twig = new \Twig_Environment($loader, $twigOptions);
     if ($twig->isDebug()) {
         $twig->addExtension(new \Twig_Extension_Debug());
     }
     $twig->addExtension(new BitrixExtension());
     $twig->addExtension(new CustomFunctionsExtension());
     $event = new Event('', 'onAfterTwigTemplateEngineInited', array($twig));
     $event->send();
     if ($event->getResults()) {
         foreach ($event->getResults() as $evenResult) {
             if ($evenResult->getType() == \Bitrix\Main\EventResult::SUCCESS) {
                 $twig = current($evenResult->getParameters());
             }
         }
     }
     return self::$instance = $twig;
 }
Esempio n. 2
0
 public static function initClassesList()
 {
     if (static::$classes !== null) {
         return true;
     }
     $classes = array('\\Bitrix\\Sale\\Delivery\\ExtraServices\\Enum' => 'lib/delivery/extra_services/enum.php', '\\Bitrix\\Sale\\Delivery\\ExtraServices\\Store' => 'lib/delivery/extra_services/store.php', '\\Bitrix\\Sale\\Delivery\\ExtraServices\\String' => 'lib/delivery/extra_services/string.php', '\\Bitrix\\Sale\\Delivery\\ExtraServices\\Checkbox' => 'lib/delivery/extra_services/checkbox.php');
     \Bitrix\Main\Loader::registerAutoLoadClasses('sale', $classes);
     unset($classes['\\Bitrix\\Sale\\Delivery\\ExtraServices\\Store']);
     static::$classes = array_keys($classes);
     $event = new Event('sale', 'onSaleDeliveryExtraServicesClassNamesBuildList');
     $event->send();
     $resultList = $event->getResults();
     if (is_array($resultList) && !empty($resultList)) {
         $customClasses = array();
         foreach ($resultList as $eventResult) {
             /** @var  EventResult $eventResult*/
             if ($eventResult->getType() != EventResult::SUCCESS) {
                 throw new SystemException("Can't add custom tracking class successfully");
             }
             $params = $eventResult->getParameters();
             if (!empty($params) && is_array($params)) {
                 $customClasses = array_merge($customClasses, $params);
             }
         }
         if (!empty($customClasses)) {
             \Bitrix\Main\Loader::registerAutoLoadClasses(null, $customClasses);
             $classes = array_merge($customClasses, $classes);
         }
     }
     static::$classes = array_merge(array_keys($classes), static::$classes);
     return static::$classes;
 }
Esempio n. 3
0
 /**
  * Создается событие для внесения в Twig изменения из проекта
  */
 private function generateInitEvent()
 {
     $eventName = 'onAfterTwigTemplateEngineInited';
     $event = new Event('', $eventName, array($this->engine));
     $event->send();
     if ($event->getResults()) {
         foreach ($event->getResults() as $evenResult) {
             if ($evenResult->getType() == \Bitrix\Main\EventResult::SUCCESS) {
                 $twig = current($evenResult->getParameters());
                 if (!$twig instanceof \Twig_Environment) {
                     throw new \LogicException("Событие '{$eventName}' должно возвращать экземпляр класса '\\Twig_Environment' при успешной отработке");
                 }
                 $this->engine = $twig;
             }
         }
     }
 }
Esempio n. 4
0
 public static function isSuccess(\Bitrix\Main\Event $event)
 {
     foreach ($event->getResults() as $result) {
         if ($result->getType() === EventResult::ERROR) {
             return false;
         }
     }
     return true;
 }
Esempio n. 5
0
 /**
  * @return array
  */
 public static function getList()
 {
     $resultList = array();
     $event = new Event('sender', 'OnPresetTemplateList');
     $event->send();
     if ($event->getResults()) {
         foreach ($event->getResults() as $eventResult) {
             if ($eventResult->getType() == EventResult::ERROR) {
                 continue;
             }
             $eventResultParameters = $eventResult->getParameters();
             if (!empty($eventResultParameters)) {
                 $resultList = array_merge($resultList, $eventResultParameters);
             }
         }
     }
     return $resultList;
 }
Esempio n. 6
0
 /**
  * Добавляет расширения, в том числе расширение для битрикса,
  * в котором добавляются нужные глобальные переменные и т.п.
  */
 private function addExtensions()
 {
     $this->getEnvironment()->addExtension(new \Twig_Extension_Debug());
     $this->getEnvironment()->addExtension(new BitrixExtension());
     $event = new Event('wlbl.twigrix', 'onAddExtensions');
     $event->send();
     foreach ($event->getResults() as $result) {
         if ($result->getType() == EventResult::SUCCESS) {
             foreach ($result->getParameters() as $extension) {
                 if ($extension instanceof \Twig_Extension) {
                     $this->getEnvironment()->addExtension($extension);
                 }
             }
         }
     }
 }
Esempio n. 7
0
 protected function __construct()
 {
     $event = new Main\Event("main", "OnApplicationsBuildList");
     $event->send();
     foreach ($event->getResults() as $eventResult) {
         $result = $eventResult->getParameters();
         if (is_array($result)) {
             if (!is_array($result[0])) {
                 $result = array($result);
             }
             foreach ($result as $app) {
                 $this->applications[$app["ID"]] = $app;
             }
         }
     }
     Main\Type\Collection::sortByColumn($this->applications, "SORT");
 }
Esempio n. 8
0
 public static function getUserByPassword($login, $password, $passwordIsOriginal = true)
 {
     if (empty($login)) {
         throw new Main\ArgumentNullException("login");
     }
     $event = new Main\Event("main", "OnBeforeUserLogin", array(array("LOGIN" => $login, "PASSWORD" => $password, "PASSWORD_ORIGINAL" => $passwordIsOriginal)));
     $event->send();
     if (($eventResults = $event->getResults()) !== null) {
         foreach ($eventResults as $eventResult) {
             if ($eventResult->getResultType() === Main\EventResult::ERROR) {
                 static::$lastError = $eventResult->getParameters();
                 return null;
             } elseif ($eventResult->getResultType() === Main\EventResult::SUCCESS) {
                 if (($resultParams = $eventResult->getParameters()) && is_array($resultParams)) {
                     if (isset($resultParams["LOGIN"])) {
                         $login = $resultParams["LOGIN"];
                     }
                     if (isset($resultParams["PASSWORD"])) {
                         $password = $resultParams["PASSWORD"];
                     }
                     if (isset($resultParams["PASSWORD_ORIGINAL"])) {
                         $passwordIsOriginal = $resultParams["PASSWORD_ORIGINAL"];
                     }
                 }
             }
         }
     }
     $user = null;
     $event = new Main\Event("main", "OnUserLoginExternal", array(array("LOGIN" => $login, "PASSWORD" => $password, "PASSWORD_ORIGINAL" => $passwordIsOriginal)));
     $event->send();
     if (($eventResults = $event->getResults()) !== null) {
         foreach ($eventResults as $eventResult) {
             if ($eventResult->getResultType() === Main\EventResult::SUCCESS) {
                 $userId = $eventResult->getParameters();
                 if (!Main\Type\Int::isInteger($userId)) {
                     throw new SecurityException();
                 }
                 $user = new CurrentUser($userId);
                 break;
             }
         }
     }
     $connection = Main\Application::getDbConnection();
     $sqlHelper = $connection->getSqlHelper();
     if (is_null($user)) {
         $sql = "SELECT U.ID, U.PASSWORD, U.LOGIN_ATTEMPTS " . "FROM b_user U  " . "WHERE U.LOGIN = '******' " . "\tAND (U.EXTERNAL_AUTH_ID IS NULL OR U.EXTERNAL_AUTH_ID = '') " . "   AND U.ACTIVE = 'Y' ";
         $userRecordset = $connection->query($sql);
         if ($userRecord = $userRecordset->fetch()) {
             $userTmp = new CurrentUser($userRecord["ID"]);
             $salt = substr($userRecord["PASSWORD"], 0, -32);
             $passwordFromDb = substr($userRecord["PASSWORD"], -32);
             if ($passwordIsOriginal) {
                 $passwordFromUser = md5($salt . $password);
             } else {
                 $passwordFromUser = strlen($password) > 32 ? substr($password, -32) : $password;
             }
             $policy = $userTmp->getPolicy();
             $policyLoginAttempts = intval($policy["LOGIN_ATTEMPTS"]);
             $userLoginAttempts = intval($userRecord["LOGIN_ATTEMPTS"]) + 1;
             if ($policyLoginAttempts > 0 && $userLoginAttempts > $policyLoginAttempts) {
                 //					$_SESSION["BX_LOGIN_NEED_CAPTCHA"] = true;
                 //					if (!$APPLICATION->captchaCheckCode($_REQUEST["captcha_word"], $_REQUEST["captcha_sid"]))
                 //					{
                 //						$passwordUser = false;
                 //					}
             }
             if ($passwordFromDb === $passwordFromUser) {
                 $user = $userTmp;
                 //update digest hash for http digest authorization
                 if ($passwordIsOriginal && Main\Config\Option::get('main', 'use_digest_auth', 'N') == 'Y') {
                     static::updateDigest($user->getUserId(), $password);
                 }
             } else {
                 $connection->query("UPDATE b_user SET " . "   LOGIN_ATTEMPTS = " . $userLoginAttempts . " " . "WHERE ID = " . intval($userRecord["ID"]));
             }
         }
     }
     if (is_null($user)) {
         if (Main\Config\Option::get("main", "event_log_login_fail", "N") === "Y") {
             \CEventLog::log("SECURITY", "USER_LOGIN", "main", $login, "LOGIN_FAILED");
         }
         return null;
     }
     if ($user->getUserId() !== 1) {
         $limitUsersCount = intval(Main\Config\Option::get("main", "PARAM_MAX_USERS", 0));
         if ($limitUsersCount > 0) {
             $usersCount = Main\UserTable::getActiveUsersCount();
             if ($usersCount > $limitUsersCount) {
                 $sql = "SELECT 'x' " . "FROM b_user " . "WHERE ACTIVE = 'Y' " . "   AND ID = " . intval($user->getUserId()) . " " . "   AND LAST_LOGIN IS NULL ";
                 $recordset = $connection->query($sql);
                 if ($recordset->fetch()) {
                     $user = null;
                     static::$lastError = array("CODE" => "LIMIT_USERS_COUNT", "MESSAGE" => Main\Localization\Loc::getMessage("LIMIT_USERS_COUNT"));
                 }
             }
         }
     }
     if (is_null($user)) {
         if (Main\Config\Option::get("main", "event_log_login_fail", "N") === "Y") {
             \CEventLog::log("SECURITY", "USER_LOGIN", "main", $login, "LIMIT_USERS_COUNT");
         }
         return null;
     }
     $user->setAuthType(static::AUTHENTICATED_BY_PASSWORD);
     $event = new \Bitrix\Main\Event("main", "OnAfterUserLogin", array(array("LOGIN" => $login, "PASSWORD" => $password, "PASSWORD_ORIGINAL" => $passwordIsOriginal, "USER_ID" => $user->getUserId())));
     $event->send();
     return $user;
 }
Esempio n. 9
0
 /**
  * @param array $arData
  * @return bool
  */
 public static function read(array $arData)
 {
     if (array_key_exists('MODULE_ID', $arData)) {
         $filter = array($arData['MODULE_ID']);
     } else {
         $filter = null;
     }
     $event = new \Bitrix\Main\Event("main", "OnMailEventMailRead", array($arData['FIELDS']), $filter);
     $event->send();
     foreach ($event->getResults() as $eventResult) {
         if ($eventResult->getType() == \Bitrix\Main\EventResult::ERROR) {
             return false;
         }
     }
     return true;
 }
Esempio n. 10
0
 /**
  * @param $arData
  * @return bool
  */
 public static function unsubscribe($arData)
 {
     if (!is_array($arData['FIELDS'])) {
         return false;
     }
     $event = new Event("main", "OnMailEventSubscriptionDisable", array($arData['FIELDS']), array($arData['MODULE_ID']));
     $event->send();
     foreach ($event->getResults() as $eventResult) {
         if ($eventResult->getType() == EventResult::ERROR) {
             return false;
         }
     }
     return true;
 }
Esempio n. 11
0
 /**
  * @return Entity\Result|bool
  * @throws \Bitrix\Main\ArgumentException
  * @throws \Bitrix\Main\ArgumentNullException
  */
 public function save()
 {
     $result = new Result();
     /** @var Order $order */
     $order = $this->getOrder();
     $itemsFromDb = array();
     $filter = array();
     if (!$order) {
         /** @var Main\Entity\Event $event */
         $event = new Main\Event('sale', EventActions::EVENT_ON_BASKET_BEFORE_SAVED, array('ENTITY' => $this));
         $event->send();
         if ($event->getResults()) {
             /** @var Main\EventResult $eventResult */
             foreach ($event->getResults() as $eventResult) {
                 if ($eventResult->getType() == Main\EventResult::ERROR) {
                     $errorMsg = new ResultError(Main\Localization\Loc::getMessage('SALE_EVENT_ON_BEFORE_BASKET_SAVED'), 'SALE_EVENT_ON_BEFORE_BASKET_SAVED');
                     if ($eventResultData = $eventResult->getParameters()) {
                         if (isset($eventResultData) && $eventResultData instanceof ResultError) {
                             /** @var ResultError $errorMsg */
                             $errorMsg = $eventResultData;
                         }
                     }
                     $result->addError($errorMsg);
                 }
             }
             if (!$result->isSuccess()) {
                 return $result;
             }
         }
     }
     $isNew = $order && $order->isNew() ? true : false;
     if ($order && !$isNew) {
         $filter['ORDER_ID'] = $order->getId();
     } else {
         if ($this->isLoadForFuserId()) {
             $filter = array('FUSER_ID' => $this->getFUserId(), 'ORDER_ID' => null, 'LID' => $this->getSiteId());
         }
         if ($isNew) {
             $fUserId = $this->getFUserId(true);
             if ($fUserId <= 0) {
                 $userId = $order->getUserId();
                 if (intval($userId) > 0) {
                     $fUserId = Fuser::getIdByUserId($userId);
                     if ($fUserId > 0) {
                         $this->setFUserId($fUserId);
                     }
                 }
             }
         }
     }
     if (!empty($filter)) {
         $itemsFromDbList = Internals\BasketTable::getList(array("filter" => $filter, "select" => array("ID", 'TYPE', 'SET_PARENT_ID', 'PRODUCT_ID', 'NAME', 'QUANTITY', 'FUSER_ID', 'ORDER_ID')));
         while ($itemsFromDbItem = $itemsFromDbList->fetch()) {
             if (intval($itemsFromDbItem['SET_PARENT_ID']) > 0 && intval($itemsFromDbItem['SET_PARENT_ID']) != $itemsFromDbItem['ID']) {
                 continue;
             }
             $itemsFromDb[$itemsFromDbItem["ID"]] = $itemsFromDbItem;
         }
     }
     if ($order && ($order->getId() > 0 && $this->getOrderId() == 0)) {
         $this->orderId = $order->getId();
     }
     $changeMeaningfulFields = array("PRODUCT_ID", "QUANTITY", "PRICE", "DISCOUNT_VALUE", "VAT_RATE", "NAME");
     /** @var BasketItem $basketItem */
     foreach ($this->collection as $index => $basketItem) {
         $isNew = (bool) ($basketItem->getId() <= 0);
         $isChanged = $basketItem->isChanged();
         if ($order && $order->getId() > 0 && $isChanged) {
             $logFields = array();
             $fields = $basketItem->getFields();
             $originalValues = $fields->getOriginalValues();
             foreach ($originalValues as $originalFieldName => $originalFieldValue) {
                 if (in_array($originalFieldName, $changeMeaningfulFields) && $basketItem->getField($originalFieldName) != $originalFieldValue) {
                     $logFields[$originalFieldName] = $basketItem->getField($originalFieldName);
                     $logFields['OLD_' . $originalFieldName] = $originalFieldValue;
                 }
             }
         }
         $r = $basketItem->save();
         if ($r->isSuccess()) {
             if ($order && $order->getId() > 0) {
                 if ($isChanged) {
                     OrderHistory::addLog('BASKET', $order->getId(), $isNew ? "BASKET_ITEM_ADD" : "BASKET_ITEM_UPDATE", $basketItem->getId(), $basketItem, $logFields, OrderHistory::SALE_ORDER_HISTORY_LOG_LEVEL_1);
                     OrderHistory::addAction('BASKET', $order->getId(), "BASKET_SAVED", $basketItem->getId(), $basketItem);
                 }
             }
         } else {
             $result->addErrors($r->getErrors());
         }
         if (isset($itemsFromDb[$basketItem->getId()]) && $basketItem->getQuantity() > 0) {
             unset($itemsFromDb[$basketItem->getId()]);
         }
     }
     if (!empty($filter)) {
         $itemEventName = BasketItem::getEntityEventName();
         foreach ($itemsFromDb as $k => $v) {
             /** @var Main\Event $event */
             $event = new Main\Event('sale', "OnBefore" . $itemEventName . "Deleted", array('VALUES' => $v));
             $event->send();
             if ($v['TYPE'] == static::TYPE_SET) {
                 if ($order && $order->getId() > 0) {
                     OrderHistory::addLog('BASKET', $order->getId(), 'BASKET_ITEM_DELETE_BUNDLE', $k, null, array("PRODUCT_ID" => $v["PRODUCT_ID"], "NAME" => $v["NAME"], "QUANTITY" => $v["QUANTITY"]), OrderHistory::SALE_ORDER_HISTORY_LOG_LEVEL_1);
                 }
                 Internals\BasketTable::deleteBundle($k);
             } else {
                 if ($order && $order->getId() > 0) {
                     OrderHistory::addLog('BASKET', $order->getId(), 'BASKET_ITEM_DELETED', $k, null, array("PRODUCT_ID" => $v["PRODUCT_ID"], "NAME" => $v["NAME"], "QUANTITY" => $v["QUANTITY"]), OrderHistory::SALE_ORDER_HISTORY_LOG_LEVEL_1);
                 }
                 Internals\BasketTable::deleteWithItems($k);
             }
             /** @var Main\Event $event */
             $event = new Main\Event('sale', "On" . $itemEventName . "Deleted", array('VALUES' => $v));
             $event->send();
             /** @var Order $order */
             if ($order && $order->getId() > 0) {
                 OrderHistory::addAction('BASKET', $order->getId(), 'BASKET_REMOVED', $k, null, array('NAME' => $v['NAME'], 'QUANTITY' => $v['QUANTITY'], 'PRODUCT_ID' => $v['PRODUCT_ID']));
             }
         }
     }
     if ($order && $order->getId() > 0) {
         OrderHistory::collectEntityFields('BASKET', $order->getId());
     }
     if (!$order) {
         /** @var Main\Entity\Event $event */
         $event = new Main\Event('sale', EventActions::EVENT_ON_BASKET_SAVED, array('ENTITY' => $this));
         $event->send();
         if ($event->getResults()) {
             /** @var Main\EventResult $eventResult */
             foreach ($event->getResults() as $eventResult) {
                 if ($eventResult->getType() == Main\EventResult::ERROR) {
                     $errorMsg = new ResultError(Main\Localization\Loc::getMessage('SALE_EVENT_ON_BASKET_SAVED'), 'SALE_EVENT_ON_BASKET_SAVED');
                     if ($eventResultData = $eventResult->getParameters()) {
                         if (isset($eventResultData) && $eventResultData instanceof ResultError) {
                             /** @var ResultError $errorMsg */
                             $errorMsg = $eventResultData;
                         }
                     }
                     $result->addError($errorMsg);
                 }
             }
             if (!$result->isSuccess()) {
                 return $result;
             }
         }
     }
     return $result;
 }
Esempio n. 12
0
 /**
  *
  * @param array $values
  * @return Result
  * @throws Main\ArgumentOutOfRangeException
  * @throws Main\NotSupportedException
  * @throws \Exception
  */
 public function setFields(array $values)
 {
     $resultData = array();
     $result = new Result();
     $oldValues = null;
     foreach ($values as $key => $value) {
         $oldValues[$key] = $this->fields->get($key);
     }
     if ($eventName = static::getEntityEventName()) {
         $event = new Main\Event('sale', 'OnBefore' . $eventName . 'SetFields', array('ENTITY' => $this, 'VALUES' => $values, 'OLD_VALUES' => $oldValues));
         $event->send();
         if ($event->getResults()) {
             /** @var Main\EventResult $eventResult */
             foreach ($event->getResults() as $eventResult) {
                 if ($eventResult->getType() == Main\EventResult::SUCCESS) {
                     if ($eventResultData = $eventResult->getParameters()) {
                         if (isset($eventResultData['VALUES'])) {
                             $values = $eventResultData['VALUES'];
                         }
                     }
                 } elseif ($eventResult->getType() == Main\EventResult::ERROR) {
                     $errorMsg = new ResultError(Main\Localization\Loc::getMessage('SALE_EVENT_ON_BEFORE_' . strtoupper($eventName) . '_SET_FIELDS_ERROR'), 'SALE_EVENT_ON_BEFORE_' . strtoupper($eventName) . '_SET_FIELDS_ERROR');
                     if ($eventResultData = $eventResult->getParameters()) {
                         if (isset($eventResultData['ERROR']) && $eventResultData['ERROR'] instanceof ResultError) {
                             $errorMsg = $eventResultData['ERROR'];
                         }
                     }
                     $result->addError($errorMsg);
                 }
             }
         }
     }
     if (!$result->isSuccess()) {
         return $result;
     }
     $isStartField = $this->isStartField();
     foreach ($values as $key => $value) {
         $r = $this->setField($key, $value);
         if (!$r->isSuccess()) {
             $data = $r->getData();
             if (!empty($data) && is_array($data)) {
                 $resultData = array_merge($resultData, $data);
             }
             $result->addErrors($r->getErrors());
         }
     }
     if (!empty($resultData)) {
         $result->setData($resultData);
     }
     if ($isStartField) {
         $hasMeaningfulFields = $this->hasMeaningfulField();
         /** @var Result $r */
         $r = $this->doFinalAction($hasMeaningfulFields);
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
         } else {
             if (($data = $r->getData()) && !empty($data) && is_array($data)) {
                 $result->setData($result->getData() + $data);
             }
         }
     }
     return $result;
 }
Esempio n. 13
0
 /**
  * @param bool $hasMeaningfulField
  * @return Result
  * @throws Main\ArgumentNullException
  * @throws Main\ObjectNotFoundException
  */
 public function doFinalAction($hasMeaningfulField = false)
 {
     $result = new Result();
     if (!$hasMeaningfulField) {
         $this->clearStartField();
         return $result;
     }
     if ($basket = $this->getBasket()) {
         $this->setMathActionOnly(true);
         if ($eventName = static::getEntityEventName()) {
             $event = new Main\Event('sale', 'OnBefore' . $eventName . 'FinalAction', array('ENTITY' => $this, 'HAS_MEANINGFUL_FIELD' => $hasMeaningfulField, 'BASKET' => $basket));
             $event->send();
             if ($event->getResults()) {
                 /** @var Main\EventResult $eventResult */
                 foreach ($event->getResults() as $eventResult) {
                     if ($eventResult->getType() == Main\EventResult::ERROR) {
                         $errorMsg = new ResultError(Main\Localization\Loc::getMessage('SALE_EVENT_ON_BEFORE_' . strtoupper($eventName) . '_FINAL_ACTION_ERROR'), 'SALE_EVENT_ON_BEFORE_' . strtoupper($eventName) . '_FINAL_ACTION_ERROR');
                         if ($eventResultData = $eventResult->getParameters()) {
                             if (isset($eventResultData['ERROR']) && $eventResultData['ERROR'] instanceof ResultError) {
                                 $errorMsg = $eventResultData['ERROR'];
                             }
                         }
                         $result->addError($errorMsg);
                     }
                 }
             }
             if (!$result->isSuccess()) {
                 return $result;
             }
         }
         // discount
         $discount = $this->getDiscount();
         $r = $discount->calculate();
         if (!$r->isSuccess()) {
             //				$this->clearStartField();
             //				$result->addErrors($r->getErrors());
             //				return $result;
         }
         if ($r->isSuccess() && ($discountData = $r->getData()) && !empty($discountData) && is_array($discountData)) {
             /** @var Result $r */
             $r = $this->applyDiscount($discountData);
             if (!$r->isSuccess()) {
                 $result->addErrors($r->getErrors());
                 return $result;
             }
         }
         if (!$this->isExternal()) {
             /** @var Tax $tax */
             $tax = $this->getTax();
             /** @var Result $r */
             $r = $tax->calculate();
             if (!$result->isSuccess()) {
                 return $r;
             }
             $r = $tax->calculateDelivery();
             if (!$result->isSuccess()) {
                 return $r;
             }
             $taxChanged = false;
             $taxResult = $r->getData();
             if (isset($taxResult['TAX_PRICE']) && floatval($taxResult['TAX_PRICE']) >= 0) {
                 if (!$this->isUsedVat()) {
                     $taxChanged = true;
                     $this->setField('TAX_PRICE', $taxResult['TAX_PRICE']);
                     $this->setFieldNoDemand("PRICE", $this->getBasket()->getPrice() + $this->getShipmentCollection()->getPriceDelivery() + $taxResult['TAX_PRICE']);
                 }
             }
             if ($taxChanged || $this->isUsedVat()) {
                 $taxValue = $this->isUsedVat() ? $this->getVatSum() : $this->getField('TAX_PRICE');
                 if (floatval($taxValue) != floatval($this->getField('TAX_VALUE'))) {
                     $this->setField('TAX_VALUE', floatval($taxValue));
                 }
             }
         }
     }
     //
     $this->setMathActionOnly(false);
     //
     /** @var Result $r */
     $r = $this->syncOrderAndPayments();
     if (!$r->isSuccess()) {
         $result->addErrors($r->getErrors());
     }
     $this->clearStartField();
     if ($eventName = static::getEntityEventName()) {
         $event = new Main\Event('sale', 'OnAfter' . $eventName . 'FinalAction', array('ENTITY' => $this));
         $event->send();
     }
     return $result;
 }
Esempio n. 14
0
            $bCanEdit = false;
        }
        //need fm_lpa for every .php file, even with no php code inside
        if ($bCanEdit && !$USER->CanDoOperation('edit_php') && in_array(GetFileExtension($currentFilePath), GetScriptFileExt()) && !$USER->CanDoFileOperation('fm_lpa', array(SITE_ID, $currentFilePath))) {
            $bCanEdit = false;
        }
        if ($bCanEdit && IsModuleInstalled("fileman") && !($USER->CanDoOperation("fileman_admin_files") && $USER->CanDoOperation("fileman_edit_existent_files"))) {
            $bCanEdit = false;
        }
        if ($bCanEdit) {
            echo $APPLICATION->IncludeStringBefore();
            $BX_GLOBAL_AREA_EDIT_ICON = true;
        }
    }
}
define("START_EXEC_PROLOG_AFTER_2", microtime());
$GLOBALS["BX_STATE"] = "WA";
$APPLICATION->RestartWorkarea(true);
//magically replacing the current file with another one
$event = new Main\Event("main", "OnFileRewrite", array("path" => Main\Context::getCurrent()->getRequest()->getScriptFile()));
$event->send();
foreach ($event->getResults() as $evenResult) {
    if (($result = $evenResult->getParameters()) != '') {
        $file = new Main\IO\File($_SERVER["DOCUMENT_ROOT"] . $result);
        if ($file->isExists()) {
            //only the first result matters
            include $file->getPhysicalPath();
            die;
        }
    }
}
Esempio n. 15
0
 /**
  * Calculates delivery price
  * @param \Bitrix\Sale\Shipment $shipment.
  * @return \Bitrix\Sale\Delivery\CalculationResult
  */
 public function calculate(\Bitrix\Sale\Shipment $shipment = null)
 {
     if ($shipment && !$shipment->getCollection()) {
         return false;
     }
     $result = $this->calculateConcrete($shipment);
     if ($shipment) {
         $this->extraServices->setValues($shipment->getExtraServices());
         $extraServicePrice = $this->extraServices->getTotalCost();
         if (floatval($extraServicePrice) > 0) {
             $result->setExtraServicesPrice($extraServicePrice);
         }
     }
     $eventParams = array("RESULT" => $result, "SHIPMENT" => $shipment);
     $event = new Event('sale', self::EVENT_ON_CALCULATE, $eventParams);
     $event->send();
     $resultList = $event->getResults();
     if (is_array($resultList) && !empty($resultList)) {
         foreach ($resultList as &$eventResult) {
             if ($eventResult->getType() != EventResult::SUCCESS) {
                 continue;
             }
             $params = $eventResult->getParameters();
             if (isset($params["RESULT"])) {
                 $result = $params["RESULT"];
             }
         }
     }
     return $result;
 }
Esempio n. 16
0
 private function buildAdditionalConnectorList()
 {
     $this->additionalConnectorList = array();
     $event = new Event(Driver::INTERNAL_MODULE_ID, 'onBuildAdditionalConnectorList');
     $event->send();
     if ($event->getResults()) {
         foreach ($event->getResults() as $evenResult) {
             if ($evenResult->getResultType() != EventResult::SUCCESS) {
                 continue;
             }
             $result = $evenResult->getParameters();
             if (!is_array($result)) {
                 throw new SystemException('Wrong event result by building AdditionalConnectorList. Must be array.');
             }
             if (empty($result['ENTITY_TYPE'])) {
                 throw new SystemException('Wrong event result by building AdditionalConnectorList. Could not find ENTITY_TYPE.');
             }
             if (empty($result['MODULE_ID'])) {
                 throw new SystemException('Wrong event result by building AdditionalConnectorList. Could not find MODULE_ID.');
             }
             if (empty($result['CLASS'])) {
                 throw new SystemException('Wrong event result by building AdditionalConnectorList. Could not find CLASS.');
             }
             if (is_string($result['CLASS']) && class_exists($result['CLASS'])) {
                 $this->additionalConnectorList[strtolower($result['ENTITY_TYPE'])] = array($result['CLASS'], $result['MODULE_ID']);
             } else {
                 throw new SystemException('Wrong event result by building AdditionalConnectorList. Could not find class by CLASS.');
             }
         }
     }
 }
Esempio n. 17
0
 /**
  * @throws SystemException
  * @throws \Bitrix\Main\LoaderException
  *
  * For custom handlers use (for example in init.php)
  * paste code like this:
  *
  * function addCustomDeliveryTrackingServices()
  * {
  *		return new \Bitrix\Main\EventResult(
  *			\Bitrix\Main\EventResult::SUCCESS,
  *			array(
  *				'\Custom\Name\Space\TrackingHandlerClass' => '/custom/path/tracking_handler_class.php'
  *			),
  *			'sale'
  *		);
  * }
  *
  * $eventManager->addEventHandler('sale', 'onSaleDeliveryTrackingClassNamesBuildList', 'addCustomDeliveryTrackingServices');
  */
 protected function initClassNames()
 {
     if (self::$classNames !== null) {
         return true;
     }
     $classes = array('\\Bitrix\\Sale\\Delivery\\Tracking\\RusPost' => 'lib/delivery/tracking/rus_post.php');
     \Bitrix\Main\Loader::registerAutoLoadClasses('sale', $classes);
     $event = new Event('sale', 'onSaleDeliveryTrackingClassNamesBuildList');
     $event->send();
     $resultList = $event->getResults();
     if (is_array($resultList) && !empty($resultList)) {
         $customClasses = array();
         foreach ($resultList as $eventResult) {
             /** @var  EventResult $eventResult*/
             if ($eventResult->getType() != EventResult::SUCCESS) {
                 throw new SystemException("Can't add custom tracking class successfully");
             }
             $params = $eventResult->getParameters();
             if (!empty($params) && is_array($params)) {
                 $customClasses = array_merge($customClasses, $params);
             }
         }
         if (!empty($customClasses)) {
             \Bitrix\Main\Loader::registerAutoLoadClasses(null, $customClasses);
             $classes = array_merge($customClasses, $classes);
         }
     }
     self::$classNames = array_keys($classes);
     return true;
 }
Esempio n. 18
0
 /**
  * Initialization discount providers.
  *
  * @return void
  */
 protected static function initDiscountProviders()
 {
     /** @var Main\EventResult $eventResult */
     self::$discountProviders = array();
     $event = new Main\Event('sale', self::EVENT_ON_BUILD_DISCOUNT_PROVIDERS, array());
     $event->send();
     $resultList = $event->getResults();
     if (empty($resultList) || !is_array($resultList)) {
         return;
     }
     foreach ($resultList as &$eventResult) {
         if ($eventResult->getType() != Main\EventResult::SUCCESS) {
             continue;
         }
         $module = (string) $eventResult->getModuleId();
         $provider = $eventResult->getParameters();
         if (empty($provider) || !is_array($provider)) {
             continue;
         }
         if (!isset($provider['prepareData'])) {
             continue;
         }
         self::$discountProviders[$module] = array('module' => $module, 'prepareData' => $provider['prepareData']);
         if (isset($provider['getEditUrl'])) {
             self::$discountProviders[$module]['getEditUrl'] = $provider['getEditUrl'];
         }
     }
     unset($provider, $module, $eventResult, $resultList, $event);
 }
Esempio n. 19
0
 /**
  * Extend order data for discounts.
  *
  * @return void
  */
 protected function extendOrderData()
 {
     if (empty($this->discountIds)) {
         return;
     }
     $this->entityList = Internals\DiscountEntitiesTable::getByDiscount($this->discountIds);
     if (empty($this->entityList)) {
         return;
     }
     $event = new Main\Event('sale', self::EVENT_EXTEND_ORDER_DATA, array('ORDER' => $this->orderData, 'ENTITY' => $this->entityList));
     $event->send();
     $resultList = $event->getResults();
     if (empty($resultList) || !is_array($resultList)) {
         return;
     }
     /** @var Main\EventResult $eventResult */
     foreach ($resultList as &$eventResult) {
         if ($eventResult->getType() != Main\EventResult::SUCCESS) {
             continue;
         }
         $newData = $eventResult->getParameters();
         if (empty($newData) || !is_array($newData)) {
             continue;
         }
         $this->modifyOrderData($newData);
     }
     unset($newData, $eventResult, $resultList);
 }
Esempio n. 20
0
 /**
  * @return Entity\Result|bool
  * @throws \Bitrix\Main\ArgumentException
  * @throws \Bitrix\Main\ArgumentNullException
  */
 public function save()
 {
     $result = new Result();
     /** @var Order $order */
     $order = $this->getOrder();
     $itemsFromDb = array();
     $filter = array();
     if (!$order) {
         /** @var Main\Entity\Event $event */
         $event = new Main\Event('sale', EventActions::EVENT_ON_BASKET_BEFORE_SAVED, array('ENTITY' => $this));
         $event->send();
         if ($event->getResults()) {
             $result = new Result();
             /** @var Main\EventResult $eventResult */
             foreach ($event->getResults() as $eventResult) {
                 if ($eventResult->getType() == Main\EventResult::ERROR) {
                     $errorMsg = new ResultError(Main\Localization\Loc::getMessage('SALE_EVENT_ON_BEFORE_BASKET_SAVED'), 'SALE_EVENT_ON_BEFORE_BASKET_SAVED');
                     if (isset($eventResultData['ERROR']) && $eventResultData['ERROR'] instanceof ResultError) {
                         $errorMsg = $eventResultData['ERROR'];
                     }
                     $result->addError($errorMsg);
                 }
             }
             if (!$result->isSuccess()) {
                 return $result;
             }
         }
     }
     $isNew = $order && $order->isNew() ? true : false;
     if ($order && !$isNew) {
         $filter['ORDER_ID'] = $order->getId();
     } else {
         if ($this->isLoadForFuserId()) {
             $filter = array('FUSER_ID' => $this->getFUserId(), 'ORDER_ID' => null, 'LID' => $this->getSiteId());
         }
         if ($isNew) {
             $fUserId = $this->getFUserId(true);
             if ($fUserId <= 0) {
                 $userId = $order->getUserId();
                 if (intval($userId) > 0) {
                     $fUserId = Fuser::getIdByUserId($userId);
                     if ($fUserId > 0) {
                         $this->setFUserId($fUserId);
                     }
                 }
             }
         }
     }
     if (!empty($filter)) {
         $itemsFromDbList = Internals\BasketTable::getList(array("filter" => $filter, "select" => array("ID", 'TYPE', 'SET_PARENT_ID', 'PRODUCT_ID', 'NAME', 'QUANTITY')));
         while ($itemsFromDbItem = $itemsFromDbList->fetch()) {
             if (intval($itemsFromDbItem['SET_PARENT_ID']) > 0 && intval($itemsFromDbItem['SET_PARENT_ID']) != $itemsFromDbItem['ID']) {
                 continue;
             }
             $itemsFromDb[$itemsFromDbItem["ID"]] = $itemsFromDbItem;
         }
     }
     /** @var BasketItem $basketItem */
     foreach ($this->collection as $index => $basketItem) {
         $r = $basketItem->save();
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
         }
         if (isset($itemsFromDb[$basketItem->getId()]) && $basketItem->getQuantity() > 0) {
             unset($itemsFromDb[$basketItem->getId()]);
         }
     }
     if (!empty($filter)) {
         foreach ($itemsFromDb as $k => $v) {
             if ($v['TYPE'] == static::TYPE_SET) {
                 Internals\BasketTable::deleteBundle($k);
             } else {
                 Internals\BasketTable::deleteWithItems($k);
             }
             /** @var Order $order */
             if ($order && $order->getId() > 0) {
                 OrderHistory::addAction('BASKET', $order->getId(), 'BASKET_REMOVED', $k, null, array('NAME' => $v['NAME'], 'QUANTITY' => $v['QUANTITY'], 'PRODUCT_ID' => $v['PRODUCT_ID']));
             }
         }
     }
     if ($order && $order->getId() > 0) {
         OrderHistory::collectEntityFields('BASKET', $order->getId());
     }
     if (!$order) {
         /** @var Main\Entity\Event $event */
         $event = new Main\Event('sale', EventActions::EVENT_ON_BASKET_SAVED, array('ENTITY' => $this));
         $event->send();
         if ($event->getResults()) {
             $result = new Result();
             /** @var Main\EventResult $eventResult */
             foreach ($event->getResults() as $eventResult) {
                 if ($eventResult->getType() == Main\EventResult::ERROR) {
                     $errorMsg = new ResultError(Main\Localization\Loc::getMessage('SALE_EVENT_ON_BASKET_SAVED'), 'SALE_EVENT_ON_BASKET_SAVED');
                     if (isset($eventResultData['ERROR']) && $eventResultData['ERROR'] instanceof ResultError) {
                         $errorMsg = $eventResultData['ERROR'];
                     }
                     $result->addError($errorMsg);
                 }
             }
             if (!$result->isSuccess()) {
                 return $result;
             }
         }
     }
     return $result;
 }
 protected function buildDocumentHandlerList()
 {
     /** @var GoogleHandler $googleDriveClass */
     $googleDriveClass = GoogleHandler::className();
     /** @var DropboxHandler $dropboxClass */
     $dropboxClass = DropboxHandler::className();
     /** @var BoxHandler $boxClass */
     $boxClass = BoxHandler::className();
     /** @var YandexDiskHandler $yandexDiskClass */
     $yandexDiskClass = YandexDiskHandler::className();
     /** @var OneDriveHandler $oneDriveClass */
     $oneDriveClass = OneDriveHandler::className();
     /** @var GoogleViewerHandler $googleViewerClass */
     $googleViewerClass = GoogleViewerHandler::className();
     $this->documentHandlerList = array($googleDriveClass::getCode() => $googleDriveClass, $oneDriveClass::getCode() => $oneDriveClass, $dropboxClass::getCode() => $dropboxClass, $googleViewerClass::getCode() => $googleViewerClass, $yandexDiskClass::getCode() => $yandexDiskClass, $boxClass::getCode() => $boxClass);
     $event = new Event(Driver::INTERNAL_MODULE_ID, 'onDocumentHandlerBuildList');
     $event->send();
     if ($event->getResults()) {
         foreach ($event->getResults() as $evenResult) {
             if ($evenResult->getType() != EventResult::SUCCESS) {
                 continue;
             }
             $result = $evenResult->getParameters();
             if (!is_array($result)) {
                 throw new SystemException('Wrong event result by building DocumentHandlerList. Must be array.');
             }
             if (empty($result['CODE_NAME'])) {
                 throw new SystemException('Wrong event result by building DocumentHandlerList. Could not find CODE_NAME.');
             }
             if (empty($result['CLASS'])) {
                 throw new SystemException('Wrong event result by building DocumentHandlerList. Could not find CLASS.');
             }
             if (is_string($result['CLASS']) && class_exists($result['CLASS'])) {
                 $this->documentHandlerList[$result['CODE_NAME']] = $result['CLASS'];
             } else {
                 throw new SystemException('Wrong event result by building DocumentHandlerList. Could not find class by CLASS.');
             }
         }
     }
 }
Esempio n. 22
0
 /**
  * @return Entity\AddResult|Entity\UpdateResult
  * @throws ArgumentException
  * @throws ArgumentNullException
  * @throws \Exception
  */
 public function save()
 {
     $id = $this->getId();
     $changedFields = $this->fields->getChangedValues();
     $isNew = $id <= 0;
     if (!empty($changedFields)) {
         /** @var array $oldEntityValues */
         $oldEntityValues = $this->fields->getOriginalValues();
         /** @var Event $event */
         $event = new Event('sale', EventActions::EVENT_ON_BASKET_ITEM_BEFORE_SAVED, array('ENTITY' => $this, 'IS_NEW' => $isNew, 'VALUES' => $oldEntityValues));
         $event->send();
         if ($event->getResults()) {
             $result = new Result();
             /** @var EventResult $eventResult */
             foreach ($event->getResults() as $eventResult) {
                 if ($eventResult->getType() == EventResult::ERROR) {
                     $errorMsg = new ResultError(Loc::getMessage('SALE_EVENT_ON_BEFORE_BASKET_ITEM_SAVED'), 'SALE_EVENT_ON_BEFORE_BASKET_ITEM_SAVED');
                     if (isset($eventResultData['ERROR']) && $eventResultData['ERROR'] instanceof ResultError) {
                         $errorMsg = $eventResultData['ERROR'];
                     }
                     $result->addError($errorMsg);
                 }
             }
             if (!$result->isSuccess()) {
                 return $result;
             }
         }
     }
     $fields = $this->fields->getValues();
     if ($this->isBundleParent()) {
         $bundleBasketCollection = $this->getBundleCollection();
     }
     if ($id > 0) {
         $fields = $changedFields;
         if (!isset($fields["ORDER_ID"]) || intval($fields["ORDER_ID"]) == 0) {
             $orderId = null;
             if ($this->getParentOrderId() > 0) {
                 $orderId = $this->getParentOrderId();
             }
             if ($this->isBundleChild() && $orderId === null) {
                 /** @var BasketItem $parentBasket */
                 if (!($parentBasket = $this->getParentBasketItem())) {
                     throw new ObjectNotFoundException('Entity parent "BasketItem" not found');
                 }
                 $orderId = $parentBasket->getParentOrderId();
             }
             if (intval($orderId) > 0 && $this->getField('ORDER_ID') != $orderId) {
                 $fields['ORDER_ID'] = $orderId;
             }
         }
         if (!empty($fields) && is_array($fields)) {
             if (isset($fields["QUANTITY"]) && floatval($fields["QUANTITY"]) == 0) {
                 return new Entity\UpdateResult();
             }
             $fields['DATE_UPDATE'] = new DateTime();
             $this->setFieldNoDemand('DATE_UPDATE', $fields['DATE_UPDATE']);
             $r = Internals\BasketTable::update($id, $fields);
             if (!$r->isSuccess()) {
                 return $r;
             }
         }
         $result = new Entity\UpdateResult();
     } else {
         $fields['ORDER_ID'] = $this->getParentOrderId();
         $fields['DATE_INSERT'] = new DateTime();
         $fields['DATE_UPDATE'] = new DateTime();
         $this->setFieldNoDemand('DATE_INSERT', $fields['DATE_INSERT']);
         $this->setFieldNoDemand('DATE_UPDATE', $fields['DATE_UPDATE']);
         if (!$this->isBundleChild() && (!isset($fields["FUSER_ID"]) || intval($fields["FUSER_ID"]) <= 0)) {
             /** @var Basket $basket */
             if (!($basket = $this->getCollection())) {
                 throw new ObjectNotFoundException('Entity "Basket" not found');
             }
             $fields["FUSER_ID"] = intval($basket->getFUserId());
         }
         /** @var Basket $basket */
         if (!($basket = $this->getCollection())) {
             throw new ObjectNotFoundException('Entity "Basket" not found');
         }
         /** @var Order $order */
         if ($order = $basket->getOrder()) {
             if (!isset($fields["LID"]) || strval($fields["LID"]) == '') {
                 $fields['LID'] = $order->getField('LID');
             }
         } else {
             if ($siteId = $basket->getSiteId()) {
                 $fields['LID'] = $siteId;
             }
         }
         if ($this->isBundleChild()) {
             if (!($parentBasketItem = $this->getParentBasketItem())) {
                 throw new ObjectNotFoundException('Entity parent "BasketItem" not found');
             }
             $fields['LID'] = $parentBasketItem->getField('LID');
             if (!isset($fields["FUSER_ID"]) || intval($fields["FUSER_ID"]) <= 0) {
                 $fields['FUSER_ID'] = intval($parentBasketItem->getField('FUSER_ID'));
             }
         }
         if (!isset($fields["LID"]) || strval(trim($fields["LID"])) == '') {
             throw new ArgumentNullException('lid');
         }
         if ($this->isBundleChild() && (!isset($fields["SET_PARENT_ID"]) || intval($fields["QUANTITY"]) <= 0)) {
             $fields["SET_PARENT_ID"] = $this->getParentBasketItemId();
             $this->setFieldNoDemand('SET_PARENT_ID', $fields['SET_PARENT_ID']);
         }
         if (!isset($fields["QUANTITY"]) || floatval($fields["QUANTITY"]) == 0) {
             return new Entity\AddResult();
         }
         if (!isset($fields["CURRENCY"]) || strval(trim($fields["CURRENCY"])) == '') {
             throw new ArgumentNullException('currency');
         }
         $r = Internals\BasketTable::add($fields);
         if (!$r->isSuccess()) {
             return $r;
         }
         $id = $r->getId();
         $this->setFieldNoDemand('ID', $id);
         $this->setFieldNoDemand('LID', $fields['LID']);
         $this->setFieldNoDemand('FUSER_ID', $fields['FUSER_ID']);
         if ($basket->getOrder() && $basket->getOrderId() > 0) {
             OrderHistory::addAction('BASKET', $order->getId(), 'BASKET_ADDED', $id, $this);
         }
         $result = new Entity\AddResult();
     }
     if ($isNew || !empty($changedFields)) {
         /** @var array $oldEntityValues */
         $oldEntityValues = $this->fields->getOriginalValues();
         /** @var Event $event */
         $event = new Event('sale', EventActions::EVENT_ON_BASKET_ITEM_SAVED, array('ENTITY' => $this, 'IS_NEW' => $isNew, 'VALUES' => $oldEntityValues));
         $event->send();
         if ($event->getResults()) {
             $result = new Result();
             /** @var EventResult $eventResult */
             foreach ($event->getResults() as $eventResult) {
                 if ($eventResult->getType() == EventResult::ERROR) {
                     $errorMsg = new ResultError(Loc::getMessage('SALE_EVENT_ON_BEFORE_BASKET_ITEM_SAVED'), 'SALE_EVENT_ON_BEFORE_BASKET_ITEM_SAVED');
                     if (isset($eventResultData['ERROR']) && $eventResultData['ERROR'] instanceof ResultError) {
                         $errorMsg = $eventResultData['ERROR'];
                     }
                     $result->addError($errorMsg);
                 }
             }
             if (!$result->isSuccess()) {
                 return $result;
             }
         }
     }
     if ($eventName = static::getEntityEventName()) {
         /** @var array $oldEntityValues */
         $oldEntityValues = $this->fields->getOriginalValues();
         if (!empty($oldEntityValues)) {
             /** @var Event $event */
             $event = new Event('sale', 'On' . $eventName . 'EntitySaved', array('ENTITY' => $this, 'VALUES' => $oldEntityValues));
             $event->send();
         }
     }
     $this->fields->clearChanged();
     // bundle
     if ($this->isBundleParent()) {
         if (!empty($bundleBasketCollection)) {
             if (!($order = $bundleBasketCollection->getOrder())) {
                 /** @var Basket $basketCollection */
                 $basketCollection = $this->getCollection();
                 if ($order = $basketCollection->getOrder()) {
                     $bundleBasketCollection->setOrder($order);
                 }
             }
             $itemsFromDb = array();
             if (!$isNew) {
                 $itemsFromDbList = Internals\BasketTable::getList(array("filter" => array("SET_PARENT_ID" => $id), "select" => array("ID")));
                 while ($itemsFromDbItem = $itemsFromDbList->fetch()) {
                     if ($itemsFromDbItem["ID"] == $id) {
                         continue;
                     }
                     $itemsFromDb[$itemsFromDbItem["ID"]] = true;
                 }
             }
             /** @var BasketItem $bundleBasketItem */
             foreach ($bundleBasketCollection as $bundleBasketItem) {
                 $r = $bundleBasketItem->save();
                 if (!$r->isSuccess()) {
                     $result->addErrors($r->getErrors());
                 }
                 if (isset($itemsFromDb[$bundleBasketItem->getId()])) {
                     unset($itemsFromDb[$bundleBasketItem->getId()]);
                 }
             }
             foreach ($itemsFromDb as $k => $v) {
                 Internals\BasketTable::delete($k);
             }
         }
     }
     /** @var BasketPropertiesCollection $basketPropertyCollection */
     $basketPropertyCollection = $this->getPropertyCollection();
     $r = $basketPropertyCollection->save();
     if (!$r->isSuccess()) {
         $result->addErrors($r->getErrors());
     }
     return $result;
 }
Esempio n. 23
0
 public static function GetCurTemplate()
 {
     /** @noinspection PhpUnusedLocalVariableInspection */
     global $APPLICATION, $USER, $CACHE_MANAGER;
     $connection = Main\Application::getConnection();
     $helper = $connection->getSqlHelper();
     $conditionQuoted = $helper->quote("CONDITION");
     $siteTemplate = "";
     if (CACHED_b_site_template === false) {
         $strSql = "\n\t\t\t\tSELECT\n\t\t\t\t\t" . $conditionQuoted . ",\n\t\t\t\t\tTEMPLATE\n\t\t\t\tFROM\n\t\t\t\t\tb_site_template\n\t\t\t\tWHERE\n\t\t\t\t\tSITE_ID='" . SITE_ID . "'\n\t\t\t\tORDER BY\n\t\t\t\t\tCASE\n\t\t\t\t\t\tWHEN " . $helper->getIsNullFunction($helper->getLengthFunction($conditionQuoted), 0) . "=0 THEN 2\n\t\t\t\t\t\tELSE 1\n\t\t\t\t\tEND,\n\t\t\t\t\tSORT\n\t\t\t\t";
         $dbr = $connection->query($strSql);
         while ($ar = $dbr->fetch()) {
             $strCondition = trim($ar["CONDITION"]);
             if (strlen($strCondition) > 0 && !@eval("return " . $strCondition . ";")) {
                 continue;
             }
             if (($path = getLocalPath("templates/" . $ar["TEMPLATE"], BX_PERSONAL_ROOT)) !== false && is_dir($_SERVER["DOCUMENT_ROOT"] . $path)) {
                 $siteTemplate = $ar["TEMPLATE"];
                 break;
             }
         }
     } else {
         if ($CACHE_MANAGER->Read(CACHED_b_site_template, "b_site_template")) {
             $arSiteTemplateBySite = $CACHE_MANAGER->Get("b_site_template");
         } else {
             $dbr = $connection->query("\n\t\t\t\t\tSELECT\n\t\t\t\t\t\t" . $conditionQuoted . ",\n\t\t\t\t\t\tTEMPLATE,\n\t\t\t\t\t\tSITE_ID\n\t\t\t\t\tFROM\n\t\t\t\t\t\tb_site_template\n\t\t\t\t\tORDER BY\n\t\t\t\t\t\tSITE_ID,\n\t\t\t\t\t\tCASE\n\t\t\t\t\t\t\tWHEN " . $helper->getIsNullFunction($helper->getLengthFunction($conditionQuoted), 0) . "=0 THEN 2\n\t\t\t\t\t\t\tELSE 1\n\t\t\t\t\t\tEND,\n\t\t\t\t\t\tSORT\n\t\t\t\t");
             $arSiteTemplateBySite = array();
             while ($ar = $dbr->fetch()) {
                 $arSiteTemplateBySite[$ar['SITE_ID']][] = $ar;
             }
             $CACHE_MANAGER->Set("b_site_template", $arSiteTemplateBySite);
         }
         if (is_array($arSiteTemplateBySite[SITE_ID])) {
             foreach ($arSiteTemplateBySite[SITE_ID] as $ar) {
                 $strCondition = trim($ar["CONDITION"]);
                 if (strlen($strCondition) > 0 && !@eval("return " . $strCondition . ";")) {
                     continue;
                 }
                 if (($path = getLocalPath("templates/" . $ar["TEMPLATE"], BX_PERSONAL_ROOT)) !== false && is_dir($_SERVER["DOCUMENT_ROOT"] . $path)) {
                     $siteTemplate = $ar["TEMPLATE"];
                     break;
                 }
             }
         }
     }
     if ($siteTemplate == "") {
         $siteTemplate = ".default";
     }
     $event = new Main\Event("main", "OnGetCurrentSiteTemplate", array("template" => $siteTemplate));
     $event->send();
     foreach ($event->getResults() as $evenResult) {
         if (($result = $evenResult->getParameters()) != '') {
             //only the first result matters
             $siteTemplate = $result;
             break;
         }
     }
     return $siteTemplate;
 }
Esempio n. 24
0
 /**
  * Create coupon code.
  *
  * @param bool $check		Check new coupon or no.
  * @return string
  */
 public static function generateCoupon($check = false)
 {
     static $eventExists = null;
     $check = $check === true;
     if ($eventExists === true || $eventExists === null) {
         $event = new Main\Event('sale', self::EVENT_ON_GENERATE_COUPON, array('CHECK' => $check));
         $event->send();
         $resultList = $event->getResults();
         if (!empty($resultList) && is_array($resultList)) {
             /** @var Main\EventResult $eventResult */
             foreach ($resultList as &$eventResult) {
                 if ($eventResult->getType() != Main\EventResult::SUCCESS) {
                     continue;
                 }
                 $eventExists = true;
                 $result = $eventResult->getParameters();
                 if (!empty($result) && is_string($result)) {
                     return $result;
                 }
             }
             unset($eventResult);
         }
         if ($eventExists === null) {
             $eventExists = false;
         }
     }
     $allchars = 'ABCDEFGHIJKLNMOPQRSTUVWXYZ0123456789';
     $charsLen = strlen($allchars) - 1;
     do {
         $resultCorrect = true;
         $partOne = '';
         $partTwo = '';
         for ($i = 0; $i < 5; $i++) {
             $partOne .= substr($allchars, rand(0, $charsLen), 1);
         }
         for ($i = 0; $i < 7; $i++) {
             $partTwo .= substr($allchars, rand(0, $charsLen), 1);
         }
         $result = 'SL-' . $partOne . '-' . $partTwo;
         if ($check) {
             $existCoupon = Sale\DiscountCouponsManager::isExist($result);
             $resultCorrect = empty($existCoupon);
         }
     } while (!$resultCorrect);
     return $result;
 }
Esempio n. 25
0
 /**
  * Initialization coupons providers.
  *
  * @return void
  */
 protected static function initUseDiscount()
 {
     if (self::$onlySaleDiscount === null) {
         self::$onlySaleDiscount = (string) Option::get('sale', 'use_sale_discount_only') == 'Y';
         self::$couponProviders = array();
         if (!self::$onlySaleDiscount) {
             $eventData = array('COUPON_UNKNOWN' => Internals\DiscountCouponTable::TYPE_UNKNOWN, 'COUPON_TYPES' => array(Internals\DiscountCouponTable::TYPE_BASKET_ROW, Internals\DiscountCouponTable::TYPE_ONE_ORDER, Internals\DiscountCouponTable::TYPE_MULTI_ORDER));
             $event = new Main\Event('sale', self::EVENT_ON_BUILD_COUPON_PROVIDES, $eventData);
             $event->send();
             $resultList = $event->getResults();
             if (empty($resultList) || !is_array($resultList)) {
                 return;
             }
             foreach ($resultList as &$eventResult) {
                 if ($eventResult->getType() != Main\EventResult::SUCCESS) {
                     continue;
                 }
                 $module = (string) $eventResult->getModuleId();
                 $provider = $eventResult->getParameters();
                 if (empty($provider) || !is_array($provider)) {
                     continue;
                 }
                 if (empty($provider['getData']) || empty($provider['isExist']) || empty($provider['saveApplied'])) {
                     continue;
                 }
                 self::$couponProviders[] = array('module' => $module, 'getData' => $provider['getData'], 'isExist' => $provider['isExist'], 'saveApplied' => $provider['saveApplied'], 'mode' => isset($provider['mode']) && $provider['mode'] == self::COUPON_MODE_FULL ? self::COUPON_MODE_FULL : self::COUPON_MODE_SIMPLE);
             }
             unset($eventResult);
         }
     }
 }
Esempio n. 26
0
 /**
  * Return array of connectors information by endpoints array.
  *
  * @param array|null
  * @return array
  */
 public static function getConnectorClassList(array $endpointList = null)
 {
     $resultList = array();
     $moduleIdFilter = null;
     $moduleConnectorFilter = null;
     if ($endpointList) {
         $moduleIdFilter = array();
         foreach ($endpointList as $endpoint) {
             $moduleIdFilter[] = $endpoint['MODULE_ID'];
             $moduleConnectorFilter[$endpoint['MODULE_ID']][] = $endpoint['CODE'];
         }
     }
     $data = array();
     $event = new Event('sender', 'OnConnectorList', array($data), $moduleIdFilter);
     $event->send();
     foreach ($event->getResults() as $eventResult) {
         if ($eventResult->getType() == EventResult::ERROR) {
             continue;
         }
         $eventResultParameters = $eventResult->getParameters();
         if ($eventResultParameters && array_key_exists('CONNECTOR', $eventResultParameters)) {
             $connectorClassName = $eventResultParameters['CONNECTOR'];
             if (!is_subclass_of($connectorClassName, '\\Bitrix\\Sender\\Connector')) {
                 continue;
             }
             $connectorCode = call_user_func(array($connectorClassName, 'getCode'));
             if ($moduleConnectorFilter && !in_array($connectorCode, $moduleConnectorFilter[$eventResult->getModuleId()])) {
                 continue;
             }
             $connectorName = call_user_func(array($connectorClassName, 'getName'));
             $connectorRequireConfigure = call_user_func(array($connectorClassName, 'requireConfigure'));
             $resultList[] = array('MODULE_ID' => $eventResult->getModuleId(), 'CLASS_NAME' => $connectorClassName, 'CODE' => $connectorCode, 'NAME' => $connectorName, 'REQUIRE_CONFIGURE' => $connectorRequireConfigure);
         }
     }
     if (!empty($resultList)) {
         usort($resultList, array(__CLASS__, 'sort'));
     }
     return $resultList;
 }
Esempio n. 27
0
 /**
  *
  * @param $mailingChainId
  * @param array $params
  * @return string
  * @throws \Bitrix\Main\ArgumentException
  * @throws \Bitrix\Main\DB\Exception
  */
 protected static function sendInternal($mailingChainId, array $params)
 {
     // event before sending
     $eventSendParams = $params;
     $eventSendParams['MAILING_CHAIN_ID'] = $mailingChainId;
     $event = new Event('sender', 'OnBeforePostingSendRecipient', array($eventSendParams));
     $event->send();
     foreach ($event->getResults() as $eventResult) {
         if ($eventResult->getType() == \Bitrix\Main\EventResult::ERROR) {
             return PostingRecipientTable::SEND_RESULT_ERROR;
         }
         if (is_array($eventResult->getParameters())) {
             $eventSendParams = array_merge($eventSendParams, $eventResult->getParameters());
         }
     }
     unset($eventSendParams['MAILING_CHAIN_ID']);
     $params = $eventSendParams;
     // prepare common params
     if (static::$currentMailingChainFields !== null) {
         if (static::$currentMailingChainFields['ID'] != $mailingChainId) {
             static::$currentMailingChainFields = null;
         }
     }
     if (static::$currentMailingChainFields === null) {
         $mailingChainDb = MailingChainTable::getList(array('select' => array('*', 'SITE_ID' => 'MAILING.SITE_ID'), 'filter' => array('=ID' => $mailingChainId)));
         if (!($mailingChain = $mailingChainDb->fetch())) {
             return PostingRecipientTable::SEND_RESULT_ERROR;
         }
         $charset = false;
         $siteDb = \Bitrix\Main\SiteTable::getList(array('select' => array('SERVER_NAME', 'NAME', 'CULTURE_CHARSET' => 'CULTURE.CHARSET'), 'filter' => array('=LID' => $mailingChain['SITE_ID'])));
         if ($site = $siteDb->fetch()) {
             $charset = $site['CULTURE_CHARSET'];
             $serverName = $site['SERVER_NAME'];
         } else {
             throw new \Bitrix\Main\DB\Exception(Loc::getMessage('SENDER_POSTING_MANAGER_ERR_SITE', array('#SITE_ID#' => $mailingChain['SITE_ID'])));
         }
         if (!$charset) {
             throw new \Bitrix\Main\DB\Exception(Loc::getMessage('SENDER_POSTING_MANAGER_ERR_CHARSET', array('#SITE_ID#' => "[" . $mailingChain['SITE_ID'] . "]" . $site['NAME'])));
         }
         $attachmentList = array();
         $attachmentDb = \Bitrix\Sender\MailingAttachmentTable::getList(array('select' => array('FILE_ID'), 'filter' => array('CHAIN_ID' => $mailingChainId)));
         while ($attachment = $attachmentDb->fetch()) {
             $attachmentList[] = $attachment['FILE_ID'];
         }
         static::$currentMailingChainFields = array();
         static::$currentMailingChainFields['EVENT'] = array('FILE' => $attachmentList);
         static::$currentMailingChainFields['ID'] = $mailingChain['ID'];
         // create final mail-text due to filling template by blocks
         static::$currentMailingChainFields['IS_MESSAGE_WITH_TEMPLATE'] = false;
         if ($mailingChain['TEMPLATE_TYPE'] && $mailingChain['TEMPLATE_ID']) {
             $chainTemplate = \Bitrix\Sender\Preset\Template::getById($mailingChain['TEMPLATE_TYPE'], $mailingChain['TEMPLATE_ID']);
             if ($chainTemplate && $chainTemplate['HTML']) {
                 $document = new \Bitrix\Main\Web\DOM\Document();
                 $document->loadHTML($chainTemplate['HTML']);
                 \Bitrix\Main\Loader::includeModule('fileman');
                 if (\Bitrix\Fileman\Block\Editor::fillDocumentBySliceContent($document, $mailingChain['MESSAGE'])) {
                     \Bitrix\Main\Web\DOM\StyleInliner::inlineDocument($document);
                     $mailingChain['MESSAGE'] = $document->saveHTML();
                     static::$currentMailingChainFields['IS_MESSAGE_WITH_TEMPLATE'] = true;
                 } else {
                     unset($document);
                 }
             }
         }
         static::$currentMailingChainFields['MESSAGE'] = array('BODY_TYPE' => 'html', 'EMAIL_FROM' => $mailingChain['EMAIL_FROM'], 'EMAIL_TO' => '#EMAIL_TO#', 'PRIORITY' => $mailingChain['PRIORITY'], 'SUBJECT' => $mailingChain['SUBJECT'], 'MESSAGE' => $mailingChain['MESSAGE'], 'MESSAGE_PHP' => \Bitrix\Main\Mail\Internal\EventMessageTable::replaceTemplateToPhp($mailingChain['MESSAGE']));
         static::$currentMailingChainFields['SITE'] = array($mailingChain['SITE_ID']);
         static::$currentMailingChainFields['CHARSET'] = $charset;
         static::$currentMailingChainFields['SERVER_NAME'] = $serverName;
         static::$currentMailingChainFields['LINK_PROTOCOL'] = \Bitrix\Main\Config\Option::get("sender", "link_protocol", 'http');
         static::$currentMailingChainFields['LINK_PARAMS'] = $mailingChain['LINK_PARAMS'];
     }
     $trackClick = isset($params['TRACK_CLICK']) ? $params['TRACK_CLICK'] : null;
     if ($trackClick && static::$currentMailingChainFields['LINK_PARAMS']) {
         if (!is_array($trackClick['URL_PARAMS'])) {
             $trackClick['URL_PARAMS'] = array();
         }
         parse_str(static::$currentMailingChainFields['LINK_PARAMS'], $trackClickTmp);
         if (is_array($trackClickTmp)) {
             $trackClick['URL_PARAMS'] = array_merge($trackClick['URL_PARAMS'], $trackClickTmp);
         }
     }
     // prepare params for send email
     $messageParams = array('EVENT' => static::$currentMailingChainFields['EVENT'], 'FIELDS' => $params['FIELDS'], 'MESSAGE' => static::$currentMailingChainFields['MESSAGE'], 'SITE' => static::$currentMailingChainFields['SITE'], 'CHARSET' => static::$currentMailingChainFields['CHARSET']);
     if (!empty($params['FIELDS']['UNSUBSCRIBE_LINK'])) {
         if (substr($params['FIELDS']['UNSUBSCRIBE_LINK'], 0, 4) !== 'http') {
             if (!empty(static::$currentMailingChainFields['SERVER_NAME'])) {
                 $serverName = static::$currentMailingChainFields['SERVER_NAME'];
             } else {
                 $serverName = \Bitrix\Main\Config\Option::get("main", "server_name", $GLOBALS["SERVER_NAME"]);
             }
             $linkProtocol = static::$currentMailingChainFields['LINK_PROTOCOL'];
             $params['FIELDS']['UNSUBSCRIBE_LINK'] = $linkProtocol . '://' . $serverName . $params['FIELDS']['UNSUBSCRIBE_LINK'];
         }
     }
     // event on sending
     $eventMessageParams = $messageParams;
     $eventMessageParams['MAILING_CHAIN_ID'] = $mailingChainId;
     $eventMessageParams['IS_MESSAGE_WITH_TEMPLATE'] = static::$currentMailingChainFields['IS_MESSAGE_WITH_TEMPLATE'];
     $event = new Event('sender', 'OnPostingSendRecipient', array($eventMessageParams));
     $event->send();
     foreach ($event->getResults() as $eventResult) {
         if ($eventResult->getType() == \Bitrix\Main\EventResult::ERROR) {
             return PostingRecipientTable::SEND_RESULT_ERROR;
         }
         if (is_array($eventResult->getParameters())) {
             $eventMessageParams = array_merge($eventMessageParams, $eventResult->getParameters());
         }
     }
     static::$currentMailingChainFields['IS_MESSAGE_WITH_TEMPLATE'] = $eventMessageParams['IS_MESSAGE_WITH_TEMPLATE'];
     unset($eventMessageParams['IS_MESSAGE_WITH_TEMPLATE']);
     unset($eventMessageParams['MAILING_CHAIN_ID']);
     $messageParams = $eventMessageParams;
     $message = Mail\EventMessageCompiler::createInstance($messageParams);
     $message->compile();
     // add unsubscribe info to header
     $mailHeaders = $message->getMailHeaders();
     if (!empty($params['FIELDS']['UNSUBSCRIBE_LINK'])) {
         $unsubUrl = $params['FIELDS']['UNSUBSCRIBE_LINK'];
         $mailHeaders['List-Unsubscribe'] = '<' . $unsubUrl . '>';
     }
     $mailBody = null;
     if (static::$currentMailingChainFields['IS_MESSAGE_WITH_TEMPLATE'] && Option::get('sender', 'use_inliner_for_each_template_mail', 'N') == 'Y') {
         // inline styles
         $mailBody = \Bitrix\Main\Web\DOM\StyleInliner::inlineHtml($message->getMailBody());
     }
     if (!$mailBody) {
         $mailBody = $message->getMailBody();
     }
     // set email params
     $mailParams = array('TO' => $message->getMailTo(), 'SUBJECT' => $message->getMailSubject(), 'BODY' => $mailBody, 'HEADER' => $mailHeaders, 'CHARSET' => $message->getMailCharset(), 'CONTENT_TYPE' => $message->getMailContentType(), 'MESSAGE_ID' => '', 'ATTACHMENT' => $message->getMailAttachment(), 'LINK_PROTOCOL' => static::$currentMailingChainFields['LINK_PROTOCOL'], 'LINK_DOMAIN' => static::$currentMailingChainFields['SERVER_NAME'], 'TRACK_READ' => isset($params['TRACK_READ']) ? $params['TRACK_READ'] : null, 'TRACK_CLICK' => $trackClick);
     // event on sending email
     $eventMailParams = $mailParams;
     $eventMailParams['MAILING_CHAIN_ID'] = $mailingChainId;
     $event = new Event('sender', 'OnPostingSendRecipientEmail', array($eventMailParams));
     $event->send();
     foreach ($event->getResults() as $eventResult) {
         if ($eventResult->getType() == \Bitrix\Main\EventResult::ERROR) {
             return PostingRecipientTable::SEND_RESULT_ERROR;
         }
         if (is_array($eventResult->getParameters())) {
             $eventMailParams = array_merge($eventMailParams, $eventResult->getParameters());
         }
     }
     unset($eventMailParams['MAILING_CHAIN_ID']);
     $mailParams = $eventMailParams;
     // send mail
     $result = Mail\Mail::send($mailParams);
     if ($result) {
         return PostingRecipientTable::SEND_RESULT_SUCCESS;
     } else {
         return PostingRecipientTable::SEND_RESULT_ERROR;
     }
 }