Здравствуйте, возникла проблема при использовании транзакций вылезает deadlock при выполнении CIBlockElement::Add, хотел отловить исключение SqlQueryException и повторно выполнить действие, но этот метод не выбрасывает исключение, а показывает и прерывает скрипт, хотел сделать через d7 добавление элемента, что бы там отловить, но в документации написано:
\Bitrix\Main\Entity\AddResult public static \Bitrix\Iblock\ElementTable::add( array $data );
Есть инфоблок сообщения чата. У каждого сообщения есть множественное свойство типа Число VIEWED_USERS. В это св-во записываются все пользователи, которые просмотрели данное сообщение. Я составил запрос через ORM и указал в фильтре выбрать все сообщения, которые НЕ просмотрел админ (user_id=1), VIEWED_USERS != 1 OR VIEWED_USERS = false, т.к. через ORM записи выводятся со всевозможными значениями, мне вывело все сообщения с VIEWED_USERS = false, а так же те, которые были прочитаны другими пользователями (даже если админ тоже прочитал), все логично, тут нужен запрос вида whereNotExists с подзапросом где where VIEWED_USERS = 1, если создать прямой запрос в bd, то все выбирает как надо, но средствами ORM не получилось составить, не удается связать подзапрос с основным запросом или может как по другому можно это сделать?
Как раз цены в фильтр собираются из $arResult['PRICES']; вот строка 245: foreach($arResult["PRICES"] as &$value){ if (!$value['CAN_VIEW'] && !$value['CAN_BUY']) continue; $arSelect = array_merge($arSelect, $value["SELECT_EXTENDED"]); $arElementFilter["DEFAULT_PRICE_FILTER_".$value["ID"]] = 1; if (isset($arSkuFilter)) $arSkuFilter["DEFAULT_PRICE_FILTER_".$value["ID"]] = 1; }
В интернет магазине заведены 80 типов цен для каждого склада (у каждого товара своя цена на складе), при попытке загрузить каталог /catalog вылезает ошибка Too many tables; MariaDB can only use 61 tables in a join и запрос получается космических размеров, т.к. подключается таблица с каждым типом цены, как в итоге это обойти или реализовать по другому?
Ситуация такая, на форму навесил соглашение, пользователь тыкает на соглашение, нажимает Принять, потом подумал, не не буду принимать и снял галочку, потом ушел с сайта, так и не отправив форма (т.к. его без соглашения не пропустило), но запись то уже есть что он нажимал соглашение и когда я запросом проверяю, нажимал ли этот пользьватель соглашение, запись есть, хотя после этого он уже снимал галочку, как быть в этом случае?
Вообщем нужно в поле: Доменное имя: (список доменных имен, каждое в новой строке) ничего не указывать, тогда PHPSESSID прописывается как test.ru, а не .test.ru и куки уже на поддомены не распостраняются. Хотя странно, прописывал просто test.ru (без точки в начале), а в cookie_domain прописывалось с точкой.
Похоже дело в функции session_regenerate_id(); когда она срабатывает, то удаляет не только текущий файл сессии, но так же и для главного домена или поддомена если она запускается на главном. Не понятно только почему она захватывает чужие сессии.
Проблема в следующем. Есть 2 битрикса, первый на домене test.ru, в второй на new.test.ru. Так вот если на new.test.ru попробовать через админку авторизоваться под пользователем, то авторизация не происходит, причем, слетает авторизация на test.ru. В настройках сайта в сайте и главном модуле домены прописаны правильно, пути до сайта тоже. Пробовал менять префиксы для cookie, не помогает. В чем может быть проблема и как сделать эти сайты вообще независимыми? Причем, я так понял, что при такой авторизации берется куки главного test.ru и из-за этого не удается авторизоваться, потому что если почистить все куки и не заходить сначала на test.ru, на new.test.ru авторизация под пользователем проходит без проблем. Параметр распостранять куки на поддомены естественно отключен.
Спасибо всем кто принимал участие, разобрался, дело было в модуле recapcha3 скачанного из маркетплейса, в нем через событие OnEndBufferContent анализировался выходящий буфер и проводились замены стандартной капчи на recapcha3, видимо не совсем корректно написана регулярка, по этому все ломалось. И, возможно, влияла настройка "Размер стека и pcre.recursion_limit" она влияет на обработку больших строк регулярными выражениями, хотя тест этой настройки пройден успешно.
Евгений Жуков написал: Логи php посмотрите. Там будет либо ошибка рекурсии, либо memory limit.
Про логи писал выше, делал в первую очередь, ошибок нет. Про memory limit, это явно не то, скрипт идет со статусом 200, а не 500 и я указал 2560M памяти.
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
while (ob_get_level()) {
ob_end_clean();
}
так подключите ядро и убейте буферы, затем выведите файл
И так тоже делал, закрывал все уровни буферизации, вывод начинает работать, так как больше не буферизуется, но при подключенном require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php"); в футере выводится какая то ерунда - часть хедера, да и при таком варианте не будут работать отложенные функции, т.к. буфер уже выкачен. Тут больше интересует почему так происходит, что бы увеличить этот лимит, а не городить костыли.
Я просто пытаюсь разобраться, почему один объем данных отображается нормально, а чуть больший уже нет и чем это регулируется. Сталкивался несколько раз в этой проблемой, когда надо было вывести через print_r() на экран огромный массив, тогда отложил, т.к. так и не удалось это сделать, мучался через сохранение в файл. А сейчас надо было вывести код формирующий карту, где набралось 16 тыс строк, из-за координат около 1 мб. и так иногда упираюсь в это, решил разобраться раз и навсегда. Init.php удалил для чистоты эксперимента, нигде события не используются больше, надо выводить все шаблоне сайта, на простой статичной странице.
Нет, ошибок нет, одни notice да deprecated. Если после require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php"); сразу сбросить буфер, через ob_end_flash() или ob_end_clean(), то показывает на экран файл любого размера, НО только если в конце не стоит <?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>, но футер мне нужен и это дает понять что что то в лимитах буфера всетаки, но не могу понять как сделать.
И еще интересный момент, если не использовать ядро битрикса, не подключать require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php"); , а просто сделать тоже самое через голый php, сложить содержимое в буфер и вывести, то так же отображается любой размер файла, так что дело не в apache, nginx, php. Видимо функции битрикс переназначают какие то функции и задают свои лимиты не генерируя ошибок. Попробуйте у себя взять любой файл около пары мегабайт и вывести его содержимое между header и footer, как у вас отработает?
Это сделал в первую очередь, но это не помогает, т.к. похоже вывод ошибок тоже идет в буфер, а т.к он переполнен, то просто прекращается вывод на экран и статус страницы 200, а не 500. В логах ошибок тоже нет.
Сократил немного файл, вывелось на экран, так же добавил в код функцию ob_get_status(true) в ней видно:
[3] => Array
(
[name] => CMain::EndBufferContent
[type] => 1
[flags] => 113
[level] => 3
[chunk_size] => 0
[buffer_size] => 999424
[buffer_used] => 992965
)
что стоит обработчик CMain::EndBufferContent() и что buffer_size уже на пределе, как раз если добавить чуть теста в файл, то буфер переполнится и будет опять белый экран, можно как то регулировать это значение?
В ней просто вывожу на экран содержимое файл 1.txt, в него напихал просто единички (111111) на 1 мб., так вот при загрузке страницы просто показывается белый экран, статус страницы 200, вывод ошибок включен, ошибок нет. Если в файле удалить часть содержимого, например сделать весом 950кб, то грузится без проблем. Есть ощущение что это из-за буферизации, т.к. если удалить require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php"); и require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php"); то все содержимое файла показывает без проблем сколько бы в нем данных не было. Пробовал увеличить output_buffering 128мб даже ставил, не помогает. И еще момент, если на экран не выводить, то все работает, можно получить содержимое файла и, например, пересохранить в другой. Тут проблема явно с выводом большого текста именно на экран. У кого такое было и как решить это?
Создал у пользователя множественное пользовательское свойство типа файл для прикрепления картинок. В публичной части в профиле загружается все нормально, но когда выводится, то прописывается одинаковый id для чекбоксов del, соответственно в консоле пишется ошибка о дублях id. Это будет исправлено и как сделать пока не исправили, что бы id был уникальный если загружено несколько картинок?
Хочу задать скидку 5 процентов на любой товар для зарегистрированных пользователей. Скидку создал, но она показывается теперь на каждом товаре, а мне нужно что бы применялась только в корзине, это возможно сделать, не указывая условие что Товар находится в корзине с перечислением всех товаров?
В настройках пользовательского поля можно только либо разрешить пользователям редактировать, либо запретить в том числе и админу, использую это поле только в админке что бы админ мог его заполнять.
Здравствуйте, создал 2 версии языка ru и en, создал разные почтовые шаблоны для разных языков на одни и те же события. Регистрация, смена пароля, отсылает по правильным шаблонам на соответствующем языке, а интернет магазин всегда шлет на ru. Полазил в ядре магазина, там отправка писем идет без учета языка $event->Send($eventName, $LID, $arFields, "N"); Это будет исправлено?
Здравствуйте. Есть прописанные языковые фразы, я нахожусь на языке ru, но мне нужно получить фразу для языка en, получаю ее через \Bitrix\Main\Localization\Loc::GetMessage('нужный_код',null,'en'); все отлично показывает, но только для публичной части. Если тоже самое делаю в событии, которое срабатывает в админке, то уже ничего не возвращается. Если посмотреть для каких языков подключились фразы, то видно, что en нету, хотя явно указывают, что хочу получить фразу для языка en. Почему в админке это не работает и как в итоге получить эту фразу? Причем, если переключиться в админке на en, то все отлично, показывает что надо. Поизучал файл loc.php оказывается, что в каком языке запрашиваешь первую фразу, то файл в котором есть эта фраза подключается только в этом языке, а другие языки исключаются и больше не подключаются. Не понятно тогда зачем в методе \Bitrix\Main\Localization\Loc::GetMessage() указывать язык если всеровно не вернется в запрашиваемом языке, если уже были запросы в другом языке.