Лариса Куцая: Ни для кого не секрет, что от выбора компании, предоставляющей услуги по перевозке пассажиров или груза, зависит своевременное прибытие в назначенный пункт и безопасность передвижения. Можно выбрать проверенную компанию, предоставляющую услугу такси из аэ

Ни для кого не секрет, что от выбора компании, предоставляющей услуги по перевозке пассажиров или груза, зависит своевременное прибытие в назначенный пункт и безопасность передвижения. Можно выбрать проверенную компанию, предоставляющую услугу такси из аэропорта Симферополя в Севастополь, такую как https://www.krimtransaero.ru

Автор :

Игорь Пикуль: Здравствуйте , я владелец сайта bringer.com.ua. Сразу скажу я не разработчик , имею только базовые знания по администрированию сайта. Помогите пожалуйста разобраться с url страниц на двух языках ru и ua.  К примеру имеем страницу на русском  https://bring

Здравствуйте , я владелец сайта bringer.com.ua. Сразу скажу я не разработчик , имею только базовые знания по администрированию сайта. Помогите пожалуйста разобраться с url страниц на двух языках ru и ua.

К примеру имеем страницу на русском

https://bringer.com.ua/shop-sale/ssha/deti-i-roditeli/

аналог на украинской версии

https://bringer.com.ua/ua/shop-sale/ssha/diti-i-batki/

при создании категории магазинов на русской версии ДЕТИ И РОДИТЕЛИ битрикс присваивает символьный код deti-i-roditeli

при создании категории магазинов на украинской версии ДІТИ ТА БАТЬКИ битрикс присваивает символьный код diti-i-batki

в результате происходит ошибка при переключении с одного языка на другой , страница не отображается , но если украинской версии присвоить символьный код русской версии и вбить в ручную в админке , все нормально страница отображается ,насколько я понял , в обоих версиях URL должен быть одинаковые , с разницей только в приставке ua в украинской версии .

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



Автор :

Михаил Пилипосян: Добрый день Заливал тексты на сайт в разделы, и обнаружил, что текст после заливки так же ещё отображается и в карточке самого раздела (прикрепил скрин). Скажите пожалуйста, как его оттуда убрать.

Добрый день
Заливал тексты на сайт в разделы, и обнаружил, что текст после заливки так же ещё отображается и в карточке самого раздела (прикрепил скрин).
Скажите пожалуйста, как его оттуда убрать.

Автор :

Андрей Рябин: Копирование блоков (модуль редактор для контент менеджеров)

Selection_140.png
Начиная с версии 1.1.5 в редактор добавились кнопки копирования/вставки блоков, кликаем на кнопку копирования блока, она подсветится желтым, а содержимое блока попадает в буфер (localStorage), после этого у каждой колонки появится кнопка вставки из буфера, куда можно вставить выбранные блоки, а буфер очистится.

Так как буфер хранится в localStorage, копировать можно блоки как между редакторами на одной странице, так и в редакторы на соседних страницах (вкладках) браузера.





Функционал копирования доступен также и в режиме просмотра колонок
Selection_137.png

Причем им даже удобнее пользоваться, так как лучше видно скопированные блоки.

Selection_138.png


Маркетплейс
http://marketplace.1c-bitrix.ru/solutions/sprint.editor/

Документация
https://bitbucket.org/andrey_ryabin/sprint.editor/wiki/Home

Автор :

Дмитрий Репин: Подмена параметров компонента прямо из шаблона

Web 1920 _ 1.png
Добрый день!
Бывают ситуации когда в каком-либо компоненте не хватает какого то параметра. Например, мне, не хватает параметра очередности столбцов в стандартном копоненте
"корзина" (bitrix:sale.basket.basket). То есть я хочу чтобы первым столбцом в корзине было не наименование, а артикул, или любой другой столбец.
Для этого я ничего не придумал лучше как добавить в настройках компонента дополнительные параметры вида "Номер столбца => Название столбца". Но проблема в том что я не знаю заранее количество столбцов, которые будут использованы в корзине, поэтому этот параметр должен быть динамически, то есть для параметра "COLUMNS_LIST" у компонента, мы должны добавить 'REFRESH' => 'Y' и в зависимости от количества выбранных столбцов выводить то же количество необходимых нам параметров.
Вариант "скопировать компонент в своё пространство имён" - оставим на потом, а я предлагаю прямо в шаблоне влезть в настройки параметров и поправить всё что нам нужно.
Итак. Копируем шаблон корзины в свой шаблон и добавляем (если отсутствует) файл .parameters.php прямо в вашей папке шаблона корзины.
Далее добавляем в этот файл параметр, полностью соответствующий параметру в папке .parameters.php компонента.
====code====
$arColumns = array(
   "NAME" => GetMessage("SBB_BNAME"),
   "DISCOUNT" => GetMessage("SBB_BDISCOUNT"),
   "WEIGHT" => GetMessage("SBB_BWEIGHT"),
   "PROPS" => GetMessage("SBB_BPROPS"),
   "DELETE" => GetMessage("SBB_BDELETE"),
   "DELAY" => GetMessage("SBB_BDELAY"),
   "TYPE" => GetMessage("SBB_BTYPE"),
   "PRICE" => GetMessage("SBB_BPRICE"),
   "QUANTITY" => GetMessage("SBB_BQUANTITY"),
   "SUM" => GetMessage("SBB_BSUM")
);
if (Loader::includeModule('catalog'))
{
   $arIblockIDs = array();
   $arIblockNames = array();
   $catalogIterator = CatalogCatalogIblockTable::getList(array(
      'select' => array('IBLOCK_ID', 'NAME' => 'IBLOCK.NAME'),
      'order' => array('IBLOCK_ID' => 'ASC')
   ));
   while ($catalog = $catalogIterator->fetch())
   {
      $catalog['IBLOCK_ID'] = (int)$catalog['IBLOCK_ID'];
      $arIblockIDs[] = $catalog['IBLOCK_ID'];
      $arIblockNames[$catalog['IBLOCK_ID']] = $catalog['NAME'];
   }
   unset($catalog, $catalogIterator);


   if (!empty($arIblockIDs))
   {
      $arProps = array();
      $propertyIterator = IblockPropertyTable::getList(array(
         'select' => array('ID', 'CODE', 'NAME', 'IBLOCK_ID'),
         'filter' => array('@IBLOCK_ID' => $arIblockIDs, '=ACTIVE' => 'Y', '!=XML_ID' => CIBlockPropertyTools::XML_SKU_LINK),
         'order' => array('IBLOCK_ID' => 'ASC', 'SORT' => 'ASC', 'ID' => 'ASC')
      ));
      while ($property = $propertyIterator->fetch())
      {
         $property['ID'] = (int)$property['ID'];
         $property['IBLOCK_ID'] = (int)$property['IBLOCK_ID'];
         $property['CODE'] = (string)$property['CODE'];
         if ($property['CODE'] == '')
            $property['CODE'] = $property['ID'];
         if (!isset($arProps[$property['CODE']]))
         {
            $arProps[$property['CODE']] = array(
               'CODE' => $property['CODE'],
               'TITLE' => $property['NAME'].' ['.$property['CODE'].']',
               'ID' => array($property['ID']),
               'IBLOCK_ID' => array($property['IBLOCK_ID'] => $property['IBLOCK_ID']),
               'IBLOCK_TITLE' => array($property['IBLOCK_ID'] => $arIblockNames[$property['IBLOCK_ID']]),
               'COUNT' => 1
            );
         }
         else
         {
            $arProps[$property['CODE']]['ID'][] = $property['ID'];
            $arProps[$property['CODE']]['IBLOCK_ID'][$property['IBLOCK_ID']] = $property['IBLOCK_ID'];
            if ($arProps[$property['CODE']]['COUNT'] < 2)
               $arProps[$property['CODE']]['IBLOCK_TITLE'][$property['IBLOCK_ID']] = $arIblockNames[$property['IBLOCK_ID']];
            $arProps[$property['CODE']]['COUNT']++;
         }
      }
      unset($property, $propertyIterator, $arIblockNames, $arIblockIDs);


      $propList = array();
      foreach ($arProps as &$property)
      {
         $iblockList = '';
         if ($property['COUNT'] > 1)
         {
            $iblockList = ($property['COUNT'] > 2 ? ' ( ... )' : ' ('.implode(', ', $property['IBLOCK_TITLE']).')');
         }
         $propList['PROPERTY_'.$property['CODE']] = $property['TITLE'].$iblockList;
      }
      unset($property, $arProps);


      if (!empty($propList))
         $arColumns = array_merge($arColumns, $propList);
      unset($propList);
   }
}
$arTemplateParameters["COLUMNS_LIST"] = array(
   "NAME"=>GetMessage("SBB_COLUMNS_LIST"),
   "TYPE"=>"LIST",
   "MULTIPLE"=>"Y",
   "VALUES"=>$arColumns,
   "DEFAULT"=>array("NAME", "PRICE", "TYPE", "DISCOUNT", "QUANTITY", "DELETE", "DELAY", "WEIGHT"),
   "COLS"=>25,
   "SIZE"=>7,
   "ADDITIONAL_VALUES"=>"N",
   "PARENT" => "VISUAL",
   'REFRESH' => 'Y',
);
=============
Единственное что я добавил это 'REFRESH' => 'Y'.
И теперь если посмотрим уже визуальные настройки компонента, то параметр "Выводимые колонки" поменяется на наш. Таким образом можно менять логику, значения любого параметра прямо из шаблона.

Далее просто получаем значения, создаём массив и выводим новые параметры для выбора.
====code====
$arrColumn = array();
foreach($arCurrentValues["COLUMNS_LIST"] as $id=>$code){
   $arrColumn[$code] = $arColumns[$code];
}
foreach($arCurrentValues["COLUMNS_LIST"] as $id=>$val){
   $arTemplateParameters['COLUMN_SORT'.$id] = array(
      'NAME' => GetMessage('COLUMN_NAME').($id+1),
      'TYPE' => 'LIST',
      'VALUES' => $arrColumn,
      "PARENT" => "VISUAL",
   );
}
=============
У меня получилось в итоге так:



Далее просто в result_modifier.php получаем наши параметры и меняем массив $arResult["GRID"]["HEADERS"] в зависимости от параметров.
====code====
$newArrHeaders = array();
foreach($arResult["GRID"]["HEADERS"] as $k=>$arHeader){
   $new_id = array_search ($arParams["COLUMN_SORT".$k], $arParams["COLUMNS_LIST"]);
   $newArrHeaders[] = $arResult["GRID"]["HEADERS"][$new_id];
}
ksort($newArrHeaders);
$arResult["GRID"]["HEADERS"] = $newArrHeaders;
=============

PS. Не забываем про языковой файл lang/[язык]/.parameters.php

Автор : bi3ks

Опасный target=»_blank»

Большинство создают внешние ссылки через target=»_blank» и не знают одного интересного нюанса — страница, на которую мы попадем таким образом, получит частичный контроль над ссылающейся на нее страницей через js свойство window.opener. Через window.opener.location мы сможем сделать редирект на, к примеру, фишинговую страницу. Это своего рода tabnabbing, только более продвинутый. Так как жертва … Continue reading

Автор : bi3ks
Теги : SEO

Дмитрий Козлов: EntityResult и ошибки работы с БД

В руководстве написано:

====code====
Если во время операции произошла одна или несколько ошибок, их текст можно получить из результата:
$result = BookTable::update(...);  
if (!$result->isSuccess()) {
    $errors = $result->getErrorMessages(); 
}
============= Создается обманчивое впечатление, что проверкой isSuccess можно отлавливать ошибки работы с БД. Однако это не так. Ошибки уровня БД обрабатываться не будут. Т.е. ошибки валидации, несоответствия полей в классах DataManager обработаются, а вот попытки записать NULL в поле NOT NULL или ошибки дубликата ключей вызовут просто Exception. В DataManager такой код: ====code====
try {
    операции с БД
}
catch (Exception $e)
{
    // check result to avoid warning
    $result->isSuccess();

    throw $e;
}

return $result;
=============
не логичнее ли было все же вернуть $result и дать программисту возможность самому решить, разрулить ситуацию или вызвать throw?
Ну а так все равно придется оборачивать каждую операцию в свой дополнительный try catch

Автор :

dev2fun: Внимание! Нюанс в компоненте bitrix:news.detail

Найдена проблема в компоненте bitrix:news.detail. У некоторых из-за этого могут возникнуть баги.

В чем соль?
Компонент сначала ищет элемент (по CODE or ID), затем только раздел (по CODE или ID), что не верно.

Представим пути:

/news/section_1/2017/
/news/section_2/2017/

Компонент ищет вначале элемент (2017), а потом только раздел (section_1 OR section_2). А должен сначала учесть раздел, а потом уже элемент.

Как пофиксить?
Копируем папку /bitrix/components/bitrix/news.detail, ложем в папку /bitrix/components/dev2fun/
Открываем components.php
Находим кусок и удаляем его:
====code====

//Handle case when ELEMENT_CODE used
if($arParams["ELEMENT_ID"] <= 0)
    $arParams["ELEMENT_ID"] = CIBlockFindTools::GetElementID(
        $arParams["ELEMENT_ID"],
        $arParams["~ELEMENT_CODE"],
        false,
        $arFilter["SECTION_CODE"],
        $arFilter
    );
=============
Далее находим:
====code====
if ($arParams["STRICT_SECTION_CHECK"])
{
   if ($arParams["SECTION_ID"] > 0)
   {
      $arFilter["SECTION_ID"] = $arParams["SECTION_ID"];
   }
   elseif (strlen($arParams["~SECTION_CODE"]) > 0)
   {
      $arFilter["SECTION_CODE"] = $arParams["~SECTION_CODE"];
   }
   elseif ($this->getParent() && strpos($arParams["DETAIL_URL"], "#SECTION_CODE_PATH#") !== false)
   {
      $this->abortResultCache();
      IblockComponentTools::process404(
         trim($arParams["MESSAGE_404"]) ?: GetMessage("T_NEWS_DETAIL_NF")
         ,true
         ,$arParams["SET_STATUS_404"] === "Y"
         ,$arParams["SHOW_404"] === "Y"
         ,$arParams["FILE_404"]
      );
      return 0;
   }
}
=============
И после него вставляем:
====code====
//Handle case when ELEMENT_CODE used
if($arParams["ELEMENT_ID"] <= 0)
    $arParams["ELEMENT_ID"] = CIBlockFindTools::GetElementID(
        $arParams["ELEMENT_ID"],
        $arParams["~ELEMENT_CODE"],
        (isset($arFilter["SECTION_ID"])?$arFilter["SECTION_ID"]:false),
        (isset($arFilter["SECTION_CODE"])?$arFilter["SECTION_CODE"]:false),
        $arFilter
    );
=============
Что мы сделали? Мы научили компонент учитывать раздел.

Вызов компонента теперь таков:
====code====
<?$APPLICATION->IncludeComponent(
   "dev2fun:news.detail",
   "",
   Array()
);?>
=============
Теперь пути:

/news/section_1/2017/
/news/section_2/2017/

Работают правильно.

Автор :

Андрей Рябин: Видеогалерея, почти как в «стиме» (модуль редактор для контент менеджеров)

Selection_008.png
В обновлении 1.1.6 вышел новый блок для редактора - Галерея видеороликов
В публичной части он похож на видеогалерею в сервисе steam - есть центральный блок с видео или картинкой и слайдер с остальными превьюшками.





Видеогалерея адаптивна, она занимает всю ширину блока в котором находится и поэтому очень удобна для встраивания в различные материалы.
На картинке пример двух видеогалерей которые находятся в невидимых блоках разной ширины

Selection_005.png

Помимо видео (сейчас поддерживается только youtube) видеогалеря может отображать и просто картинки, что создают сильную конкуренцию другому блоку - Галерея изображений :)
Selection_123.png

Однако в админке, работа с блоком Галерея видеороликов немного сложнее обычной Галереи изображений.

Из-за того что в слайды можно загружать или видео или картинку (или все вместе), предлагается добавлять сначала кадры слайда, на картинке это небольшие серые блоки, которые можно создать через кнопку "Добавить"

Далее, кликая на слайд (он подсветится красной рамкой) можно отредактировать его содержимое, прикрепить видео или добавить картинку.

Примечательно что модуль загрузит картинку-превью с ютуба если просто указать ссылку на видео.

А удалить слайд можно нажав на кнопку с крестиком у выделенного слайда.

Selection_004.png

Маркетплейс
http://marketplace.1c-bitrix.ru/solutions/sprint.editor/

Документация
https://bitbucket.org/andrey_ryabin/sprint.editor/wiki/Home

Автор : bi3ks
1 2 3 4 5
Страница 2 из 5