- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
В 2023 году 36,9% всех DDoS-атак пришлось на сферу финансов
А 24,9% – на сегмент электронной коммерции
Оксана Мамчуева
Все что нужно знать о DDоS-атаках грамотному менеджеру
И как реагировать на "пожар", когда неизвестно, где хранятся "огнетушители
Антон Никонов
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Есть сайт на Джумле 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 - самые грубые в логе, а попроще - на экране. Бывает, что ошибка уровня "Замечание" приводит к потере данных, вследствие чего вываливается то, что на скрине в стартпосте.