protected function getElementFields($iblockId, $elementId) { $totalResult = array(); $list = new CList($iblockId); $listFields = $list->getFields(); foreach ($listFields as $fieldId => $field) { $totalResult[$fieldId] = $field; } $elementQuery = CIBlockElement::getList(array(), array("IBLOCK_ID" => $iblockId, "=ID" => $elementId), false, false, array('*')); $elementObject = $elementQuery->getNextElement(); $elementNewData = $elementObject->getFields(); if (is_array($elementNewData)) { foreach ($elementNewData as $fieldId => $fieldValue) { if (!$list->is_field($fieldId)) { continue; } if (isset($totalResult[$fieldId]["NAME"])) { $totalResult[$fieldId]["VALUE"] = $fieldValue; } } } $query = \CIblockElement::getPropertyValues($iblockId, array('ID' => $elementId)); if ($propertyValues = $query->fetch()) { foreach ($propertyValues as $id => $values) { if ($id == "IBLOCK_ELEMENT_ID") { continue; } $fieldId = "PROPERTY_" . $id; $totalResult[$fieldId]["VALUE"] = $values; } } return $totalResult; }
/** * @return array */ protected function getList() { if ($this->_list !== null) { return $this->_list; } $cache = $this->getCache(); $cId = get_class($this) . '_list'; if (!$cache || ($this->_list = $cache->get($cId)) === false) { $this->_list = []; $res = \CIblockElement::GetList(['SORT' => 'ASC', 'NAME' => 'ASC'], $this->filter, false, false, $this->select); $iblocksIds = []; while ($ob = $res->Fetch()) { $arItem = []; foreach ($this->select as $field) { if (isset($ob[$field])) { $arItem[$field] = $ob[$field]; } elseif (isset($ob[$field . '_VALUE'])) { $arItem[$field] = $ob[$field . '_VALUE']; } } $this->_list[$ob['ID']] = $arItem; } if ($cache) { $cache->set($cId, $this->_list, $this->cacheTime); } } return $this->_list; }
protected function addElement($arElement) { $this->prepareElementFields($arElement, true); if (strlen($arElement['CODE']) > 0) { $arSelect = array("ID"); $arFilter = array("IBLOCK_ID" => $arElement['IBLOCK_ID'], "CODE" => $arElement['CODE']); $res = \CIBlockElement::GetList(array(), $arFilter, false, array("nPageSize" => 1), $arSelect); if ($ob = $res->GetNextElement()) { $arFields = $ob->GetFields(); //TODO: Обновлять свойства элемента $el = new \CIblockElement(); if ($el->Update($arFields['ID'], $arElement)) { $this->addMessage('Элемент ' . $arElement['CODE'] . ' обновлен.'); } else { $this->addMessage($el->LAST_ERROR); } unset($el); return $arFields['ID']; } } $el = new \CIblockElement(); if ($iNewId = $el->Add($arElement)) { $this->addMessage('Новый элемент ' . $iNewId . ' добавлен.', true); } else { $this->addMessage($el->LAST_ERROR); } unset($el); return $iNewId; }
function WF_SetMove($NEW_ID, $OLD_ID = 0) { if (CModule::IncludeModule("workflow")) { $err_mess = "FILE: " . __FILE__ . "<br>LINE: "; global $DB, $USER; $USER_ID = is_object($USER) ? intval($USER->GetID()) : 0; $NEW = "Y"; $OLD_ID = intval($OLD_ID); $NEW_ID = intval($NEW_ID); if ($OLD_ID > 0) { $old = $DB->Query("SELECT WF_STATUS_ID FROM b_iblock_element WHERE ID = " . $OLD_ID, false, $err_mess . __LINE__); if ($old_r = $old->Fetch()) { $NEW = "N"; } } CTimeZone::Disable(); $new = CIBlockElement::GetByID($NEW_ID); CTimeZone::Enable(); if ($new_r = $new->Fetch()) { $NEW_STATUS_ID = intval($new_r["WF_STATUS_ID"]); $OLD_STATUS_ID = intval($old_r["WF_STATUS_ID"]); $PARENT_ID = intval($new_r["WF_PARENT_ELEMENT_ID"]); CTimeZone::Disable(); $parent = CIBlockElement::GetByID($PARENT_ID); CTimeZone::Enable(); if ($parent_r = $parent->Fetch()) { $arFields = array("TIMESTAMP_X" => $DB->GetNowFunction(), "IBLOCK_ELEMENT_ID" => $PARENT_ID, "OLD_STATUS_ID" => $OLD_STATUS_ID, "STATUS_ID" => $NEW_STATUS_ID, "USER_ID" => $USER_ID); $DB->Insert("b_workflow_move", $arFields, $err_mess . __LINE__); if ($NEW_STATUS_ID != $OLD_STATUS_ID) { // Get creator Email $strSql = "SELECT EMAIL FROM b_user WHERE ID = " . intval($parent_r["CREATED_BY"]); $rs = $DB->Query($strSql, false, $err_mess . __LINE__); if ($ar = $rs->Fetch()) { $parent_r["CREATED_BY_EMAIL"] = $ar["EMAIL"]; } else { $parent_r["CREATED_BY_EMAIL"] = ""; } // gather email of the workflow admins $WORKFLOW_ADMIN_GROUP_ID = intval(COption::GetOptionString("workflow", "WORKFLOW_ADMIN_GROUP_ID")); $strSql = "\n\t\t\t\t\t\t\tSELECT U.ID, U.EMAIL\n\t\t\t\t\t\t\tFROM b_user U, b_user_group UG\n\t\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\t\tUG.GROUP_ID=" . $WORKFLOW_ADMIN_GROUP_ID . "\n\t\t\t\t\t\t\t\tAND U.ID = UG.USER_ID\n\t\t\t\t\t\t\t\tAND U.ACTIVE='Y'\n\t\t\t\t\t\t"; $rs = $DB->Query($strSql, false, $err_mess . __LINE__); $arAdmin = array(); while ($ar = $rs->Fetch()) { $arAdmin[$ar["ID"]] = $ar["EMAIL"]; } // gather email for BCC $arBCC = array(); // gather all who changed doc in its current status $strSql = "\n\t\t\t\t\t\t\tSELECT U.EMAIL\n\t\t\t\t\t\t\tFROM\n\t\t\t\t\t\t\t\tb_workflow_move WM\n\t\t\t\t\t\t\t\tINNER JOIN b_user U on U.ID = WM.USER_ID\n\t\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\t\tIBLOCK_ELEMENT_ID = " . $PARENT_ID . "\n\t\t\t\t\t\t\t\tAND OLD_STATUS_ID = " . $NEW_STATUS_ID . "\n\t\t\t\t\t\t"; $rs = $DB->Query($strSql, false, $err_mess . __LINE__); while ($ar = $rs->Fetch()) { $arBCC[$ar["EMAIL"]] = $ar["EMAIL"]; } // gather all editors // in case status have notifier flag //First those who have write permissions on iblock $strSql = "\n\t\t\t\t\t\t\tSELECT U.EMAIL\n\t\t\t\t\t\t\tFROM\n\t\t\t\t\t\t\t\tb_workflow_status S\n\t\t\t\t\t\t\t\tINNER JOIN b_workflow_status2group SG on SG.STATUS_ID = S.ID\n\t\t\t\t\t\t\t\tINNER JOIN b_iblock_group IG on IG.GROUP_ID = SG.GROUP_ID\n\t\t\t\t\t\t\t\tINNER JOIN b_user_group UG on UG.GROUP_ID = IG.GROUP_ID\n\t\t\t\t\t\t\t\tINNER JOIN b_user U on U.ID = UG.USER_ID\n\t\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\t\tS.ID = " . $NEW_STATUS_ID . "\n\t\t\t\t\t\t\t\tAND S.NOTIFY = 'Y'\n\t\t\t\t\t\t\t\tAND IG.IBLOCK_ID = " . intval($new_r["IBLOCK_ID"]) . "\n\t\t\t\t\t\t\t\tAND IG.PERMISSION >= 'U'\n\t\t\t\t\t\t\t\tAND SG.PERMISSION_TYPE = '2'\n\t\t\t\t\t\t\t\tAND U.ACTIVE = 'Y'\n\t\t\t\t\t\t"; $rs = $DB->Query($strSql, false, $err_mess . __LINE__); while ($ar = $rs->Fetch()) { $arBCC[$ar["EMAIL"]] = $ar["EMAIL"]; } //Second admins if they in PERMISSION_TYPE = 2 list //because they have all the rights $strSql = "\n\t\t\t\t\t\t\tSELECT U.EMAIL\n\t\t\t\t\t\t\tFROM\n\t\t\t\t\t\t\t\tb_workflow_status S\n\t\t\t\t\t\t\t\tINNER JOIN b_workflow_status2group SG on SG.STATUS_ID = S.ID\n\t\t\t\t\t\t\t\tINNER JOIN b_user_group UG on UG.GROUP_ID = SG.GROUP_ID\n\t\t\t\t\t\t\t\tINNER JOIN b_user U on U.ID = UG.USER_ID\n\t\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\t\tS.ID = " . $NEW_STATUS_ID . "\n\t\t\t\t\t\t\t\tAND S.NOTIFY = 'Y'\n\t\t\t\t\t\t\t\tAND SG.GROUP_ID = 1\n\t\t\t\t\t\t\t\tAND SG.PERMISSION_TYPE = '2'\n\t\t\t\t\t\t\t\tAND U.ACTIVE = 'Y'\n\t\t\t\t\t\t"; $rs = $DB->Query($strSql, false, $err_mess . __LINE__); while ($ar = $rs->Fetch()) { $arBCC[$ar["EMAIL"]] = $ar["EMAIL"]; } $iblock_r = CIBlock::GetArrayByID($new_r["IBLOCK_ID"]); $iblock_r["LID"] = array(); $rsIBlockSite = $DB->Query("SELECT SITE_ID FROM b_iblock_site WHERE IBLOCK_ID= " . intval($new_r["IBLOCK_ID"])); while ($arIBlockSite = $rsIBlockSite->Fetch()) { $iblock_r["LID"][] = $arIBlockSite["SITE_ID"]; } if (array_key_exists($new_r["MODIFIED_BY"], $arAdmin)) { $new_r["USER_NAME"] .= " (Admin)"; } // it is not new doc if ($NEW != "Y") { if (array_key_exists($parent_r["CREATED_BY"], $arAdmin)) { $parent_r["CREATED_USER_NAME"] .= " (Admin)"; } // send change notification $arEventFields = array("ID" => $PARENT_ID, "IBLOCK_ID" => $new_r["IBLOCK_ID"], "IBLOCK_TYPE" => $iblock_r["IBLOCK_TYPE_ID"], "ADMIN_EMAIL" => implode(",", $arAdmin), "BCC" => implode(",", $arBCC), "PREV_STATUS_ID" => $OLD_STATUS_ID, "PREV_STATUS_TITLE" => CIblockElement::WF_GetStatusTitle($OLD_STATUS_ID), "STATUS_ID" => $NEW_STATUS_ID, "STATUS_TITLE" => CIblockElement::WF_GetStatusTitle($NEW_STATUS_ID), "DATE_CREATE" => $parent_r["DATE_CREATE"], "CREATED_BY_ID" => $parent_r["CREATED_BY"], "CREATED_BY_NAME" => $parent_r["CREATED_USER_NAME"], "CREATED_BY_EMAIL" => $parent_r["CREATED_BY_EMAIL"], "DATE_MODIFY" => $new_r["TIMESTAMP_X"], "MODIFIED_BY_ID" => $new_r["MODIFIED_BY"], "MODIFIED_BY_NAME" => $new_r["USER_NAME"], "NAME" => $new_r["NAME"], "SECTION_ID" => $new_r["IBLOCK_SECTION_ID"], "PREVIEW_HTML" => $new_r["PREVIEW_TEXT_TYPE"] == "html" ? $new_r["PREVIEW_TEXT"] : TxtToHtml($new_r["PREVIEW_TEXT"]), "PREVIEW_TEXT" => $new_r["PREVIEW_TEXT_TYPE"] == "text" ? $new_r["PREVIEW_TEXT"] : HtmlToTxt($new_r["PREVIEW_TEXT"]), "PREVIEW" => $new_r["PREVIEW_TEXT"], "PREVIEW_TYPE" => $new_r["PREVIEW_TEXT_TYPE"], "DETAIL_HTML" => $new_r["DETAIL_TEXT_TYPE"] == "html" ? $new_r["DETAIL_TEXT"] : TxtToHtml($new_r["DETAIL_TEXT"]), "DETAIL_TEXT" => $new_r["DETAIL_TEXT_TYPE"] == "text" ? $new_r["DETAIL_TEXT"] : HtmlToTxt($new_r["DETAIL_TEXT"]), "DETAIL" => $new_r["DETAIL_TEXT"], "DETAIL_TYPE" => $new_r["DETAIL_TEXT_TYPE"], "COMMENTS" => $new_r["WF_COMMENTS"]); CEvent::Send("WF_IBLOCK_STATUS_CHANGE", $iblock_r["LID"], $arEventFields); } else { // it was new one $arEventFields = array("ID" => $PARENT_ID, "IBLOCK_ID" => $new_r["IBLOCK_ID"], "IBLOCK_TYPE" => $iblock_r["IBLOCK_TYPE_ID"], "ADMIN_EMAIL" => implode(",", $arAdmin), "BCC" => implode(",", $arBCC), "STATUS_ID" => $NEW_STATUS_ID, "STATUS_TITLE" => CIblockElement::WF_GetStatusTitle($NEW_STATUS_ID), "DATE_CREATE" => $parent_r["DATE_CREATE"], "CREATED_BY_ID" => $parent_r["CREATED_BY"], "CREATED_BY_NAME" => $parent_r["CREATED_USER_NAME"], "CREATED_BY_EMAIL" => $parent_r["CREATED_BY_EMAIL"], "NAME" => $new_r["NAME"], "PREVIEW_HTML" => $new_r["PREVIEW_TEXT_TYPE"] == "html" ? $new_r["PREVIEW_TEXT"] : TxtToHtml($new_r["PREVIEW_TEXT"]), "PREVIEW_TEXT" => $new_r["PREVIEW_TEXT_TYPE"] == "text" ? $new_r["PREVIEW_TEXT"] : HtmlToTxt($new_r["PREVIEW_TEXT"]), "PREVIEW" => $new_r["PREVIEW_TEXT"], "PREVIEW_TYPE" => $new_r["PREVIEW_TEXT_TYPE"], "SECTION_ID" => $new_r["IBLOCK_SECTION_ID"], "DETAIL_HTML" => $new_r["DETAIL_TEXT_TYPE"] == "html" ? $new_r["DETAIL_TEXT"] : TxtToHtml($new_r["DETAIL_TEXT"]), "DETAIL_TEXT" => $new_r["DETAIL_TEXT_TYPE"] == "text" ? $new_r["DETAIL_TEXT"] : HtmlToTxt($new_r["DETAIL_TEXT"]), "DETAIL" => $new_r["DETAIL_TEXT"], "DETAIL_TYPE" => $new_r["DETAIL_TEXT_TYPE"], "COMMENTS" => $new_r["WF_COMMENTS"]); CEvent::Send("WF_NEW_IBLOCK_ELEMENT", $iblock_r["LID"], $arEventFields); } } } } } }
function CleanUpHistory() { $err_mess = CWorkflow::err_mess() . "<br>Function: CleanUpHistory<br>Line: "; global $DB; $HISTORY_DAYS = intval(COption::GetOptionString("workflow", "HISTORY_DAYS", "-1")); if ($HISTORY_DAYS >= 0) { $strSql = "\n\t\t\t\tDELETE FROM b_workflow_log\n\t\t\t\tWHERE\n\t\t\t\t\tto_days(now())-to_days(TIMESTAMP_X)>={$HISTORY_DAYS}\n\t\t\t\t"; $DB->Query($strSql, false, $err_mess . __LINE__); } if (CModule::IncludeModule("iblock")) { CIblockElement::WF_CleanUpHistory(); } }
$arEditLinkParams = array( "find_section_section" => intval($find_section_section) ); if ($bAutocomplete) { $arEditLinkParams['lookup'] = $strLookup; } $tabControl->Begin(array( "FORM_ACTION" => "/bitrix/admin/".CIBlock::GetAdminElementEditLink($IBLOCK_ID, null, $arEditLinkParams) )); $tabControl->BeginNextFormTab(); if($ID > 0 && !$bCopy) { $p = CIblockElement::GetByID($ID); $pr = $p->ExtractFields("prn_"); } else { $pr = array(); } $tabControl->AddCheckBoxField("ACTIVE", GetMessage("IBLOCK_FIELD_ACTIVE").":", false, array("Y","N"), $str_ACTIVE=="Y"); $tabControl->BeginCustomField("ACTIVE_FROM", GetMessage("IBLOCK_FIELD_ACTIVE_PERIOD_FROM"), $arIBlock["FIELDS"]["ACTIVE_FROM"]["IS_REQUIRED"] === "Y"); ?> <tr id="tr_ACTIVE_FROM"> <td><?echo $tabControl->GetCustomLabelHTML()?>:</td> <td><?echo CAdminCalendar::CalendarDate("ACTIVE_FROM", $str_ACTIVE_FROM, 19, true)?></td> </tr> <? $tabControl->EndCustomField("ACTIVE_FROM", '<input type="hidden" id="ACTIVE_FROM" name="ACTIVE_FROM" value="'.$str_ACTIVE_FROM.'">');
} $IBLOCK_ID = intval($IBLOCK_ID); $ELEMENT_ID = intval($ELEMENT_ID); $find_section_section = intval($find_section_section); $iblock = CIBlock::GetByID($IBLOCK_ID); if ($arIBlock = $iblock->Fetch()) { if (!CIBlockRights::UserHasRightTo($IBLOCK_ID, $IBLOCK_ID, "iblock_admin_display")) { $APPLICATION->SetTitle(GetMessage("IBLOCK_ADM_HISTORY_TITLE", array("#ID#" => $ELEMENT_ID))); require $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_admin_after.php"; echo ShowError(GetMessage("IBLOCK_ADM_HISTORY_BAD_IBLOCK")); require $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/epilog_admin.php"; die; } } $LAST_ID = CIBlockElement::WF_GetLast($ELEMENT_ID); $z = CIblockElement::GetByID($LAST_ID); if (!($zr = $z->Fetch())) { $APPLICATION->SetTitle(GetMessage("IBLOCK_ADM_HISTORY_TITLE", array("#ID#" => $ELEMENT_ID))); require $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_admin_after.php"; ?> <a href="/bitrix/admin/iblock_admin.php?type=<?php echo htmlspecialcharsbx($type); ?> &lang=<?php echo LANG; ?> "><?php echo htmlspecialcharsex($arIBTYPE["NAME"]); ?> </a> - <a href="<?php echo htmlspecialcharsbx(CIBlock::GetAdminElementListLink($IBLOCK_ID, array()));
public static function convertToDB($property, $value) { $listId = self::prepareValue($value); if (empty($property['ELEMENT_ID'])) { $value['VALUE'] = implode(',', $listId); return $value; } global $USER; if ($USER instanceof \CUser && $USER->getId()) { $userId = $USER->getId(); } else { $userId = SystemUser::SYSTEM_USER_ID; } if (isset($value['DESCRIPTION']) && $value['DESCRIPTION'] == 'workflow') { $workFlow = true; } else { $workFlow = false; } $value['VALUE'] = array(); $userFieldManager = Driver::getInstance()->getUserFieldManager(); list($connectorClass, $moduleId) = $userFieldManager->getConnectorDataByEntityType("iblock_element"); foreach ($listId as $id) { list($type, $realId) = FileUserType::detectType($id); if ($type == FileUserType::TYPE_NEW_OBJECT) { $errorCollection = new ErrorCollection(); $fileModel = File::loadById($realId, array('STORAGE')); if (!$fileModel) { continue; } if ($workFlow) { $canUpdate = true; } else { $securityContext = $fileModel->getStorage()->getSecurityContext($userId); if (!$fileModel->canRead($securityContext)) { continue; } $canUpdate = $fileModel->canUpdate($securityContext); } $attachedModel = AttachedObject::add(array('MODULE_ID' => $moduleId, 'OBJECT_ID' => $fileModel->getId(), 'ENTITY_ID' => $property['ELEMENT_ID'], 'ENTITY_TYPE' => $connectorClass, 'IS_EDITABLE' => (int) $canUpdate, 'ALLOW_EDIT' => (int) ($canUpdate && (int) Application::getInstance()->getContext()->getRequest()->getPost('DISK_FILE_' . $property['IBLOCK_ID'] . '_DISK_ATTACHED_OBJECT_ALLOW_EDIT')), 'CREATED_BY' => $userId), $errorCollection); if (!$attachedModel || $errorCollection->hasErrors()) { continue; } $value['VALUE'][] = $attachedModel->getId(); } else { $value['VALUE'][] = $realId; } } $query = \CIblockElement::getPropertyValues($property['IBLOCK_ID'], array('ID' => $property['ELEMENT_ID'])); $oldPropertyValues = array(); if ($propertyValues = $query->fetch()) { if (is_array($propertyValues[$property['ID']]) && !empty($propertyValues[$property['ID']])) { $oldValues = current($propertyValues[$property['ID']]); } else { $oldValues = $propertyValues[$property['ID']]; } if (!empty($oldValues)) { $oldPropertyValues = explode(',', $oldValues); } } $attachedIdForDelete = array_diff($oldPropertyValues, $value['VALUE']); if (!empty($attachedIdForDelete)) { foreach ($attachedIdForDelete as $idAttached) { list($type, $realId) = FileUserType::detectType($idAttached); if ($type == FileUserType::TYPE_ALREADY_ATTACHED) { $attachedModel = AttachedObject::loadById($realId); if (!$attachedModel) { continue; } if ($userFieldManager->belongsToEntity($attachedModel, "iblock_element", $property['ELEMENT_ID'])) { $attachedModel->delete(); } } } } $value['VALUE'] = implode(',', $value['VALUE']); return $value; }
$viewCount = 0; while ($arViews = $dbViewsList->Fetch()) { $arViewsData[$viewCount] = $arViews; $elementID = (int) $arViews["PRODUCT_ID"]; if (!isset($mapViewByProduct[$elementID])) { $mapViewByProduct[$elementID] = array(); } $mapViewByProduct[$elementID][] = $viewCount; $arProductId[$arViews["PRODUCT_ID"]] = $arViews["PRODUCT_ID"]; $arCatalogProductId[] = $arViews["PRODUCT_ID"]; $viewCount++; } unset($arViews, $dbViewsList, $viewCount); // Get product name if (!empty($arCatalogProductId)) { $elementIterator = CIblockElement::GetList(array(), array("ID" => $arCatalogProductId), false, false, array('ID', 'IBLOCK_ID', 'DETAIL_PAGE_URL')); while ($element = $elementIterator->GetNext()) { $elementID = (int) $element['ID']; if (isset($mapViewByProduct[$elementID]) && !empty($mapViewByProduct[$elementID])) { foreach ($mapViewByProduct[$elementID] as &$viewCount) { $arViewsData[$viewCount]['DETAIL_PAGE_URL'] = $element['~DETAIL_PAGE_URL']; } unset($viewCount); } } unset($element, $elementIterator); } // collect iblock info about all products in the static class member. Will be used in the CSaleProduct::GetProductSku if (!empty($arProductId)) { CSaleProduct::GetProductListIblockInfo($arProductId); }