Пример 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(); // не будет Warning |
В документации эта ситуация упоминается, но считается редкой:
В предыдущих примерах есть нюанс: запрос на обновление данных вызывается без проверки результата. Если запрос не прошел из-за "проваленной" валидации, и не была вызвана проверка isSuccess(), система сгенерирует E_USER_WARNING со списком ошибок, который можно будет увидеть в логе сайта (если соответствующим образом настроить .settings.php). |
Самое плохое, если Warning появляется при обмене с 1С, или при самодельном импорте/экспорте. В таких ситуациях, где мы не можем исправить чужой скрипт, вывод предупреждений на сайте надо отключить.