Приветствую Михаил и всех пользователей, прошу помочь, как можно победить эту ошибку?
Код
Fatal error: Declaration of MyPaySystemRestriction::extractParams(Bitrix\Sale\Payment $payment) must be compatible with Bitrix\Sale\Services\Base\Restriction::extractParams(Bitrix\Sale\Internals\Entity $entity) in /home/gotovo/fm.gotovo.site/local/php_interface/include/mypayrestriction.php on line 21
[ErrorException] E_COMPILE_ERROR
Declaration of MyPaySystemRestriction::extractParams(Bitrix\Sale\Payment $payment) must be compatible with Bitrix\Sale\Services\Base\Restriction::extractParams(Bitrix\Sale\Internals\Entity $entity) (0)
/home/gotovo/fm.gotovo.site/local/php_interface/include/mypayrestriction.php:21
В init.php
Код
Bitrix\Main\EventManager::getInstance()->addEventHandler(
'sale',
'onSalePaySystemRestrictionsClassNamesBuildList',
'myPayFunction'
);
function myPayFunction()
{
return new \Bitrix\Main\EventResult(
\Bitrix\Main\EventResult::SUCCESS,
array(
'\MyPaySystemRestriction' => '/local/php_interface/include/mypayrestriction.php',
)
);
}
В mypayrestriction.php
Код
use \Bitrix\Sale\Services\Base;
use \Bitrix\Sale\Internals\Entity;
class MyPaySystemRestriction extends Base\Restriction
{
public static function getClassTitle()
{
return 'ограничение по наличию';
}
public static function getClassDescription()
{
return 'оплата онлайн будет доступна только если товар в наличии';
}
protected static function extractParams(Bitrix\Sale\Payment $payment)
{
$obBasket = \Bitrix\Sale\Basket::getList(array('filter' => array("FUSER_ID" => CSaleBasket::GetBasketUserID(), "ORDER_ID" => "NULL")));
CModule::IncludeModule('iblock');
while($bItem = $obBasket->Fetch()){
$arSelect = Array("ID", "IBLOCK_ID", "NAME", "CATALOG_QUANTITY");
$mxResult = CCatalogSku::GetProductInfo($bItem["PRODUCT_ID"]);
if (is_array($mxResult)) {
$arFilter = Array("ID"=>$bItem["PRODUCT_ID"], "IBLOCK_ID"=>5);//Указываем ID инфоблока
} else {
$arFilter = Array("ID"=>$bItem["PRODUCT_ID"], "IBLOCK_ID"=>4);//Указываем ID инфоблока
}
$res = CIBlockElement::GetList(Array("SORT"=>"ASC"), $arFilter, false, Array("nPageSize"=>1), $arSelect);
while($ob = $res->GetNextElement()){
if ($ob->GetFields()["CATALOG_QUANTITY"] <= 0) {
$arFields = true;
break;
}
}
}
$nal = true;
if ($arFields) {
$nal = false;
}
return $nal;
}
public static function check($nalich, array $restrictionParams, $PaySystemId = 1)
{
if (!$nalich) {
if ($restrictionParams["MY_PARAM_CHECKBOX"] == 'Y') {
return false;
}
} else {
if ($restrictionParams["MY_PARAM_CHECKBOX"] == 'N') {
return false;
}
}
return true;
}
public static function getParamsStructure($entityId = 0)
{
return array(
"MY_PARAM_CHECKBOX" => array(
'TYPE' => 'Y/N',
'VALUE' => 'Y',
'LABEL' => 'Наличие да / нет'
)
);
}
}
Изменено: Михаил Базаров - 09.08.2023 20:16:05(Конкретизирована задача/ошибка)
Должно бы вот так заработать, там в битриксе Bitrix\Sale\Services\Base\Restriction стал Bitrix\Sale\Internals\Entity Но не проверяя подсказываю. Если не поможет надо разбираться подробнее
Код
class MyPaySystemRestriction extends Base\Restriction
{
// ...
protected static function extractParams(Base\Internals\Entity $entity)
{
$payment = $entity->getPayment();
// Ваш код обработки параметров платежа
return $result; // Возвращаем результат обработки
}
// ...
}
Здравствуйте, Михаил! У нас точно такое же, только с ограничениями по местоположению в службах доставки.. Помогите, пожалуйста.
Ошибка в чекауте заказа
Код
Fatal error: Declaration of ExclLocationsDeliveryRestriction::extractParams(Bitrix\Sale\Internals\CollectableEntity
$shipment) must be compatible with Bitrix\Sale\Services\Base\Restriction::extractParams(Bitrix\Sale\Internals\
Entity $entity) in /home/c/cl88450/public_html/bitrix/php_interface/include/ExclLocationsDeliveryRestriction.php
on line 44 [ErrorException] E_COMPILE_ERROR Declaration of ExclLocationsDeliveryRestriction::extractParams(Bitrix\
Sale\ Internals\CollectableEntity $shipment) must be compatible with Bitrix\Sale\Services\Base\Restriction::
extractParams(Bitrix\Sale\Internals\Entity $entity) (0) /home/c/cl88450/public_html/bitrix/php_interface
/include/ExclLocationsDeliveryRestriction.php:44 ----------
Ошибка, которую вы видите, связана с тем, что сигнатура метода extractParams в классе ExclLocationsDeliveryRestriction не совпадает с сигнатурой метода в базовом классе Bitrix\Sale\Services\Base\Restriction. В базовом классе метод ожидает объект типа Bitrix\Sale\Internals\Entity, а в вашем классе передается объект типа Bitrix\Sale\Internals\CollectableEntity.
Для исправления этой ошибки вам нужно изменить сигнатуру метода extractParams в классе ExclLocationsDeliveryRestriction, чтобы она соответствовала сигнатуре метода в базовом классе. Вот как это можно сделать:
Код
class ExclLocationsDeliveryRestriction extends \Bitrix\Sale\Delivery\Restrictions\Base
{
// ...
protected static function extractParams(\Bitrix\Sale\Internals\Entity $entity)
{
if ($entity instanceof CollectableEntity) {
$shipment = $entity;
} else {
// Handle other cases if needed
return '';
}
$order = $shipment->getCollection()->getOrder();
// Your code for extracting params
return $params; // Return the extracted params
}
// ...
}
Здесь вам нужно изменить параметр метода extractParams на \Bitrix\Sale\Internals\Entity, чтобы сигнатура соответствовала ожидаемой в базовом классе. Затем вы можете проверить, что переданный объект $entity является экземпляром класса CollectableEntity, и продолжить обработку параметров в вашем коде.
После внесения этой коррекции ошибка также должна исчезнуть, и ваш класс будет совместим с PHP 8.2.
Действительно, помогло! Спасибо, Михаил! А могут после этих исправлений случиться ошибки такого плана? 1) в админке не может выйти из заказа, уходит в белый экран и всё 2) проверка системы показывает ошибку -Лишний вывод в файлах конфигурации
[B]Ошибка! Не работает[/TD][/TR][/TABLE]Описание ошибки: Проверяется вывод текста в файлах конфигурации: dbconn.php и init.php. Даже пробел или перенос строки может приводить к тому, что с включенной компрессией страница не сможет распаковаться на стороне браузера и будет нечитаема. Также могут возникнуть проблемы с авторизацией или в работе CAPTCHA. Подробности в журнале проверки системы
В журнале такое вывелось: 2023-Aug-09 14:24:09 Лишний вывод в файлах конфигурации (check_dbconn): Fail Connection to ssl://lovebabytoys.ru:443 Success == Request == GET /bitrix/admin/site_checker.php?test_type=dbconn_test&unique_id=063989d0529842119890b75e207eeddf HTTP/1.1 Host: lovebabytoys.ru == Response == HTTP/1.1 200 OK Server: nginx/1.22.1 Date: Wed, 09 Aug 2023 11:24:09 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 14 Connection: keep-alive P3P: policyref="/bitrix/p3p.xml", CP="NON DSP COR CUR ADM DEV PSA PSD OUR UNR BUS UNI COM NAV INT DEM STA" X-Powered-CMS: Bitrix Site Manager (ba77a60be93f2b27b86efd6aed484f36) Set-Cookie: PHPSESSID=kT0FJ6Y4KpaOcnq9xIkEi4zuZrZt3G5W; path=/; domain=lovebabytoys.ru; HttpOnly Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate Pragma: no-cache Set-Cookie: LIVECHAT_GUEST_HASH=39852cd548c05e7313251bc893533945; expires=Thu, 08 Aug 2024 11:24:09 GMT; Max-Age=31536000; path=/ == Body == Length: 2 ( ) ========== Ошибка! Не работает
Капчей на сайте нет, что ему не живётся..
Изменено: Михаил Базаров - 09.08.2023 20:10:52(Удалил ссылку на сайт)
У вас и того кто начал эту тему нечто не стандартное в обработчиках. Очень тяжело помогать в режиме форума, не понимая всей картины. Не то что бы нейросети помогают во всех вопросах (чаще нет) но попробуйте решить вопрос с их помощью. Нужна полная картина того что хотите (или как оно работало), зачем, почему и на какие готовы пойти компромиссы.
Fatal error: Could not check compatibility between MyPaySystemRestriction::extractParams(Bitrix\Sale\Services\Base\Internals\Entity $entity) and Bitrix\Sale\Services\Base\Restriction::extractParams(Bitrix\Sale\Internals\Entity $entity), because class Bitrix\Sale\Services\Base\Internals\Entity is not available in /home/gotovo/fm.gotovo.site/local/php_interface/include/mypayrestriction.php on line 21
[ErrorException] E_COMPILE_ERROR
Could not check compatibility between MyPaySystemRestriction::extractParams(Bitrix\Sale\Services\Base\Internals\Entity $entity) and Bitrix\Sale\Services\Base\Restriction::extractParams(Bitrix\Sale\Internals\Entity $entity), because class Bitrix\Sale\Services\Base\Internals\Entity is not available (0) /home/gotovo/fm.gotovo.site/local/php_interface/include/mypayrestriction.php:21
В mypayrestriction.php
Код
use \Bitrix\Sale\Services\Base;
use \Bitrix\Sale\Internals\Entity;
class MyPaySystemRestriction extends Base\Restriction
{
public static function getClassTitle()
{
return 'ограничение по наличию';
}
public static function getClassDescription()
{
return 'оплата онлайн будет доступна только если товар в наличии';
}
protected static function extractParams(Base\Internals\Entity $entity)
{
$payment = $entity->getPayment();
$obBasket = \Bitrix\Sale\Basket::getList(array('filter' => array("FUSER_ID" => CSaleBasket::GetBasketUserID(), "ORDER_ID" => "NULL")));
CModule::IncludeModule('iblock');
while($bItem = $obBasket->Fetch()){
$arSelect = Array("ID", "IBLOCK_ID", "NAME", "CATALOG_QUANTITY");
$mxResult = CCatalogSku::GetProductInfo($bItem["PRODUCT_ID"]);
if (is_array($mxResult)) {
$arFilter = Array("ID"=>$bItem["PRODUCT_ID"], "IBLOCK_ID"=>5);//Указываем ID инфоблока
} else {
$arFilter = Array("ID"=>$bItem["PRODUCT_ID"], "IBLOCK_ID"=>4);//Указываем ID инфоблока
}
$res = CIBlockElement::GetList(Array("SORT"=>"ASC"), $arFilter, false, Array("nPageSize"=>1), $arSelect);
while($ob = $res->GetNextElement()){
if ($ob->GetFields()["CATALOG_QUANTITY"] <= 0) {
$arFields = true;
break;
}
}
}
$nal = true;
if ($arFields) {
$nal = false;
}
return $nal;
}
public static function check($nalich, array $restrictionParams, $PaySystemId = 1)
{
if (!$nalich) {
if ($restrictionParams["MY_PARAM_CHECKBOX"] == 'Y') {
return false;
}
} else {
if ($restrictionParams["MY_PARAM_CHECKBOX"] == 'N') {
return false;
}
}
return true;
}
public static function getParamsStructure($entityId = 0)
{
return array(
"MY_PARAM_CHECKBOX" => array(
'TYPE' => 'Y/N',
'VALUE' => 'Y',
'LABEL' => 'Наличие да / нет'
)
);
}
}
Гость написал: Действительно, помогло! Спасибо, Михаил! А могут после этих исправлений случиться ошибки такого плана? 1) в админке не может выйти из заказа, уходит в белый экран и всё 2) проверка системы показывает ошибку -Лишний вывод в файлах конфигурации
Ошибка! Не работает Описание ошибки: Проверяется вывод текста в файлах конфигурации: dbconn.php и init.php. Даже пробел или перенос строки может приводить к тому, что с включенной компрессией страница не сможет распаковаться на стороне браузера и будет нечитаема. Также могут возникнуть проблемы с авторизацией или в работе CAPTCHA. Подробности в журнале проверки системы
В журнале такое вывелось: 2023-Aug-09 14:24:09 Лишний вывод в файлах конфигурации (check_dbconn): Fail Connection to ssl://lovebabytoys.ru:443 Success == Request == GET /bitrix/admin/site_checker.php?test_type=dbconn_test&unique_id=063989d0529842119890b75e207e eddf HTTP/1.1 Host: lovebabytoys.ru == Response == HTTP/1.1 200 OK Server: nginx/1.22.1 Date: Wed, 09 Aug 2023 11:24:09 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 14 Connection: keep-alive P3P: policyref="/bitrix/p3p.xml", CP="NON DSP COR CUR ADM DEV PSA PSD OUR UNR BUS UNI COM NAV INT DEM STA" X-Powered-CMS: Bitrix Site Manager (ba77a60be93f2b27b86efd6aed484f36) Set-Cookie: PHPSESSID=kT0FJ6Y4KpaOcnq9xIkEi4zuZrZt3G5W; path=/; domain=lovebabytoys.ru; HttpOnly Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate Pragma: no-cache Set-Cookie: LIVECHAT_GUEST_HASH=39852cd548c05e7313251bc893533945; expires=Thu, 08 Aug 2024 11:24:09 GMT; Max-Age=31536000; path=/ == Body == Length: 2 ( ) ========== Ошибка! Не работает
Капчей на сайте нет, что ему не живётся..
Попробуйте проверить файл bx_root.php по пути [B]/bitrix/modules/main/bx_root.php на наличие BOM.
Оригинал со своего ядра. Можете скопировать и вставить, далее еще раз пройти проверку системы. В том числе лишние пробелы и переносы в файлах init.php и dbconn.php
Михаил здравствуйте, вопрос после обновления на странице самого обновления вылетает это Fatal error: Access level to Bitrix\Main\DB\MysqlConnection::getErrorMessage() must be public (as in class Bitrix\Main\DB\Connection) in /home/c/citrusmix/citrus-mix.ru/public_html/bitrix/modules/main/lib/db/mysqlconnection.php on line 161[ErrorException] E_COMPILE_ERROR Access level to Bitrix\Main\DB\MysqlConnection::getErrorMessage() must be public (as in class Bitrix\Main\DB\Connection) (0) /home/c/citrusmix/citrus-mix.ru/public_html/bitrix/modules/main/lib/db/mysqlconnection.php:161 ----------
Здравствуйте, при переходе с PHP 7.4.33 на PHP 8.3.0 там на сайте есть как электронные товары, так и физические. Дак вот при оформлении заказа вылетает ошибка:
Код
[ErrorException] E_COMPILE_ERROR Declaration of OnlyDigitalGoods::extractParams(Bitrix\Sale\Internals\CollectableEntity $shipment)
must be compatible with Bitrix\Sale\Services\Base\Restriction::extractParams(Bitrix\Sale\Internals\Entity $entity) (0)
/local/php_interface/include/Digital/OnlyDigitalGoods.php:111
Вроде понятно куда копать: local/php_interface/include/Digital/OnlyDigitalGoods.php:111, там класс OnlyDigitalGoods , его метод extractParams должен принимать аргументом тип Bitrix\Sale\Internals\Entity , а не Bitrix\Sale\Internals\CollectableEntity. Попробую для начала поменять и посмотрите, что получится - вылетает уже другая ошибка:
Код
[Error] Call to undefined function each() (0)
/bitrix/components/h2o/buyoneclick/class.php:648
Выглядит так, что $shipment не наследуется от $entity, либо не может его привести к этому типу, а как это побороть я не знаю куда копнуть. Помогите плиз разобраться, уже вторые сутки бьюсь!!!
Насколько знаю, компания h2о больше не выпускает модулей и очень давно. Расковыряйте их модуль быстрой покупки (ошибка в нем) - видимо, именно он не совместим с php 8
написал: Насколько знаю, компания h2о больше не выпускает модулей и очень давно. Расковыряйте их модуль быстрой покупки (ошибка в нем) - видимо, именно он не совместим с php 8
да спасибо за помощь, расковырял оказалось что each то из пыхи 8 удалили, переписал с помощью foreach и все завелось. Но вот возник другой вопрос, точнее ошибка после многих исправленных, с этой тоже затык, наверное специфика пыхи 8:
Код
Using $this when not in object context (0)
/bitrix/modules/wsm.reviews/include.php:24
Вот кусочек кода из include.php
Код
<?
global $DBType;
abstract class WSMReviewsBase
{
private static $arAps = array ('!', '=', '>', '<', '><', '!><', '<=', '>=', '><', '%');
private $fields = array();
private $table = '';
abstract public function getTable();
public static function Query($strSql, $errors = false)
{
GLOBAL $DB;
if($errors)
return $DB->Query($strSql, true, $err_mess.__LINE__);
else
return $DB->Query($strSql, $errors);
}
protected static function GetFields()
{
$table = $this->getTable();
$rsFields = self::Query('SHOW COLUMNS FROM ' . $table);
while($arFields = $rsFields->Fetch())
$fields[$arFields['Field']] = $arFields;
return $fields;
}
написал: Да, теперь нельзя использовать $this в статическом методе. Как-то так должно заработать, но не проверял:
Спасибо за совет Михаил! По идее прочитал ман по пыхе 8, а точнее раздел абстрактных классов и метод и все что связано с ними, вообще написано, что в абстрактном классе обратится к абстрактному методу из статического метода этого же класса можно с помощью self:: ,но что-то этот метод на пыхе 8.3.0 все равно выдавал ошибку что невозможно вызвать абстрактный метод.
Короче убрал статику в GetFields() все завелось, правда в шаблоне во въюхе компонента пришлось пол шаблона переписать с обращения как статическому метода на не статическое обращение и все завелось. Короче пыха 8 еще раз убеждаюсь в том, что стала работать быстрее дак это потому что контроль за типами данных переложили на разработчиков вот и все прелести!)
Еще раз спасибо за помощь Михаил! Хороший у Вас сайт - оставил в закладках!)