Ошибки при переходе на PHP 8.2

12
D
На сайте с 28.06.2008
Offline
1104
1021

Есть сайт на Джумле 3.10 под нее написан самописный компонент (не мной). Есть желание перейти с php 7.4 на 8.2. Взял тестовый серв, перенес сайт. На фронте вроде без ошибок, все работает. Сайм функционал джумлы версии  3.10 тоже стабильно пашет под PHP 8.2, но вот с самописным компонентом есть ошибки. Некоторые смог исправить сам, а для других не хватает знаний, прошу помочь.

Первая ошибка - при попытки сохранить материал получаю ошибку 


Я так понимаю в конструктор класса Тайбл приходит 1 значение, а нужно три. Вот конструктор родного класса джумлы  (148 строка)

Я предполагаю, что проблема в модели (конкретно в конструкторе) самописного компонента (но возможно ошибаюсь). Логика такая - раз сохранение и редактирование родных материалов джумлы работает. Значит дело не в классе ядра, а в самописе.


Как это выяснить?

P.S. я проверил - в главный контструктор все три значения приходят и мне не понятно чего он ругается что пришло одно вместо трех


328 строка это уже не конструктор



W1
На сайте с 22.01.2021
Offline
304
#1
Dram :
328 строка это уже не конструктор

Это вызов конструктора, с одним аргументом вместо трёх.

Мой форум - https://webinfo.guru –Там я всегда на связи
D
На сайте с 28.06.2008
Offline
1104
#2
webinfo #:

Это вызов конструктора, с одним аргументом вместо трёх.

Почему тогда сохранение материалов родных Джумлы работает, а через самописный компонент нет? Все же идет через этот файл. Т.е. родной функционал Джумлы работает. Занчит причина где то в самописном компоненте, разве нет?

SS
На сайте с 15.12.2015
Offline
83
#3
Dram #:

Почему тогда сохранение материалов родных Джумлы работает, а через самописный компонент нет? Все же идет через этот файл. Т.е. родной функционал Джумлы работает. Занчит причина где то в самописном компоненте, разве нет?

Посмотрите как вызывается класс в самописном компоненте

Размещение естественных ссылок на тематических порталах, отзовиках, справочниках (/ru/forum/1013919)
D
На сайте с 28.06.2008
Offline
1104
#4
SERM-service #:

Посмотрите как вызывается класс в самописном компоненте

Насколько я понимаю, класс самописного компонента наследуется от стандартного класса JModelLegacy Джумлы (вероятно этот класс далее уже перекидывает запрос в класс Тейбл где и случается ошибка), а далее уже идут обычные CRUD методы

<?php

defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.model');

class VuzModelItem extends JModelLegacy
{
    var $dir = null;

        function __construct()
        {
                parent::__construct();

        $this->dir = JPATH_ROOT.'/images/vuz';
                $array = JRequest::getVar('cid',  0, '', 'array');
                $this->setId((int)$array[0]);
        }

        function setId($id)
        {
                $this->_id      = $id;
                $this->_data    = null;
        }

        function getImages()
        {       
                $db = JFactory::getDBO();

                $db->setQuery("SELECT * FROM  #__vuz_images WHERE item_id = ".$this->_id);
                return $db->loadObjectList();
        }
....

При нажатии сохранить запрос уходит в контроллер, метод apply

оттуда уже запрос идет в модель итем, метод store  (class VuzModelItem extends JModelLegacy  - начало этого класса в начале этого поста)


Вот тут меня смущает строка

$row =& $this->getTable();

я не совсем понимаю как работает передача по ссылке и вроде бы она может вызывать ошибку  (но убирание ампеданса проблему не решает)

Но дальше этой строки запрос не идет, я проверил.

D.iK.iJ
На сайте с 26.05.2013
Offline
228
#5

Изменения в версиях: https://www.php.net/manual/ru/migration80.incompatible.php

Я тоже в этом не разбираюсь, если что, но единственное что нашел подходящее - parent::__construct();

  • Использование parent внутри класса, у которого нет родителя, теперь приведёт к фатальной ошибке во время компиляции.

Но это я так, пальцем в небо.  Больше для поднятия темы ))

Адаптивный дизайн в 2 строчки ( https://dikij.com/wm/adaptaciya-saytov.php ). + Принимаю заказы любой сложности ( https://searchengines.guru/ru/forum/926323 ). 💎 Еще я делаю классные кулоны с опалами ( https://mosaicopal.ru/ ).
D
На сайте с 28.06.2008
Offline
1104
#6
D.iK.iJ #:

Изменения в версиях: https://www.php.net/manual/ru/migration80.incompatible.php

Я тоже в этом не разбираюсь, если что, но единственное что нашел подходящее - parent::__construct();

Спасибо, так вроде же есть родитель, класс самописного компонента, где используется конструктор наследуется от стандартного класса ядра Джумлы


MrOPS
На сайте с 02.10.2018
Offline
39
#7
Dram #:

Но дальше этой строки запрос не идет, я проверил.

А внутри `getTable` на чём сыпется?

5d41402abc4b2a76b9719d911017c592
D
На сайте с 28.06.2008
Offline
1104
#8

Я продвинулся немного дальше.

В общем в файле модели, в которм прописана логика сохранения/редактирования класс называется 

VuzModelItem

в нем же в этом же файле есть метод 

store()

который отвечает за кохранение, в нем и был вызов 

getTable()

который вызывал ошибку, в сети нашел что в него нужно явно передать название класса, что я и сделал так

$row = &$this->getTable('Item', 'VuzModel');

в результате запрос прошел дальше внутри этого метода и споткнулся о bind() внутри этого же метода чуть ниже. Ошибка такая

Call to undefined method VuzModelItem::bind()
/var/www/vuz/administrator/components/com_vuz/models/item.php:236

а вот весь код метода store(), вызов bind в нем же внизу...

Я посмотрел вывод $row - с виду выглядит как объект базы данных с названием VuzModelItem Object (данных много), но метода bind в нем реально нет. Данные передающиеся в $data для сохранения вполне правильные.

        function store()
        {
                $row = &$this->getTable('Item', 'VuzModel');

                $data = JRequest::get('post');

                $fields = JRequest::getVar('fields', '', 'post', 'array', JREQUEST_ALLOWRAW);
        $statistics = JRequest::getVar('statistics', '', 'post', 'array', JREQUEST_ALLOWRAW);
                $data['text'] = JRequest::getVar('text', '', 'post', 'string', JREQUEST_ALLOWRAW);

                if(empty($data['name']))
                {
                        $this->setError($this->_db->getErrorMsg());
                        return false;
                }else{
                        if(empty($data['alias']))
                        {
                                $data['alias'] = $this->transliterate($data['name']);
                        }
                }
                if(!empty($fields))
                {
                        $this->setFields($fields);
                }
        if (!empty($statistics)) {
            $this->setStatistics($statistics);
        }
                if(!empty($data['images']))
                {
                        $this->setImages($data['images']);
                }
                if(!empty($data['city']))
                {
                        $data['city_alias'] = $this->transliterate($data['city']);
                }
                if(!empty($data['hideexam']))
                {
                        $data['hideexam'] = 1;
                }else{
                        $data['hideexam'] = 0;
                }
                if(empty($data['id']))
                {
                        $data['created'] = JHTML::_('date', time(), 'Y-m-d H:M:S');
                }
                $data['modified'] = JHTML::_('date', time(), 'Y-m-d H:M:S');
                if (!$row->bind($data)) {
                        $this->setError($this->_db->getErrorMsg());
                        return false;
                }

                if (!$row->check()) {
                        $this->setError($this->_db->getErrorMsg());
                        return false;
                }

                if (!$row->store()) {
                        $this->setError( $row->getErrorMsg() );
                        return false;
                }
                return true;
        }
P.S. на хостинге с PHP 7.4. я тоже проверил объект 
$row

там он значительно меньше и называется TableItem Object, но что самое интересное в нем так же нет упоминания bind и тем не менее 

$row->bind($data)

на хостинге  с PHP 7.4. возвращает 1 (единицу), хз откуда, но это факт.

W1
На сайте с 22.01.2021
Offline
304
#9
Dram :
при попытки сохранить материал получаю ошибку 

Это исключение, которое отлавливает Джумла. Я при смене версий и прочих аналогичных действиях предпочитаю выводить все ошибки PHP - самые грубые в логе, а попроще - на экране. Бывает, что ошибка уровня "Замечание" приводит к потере данных, вследствие чего вываливается то, что на скрине в стартпосте.

LD
На сайте с 20.05.2015
Offline
140
#10
Скажите пожалуйста , а какой прирост в скорости при переходе с 7.4 на 8.2 ?
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий