dion_86, еще в Linux Mint (и в Ubuntu), по-умолчанию, /bin/sh ссылается на dash, а не на bash, как в BitrixVM. dash - это быстрый, но упрощенный шелл, который не поддерживает некоторые команды bash (Dash as /bin/sh), да еще и SIGTERM по другому работает (Fixing the default shell in Ubuntu / Linux Mint). Проблемы могут быть со скриптами, в которых используются возможности bash, хотя в шебанге у них прописан #!/bin/sh.
Мне кажется, что для восприятия примера Копирование значений полей элементов в свойства требуется значительно большее содержание дзена в крови, чем это дано среднему земному гуманоиду. Понизить планку можно с помощью такого кода:
Код
/*
* Пример вызова функции:
* CopyFromFieldsToPropertiesValues(22, array('DATE_ACTIVE_FROM','DATE_ACTIVE_TO'), array('DATE_BEGIN','DATE_END'));
*/
function CopyFromFieldsToPropertiesValues ($iblockId, $arFromFieldNames, $arToPropertyNames)
{
// Подключение модуля инфоблоков:
if (!CModule::IncludeModule('iblock')) die('Модуль iblock не установлен');
// Проверка входных параметров:
if (!is_array($arFromFieldNames))
throw new \Bitrix\Main\ArgumentTypeException('arFromFieldNames', 'array');
if (!is_array($arToPropertyNames))
throw new \Bitrix\Main\ArgumentTypeException('arToPropertyNames', 'array');
if (count($arFromFieldNames) != count($arToPropertyNames))
throw new \Bitrix\Main\ArgumentException('Число свойств не равно числу полей', 'arToPropertyNames');
$iblockId = intval($iblockId);
if ($iblockId == 0)
throw new \Bitrix\Main\ArgumentException('Нулевое значение Id инфоблока', 'iblockId');
if (count($arFromFieldNames) <= 0) return;
// Запросим ID и требуемые поля для всех элементов указанного инфоблока:
$dbElements = CIBlockElement::GetList(
array(), // arOrder (Без сортировки)
array('IBLOCK_ID' => $iblockId), // arFilter (Все элементы инфоблока с указанным ID)
false, // arGroupBy (Не группировать)
false, // arNavStartParams (Без постраничной навигации)
array_merge(array('ID'), $arFromFieldNames) // arSelectFields (Нам нужны ID и требуемые поля)
);
// Перебираем результаты:
while ($arElement = $dbElements->Fetch())
{
// Подготовим массив для SetPropertyValuesEx():
$arPropertyValues = array();
foreach ($arToPropertyNames as $key => $propertyName)
{
$arPropertyValues[$propertyName] = $arElement[$arFromFieldNames[$key]];
}
// Изменяем требуемые свойства для найденного элемента:
CIBlockElement::SetPropertyValuesEx(
$arElement['ID'], // ELEMENT_ID
$iblockId, // IBLOCK_ID
$arPropertyValues // PROPERTY_VALUES
//, array() // FLAGS
);
/*
// Вместо вызова SetPropertyValuesEx() можно установить каждое свойство отдельным вызовом SetPropertyValues().
// В этом случае нам не нужно создавать массив $arPropertyValues, но будет выполнено больше запросов к базе данных:
foreach ($arToPropertyNames as $key => $propertyName)
{
// Установим значение каждого требуемого свойства из полученных результатов:
CIBlockElement::SetPropertyValues(
$arElement['ID'], // ELEMENT_ID
$iblockId, // IBLOCK_ID
$arElement[$arFromFieldNames[$key]], // PROPERTY_VALUES
$propertyName // PROPERTY_CODE
);
}
*/
}
if (!isset($arPropertyValues))
throw new Exception('Не найдены поля инфоблока с ID='.$iblockId);
}
Денис Диденко, еще под Ubuntu сходу не зажглась галка "Сохранение сессий без UserAgent" в bitrix_server_test.php. Написано, что это 'Необходимо для апплета множественной загрузки файлов и обмена с 1С'. Сразу не стал разбираться, а потом - уже ВitrixVM докачался.
dion_86, в Linux Mint пакетным менеджером является APT (apt-get), а не RPM (к которому bitrix-env обращается через yum). Так что ставите все через apt-get install (php, apache, nginx, mysql и прочее), настраиваете так, чтобы проходил тест bitrix_server_test.php, а потом уже ставите ваш Битрикс. Утверждается, что на полную настройку тратится не менее 200 часов
Алексей Вдовин, в таком случае Вам придется установить для этих пользователей квоты на расход памяти, CPU, io ... Ведь если на одном из сайтов будет нагрузка, то и другие начнут тормозить. Не говоря уже о возможности запустить из шелла какой-нибудь cpuburn
По-моему, вместо этого надежнее каждый сайт держать в отдельной VM.
Если бы функция-обработчик в примере была названа "MyHandler()", то как догадаться, что нужно обратить свое внимание на событие OnAfterTicketAdd модуля support и написать код привязки?:
- В строке "Вынести компонент section.edit" должно быть "Вынести компонент photogallery.section.edit".
- Нужно разделить код около строки "Файл result_modifier.php".
- Там же, после строки "А также создайте result_modifier.php, где разместите такой код", не отображается часть примера - нужно заменить < и > на < и > в коде.
- Еще в примере отсутствует код установки обработчика:
- ID нужного инфоблока не 68, а 10 (по крайней мере, в БУС Бизнес 14.0.6).
- Можно дополнить пример замечанием, что если использовать более специфичное событие, то отпадает необходимость в скрытом input'е (PHOTOALBUM_PUBLIC_EDIT) и дополнительной проверке в коде обработчика:
Код
function OnAfterSectionEditHandler($arFields, $arParams, $arResult)
{
$es = new CIBlockSection();
$es->Update($arResult['SECTION']['ID'], array('UF_COOL_ALBUM' => $_POST['COOL_ALBUM']));
}
AddEventHandler('photogallery', 'OnAfterSectionEdit', 'OnAfterSectionEditHandler');
Можно также добавить, что в данном компоненте пользовательские поля уже загружены в $arResult['SECTION']['USER_FIELDS'], поэтому здесь можно обойтись без result_modifier.php, и в шаблоне использовать примерно такой код:
- В коде примеров не все < и > переведены в < и >. Из-за этого в двух местах код примеров не отображается (после "в квадрате равно" и после "в квадрате взятое дважды равно") .
- Слово "декоратор" нужно убрать, так как пример не имеет отношения к шаблону проектирования "Декоратор". В примере - обычное наследование и переопределение метода.
Значит словосочетание "мнемонический или символьный" - это ошибка. А запись в CIBlockSection::GetMixedList должна быть:
PROPERTY_CODE - числовой или символьный код свойства типа привязка к элементам.
Хотя на мой взгляд, для разработчиков, понятнее будет явное указание на значения ID и CODE.
Кстати, заметил что, у типов инфоблоков ID является символьным (String(50)), в отличие от других сущностей, у которых ID - числовой (Int). Хорошо, что у типов инфоблоков нет поля CODE :)))
Иногда в документации API противопоставляются понятия "мнемонический" и "символьный". Например, на CIBlockSection::GetMixedList:
PROPERTY_CODE - мнемонический или символьный код свойства типа привязка к элементам.
Означает ли это, что здесь можно использовать значения полей "CODE" и "NAME"? Или в данном случае "символьный код" означает "ID"? (Слово "мнемонический" вроде как закреплено за "CODE"?)
Имеет смысл добавить в шаблон пару строк так, чтобы он выдавал эту страницу с кодом 404: CHTTP::SetStatus("404 Not Found"); @define("ERROR_404","Y");
Это упростит написание валидатора ссылок для ваших программистов.
P.S.: Правильно ли я понимаю, что установка @define("ERROR_404","Y"); заставляет шаблон прилепить к странице скрытую форму для автоматического сбора статистики битых ссылок? Или это мои фантазии и оно просто карту прилепляет?
Кстати, эти страницы типов фильтров (и ссылки на них) лучше переименовать в 'Фильтр "Число"', 'Фильтр "Строка"', 'Фильтр "Маска"' и 'Фильтр "Дата"', чтобы не путаться с обычными типами данных. Сейчас, например, запись 'ID - по числовому коду (Число);' в описании функции CIBlockElement::GetList(), на мой взгляд, мало информативна. Ведь то, что ID - это число, я уже знаю, и совсем не предполагаю, что по предложенной ссылке есть дополнительная полезная информация. А если будет написано 'ID - по числовому коду (фильтр "Число");', то я сразу стану внимательнее относиться к таким ссылкам. Ведь, в частности, именно они указывают разницу, когда применяется тип фильтрации "Строка", а когда - "Маска".
Дополнительно задам еще пару вопросов:
1. Работают ли типы фильтрации в функциях, в описании которых это явно не описано, например, в CSocNetGroup::GetList() или в CIBlockProperty::GetList() ? (Это я к тому, что вдруг они работают, а в описании таких функций об этом просто забыли написать.)
2. Правильно ли я понимаю, что для значений пользовательских свойств типа DateTime ни в одной функции не используется фильтр "Дата", а вместо него применяется только поиск по шаблону [%_] ?
P.S.: Подсказка по предыдущему посту - строку
$arFilter = array("!PROPERTY_CML2_SCAN_CODE"=>false ) - используется, чтобы выбрать все элементы;
нужно было просто удалить со страницы Фильтрация ;) Кстати, этот злосчастный пример остался еще и в API - на странице описания функции CIBlockElement::GetList().
--- Добавлено:
И еще по фильтрации:
В документации классов модулей "Интернет-магазин" и "Торговый каталог" (например, CSaleOrder::GetList()) типы фильтрации '!' и '+' названы "модификаторами", а остальные ('>=', '>', '<=', '<', '~', '@', '%') - "операторами". Может имеет смысл использовать такую же нотацию и на странице курса?
Наверное, стоит упомянуть в курсе операторы '~', '@' и модификатор '+'. Интересно, они специфичны для этих двух модулей, или встроены в ядро? (Например, для CBlogPost::GetList() оператор '~' отсутствует в описании параметра arFilter, но работает, как указано в примере и комментарии.)
Интересно также знать, работает ли оператор '?' для классов модулей "Интернет-магазин" и "Торговый каталог"? (В API на эти модули он не упомянут.)
А также, отличается ли логика работы оператора '%' в модулях "Интернет-магазин" и "Торговый каталог" от прочих? Ведь в документации на эти модули указано, что для этого оператора "значение поля проверяется на соответствие передаваемой в фильтр строке в соответствии с языком запросов" (я так понимаю в SQL текущей базы данных?), в то время как в общем описании инфоблоков - действие зависит от типа значения (для чисел и дат - проверка на точное совпадение значения, для строк и масок - это регистронезависимый поиск подстроки).
$arFilter = array("!PROPERTY_CML2_SCAN_CODE"=>false ) - используется, чтобы выбрать только элементы с заполненным свойством; $arFilter = array("!PROPERTY_CML2_SCAN_CODE"=>false ) - используется, чтобы выбрать все элементы;
Выражения слева от '-' равны, а справа - нет. Это - Пятницо :) ))