- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Что делать, если ваша email-рассылка попала в спам
10 распространенных причин и решений
Екатерина Ткаченко
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Есть сайт на Джумле 3.10 под нее написан самописный компонент (не мной). Есть желание перейти с php 7.4 на 8.2. Взял тестовый серв, перенес сайт. На фронте вроде без ошибок, все работает. Сайм функционал джумлы версии 3.10 тоже стабильно пашет под PHP 8.2, но вот с самописным компонентом есть ошибки. Некоторые смог исправить сам, а для других не хватает знаний, прошу помочь.
Первая ошибка - при попытки сохранить материал получаю ошибку
Я так понимаю в конструктор класса Тайбл приходит 1 значение, а нужно три. Вот конструктор родного класса джумлы (148 строка)
Я предполагаю, что проблема в модели (конкретно в конструкторе) самописного компонента (но возможно ошибаюсь). Логика такая - раз сохранение и редактирование родных материалов джумлы работает. Значит дело не в классе ядра, а в самописе.
Как это выяснить?
P.S. я проверил - в главный контструктор все три значения приходят и мне не понятно чего он ругается что пришло одно вместо трех
328 строка это уже не конструктор
328 строка это уже не конструктор
Это вызов конструктора, с одним аргументом вместо трёх.
Это вызов конструктора, с одним аргументом вместо трёх.
Почему тогда сохранение материалов родных Джумлы работает, а через самописный компонент нет? Все же идет через этот файл. Т.е. родной функционал Джумлы работает. Занчит причина где то в самописном компоненте, разве нет?
Почему тогда сохранение материалов родных Джумлы работает, а через самописный компонент нет? Все же идет через этот файл. Т.е. родной функционал Джумлы работает. Занчит причина где то в самописном компоненте, разве нет?
Посмотрите как вызывается класс в самописном компоненте
Посмотрите как вызывается класс в самописном компоненте
Насколько я понимаю, класс самописного компонента наследуется от стандартного класса JModelLegacy Джумлы (вероятно этот класс далее уже перекидывает запрос в класс Тейбл где и случается ошибка), а далее уже идут обычные CRUD методы
При нажатии сохранить запрос уходит в контроллер, метод apply
оттуда уже запрос идет в модель итем, метод store (class VuzModelItem extends JModelLegacy - начало этого класса в начале этого поста)
Вот тут меня смущает строка
$row =& $this->getTable();я не совсем понимаю как работает передача по ссылке и вроде бы она может вызывать ошибку (но убирание ампеданса проблему не решает)
Но дальше этой строки запрос не идет, я проверил.
Изменения в версиях: https://www.php.net/manual/ru/migration80.incompatible.php
Я тоже в этом не разбираюсь, если что, но единственное что нашел подходящее - parent::__construct();
Но это я так, пальцем в небо. Больше для поднятия темы ))
Изменения в версиях: https://www.php.net/manual/ru/migration80.incompatible.php
Я тоже в этом не разбираюсь, если что, но единственное что нашел подходящее - parent::__construct();
Спасибо, так вроде же есть родитель, класс самописного компонента, где используется конструктор наследуется от стандартного класса ядра Джумлы
Но дальше этой строки запрос не идет, я проверил.
А внутри `getTable` на чём сыпется?
Я продвинулся немного дальше.
В общем в файле модели, в которм прописана логика сохранения/редактирования класс называется
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 и тем не менее
на хостинге с PHP 7.4. возвращает 1 (единицу), хз откуда, но это факт.
при попытки сохранить материал получаю ошибку
Это исключение, которое отлавливает Джумла. Я при смене версий и прочих аналогичных действиях предпочитаю выводить все ошибки PHP - самые грубые в логе, а попроще - на экране. Бывает, что ошибка уровня "Замечание" приводит к потере данных, вследствие чего вываливается то, что на скрине в стартпосте.