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; }
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; }
/** * Создается событие для внесения в 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; } } } }
public static function isSuccess(\Bitrix\Main\Event $event) { foreach ($event->getResults() as $result) { if ($result->getType() === EventResult::ERROR) { return false; } } return true; }
/** * @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; }
/** * Добавляет расширения, в том числе расширение для битрикса, * в котором добавляются нужные глобальные переменные и т.п. */ 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); } } } } }
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"); }
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; }
/** * @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; }
/** * @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; }
/** * @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; }
/** * * @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; }
/** * @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; }
$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; } } }
/** * 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; }
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.'); } } } }
/** * @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; }
/** * 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); }
/** * 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); }
/** * @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.'); } } } }
/** * @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; }
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; }
/** * 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; }
/** * 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); } } }
/** * 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; }
/** * * @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; } }