require_once ($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/csv_data.php";);
$csvFile = new CCSVData('R', true);
$csvFile->LoadFile($_FILES['csv']['tmp_name']);
$csvFile->SetDelimiter(',');
while ($arRes = $csvFile->Fetch()) {
ec($arRes);
}
Собственно: - подключаем файл класса работы с CSV - создаем объект класса, указываем, что будет использоваться разделитель (R, есть еще фикс.поля F), и первая строка содержит заголовки (true); можно не указывать эти параметры и задать отдельными методами
- загружаем файл - ставим делиметер, где допустимые параметры: \t (табуляция), запятая, пробел, точка с запятой. - бежим как при обычной выборке из базы (напомню, Fetch возвращает НЕ обработанные данные, а GetNext безопасные).
Semenov Roman, да никто же не спорит Тут вопрос скорее не "почему не использовали именно эту фичу", а "зачем понадобилось писать прослойку, да еще и не очень удобную"
Эту фичу наверное нужно использовать для того что бы избежать всяческих проблем с кодировкой и прочими настройками которые Битрикс учитывает. Антон там в строке подключения библиортеки лишнее
Недавно столкнулся со старой версией битрикса у клиента, нужно было реализовать нечто подобное Если в методе CEvent::Send id сайта передан как массив, то в методе SendAttach нужно поправить выборку при обращении к таблице b_event_message
Долгое время рецепт работал. Но после одного из последних обновлений Битрикс скрипты im стали конфликтовать со скриптами админки. Чат пришлось отключить.
Хочу кратко описать как работать с XML в Битриксе правильно. Ибо не так давно (ну, для меня было неожиданностью по крайней мере) API для оного обновилось, и если раньше работали в лоб с массивом из XML, то сейчас для этого есть удобные инструменты.
if ($node = $xml->SelectNodes('/videos/video/pics')) {
print_r($node->children());
}
Где каждый такой чилдрен будет объектом CDataXMLNode.
Этого вполе достаточно для работы. Но более подробно изучить класс вы сможете по пути из п.1.
Дополнение:
1. Если формат XML с двоеточиями (неймспейсы которые, хз как правильно его называть):
<media:title></media:title>
то перед парсингом, надо сделать следующее:
$xml->delete_ns=false;
Спасибо за совет техподдержке.
2. Можно использовать не LoadString, а Load, которой передать абсолютный путь до файла. Метод хорош тем, что автоматически вычленяет кодировку из XML-файла (encoding) и конвертит файл в кодировку сайта. Есть минус - если кодировки в файле не найдется, будет считать, что файл находится в windows-1251 кодировке.
Столкнулся с довольно странным поведением (сначала думал) продукта, убил прилично времени. Так что, поделюсь этими граблями. Грабли относятся к БД с транзакциями (INNODB в MySQL, в частности).
Суть - пытаемся записать в Журнал сообщение при добавлении поста в форум. В данном виде все отлично работает. Но стоит нам откомментировать две нижние строчки, как ничего не добавляется - автоинкремент таблицы Журнала увеличивается, но лог не пишется. Это сейчас на простейшем обработчике 2 + 2 связываются легко, но стоило времени дойти до этого
В чем магия? Дело в том, что добавление постов в форум (а может и в блоги) окружено такой конструкцией в компонентах:
StartTransaction
AddMessage()
Commit OR RollBack
Для непосвященных, основная фишка транзаций - все-все что мы делаем после StartTransaction, упадет в базу только после Commit. Если же делается RollBack, то ничего не добавится. Вообще ничего.
И вот в эти грабли я и попал - в AddMessage генерировалась ошибка, а далее (в компоненте) делался RollBack. Соответственно, запись не ложилась в таблицу.
А можно ли закрывать транзакцию, если ее не открывать? У тебя получается $GLOBALS['DB']->RollBack(); дважды. Один ты закрыл, a другой, наверняка, еще где-то.
Артемий, все можно, только будет ли толк )) тоже самое можно сказать человеку закрыть два раза дверь не открывая, он команду получит, но ничего делать не будет, т.к. дверь уже закрыта =)
Большое спасибо, Антон, за пример! Как правильно заметил Андрей, в документации не указана переменная $arTemplateParameters - кучу времени убил, чтобы разобраться, почему дополнительные параметры не подтягиваются. Битриксу как всегда двойка в этой области.
Долганин Антон написал: под рукой. Вот требуется вам сохранять элемент со свойством, передавая просто название элемента списка, и не париться о том, есть ли такой вариант, или надо добавить н
Да это старо как битрикс! А вот как сделать если ты хочешь добавить в шаблон bitrix:catalog кроме стандартного набора еще один компонент и при этом использовать настройки комплексного компонента ($component), но не просто вынести эти настройки во вкладку "Дополнительно", а создать свою вкладку, по аналогии с существующими (настройки ТОПа или "С этим товаром покупают")??? Вот это как реализовать? Как добавить свою группу в параметрах шаблона?
Дело в том, что именно первая строчка выплевывает jquery системный, а вторая строчка js-скрипты шаблона (которые по правильному должны подрубаться через AddHeadScript). Таким образом, если их поменять местами, сначала пойдут скрипты, использующие jquery, а затем сама jquery. Конечно же, jquery это лишь пример подводного камня.
PS: Такой же порядок в
<?$APPLICATION->ShowHead();?>
но мне метод не нравится в силу того, что я не могу сам раскидать теги как мне надо.
Не путайте людей, сейчас через настройки можно выносить все js вниз страницы, а их порядок зависит от порядка их регистрации в шаблоне.
В 90% случаев подключаете первую jquery и подобные библиотеки и патом всё остальное и никаких проблем не будет, а если всё же есть то вы изобрели велосипед.
Я думаю это очевидно должно быть, что строка идет Выше, потому что как раз в ней часто вызывается jquery с гугла.
А вот у меня назрел вопрос, есть ли реальная разница между Asset::getInstance()->addString(""); и $APPLICATION->ShowHeadStrings(); в скоросрти работы, и не отвалится ли $APPLICATION в одном из обновлений битрикса, в результате полного перехода на D7.
Наверное, никто не будет спорить, что форма оформления заказа это самый сложный элемент для кастомизации, так как если внешний облик формы не устраивает клиента, то попотеть придется. Как-то так:
Поэтому, я поделюсь кое-какими соображениями о самой сложной части кастомизации - о блоке свойств. И да, речь пойдет исключительно об одношаговом компоненте как самом ходовом и современном.
А я использую компонент по шагам bitrix:sale.order.full и в нем нет файла props.php зато есть функция PrintPropsForm Есть варианты как отсортировать свойства по группам?
Дмитрий, не смотря на то, что это многошаговый, св-ва и так по группам должны идти (а иначе как?). Возможно ошибка какая-то, рекомендую в Битрикс стукнуть.
Зачем заменять маркеры в буферизированном блоке на живые поля ввода, если потом просто ставить continue? Не претендую на истину последней инстанции. Мне просто хочется разобраться.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».