Я продвинулся немного дальше.
В общем в файле модели, в которм прописана логика сохранения/редактирования класс называется
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; }
$row
там он значительно меньше и называется TableItem Object, но что самое интересное в нем так же нет упоминания bind и тем не менее
$row->bind($data)
на хостинге с PHP 7.4. возвращает 1 (единицу), хз откуда, но это факт.
откройте для себя awk, например сортировка по IP
awk '{print $1}' /var/log/nginx/site.log | sort | uniq -c | sort -nr | head -n 30
Изменения в версиях: https://www.php.net/manual/ru/migration80.incompatible.php
Я тоже в этом не разбираюсь, если что, но единственное что нашел подходящее - parent::__construct();
Спасибо, так вроде же есть родитель, класс самописного компонента, где используется конструктор наследуется от стандартного класса ядра Джумлы
Посмотрите как вызывается класс в самописном компоненте
Насколько я понимаю, класс самописного компонента наследуется от стандартного класса 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();
я не совсем понимаю как работает передача по ссылке и вроде бы она может вызывать ошибку (но убирание ампеданса проблему не решает)
Но дальше этой строки запрос не идет, я проверил.
Это вызов конструктора, с одним аргументом вместо трёх.
Почему тогда сохранение материалов родных Джумлы работает, а через самописный компонент нет? Все же идет через этот файл. Т.е. родной функционал Джумлы работает. Занчит причина где то в самописном компоненте, разве нет?
Пробовал добавить, вроде ошибки сперва пропали, потом опять вернулись ((
proxy_request_buffering off;
Вроде бы нашел ответ (но не решение тут) https://stackoverflow.com/questions/69843526/nginx-http-3-phpmyadmin-5-1-1-epoll-ctl1-16-failed-17-file-exists
Это известная ошибка Cloudflare (Angristan использует их патч quiche/nginx). Эта ошибка возникает, когда вы используете POST с телом.Но команда Cloudflare не использует POST в своей системе, поэтому для них это не является приоритетом.
К сожалению похоже придется пока http3 отложить на полочку, а жаль... сайт реально стал грузиться быстрее
Ошибка найдена как всегда методом научного тыка.
Вместо строки
add_header alt-svc 'h3-23=":443"; ma=86400'
нужно писать
add_header Alt-Svc 'h3=":443"';
и все заработало!
Вот итоги (среднее время, прогнал каждый вариант раз 20) и это с выключенным кешем браузера (кеш nginx тоже пока выключен):
HTTP2 + php 8.2 + mariaDB 10.10 + nginx 1.22.0 + brotli
HTTP3 + php 8.2 + mariaDB 10.10 + nginx 1.22.0 + brotli
Мы одновременно написали, в общем конфиг загрузился, но http3 пока нет
Если закомментировать строку listen 443 ssl http2; то сайт перестает работать.
проверка через это https://www.http3check.net/ выдала
Server does not advertise supported HTTP/3 or QUIC version on the same port.
В фаерволе UDP разрешил, но не помогло