Пример Warning
$result = \Bitrix\Catalog\Model\Price::delete($arFields["ID"]); $result->__destruct(); // Warning. Потому что произошла ошибка, и не сделали $result->isSuccess(), $result->getErrors(), $result->getErrorMessages() |
Warning: CAskaronMyTest: запрещено удалять значение цены in /bitrix/modules/main/lib/orm/data/result.php on line 87 Call Stack # Time Memory Function Location {main}( ) .../test5.php:0 Bitrix\Main\ORM\Data\Result->__destruct( ) .../test5.php:65 trigger_error( $message = 'CAskaronMyTest: запрещено удалять значение цены', $error_level = 512 ) .../result.php:87 |
Пример вызова - обработчик ORM D7 перед удалением значения цены
Warning получается если метод ORM вернул результат с ошибкой, и мы не проверили результат.
$eventManager = \Bitrix\Main\EventManager::getInstance(); $eventManager->addEventHandler("catalog", "Bitrix\\Catalog\\Model\\Price::OnBeforeDelete", array("CAskaronMyTest", "PriceOnBeforeDelete"), false, 50 ); class CAskaronMyTest { public static function PriceOnBeforeDelete( \Bitrix\Main\Event $event ) { $result = new \Bitrix\Main\Entity\EventResult(); $arErrors = array(); $arErrors[] = new \Bitrix\Main\Entity\EntityError( __CLASS__.": запрещено удалять значение цены" ); $result->setErrors($arErrors); return $result; } } // Удалить цены для товара $PRODUCT_ID = 15709; if ( \Bitrix\Main\Loader::includeModule( "catalog" ) ) { $res = \Bitrix\Catalog\PriceTable::getList( array( "filter" => array( "=PRODUCT_ID" => $PRODUCT_ID, ), ) ); while ($arFields = $res->fetch()) { $result = \Bitrix\Catalog\Model\Price::delete($arFields["ID"]); $result->__destruct(); // Warning. Потому что произошла ошибка, и не сделали $result->isSuccess(), $result->getErrors(), $result->getErrorMessages() } } |
Деструктор Bitrix\Main\ORM\Data\Result выкидывает Warning, если вернулась ошибка, и мы забыли сделать $result->isSuccess(), $result->getErrors() или $result->getErrorMessages()
Не забывайте проверять результат. Проблема не в том месте, где мы выкидываем ошибку. А в том месте, где мы не проверяем ошибку Bitrix\Main\ORM\Data\Result->__destruct( )
Так не будет Warning:
$result = \Bitrix\Catalog\Model\Price::delete( $arFields["ID"] ); if (!$result->isSuccess()) { // нужна проверка isSuccess, чтобы не было Warning // https://dev.1c-bitrix.ru/community/webdev/user/25773/blog/45090/ //echo "Ошибка"; //echo "<pre>"; print_r( $result->getErrors() ) ;echo "</pre>"; //echo "<pre>"; print_r( $result->getErrorMessages() ) ;echo "</pre>"; } $result->__destruct(); |
В документации эта ситуация упоминается, но считается редкой:
В предыдущих примерах есть нюанс: запрос на обновление данных вызывается без проверки результата. Если запрос не прошел из-за "проваленной" валидации, и не была вызвана проверка isSuccess(), система сгенерирует E_USER_WARNING со списком ошибок, который можно будет увидеть в логе сайта (если соответствующим образом настроить .settings.php). |
Самое плохое, если Warning появляется при обмене с 1С, или при самодельном импорте/экспорте. В таких ситуациях, где мы не можем исправить чужой скрипт вывод, вывод предупреждений на сайте надо отключить.