Для того чтобы сменить папку выгрузки из 1С, необходимо отредактировать таблицу b_option.
MODULE_ID: | main |
NAME: | upload_dir |
Путь по умолчанию указан upload.
Если указать upload/1c_catalog/ то будет выгружать туда
Пишем стандартный компонент. Обычно ID Раздела можно получить так через параметр $arCurrentValues[‘IBLOCK_ID’]
Код ниже.
if (0 < intval($arCurrentValues['IBLOCK_ID'])) { $arPropList = array(); $arFilter = ['IBLOCK_ID' => $arCurrentValues['IBLOCK_ID']]; $arOrder = ['LEFT_MARGIN' => 'ASC']; $arSelect = ['ID','LEFT_MARGIN','DEPTH_LEVEL','NAME']; $resSections = \CIBlockSection::GetList($arOrder, $arFilter, false, $arSelect); while( $arSection = $resSections->fetch() ) { $add=''; if ($arSection['DEPTH_LEVEL']>1) { for($i=1;$i<=$arSection['DEPTH_LEVEL'];$i++) { $add=$add.'-'; } } $arPropList[$arSection['ID']] = $add.$arSection['NAME']; } $arComponentParameters['PARAMETERS']['CITY_NORMAL_SHOW'] = array( 'NAME' => 'Список городов для отображения', 'TYPE' => 'LIST', 'VALUES' => $arPropList, ); } $arComponentParameters = array( "PARAMETERS" => array( "IBLOCK_TYPE" => array( "PARENT" => "BASE", "NAME" => "Тип инфоблока", "TYPE" => "LIST", "VALUES" => $arTypesEx, "DEFAULT" => "news", "REFRESH" => "Y", ), "IBLOCK_ID" => array( "PARENT" => "BASE", "NAME" => "Инфобок", "TYPE" => "LIST", "VALUES" => $arIBlocks, "DEFAULT" => '={$_REQUEST["ID"]}', "ADDITIONAL_VALUES" => "Y", "REFRESH" => "Y", ), "CITY_NORMAL_SHOW" => array( "PARENT" => "BASE", "NAME" => "Список городов для отображения", "TYPE" => "LIST", "VALUES" => $arPropList, "MULTIPLE" => "Y", "REFRESH" => "Y", ), 'CACHE_TIME' => Array('DEFAULT'=>3600), ), );
Не получается войти в админку и сайт закрыт, но есть доступ к FTP?
Всё просто, заходите в init.php и вставляете следующий код:
use Bitrix\Main\Config\Option; COption::SetOptionString("main", "stop_site", "N"); COption::SetOptionString("main", "site_stopped", "N");
Небольшое дополнение к предыдущей статье.
Если Вам необходимо получить в фильтре либо выше (до вызова компонента сотбит) информацию о новом URL, можно выполнить подобный код и получить требуемую информацию:
$url = $_SERVER['REQUEST_URI']; // ищем по URL. Если совпадает, то значит существует страница с таким значением $connection = Bitrix\Main\Application::getConnection(); $sqlHelper = $connection->getSqlHelper(); $sql = "SELECT NEW_URL,REAL_URL FROM b_sotbit_seometa_chpu WHERE REAL_URL='".$url."'"; $recordset = $connection->query($sql); while ($record = $recordset->fetch()) { $new_url=$record['NEW_URL']; }
Пишем класс для работы:
class dataFromSotbit { public static function getConditionById($id) { $arCondition = \Sotbit\Seometa\ConditionTable::getById($id)->fetch(); if($arCondition['FILTER_TYPE'] == 'default') { $arCondition['FILTER_TYPE'] = \Bitrix\Main\Config\Option::get("sotbit.seometa", "FILTER_TYPE", "bitrix_chpu"); } return $arCondition; } public static function getMetaId($str){ $metaData = Sotbit\Seometa\SeometaUrlTable::getByRealUrl($str); return $metaData; } public static function getListFromUrl($url){ $result = \Sotbit\Seometa\SeometaUrlTable::getList(array( 'select' => array('*'), 'filter' => array('ACTIVE' => 'Y', '=REAL_URL' => $url), 'order' => array('ID') ))->fetch(); return $result; } public static function getNewUrl($url){ $result = \Sotbit\Seometa\SeometaUrlTable::getList(array( 'select' => array('NEW_URL'), 'filter' => array('ACTIVE' => 'Y', '=REAL_URL' => $url), 'order' => array('ID'), 'limit' => 1 ))->fetch(); return $result['NEW_URL']; } }
Добавляем его в файл и подключаем в init
Теперь можно обратится getNewUrl для получения нового URL.
Либо для получения всего массива данных getMetaId($url).
Как сделать так, чтобы выбранный тег тоже выводился?
Если Вам необходимо выводить текущую позицию в облаке тегов, тогда необходимо сделать следующее:
Заходим в bitrix/components/sotbit/seo.meta.tags/.parametrs.php
Добавляем строчку после 91:
'SHOW_ACTIVE' => array( "PARENT" => "BASE", 'NAME' => "Показывать активную вкладку", 'TYPE' => "CHECKBOX", "DEFAULT" => "Y", ),
Заходим в bitrix/components/sotbit/seo.meta.tags/component.php
Находим строчку 134 и добавляем
$arrTag['SHOW_ACTIVE']=0;
http://joxi.ru/VrwLPjvUjXpodm
Находим строчку
if($curPage !== false) unset($Tags[$curPage]);
и заменяем её на следующую:
if($curPage !== false) { if ($arParams['SHOW_ACTIVE']=='Y') { $Tags[$curPage]['SHOW_ACTIVE']=1; } else { unset($Tags[$curPage]); } }
http://joxi.ru/a2X6809claEZlr
В самом вызове компонента добавляем строчку “SHOW_ACTIVE” => “Y”,
http://joxi.ru/J2bnpZWcgwjYb2
Далее при вызове уже в самом шаблоне кастомизируете если SHOW_ACTIVE=1, то добавляете выделение в css. Должно получится следующее:
<div class="sotbit-seometa-tags-wrapper <?if ($Item['SHOW_ACTIVE']==1) echo 'active';?>">
use Bitrix\Main\Loader; use Bitrix\Main\SystemException; class AllProductDiscount{ /** * @return XML_ID|array * @throws SystemException * @throws \Bitrix\Main\LoaderException */ public static function getFull($arrFilter = array(), $arSelect = array()){ if(!Loader::includeModule('sale')) throw new SystemException('Не подключен модуль Sale'); //Все товары со скидкой!!! // Группы пользователей global $USER; $arUserGroups = $USER->GetUserGroupArray(); if (!is_array($arUserGroups)) $arUserGroups = array($arUserGroups); // Достаем старым методом только ID скидок привязанных к группам пользователей по ограничениям $actionsNotTemp = \CSaleDiscount::GetList(array("ID" => "ASC"),array("USER_GROUPS" => $arUserGroups),false,false,array("ID")); while($actionNot = $actionsNotTemp->fetch()){ $actionIds[] = $actionNot['ID']; } $actionIds=array_unique($actionIds); sort($actionIds); // Подготавливаем необходимые переменные для разборчивости кода global $DB; $conditionLogic = array('Equal'=>'=','Not'=>'!','Great'=>'>','Less'=>'<','EqGr'=>'>=','EqLs'=>'<='); $arSelect = array_merge(array("ID","IBLOCK_ID","XML_ID"),$arSelect); $city='MSK'; // Теперь достаем новым методом скидки с условиями. P.S. Старым методом этого делать не нужно из-за очень высокой нагрузки (уже тестировал) $actions = \Bitrix\Sale\Internals\DiscountTable::getList(array( 'select' => array("ID","ACTIONS_LIST"), 'filter' => array("ACTIVE"=>"Y","USE_COUPONS"=>"N","DISCOUNT_TYPE"=>"P","LID"=>SITE_ID, "ID"=>$actionIds, array( "LOGIC" => "OR", array( "<=ACTIVE_FROM"=>$DB->FormatDate(date("Y-m-d H:i:s"),"YYYY-MM-DD HH:MI:SS",\CSite::GetDateFormat("FULL")), ">=ACTIVE_TO"=>$DB->FormatDate(date("Y-m-d H:i:s"),"YYYY-MM-DD HH:MI:SS",\CSite::GetDateFormat("FULL")) ), array( "=ACTIVE_FROM"=>false, ">=ACTIVE_TO"=>$DB->FormatDate(date("Y-m-d H:i:s"),"YYYY-MM-DD HH:MI:SS",\CSite::GetDateFormat("FULL")) ), array( "<=ACTIVE_FROM"=>$DB->FormatDate(date("Y-m-d H:i:s"),"YYYY-MM-DD HH:MI:SS",\CSite::GetDateFormat("FULL")), "=ACTIVE_TO"=>false ), array( "=ACTIVE_FROM"=>false, "=ACTIVE_TO"=>false ), )) )); // Перебираем каждую скидку и подготавливаем условия фильтрации для CIBlockElement::GetList while($arrAction = $actions->fetch()){ $arrActions[$arrAction['ID']] = $arrAction; } foreach($arrActions as $actionId => $action){ $arPredFilter = array_merge(array("ACTIVE_DATE"=>"Y", "CAN_BUY"=>"Y"),$arrFilter); //Набор предустановленных параметров $arFilter = $arPredFilter; //Основной фильтр $dopArFilter = $arPredFilter; //Фильтр для доп. запроса $dopArFilter["=XML_ID"] = array(); //Пустое значения для первой отработки array_merge //Магия генерации фильтра foreach($action['ACTIONS_LIST']['CHILDREN'] as $condition){ foreach($condition['CHILDREN'] as $keyConditionSub=>$conditionSub){ $cs=$conditionSub['DATA']['value']; //Значение условия $cls=$conditionLogic[$conditionSub['DATA']['logic']]; //Оператор условия //$arFilter["LOGIC"]=$conditionSub['DATA']['All']?:'AND'; $CLASS_ID = explode(':',$conditionSub['CLASS_ID']); if($CLASS_ID[0]=='ActSaleSubGrp') { foreach($conditionSub['CHILDREN'] as $keyConditionSubElem=>$conditionSubElem){ $cse=$conditionSubElem['DATA']['value']; //Значение условия $clse=$conditionLogic[$conditionSubElem['DATA']['logic']]; //Оператор условия //$arFilter["LOGIC"]=$conditionSubElem['DATA']['All']?:'AND'; $CLASS_ID_EL = explode(':',$conditionSubElem['CLASS_ID']); if($CLASS_ID_EL[0]=='CondIBProp') { $arFilter["IBLOCK_ID"]=$CLASS_ID_EL[1]; $arFilter[$clse."PROPERTY_".$CLASS_ID_EL[2]]=array_merge((array)$arFilter[$clse."PROPERTY_".$CLASS_ID_EL[2]],(array)$cse); $arFilter[$clse."PROPERTY_".$CLASS_ID_EL[2]]=array_unique($arFilter[$clse."PROPERTY_".$CLASS_ID_EL[2]]); }elseif($CLASS_ID_EL[0]=='CondIBName') { $arFilter[$clse."NAME"]=array_merge((array)$arFilter[$clse."NAME"],(array)$cse); $arFilter[$clse."NAME"]=array_unique($arFilter[$clse."NAME"]); }elseif($CLASS_ID_EL[0]=='CondIBElement') { $arFilter[$clse."ID"]=array_merge((array)$arFilter[$clse."ID"],(array)$cse); $arFilter[$clse."ID"]=array_unique($arFilter[$clse."ID"]); }elseif($CLASS_ID_EL[0]=='CondIBTags') { $arFilter[$clse."TAGS"]=array_merge((array)$arFilter[$clse."TAGS"],(array)$cse); $arFilter[$clse."TAGS"]=array_unique($arFilter[$clse."TAGS"]); }elseif($CLASS_ID_EL[0]=='CondIBSection') { $arFilter[$clse."SECTION_ID"]=array_merge((array)$arFilter[$clse."SECTION_ID"],(array)$cse); $arFilter[$clse."SECTION_ID"]=array_unique($arFilter[$clse."SECTION_ID"]); }elseif($CLASS_ID_EL[0]=='CondIBXmlID') { $arFilter[$clse."XML_ID"]=array_merge((array)$arFilter[$clse."XML_ID"],(array)$cse); $arFilter[$clse."XML_ID"]=array_unique($arFilter[$clse."XML_ID"]); }elseif($CLASS_ID_EL[0]=='CondBsktAppliedDiscount') { //Условие: Были применены скидки (Y/N) foreach($arrActions as $tempAction){ if(($tempAction['SORT']<$action['SORT']&&$tempAction['PRIORITY']>$action['PRIORITY']&&$cse=='N')||($tempAction['SORT']>$action['SORT']&&$tempAction['PRIORITY']<$action['PRIORITY']&&$cse=='Y')){ $arFilter=false; break 4; } } } } }elseif($CLASS_ID[0]=='CondIBProp') { $arFilter["IBLOCK_ID"]=$CLASS_ID[1]; $arFilter[$cls."PROPERTY_".$CLASS_ID[2]]=array_merge((array)$arFilter[$cls."PROPERTY_".$CLASS_ID[2]],(array)$cs); $arFilter[$cls."PROPERTY_".$CLASS_ID[2]]=array_unique($arFilter[$cls."PROPERTY_".$CLASS_ID[2]]); }elseif($CLASS_ID[0]=='CondIBName') { $arFilter[$cls."NAME"]=array_merge((array)$arFilter[$cls."NAME"],(array)$cs); $arFilter[$cls."NAME"]=array_unique($arFilter[$cls."NAME"]); }elseif($CLASS_ID[0]=='CondIBElement') { $arFilter[$cls."ID"]=array_merge((array)$arFilter[$cls."ID"],(array)$cs); $arFilter[$cls."ID"]=array_unique($arFilter[$cls."ID"]); }elseif($CLASS_ID[0]=='CondIBTags') { $arFilter[$cls."TAGS"]=array_merge((array)$arFilter[$cls."TAGS"],(array)$cs); $arFilter[$cls."TAGS"]=array_unique($arFilter[$cls."TAGS"]); }elseif($CLASS_ID[0]=='CondIBSection') { $arFilter[$cls."SECTION_ID"]=array_merge((array)$arFilter[$cls."SECTION_ID"],(array)$cs); $arFilter[$cls."SECTION_ID"]=array_unique($arFilter[$cls."SECTION_ID"]); }elseif($CLASS_ID[0]=='CondIBXmlID') { $arFilter[$cls."XML_ID"]=array_merge((array)$arFilter[$cls."XML_ID"],(array)$cs); $arFilter[$cls."XML_ID"]=array_unique($arFilter[$cls."XML_ID"]); }elseif($CLASS_ID[0]=='CondBsktAppliedDiscount') { //Условие: Были применены скидки (Y/N) foreach($arrActions as $tempAction){ if(($tempAction['SORT']<$action['SORT']&&$tempAction['PRIORITY']>$action['PRIORITY']&&$cs=='N')||($tempAction['SORT']>$action['SORT']&&$tempAction['PRIORITY']<$action['PRIORITY']&&$cs=='Y')){ $arFilter=false; break 3; } } } } } if($arFilter!==false&&$arFilter!=$arPredFilter){ if(!isset($arFilter['=XML_ID'])){ //Делаем запрос по каждому из фильтров, т.к. один фильтр не получится сделать из-за противоречий условий каждой скидки $res = \CIBlockElement::GetList(array(), $arFilter, false, false, $arSelect); while($ob = $res->GetNextElement()){ $arFields = $ob->GetFields(); $poductsArray['IDS'][] = $arFields["ID"]; } }elseif(!empty($arFilter['=XML_ID'])){ //Подготавливаем массив для отдельного запроса $dopArFilter['=XML_ID'] = array_unique(array_merge($arFilter['=XML_ID'],$dopArFilter['=XML_ID'])); } } } if(isset($dopArFilter)&&!empty($dopArFilter['=XML_ID'])){ //Делаем отдельный запрос по конкретным XML_ID $res = \CIBlockElement::GetList(array(), $dopArFilter, false, array("nTopCount"=>count($dopArFilter['=XML_ID'])), $arSelect); while($ob = $res->GetNextElement()){ $arFields = $ob->GetFields(); $poductsArray['IDS'][] = $arFields["ID"]; } } $poductsArray['ids']=array_unique($poductsArray['ids']); return $poductsArray; } }
<? $res = AllProductDiscount::getFull( array("ACTIVE" => "Y", "SITE_ID" => SITE_ID), array() ); foreach($res['IDS'] as $ID) { $sale_id[] = $ID; } $GLOBALS['arrFilter'] = array("ID"=>$sale_id); ?>
Спасибо за публикацию:
https://dd-blog.ru/bitrix-creating-a-partition-discounts/
Оставляю этот код у себя для простоты поиска.
На самом деле всё просто. Идём по пути:
/bitrix/modules/main/include/
И ищем там файл prolog_after.php
После этого находим строчку:
if(COption::GetOptionString("main", "site_stopped", "N")=="Y" && !$USER->CanDoOperation('edit_other_settings'))
Редактируем на:
if(COption::GetOptionString("main", "site_stopped", "N")=="Y" && !$USER->CanDoOperation('edit_own_profile'))
Даём пользователям группы возможность редактировать свой профиль. Вуаля.
Данное решение не мое, нашел на просторах интернета.
Если нужно больше полей – добавляйте
$html .= '<td><input type="text" size="25" placeholder="Количество" name="'.$strHTMLControlName['VALUE'].'[]" value="'.$value['VALUE'][КОЛИЧЕСТВО].'" /></td>';
и ниже в GetAdminListViewHTML
." - ".$value['VALUE'][N]
Исходный код:
AddEventHandler("iblock","OnIBlockPropertyBuildList",array("Property_Service_List_Class","GetUserTypeDescription")); if(!class_exists("Property_Service_List_Class")) { class Property_Service_List_Class { function GetUserTypeDescription() { return array( "PROPERTY_TYPE" => "S", "USER_TYPE" => "EServiceList", "DESCRIPTION" => "Выбор", "GetPropertyFieldHtml" => array("Property_Service_List_Class","GetPropertyFieldHtml"), "GetPublicEditHTML" => array("Property_Service_List_Class","GetPropertyFieldHtml"), "ConvertToDB" => array("Property_Service_List_Class","ConvertToDB"), "ConvertFromDB" => array("Property_Service_List_Class","ConvertFromDB"), "GetAdminListViewHTML" => array("Property_Service_List_Class","GetAdminListViewHTML"), ); } function GetPropertyFieldHtml($arProperty, $value, $strHTMLControlName) { $arResult = array(); $cache[$IBLOCK_ID] = array(); $html = ''; $html = "<table>"; $html .= "<tr>"; $html .= '<td><input type="text" size="2" placeholder="Уровень (1 - первый, 2 - второй)" name="'.$strHTMLControlName['VALUE'].'[]" value="'.$value['VALUE'][0].'" /></td>'; $html .= '<td><input type="text" size="25" placeholder="Название" name="'.$strHTMLControlName['VALUE'].'[]" value="'.$value['VALUE'][1].'" /></td>'; $html .= '<td><input type="text" size="25" placeholder="Количество" name="'.$strHTMLControlName['VALUE'].'[]" value="'.$value['VALUE'][2].'" /></td>'; $html .= '</tr>'; $html .= "</table>"; return $html; } function ConvertToDB($arProperty, $value) { if($value['VALUE'][0]!='') { $value['VALUE'] = serialize($value['VALUE']); } else { $value['VALUE'] = null; } return $value; } function ConvertFromDB($arProperty, $value){ if(strlen($value["VALUE"])>0) { $tmpArr = unserialize($value["VALUE"]); if(is_array($tmpArr) && count($tmpArr)) $value["VALUE"] = $tmpArr; } else { $value["VALUE"] = null; } return $value; } function GetAdminListViewHTML($arProperty, $value, $strHTMLControlName) { if(is_array($value["VALUE"]) && count($value["VALUE"])) { $tmpArr = array(); $tmpArr[] = "[".$value['VALUE'][0]."] - ".$value['VALUE'][1]." - ".$value['VALUE'][2]; return implode(" /\n",$tmpArr); } else { return htmlspecialcharsex($value["VALUE"]); } } } }
Есть несколько решений.
<? $renderImage = CFile::ResizeImageGet($section['DETAIL_PICTURE'], Array("width" => "572", "height" => "378"), BX_RESIZE_IMAGE_PROPORTIONAL,true, Array("name" => "sharpen", "precision" => 0),false,100); ?>
Это отключит сжатие, и улучшит качество фотографий. Где width, height,$section[‘DETAIL_PICTURE’] задаете свое.
Недавно столкнулся с проблемой вывода пользовательского свойства в разделе. Задача была либо изменить вывод “привязки к элементам” либо заменить на свое свойство. Но информации было мало. Нашел пост от 2010 года где добавляли пользовательское свойство (ранее его не было). Взял шаблон оттуда и добавил.
Было вот так:
Стало вот так:
Собственно что и требовалось.
Вот ссылка:
https://dev.1c-bitrix.ru/community/webdev/user/2854/blog/2193/
Ну и при добавлении свойства писать не :
AddEventHandler(“iblock”, “OnIBlockPropertyBuildList”, Array(…))
а использовать обращение к основному модулю:
AddEventHandler(‘main’, ‘OnUserTypeBuildList’,array(…));