среда, 15 октября 2014 г.

FTP Server для Android или переносная WiFi флешка.

В этой заметке я расскажу вам про FTP Server на Android или про то как из вашего любимого Android устройства сделать переносную WiFi флешку. Предыстория написания этой заметки банальна. Попался мне компьютер с установленной Windows 98, задача была крайне простой - скопировать несколько папок с рабочего стола на другой ПК или флешку. Т.к. флешку, к сожалению, Windows 98 не увидела по причине отсутствия драйверов, а к сетевым шарам в рабочей группе она коннектиться не хотела, да и разбираться было некогда, выбор пал на альтернативные способы, чем собственно и стал FTP (ПК с Windows 98 был подключен к маршрутизатору с WiFi точкой доступа, собственно, к той же самой точке доступа и был подключен мой телефон). Т.к. консольный ftp.exe есть практически в любой версии ОС Windows. Но ближе к делу. Итак, устанавливаем на ваш Android телефон FTPServer от Andreas Liebig. Приложение это бесплатное, имеет маленький размер и не требует root, т.е. из серии - установил и работай.

После установки FTPServer в телефон нам необходимо настроить его. Прописать имя пользователя и пароль, которые будут использоваться для доступа к FTP Server'у, указать порт (я выбрал 5000, обратите внимание, что т.к. приложение не требует root, до на стандартном для FTP сервера 21-ом порту оно работать не сможет, т.е. нужно выбрать любой номер порта больше 1024). Установить галочку "Только папка по-умолчанию" и назначить Путь по-умолчанию (у меня это был /sdcard/). После чего перейти на основной экран приложения и нажать кнопку Запустить FTP:


Как мы видим, сверху отображены IP и порт нашего FTP Server'а. Настраиваем любой FTP клиент (я, например, воспользовался встроенным плагином для Far Manager) на использование нашего FTP Server'а:


Соединяемся, и закачиваем / скачиваем любые файлы с ПК на SD-карту телефона. Профит. Кстати,  FTPServer поддерживает UTF-8, поэтому проблем с кодировкой кириллических названий - нет как класса, единственное, в настройках FTP клиента необходимо выбрать кодировку используемую сервером как UTF-8. Еще один положительный момент - в самом FTP сервере можно задать список разрешенных WiFi сетей для доступа, т.е. к примеру, его можно настроить так, чтобы в домашней / офисной сети FTP Server был доступен, а при подключении к любой другой сети - нет. Собственно, использование FTP Server'а - один из самых простых способов получить / передать файлы на телефон "по воздуху", не используя при этом какого-либо специализированного ресурсоемкого софта. Ну а если, к примеру, настроить на ПК какую-нибудь утилиту типа FTPDrive, то данный FTP можно будет использовать как отдельную букву диска в Проводнике. На этом пожалуй всё ... ) Вопросы, комментарии, предложения приветствуются.




понедельник, 13 октября 2014 г.

Как вставить подсветку синтаксиса в шаблон Google Blogger?

Озадачился я тут вопросом как вставить подсветку синтаксиса в шаблон Google Blogger. Решение было найдено в виде highlight.js и Хостинг JavaScript-библиотек от Яндекс. В шаблон Google Blogger записываем следующие строки:

<!-- Code HighLight -->
<script src="http://yastatic.net/highlightjs/8.2/highlight.min.js"></script>
<link rel="stylesheet" href="http://yastatic.net/highlightjs/8.2/styles/github.min.css" />
<script type="text/javascript">hljs.initHighlightingOnLoad();</script>

И наслаждаемся результатом, который при просмотре выглядит вот так:


Highlight.js, как и другие подобные скрипты, использует вариацию тега pre, но в данном случае вместе с тегом code, и автоматически понимает язык выкладываемого кода:

<pre><code>...</code></pre>

Т.е. весь код, в котором нужно выполнить подсветку синтаксиса необходимо размещать на месте троеточия, внутри обертки из pre и code.

p.s. Для примера, нижеследующий PHP-код в этом блоге, как раз подсвечивается с помощью highlight.js:

<?php phpinfo(); ?>

Красиво, читабельно, удобно. А главное - минимум трудозатрат, т.е. любой блоггер может добавить подсветку синтаксиса на страницы своего блога буквально в считанные минуты.

воскресенье, 12 октября 2014 г.

Alcatel One Touch POP 2 (4.5) OT-5042

Некоторое время назад я писал о распространении 4G (LTE) сетей в регионах. Так, например, в нашем - LTE-первопроходцем стала компания Мегафон, а затем и МТС объявил о запуске LTE-сети. Но речь пойдет не об этом, а об аппаратах, предназначенных для использования в 4G сетях.

Что касается компании Мегафон - то в свое время она представила первый бюджетный LTE-смартфон - Мегафон 4G Turbo, который можно было приобрести за 4990 руб., затем МТС анонсировал продажи МТС 978 (Alcatel OT-6035) и, вот теперь, в интернет-магазине МТС появился никем не замеченный анонс Alcatel One Touch POP 2 (Alcatel OT-5042).

Alcatel One Touch POP 2 - если я не ошибаюсь, это первый двухсимочник с LTE появившийся на российском рынке.

Alcatel OT-5042 / Alcatel OneTouch Pop 2 - второе поколение линейки OneTouch Pop, теперь и с LTE-модулем. Основным новшеством во второй серии гаджета является обновление процессора и модуля связи. В качестве CPU в OneTouch Pop 2 используется Qualcomm Snapdragon 410, процессор, поддерживающий все LTE стандарты и обладающий 64-х битной архитектурой. Кроме 64-разрядного Qualcomm Snapdragon 410 с четырьмя ядрами Cortex-A53, работающими на частоте 1,2 ГГц смартфон может похвастаться графическим ускорителем Adreno 306, способным воспроизводить видео в формате Full HD 1080p. Также смартфон оснащен 1 Gb оперативной памяти (RAM) и 8 Gb внутренней памяти, часть из которых используется для хранения пользовательских данных. Приятный FWVGA экран размером 4.5" с разрешением 854x480 пикселей, а также две камеры, тыловая - 5 Mpix, фронтальная - 0.3 Mpix, в сочетании с перечисленными выше характеристиками и относительно невысокой ценой (5 990 руб.) делают его достойным кандидатом для замены 3G-смартфону.

Кстати, надо отметить что Alcatel планирует выпускать данный аппарат в нескольких версиях - c Android и Windows Phone на борту, так что у поклонников ОС от Microsoft появится возможность использовать это устройство в "привычном окружении". Здесь надо отметить, что лишь некоторые производители выпускаются версию одного и того же гаджета с разными операционными системами, и, что радует, Alcatel в их числе. Версия же смартфона, поступившего в продажу в МТС базируется на Android 4.4 KitKat.


Технические характеристики Alcatel One Touch POP 2:

Дисплей
4.5-дюйма, 480 x 854 пикселей, 16M цветов, мультитач.


Процессор
Qualcomm Snapdragon 410 MSM8916 чипсет (quad-core 1.2 GHz ARM Cortex-A53 MPcore, Adreno 306 GPU)

Память
1 GB RAM, 8 GB внутренней памяти (из которой пользователю доступно около 5Gb), поддержка microSD до 32 Gb.

Операционная система
Android 4.4.2 (KitKat)

Камера
5.0 MPix (2592 x 1944 пикселей) тыловая камера.
VGA (640 x 480 pixels) фронтальная камера.

Передача данных / поддерживаемые частоты
GPRS, EDGE, UMTS, HSDPA, HSUPA 5.76 Mbps, HSPA+ 42 Mbps, LTE Cat4 150 Mbps downlink / 50 Mbps uplink (LTE-A), Wi-Fi 802.11 b/g/n, Wi-Fi Direct, Wi-Fi hotspot, NFC, DLNA, Bluetooth v4.0 с A2DP, Infrared, microUSB v2.0

  • 2G: GSM 850 / 900 / 1800 / 1900 MHz
  • 3G: UMTS 850 / 900 / 1900 / 2100 MHz (OT-5042A, OT-5042X, OT-5042W, OT-5042G)
  • UMTS 2100 / 800 MHz OT-(5042F)
  • 4G: LTE 850 / 1700 / 1900 / 2100 / 2600 MHz (OT-5042A)
  • LTE 800 / 900 / 1800 / 2100 / 2600 MHz (OT-5042X)
  • LTE 700 / 1700 / 1900 / 2100 / 2600 MHz (OT-5042W)
  • LTE 800 / 1800 / 2100 MHz (OT-5042F)
  • LTE 700 / 900 / 1800 / 2100 / 2600 MHz (OT-5042G)

Батарея
Lithium-ion 2000 mAh

Размеры и вес
132.5 x 65.4 x 9.95 мм, 147 грамм.

Доступные цветовые исполнения
Lemon Yellow, Lavender, Jade Green, Aqua Blue, Cozy Red, Volcano Black, Platinum Silver, White, Ash Gray

Полезные ссылки:

воскресенье, 5 октября 2014 г.

Как разблокировать Oysters T72M?

Сегодня, по традиции, мы продолжим обзор новостей мира мобильной связи, и, как это было и ранее, вновь обратимся к ресурсу UnlockClub.Ru. Недавно на этом сайте появилась статья - Обзор и разблокировка планшета Oysters T72M, в которой дан небольшой обзор, а также описан метод разблокировки этого планшета от оператора. В данном случае примечательно то, что на официальном сайте оператора информация о том что этот планшет предназначен только для работы в сети Мегафон попросту отсутствует (по-крайней мере на момент написания этой заметки). Однако, на практике оба слота планшета "залочены" именно на этого оператора и при попытке вставить SIM-карту отличную от Мегафон - планшет запрашивает код разблокировки. Ниже я сделал небольшую подборку полезных ссылок по Oysters T72M:

Результат теста Antutu Benchmark 5.1:


Результаты теста Vellamo Benchmark (Browser - 1453, Multicore [Beta] - 882, Metal - 543):




пятница, 3 октября 2014 г.

Битрикс. Сортировка элементов инфоблока в $arResult.

И снова мы возвращаемся к Битриксу ;) Чувствую про него будет еще десяток постов. Во время работы над проектом всегда возникают какие-то вопросы, требующие либо нетривиального подхода, либо поиска информации. Естественно, все они решаются, и вот методом их решения, как раз и хочется "поделиться с потомками". Мало ли кому будет полезным. Итак представьте, что у нас есть некий массив $arResult['ELEMENTS'] полученный из элементов инфоблока. Чтобы пример не был таким абстрактным, в качестве примера возьмем компонент bitrix:iblock.element.add.list, который выводит список Список своих элементов с привязкой к пользователю. Т.е. к примеру, если у вас "Доска объявлений", то у пользователя в личном кабинете должен быть доступен список объявлений которые он подавал. Но вот беда ... компонент выводит элементы пользователя в $arResult['ELEMENTS'], который с помощью свойств компонента никак нельзя ни отсортировать, ни изменить и т.п. Что несколько неудобно. Например, нам нужно вывести все объявления пользователя, начиная с последнего ...

На помощь нам придет result_modifier.php и Класс для сортировки массива, usort [php]. Исходный код класса:

class CCabinet_SortObject {

 function __cmp_ValueOf($a, $b, $name, $order) {
  if(is_set($a[$name]) && is_set($b[$name])) {
   if($order == 'ASC')
    return ($a[$name]<$b[$name])?true:false; 
   elseif($order == 'DESC')return ($b[$name]>$a[$name])?false:true;
  }
 }

 function cmp_STATUS_ASC($a, $b) {
  return CCabinet_SortObject::__cmp_ValueOf($a, $b, "STATUS", "ASC");
 }

 function cmp_STATUS_DESC($a, $b) {
  return CCabinet_SortObject::__cmp_ValueOf($a, $b, "STATUS", "DESC");
 }

 function cmp_NAME_ASC($a, $b) {
  return CCabinet_SortObject::__cmp_ValueOf($a, $b, "OBJECT_NAME", "ASC");
 }

 function cmp_NAME_DESC($a, $b) {
  return CCabinet_SortObject::__cmp_ValueOf($a, $b, "OBJECT_NAME", "DESC");
 }

 function cmp_CITY_ASC($a, $b) {
  return CCabinet_SortObject::__cmp_ValueOf($a, $b, "CITY_NAME", "ASC");
 }

 function cmp_CITY_DESC($a, $b) {
  return CCabinet_SortObject::__cmp_ValueOf($a, $b, "CITY_NAME", "DESC");
 }

 function cmp_DATE_DESC($a, $b) {
  if ($a["DATE_CREATE"] == $b["DATE_CREATE"]) {
         return 0;
     }
     return ($a["DATE_CREATE"] > $b["DATE_CREATE"]) ? -1 : 1;
 }

 function cmp_DATE_ASC($a, $b) {
  if ($a["DATE_CREATE"] == $b["DATE_CREATE"]) {
         return 0;
     }
     return ($a["DATE_CREATE"] < $b["DATE_CREATE"]) ? -1 : 1;
 }

}

Автор приводит такой пример вызова:

usort($arResult['ITEAM'], array("CCabinet_SortObject", "cmp_".$arParams['SORT_BY']."_".$arParams['SORT_ORDER']));

Но нам нужно отсортировать объяления по дате создания. Поэтому внутри result_modifier.php мы поступаем следующим образом:

usort($arResult['ELEMENTS'], array("CCabinet_SortObject", "cmp_"."DATE"."_"."DESC"));

В результате объявления отсортированы у нас по дате. Профит. Хочется сказать спасибо автору блога yunaliev.ru за сэкономленное время и универсальный метод.


четверг, 2 октября 2014 г.

Отправка RAW HTTP Post средствами Битрикс API

В последнее время так или иначе приходится касаться разработки на Битрикс. И сегодня мы с вами рассмотрим как отправить RAW HTTP Post средствами Битрикс. Для начала давайте разберемся, что же такое HTTP RAW Post? Чтобы не вдаваться в подробности, просто скажу, что это то что можно получить с помощью $HTTP_RAW_POST_DATA или php://input. Предположим у нас есть такой вот скрипт receiver на стороне сервера, который сохраняет http raw post в текстовый файл (пример, естественно, просто учебеный). Назовем его receiver.php:

<?php
$data = $HTTP_RAW_POST_DATA;
//$data = file_get_contents("php://input");
file_put_contents("receiver.log",$data,FILE_APPEND);
echo "<result>Ok</result>\r\n";
?>

Для чего такая штука может использоваться? Ну к примеру на вход этому скрипту подаются некие XML данные, он их обрабатывает и отвечает тоже XML (повторюсь, пример учебный, не надо говорить про схемы, отсутствие версии XML и т.д. и т.п.). Итак, есть такой receiver и нужно послать к нему запрос из Битрикса. Сделать это можно двумя способами:

  • Использование класса CHTTP (см. /bitrix/modules/main/tools.php), но как следует из комментариев в этом модуле - он deprecated.
  • Поэтому вторым вариантом является использование Bitrix\Main\Web\HttpClient, про HttpClient можно "покурить" тут.
Перейдем от слов к делу, с помощью CHTTP можно сделать так:

$post_url = "http://localhost/receiver.php";
$http = new CHTTP();
$arUrl = $http->ParseURL($post_url, $arUrl);
if ($http->Query('POST', $arUrl['host'], $arUrl['port'], $arUrl['path_query'], $xml, '', "application/octet-stream", false)) 
 { $arResult["TEST"] = $http->result; }
else    { $arResult["TEST"] = "BAD"; }

Где в $xml содержатся наши данные, которые отправляются receiver'у. Обратите внимание на параметры Query. Конкретнее на post_content_type, он у нас "application/octet-stream". В противном случае POST был ушел с application/x-www-form-urlencoded - а это уже совсем другая история.

Ну и второй вариант реализации с помощью HttpClient, тут все куда проще на первый взгляд, но без "курения" исходников до этого решения можно доходить достаточно долго:

$post_url = "http://test.local/receiver.php";
$http = new \Bitrix\Main\Web\HttpClient();  // http://bxapi.ru/?module_id=main&class=HttpClient
$http->setHeader("Content-Type","application/octet-stream");
if ($http->post($post_url,$xml))
      { $arResult["TEST"] = $http->getResult(); }

И в том, и в другом варианте в $arResult["TEST"] мы получим <result>Ok</result>. Собственно как и было задумано. Надеюсь, что эта заметка оказалась хоть кому-то полезной ;)

p.s. Напоследок ... можно долго изобретать велосипеды в своих компонентах и тысячи раз писать кривые реализации одних и тех же действий. Но зачем? В API Битрикса много чего реализовано (и много чего, кстати, остается за кадром для начинающих разработчиков, т.к. все обычно смотрят документацию на оф. сайте, и редко кто заглядывает в исходники CMS и смотрим как реализованы те или иные модули, а там, между прочим, есть чему поучиться). В том же  /bitrix/modules/main/tools.php есть, к примеру, функция check_email для проверки валидности адреса электронной почты, функция формирования списка выбора <select>...</select> из массива и много чего еще. Вообщем перед тем как кодить что-то свое, всегда нужно ознакомиться с тем что уже есть )) 

Стандарты разработки на платформе 1С-Битрикс

(с) https://github.com/uniplug/bitrix-style-guide - оригинал данного руководства. Возможно кому-то окажется полезным.

В данном руководстве описаны рекомендуемые техники при разработке на платформе 1С-Битрикс / 1C-Bitrix (далее - Битрикс). Если вы заметили ошибку и хотите внести исправление или дополнение, пожалуйста, не стесняйтесь делать pull request или связываться напрямую.
Приветствуется любая помощь.

PHP

  • Код PHP должен быть написан в соответствии со стандартом PSR-1.
  • Стиль написания кода должен соответствовать стандарту PSR-2.
  • В конечном итоге придерживаемся правил форматирования (ядро D7) от разработчиков системы.

Оформление исходного кода

  • Используйте кодировку UTF-8 без BOM для файлов с исходным кодом.
  • Используйте Unix-style окончания строк LF. Никаких CR+LF.
  • Используйте сокращенные теги <? и <?=.
    // bad
    <?php echo .. ?>
    
    // good
    <?= .. ?>
    
  • Используйте ТАБ для каждого отступа. Никаких пробелов для блоков кода.

Общие положения

  • При добавлении кода в файл init.php группируйте код в классы и выносите их в отдельные файлы.
  • При подключении файлов используйте только функции Битрикса. Цитата:
    Поддержка Bitrix Framework русских (и прочих) символов в названиях публичных файлов накладывает определённые ограничения на работу: недопустимы прямые вызовы
    • к файлам, имена которых выбираются пользователями,
    • к папкам, имена которых выбираются пользователями,
    • к файлам и папкам, которые могут лежать в папках, имена которых выбираются пользователями. Недопустимы вызовы любых прямых методов работы с файловой системой: include, require, fopen, filesize, unlink, file_exists и т.д. http://dev.1c-bitrix.ru/api_help/main/reference/cbxvirtualio/index.php
    init.php
    // bad
    // SomeClass
    include('../some_file.php');
    
    //good
    // SomeClass
    $APPLICATION->GetFileContent('../some_file.php');
    
  • Не используйте цифровые значения в GetList, GetByID и схожих методах, которые принимают различные ID. Создайте файл со всеми необходимыми константами и используйте их имена.
    // bad
    $comments = CIBlockElement::GetList(Array(), Array("IBLOCK_ID" => 12));
    
    1. У каждой константы должно быть говорящее имя и комментарий.
    2. Файл constants.php:
      // ИБ с комментариями пользователей
      const COMMENTS_IBLOCK_ID = 12;
      
    3. Подключите этот файл в init.php
      //Константы проекта
      $APPLICATION->GetFileContent($_SERVER["DOCUMENT_ROOT"] . '/bitrix/php_interface/includes/constants.php');
      
    4. Используйте константу
      $comments = CIBlockElement::GetList(Array(), Array("IBLOCK_ID" => COMMENTS_IBLOCK_ID));
      
  • Используйте Bitrix IBlock Tools, обсуждение.
  • При выборках данных (например, GetList) обязательно указывайте поля, которые нужны для дальнейших манипуляций, кроме случаев, когда нужны все поля:
    // good - Обязательно указывайте поля для выборки
    $arSelect = Array("ID", "NAME", "DATE_ACTIVE_FROM");
    ...
    $res = CIBlockElement::GetList(Array(), $arFilter, false, Array(), $arSelect);
    
  • При необходимости выбрать несколько элементов по ID, обязательно используйте GetList вместо GetByID:
    // bad
    $element1 = CIBlockElement::GetByID(1);
    $element2 = CIBlockElement::GetByID(2);
    
    // good
    $elements = CIBlockElement::GetList(Array(), Array(1, 2));
    
  • Не используйте прямые запросы к базе данных, вся работа только через API.
  • Если к файлу не предусмотрен прямой доступ через WEB, в первой строке файла добавьте:
    <?if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();?>
    

Отладка

Важно
Логирование замедляет работу системы и может являться брешью в безопасности

Вывод на экран

Вывод в файл

  1. Определите константу LOG_FILENAME в файле /bitrix/php_interface/dbconn.php, задавая путь к лог-файлу за пределами DOCUMENT_ROOT.
    // определяем константу LOG_FILENAME, в которой зададим путь к лог-файлу
    define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"]."/../log.txt");
    
  2. Отправьте сообщение в лог
    AddMessage2Log("Произвольный текст сообщения", "module_id");
    
    Пример:
    AddMessage2Log( print_r($arResult, true) );
    

SQL

  • Определите переменную DBDebugToFile для логирования всех SQL запросов.
    $DBDebugToFile = true;
    

Работа с компонентами

  • Шаблонам компонентов давайте осмысленные названия и в каждом проекте придерживайтесь общего стиля. Например, Раздел/страница_сайта.Название.Тип
    Примеры:
    • index.user.auth
    • profile.orders.list
    • cart.products.additional
  • Стандартные компоненты не модифицируются. Если возникнет такая необходимость — создайте копию компонента в своем пространстве имен в каталоге /bitrix/components/.
  • РЕКОММЕНДУЕТСЯ все шаблоны компонентов сохранять в шаблоне .default в каталоге /bitrix/templates/.default/.
  • НЕ РЕКОМЕНДУЕТСЯ делать любые манипуляции с данными в файле template.php. При необходимости правки логики стандартных компонентов, но недостаточной для того, что делать свой используются файлы result_modifier.php и component_epilog.php
  • РЕКОМЕНДУЕТСЯ использовать файлы style.css и script.js в шаблонах только если они переопределяют стандартное поведение схожих элементов. РЕКОМЕНДУЕТСЯ оставить комментарий об этой особенности.

Кэширование

  • Кэширование компонентов не отключается. Практически не существует задач, которые нельзя решить с включенным кэшированием.
    Исключение:
    • Во время разработки полностью отключайте кэширование - это съэкономит вам много времени.
  • Подключайте js и css файлы только через предназначенный для этого API:
  • Если файлы ресурсов подключены неправильно, высока вероятность, что браузеры начнут их активно кэшировать. Не забывайте про специализированные расширеня для браузеров:
  • НЕЛЬЗЯ вставлять код вызова компонента внутрь файла template.php другого компонента.
    Это противоречит идеологии разделения даннах и представления (см. выше) и влечет двойное кэширование.

Работа с шаблонами

  • РЕКОМЕНДУЕТСЯ использовать минимальное количество шаблонов.
  • РЕКОМЕНДУЕТСЯ подключать header.php и footer.php из одного места для всех шаблонов, если это позволяет дизайн и верстка.
  • РЕКОМЕНДУЕТСЯ общие картинки, скрипты и стили шаблонов сохранять в одном месте, например, в /bitrix/templates/.default/.

Структура шаблона

  • В каталоге шаблона остаются только необходимые для Битрикс файлы - header.php, footer.php, styles.css и т.д.
  • Включаемые файлы располагаются в каталоге includes
  • Все дополнительные файлы (скрипты, изображения и т.д.) располагаются в каталоге assets:
    • js - свои скрипты и однофайловые библиотеки
    • css - свои стили и однофайловые библиотеки
    • images - изображения, спрайты, иконки
    • fonts - шрифты
    • остальные библиотеки и фреймворки располагаются в каталогах, названия которых совпадают с названием и версией библиотеки, при этом сохраняется внутренняя структура дистрибутива.
      • Документацию, примеры и доп. файлы можно удалить.
Пример:
/local/templates/<название_шаблона>/
├── header.php
├── footer.php
├── styles.css
├── templaye_styles.css
│
├── components/
|   ├── ..
│
├── assets/
│   ├── js/
|   |   ├── custom.js
|   |   ├── jquery.dataAttributeEvents.js
│   |
│   ├── css/
|   |   ├── ..
│   |
│   ├── images/
|   |   ├── ..
│   |
│   └── bootstrap-3.0.0/
│       ├── js/
│       ├── css/
  ...

Работа с инфоблоками

  • Названия свойств инфоблоков должны быть:
    1. в верхнем регистре;
    2. осмысленными (используйте связку сущность_наименование);
    3. слова разделаются подчеркиванием.
    Пример:
    • Имя пользователя: USER_NAME
    • Валюта заказа: ORDER_CURRENCY
    • Список заказов: ORDER_LIST