• Как на api d7 добавить стоимость доставки в заказ?

    Adamos
    @Adamos
    $service = \Bitrix\Sale\Delivery\Services\Manager::getById($deliveryId);
    $deliveryData = [
      'DELIVERY_ID' => $service['ID'],
      'DELIVERY_NAME' => $service['NAME'],
      'ALLOW_DELIVERY' => 'Y',
      'PRICE_DELIVERY' => $deliveryPrice,
      'CUSTOM_PRICE_DELIVERY' => 'Y'
    ];
    $shipment->setFields($deliveryData);
    Ответ написан
    Комментировать
  • Где хранятся задания cron?

    в Unix задачи cron-а лежат в нескольких местах:
    1. /etc/cron.d - здесь можно создавать файлы с заданиями крону, которые он будет загружать и исполнять по указанному расписанию. в этих файлах нужно указывать пользователя, от имени которого будет исполнено задание
    */10 * * * * root /root/backup.db.sh
    2. /etc/cron.daily, /etc/cron.hourly, /etc/cron.monthly, /etc/cron.weekly - здесь кладем скрипты, которые будут исполняться ежедневно, ежечасно, ежемесячно и еженедельно. это такие себе подготовленные расписания, которые подгружаются и исполняются в определенное время
    3. crontab -e - исполнение этой команды с ключом откроет текстовый редактор для редактирования заданий крону текущего пользователя. будьте внимательны - эти задания относятся к текущему пользователю и будут исполняться от его имени
    соответственно, самый просто способ для динамического редактирования заданий для крона - это манипуляция с заданиями в /etc/cron.d
    Ответ написан
    Комментировать
  • Где хранятся задания cron?

    marrk2
    @marrk2 Автор вопроса
    Правильный ответ /var/spool/cron
    Ответ написан
    6 комментариев
  • Куда закидываются мои книги в iBooks?

    DevMan
    @DevMan
    в ~/Library/Containers/com.apple.BKAgentService/Data/Documents/iBooks/Books
    Ответ написан
    8 комментариев
  • Закрепление строки и столбцов в phpexcel - как?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Копайте в сторону официальной документации, там это есть.
    Нет, вру, нет этого в доках, только в примерах.
    $objPHPExcel->getActiveSheet()->freezePane('A2');
    Обратите внимание, что аргумент функции - это адрес ячейки, выше и левее которой будут закрепляться области. То есть A2 закрепит первую строку, а B1 - первый столбец.
    Ответ написан
    3 комментария
  • Как получить ID раздела по его имени?

    sabramovskikh
    @sabramovskikh
    Комментировать
  • Как вывести количество имеющихся в конкретном складе тех или иных товаров?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Попробовал использовать \Bitrix\Catalog\StoreProductTable::getList
    Вот таблица с данными
    5be913bcd42f9031002584.png
    Вот запрос
    CModule::IncludeModule("catalog");
    
    $products = [537, 547];
    $amount = \Bitrix\Catalog\StoreProductTable::getList([
    	'filter' => [
    		'PRODUCT_ID' => $products
    	]
    ])->fetchAll();
    
    print_r($amount);

    5be913c5e1dd4427461151.png

    У вас в запросе
    '=PRODUCT_ID' >= 12391,
    А это:
    ('=PRODUCT_ID' >= 12391) === false
    и в итоге фильтр принимает вид
    array(false, '=STORE_ID' >= 2)
    Ответ написан
    8 комментариев
  • Как обновить множественное поле типа файл при?

    iFunction
    @iFunction
    PHP
    Как-то так:
    $rsProp = CIBlockElement::GetProperty($IBLOCK_ID, $ELEMENT_ID, array('sort' => 'asc'), array('CODE' => 'FILES'));
    while($arProp = $rsProp->Fetch())
    	$PROPERTY_VALUE[$arProp['PROPERTY_VALUE_ID']] = array('VALUE' => array('del'=>'Y'));
    
    $PROPERTY_VALUE[] = CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/new_image.jpg");
    
    CIBlockElement::SetPropertyValues($ELEMENT_ID, $IBLOCK_ID, $PROPERTY_VALUE, 'FILES');

    для Update аналогично, нужно передать array('VALUE' => array('del'=>'Y'))
    Ответ написан
    1 комментарий
  • Как в bitrix установить свойство типа список(enum) у инфоблока методами api?

    alexyarik
    @alexyarik
    Битрикс разработчик
    1) Обновить списочное свойство
    CIBlockPropertyEnum::GetList - получаете ID значения свойства списка
    CIBlockElement::SetPropertyValues - обновляете свойство элемента используя ID значения свойства списка
    2) Добавить списочное свойство
    Если ID значения свойства списка пустое, тогда:
    $ibpenum = new CIBlockPropertyEnum;
    if($PropID = $ibpenum->Add() 
    {CIBlockElement::SetPropertyValues

    Тут подробнее https://dev.1c-bitrix.ru/api_help/iblock/classes/c...
    Ответ написан
    Комментировать
  • Почему мультикурл зависает на строке curl_multi_select?

    Taraflex
    @Taraflex
    Ищу работу. Контакты в профиле.
    Используйте более удобные обертки
    https://github.com/chuyskywalker/rolling-curl
    Ответ написан
    Комментировать
  • Как выбрать только первую строку используя регулярное выражение?

    DevMan
    @DevMan
    читайте документацию по парсеру, какой движок регулярок там используется.
    для pcre достаточно такого https://regex101.com/r/tT8dV6/1
    Ответ написан
    2 комментария
  • CSS. Как построить круг вокруг цифры (без учета содержимого)?

    Stalker_RED
    @Stalker_RED
    width и height задайте жестко.


    P.S.: код скриншотами - это плохо.
    Ответ написан
    2 комментария
  • Как сделать редирект c http на https для всех кроме одной страницы?

    @ShamblerR
    RewriteCond %{REQUEST_URI} !$ваш_урл1$  [NC,OR]
    RewriteCond %{REQUEST_URI} !$ваш_урл2$  [NC,OR]
    RewriteCond %{REQUEST_URI} !$ваш_урл3$  [NC,OR]
    RewriteCond %{REQUEST_URI} !$ваш_урл4$  [NC]
    # Последний без OR поскольку нет следующего или просто NC
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
    Ответ написан
    Комментировать
  • Как правильно загружать картинки через VK API на PHP?

    @Nc_Soft
    <?php
    $token = '**************************************';
    $group_id = '1111111';
    $vk = new Vk($token);
    
    $image_path = 'image.png';
    copy('https://www.google.ru/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png', 'image.png');
    
    $upload_server = $vk->photosGetWallUploadServer($group_id);
    
    $upload = $vk->uploadFile($upload_server['upload_url'], $image_path);
    
    $save = $vk->photosSaveWallPhoto([
            'group_id' => $group_id,
            'photo' => $upload['photo'],
            'server' => $upload['server'],
            'hash' => $upload['hash']
        ]
    );
    
    $attachments = sprintf('photo%s_%s', $save[0]['owner_id'], $save[0]['id']);
    
    
    $post = $vk->wallPost([
        'owner_id' => "-$group_id",
        'from_group' => 1,
        'message' => "блаблабла",
        'attachments' => $attachments
    ]);
    
    
    class Vk
    {
        private $token;
        private $v = '5.37';
    
        public function __construct($token)
        {
            $this->token = $token;
        }
    
        public function wallPost($data)
        {
            return $this->request('wall.post', $data);
        }
    
        public function photosGetWallUploadServer($group_id)
        {
            $params = [
                'group_id' => $group_id,
            ];
            return $this->request('photos.getWallUploadServer', $params);
        }
    
        /**
         * @param $params [user_id, group_id, photo, server, hash]
         * @return mixed
         * @throws \Exception
         */
        public function photosSaveWallPhoto($params)
        {
            return $this->request('photos.saveWallPhoto', $params);
        }
    
        public function uploadFile($url, $path)
        {
            $ch = curl_init($url);
            curl_setopt($ch, CURLOPT_HEADER, false);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_POST, true);
    
            if (class_exists('\CURLFile')) {
                curl_setopt($ch, CURLOPT_POSTFIELDS, ['file1' => new \CURLFile($path)]);
            } else {
                curl_setopt($ch, CURLOPT_POSTFIELDS, ['file1' => "@$path"]);
            }
    
            $data = curl_exec($ch);
            curl_close($ch);
            return json_decode($data, true);
        }
    
        private function request($method, array $params)
        {
            $params['v'] = $this->v;
    
            $ch = curl_init('https://api.vk.com/method/' . $method . '?access_token=' . $this->token);
            curl_setopt($ch, CURLOPT_HEADER, false);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
            $data = curl_exec($ch);
            curl_close($ch);
            $json = json_decode($data, true);
            if (!isset($json['response'])) {
                throw new \Exception($data);
            }
            usleep(mt_rand(1000000, 2000000));
            return $json['response'];
        }
    }
    Ответ написан
    6 комментариев
  • Как установить Recaptcha на Битрикс?

    ildarkhasanshin
    @ildarkhasanshin
    developer
    1 установить marketplace.1c-bitrix.ru/solutions/twim.recaptchafree
    2 добавить сайт на https://www.google.com/recaptcha/admin
    3 ввести полученные ключи в настройки модуля
    Ответ написан
    1 комментарий
  • Как найти папку с компонентом bitrix?

    Rema1ns
    @Rema1ns
    и так сойдет
    Дампаете переменную $view, получили название шаблона.

    Где искать
    /bitrix/templates/ваш_шаблон/components/bitrix/catalog.section/
    /bitrix/templates/.default/components/bitrix/catalog.section/
    или
    /local/templates/ваш_шаблон/components/bitrix/catalog.section/

    Ну а вообще, если вы попробуете редактировать шаблон из публичной части, в окне редактирования будет полный путь до шаблона
    Ответ написан
    2 комментария
  • Как организовать поиск по заголовкам в битриксе?

    @sergafon
    Решается задача следующим образом
    в init.php всталвяем
    // Исключаем поиск по описаниям
    AddEventHandler("search", "BeforeIndex", array("SearchHandlers", "BeforeIndexHandler"));
    
    class SearchHandlers
    {
        function BeforeIndexHandler($arFields)
        {
            if($arFields["MODULE_ID"] == "iblock")
            {
                if(array_key_exists("BODY", $arFields) && substr($arFields["ITEM_ID"], 0, 1) != "S") // Только для элементов
                {
                    $arFields["BODY"] = "";
                }
    
                if (substr($arFields["ITEM_ID"], 0, 1) == "S") // Только для разделов
                {
                    $arFields['TITLE'] = "";
                    $arFields["BODY"] = "";
                    $arFields['TAGS'] = "";
                }
            }
    
            return $arFields;
        }
    }


    После чего необходимо запустить переиндексацию в настройках-поиск-переиндексация. Данное событие запускается при переиндексировании каждого элемента. Мы убрали из поискового индекса описание, поэтому поиск теперь не будет проводится по описанию в любом компоненте поиска. У разделов мы исключили заголовок, теги и описание, чтобы они вообще не участвовали в поиске.
    Ответ написан
    1 комментарий
  • Как сделать акцию в битриксе 3 товара по цене 2?

    @tgarl Автор вопроса
    Приведу итоговое решение для того кто будет искать.
    Некоторые вещи нужно будеть немного адаптировать, но в целом вот решение:
    public static function OnBasketUpdateHandler($ID, $arItem)
        {
            global $USER;
    	if(!is_object($USER)){
    		$USER = new CUser();
    	}
    	$userId=$USER->GetID();
    	$strGroups = $USER->GetUserGroupString();
    	$arUserGroups = explode(',', $strGroups); 
    
    
        $productID = $arItem['PRODUCT_ID'];
        $quantity = $arItem['QUANTITY'];
    
    		
    	if ($userId=="81035" ){//Пока выводим только для меня
    		\Bitrix\Main\Loader::IncludeModule('iblock');
    		\Bitrix\Main\Loader::IncludeModule('catalog');
    		\Bitrix\Main\Loader::IncludeModule('sale');
    
    		$fuser=\Bitrix\Sale\Fuser::getId();
    		$basket = \Bitrix\Sale\Basket::loadItemsForFUser( $fuser, \Bitrix\Main\Context::getCurrent()->getSite() );
    		
    		$res=[];
    		$tovar=[];
    		foreach ($basket as $basketItem) {
    			if(!$basketItem->isDelay()){
    				$mxResult=[];
    				$aa = \CCatalogSku::GetProductInfo($basketItem->getProductId())['ID'];
    				$mxResult[$aa] = $aa;
    				\CIBlockElement::GetPropertyValuesArray($mxResult, 26, array(
    					'ID' => $mxResult,
    					'IBLOCK_ID' => 26,
    				));
    				$raschet='';
    				if(in_array($mxResult[$aa]['ROZNICHNAYA_SET']['VALUE_ENUM_ID'], [1753,1754]) && $mxResult[$aa]['RASPRODAZHA']['VALUE']=='true'){$raschet='raschet';}
    								
    				$basketPropertyCollection = $basketItem->getPropertyCollection(); 				
    				$res[]=[$basketItem->getProductId(),$basketItem->getPrice(), $basketItem->getQuantity(), $basketItem->getFinalPrice(), $basketPropertyCollection->getPropertyValues()['BAR_CODE']['VALUE'], $raschet];
    				$tovar[]=$basketPropertyCollection->getPropertyValues()['BAR_CODE']['VALUE'];
    					
    			}
    		}
    		
    		$coli=[];
    		$coli0=[];
    		foreach($res as $vl){
    			if($vl[5]=='raschet'){
    			for ($x=1; $x<=$vl[2]; $x++){
    				$coli[]=[$vl[0],$vl[1],$vl[5]];
    			}
    			}else{
    				$coli0[]=[$vl[0],$vl[1],$vl[5]];
    			}
    		}
    		$cont=count($coli);
    		usort($coli, function($a, $b){
    			return $a['1'] <=> $b['1'];
    		});
    		$skidka = floor($cont / 3);
    		for ($x=0; $x<$skidka; $x++){
    			$coli[$x][1]=0;
    		}
    		$coli = array_reverse($coli)+$coli0;
    		$arFilter = Array( "IBLOCK_ID"=>27, "PROPERTY_CML2_BAR_CODE"=>$tovar );
    		$res = \CIBlockElement::GetList(Array("SORT"=>"ASC",), $arFilter, false,false,array('ID',"PROPERTY_CML2_BAR_CODE",'CATALOG_QUANTITY','PROPERTY_CML2_LINK','IBLOCK_EXTERNAL_ID','XML_ID'));
    		$productsId=[];
    		$productsIdXml=[];
    		
    		while($ar_fields = $res->GetNext())
    		{
    			$productsId[$ar_fields["PROPERTY_CML2_BAR_CODE_VALUE"]]=$ar_fields['ID'];
    			$productsIdXml[$ar_fields["PROPERTY_CML2_BAR_CODE_VALUE"]]=['IBLOCK_EXTERNAL_ID'=>$ar_fields['IBLOCK_EXTERNAL_ID'],'XML_ID'=>$ar_fields['XML_ID']];
    			$productsIdXml2[$ar_fields["ID"]]=['IBLOCK_EXTERNAL_ID'=>$ar_fields['IBLOCK_EXTERNAL_ID'],'XML_ID'=>$ar_fields['XML_ID']];
    		}
    		$itogTovar=[];
    		
    		foreach($coli as $val){
    			$itogTovar[$val[0]][$val[1]]++;
    		}
    				
    		$itogo=[];	
    		foreach($itogTovar as $productID0=>$value){
    			$itogo[$productID0]['price']=0;
    			$itogo[$productID0]['quantity']=0;
    			$itogo[$productID0]['custom']='N';
    			foreach($value as $price0=>$qunt0){
    				if($price0>0){
    					$arPrice0 = \bh\catalog\tools::getPrc($productID0);
    					$itogo[$productID0]['price']=$itogo[$productID0]['price']+$arPrice0*$qunt0;
    					$itogo[$productID0]['quantity']=$itogo[$productID0]['quantity']+$qunt0;
    				}else{
    					$itogo[$productID0]['quantity']=$itogo[$productID0]['quantity']+$qunt0;
    					$itogo[$productID0]['custom']='Y';
    				}
    			}
    			$itogo[$productID0]['price']=floor($itogo[$productID0]['price']/$itogo[$productID0]['quantity']);
    		}
    		foreach ($basket as $basketItem) {
    			$id=$basketItem->getField('PRODUCT_ID');
    			if($itogo[$id]['custom']=='Y'){
    				$basketItem->setFields(array(
    						'CUSTOM_PRICE' => 'Y',
    						'PRICE' => $itogo[$id]['price'],
    						'CATALOG_XML_ID'=>$productsIdXml2[$id]['IBLOCK_EXTERNAL_ID'],
    						'PRODUCT_XML_ID'=>$productsIdXml2[$id]['XML_ID']
    					));
    				$basketItem->save();
    				$basketPropertyCollection = $basketItem->getPropertyCollection(); 
    				$basketPropertyCollection->setProperty(array(
    					'ACTION'=>array(
    					   'NAME' => 'Акция',
    					   'CODE' => 'ACTION',
    					   'VALUE' => 'Товар по акции 2=3',
    					   'SORT' => 1000,
    					),
    					'CATALOG_XML_ID'=>array(
    							'NAME' => 'Catalog XML_ID',
    							'CODE' => 'CATALOG.XML_ID',
    							'VALUE' => $productsIdXml2[$id]['IBLOCK_EXTERNAL_ID']
    						),
    					'PRODUCT_XML_ID'=>array(
    							"NAME" => "Product XML_ID",
    							"CODE" => "PRODUCT.XML_ID",
    							"VALUE" => $productsIdXml2[$id]['XML_ID']
    						)
    				));
    				$basketPropertyCollection->save();
    			}else{
    				$basketItem->setFields(array(
    						'CATALOG_XML_ID'=>$productsIdXml2[$id]['IBLOCK_EXTERNAL_ID'],
    						'PRODUCT_XML_ID'=>$productsIdXml2[$id]['XML_ID']
    					));
    				$basketItem->save();
    				$basketPropertyCollection = $basketItem->getPropertyCollection(); 
    				$basketPropertyCollection->setProperty(array(
    					'CATALOG_XML_ID'=>array(
    							'NAME' => 'Catalog XML_ID',
    							'CODE' => 'CATALOG.XML_ID',
    							'VALUE' => $productsIdXml2[$id]['IBLOCK_EXTERNAL_ID']
    						),
    					'PRODUCT_XML_ID'=>array(
    							"NAME" => "Product XML_ID",
    							"CODE" => "PRODUCT.XML_ID",
    							"VALUE" => $productsIdXml2[$id]['XML_ID']
    						)
    				));
    				$basketPropertyCollection->save();
    			}
    		}
    		
    	}
    		
        }
    Ответ написан
    Комментировать
  • ИП для небольшой компании торгующей софтом?

    customtema
    @customtema
    arint.ru
    Затаскают.

    ИП дешевле по налогам.

    А еще у вас очевидные проблемы с бизнес-моделью.

    Переход на "продажу своих разработок" займёт лет 10. И этот переход - не бизнес, а гребанная самозанятость. Однако, головной боли у вас будет много. А денег будет на порядки меньше, чем вы рассчитываете.

    Прежде чем открывать новую компанию, просто совет - поработайте в каких-нибудь компаниях в этой отрасли, посмотрите как отрасль устроена, как работает рынок, как работают компании. Какие возможности, какие сложности.
    Ответ написан
    2 комментария