Dram

Рейтинг
1115
Регистрация
28.06.2008

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

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

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 (единицу), хз откуда, но это факт.

откройте для себя awk, например сортировка по IP 

awk '{print $1}' /var/log/nginx/site.log | sort | uniq -c | sort -nr | head -n 30


D.iK.iJ #:

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

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

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


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();

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

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

webinfo #:

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

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

Я тоже так решил. Оказалось эта надстройка не поддерживает post запросы, вообще, что полностью убивает ее смысл. 

Пробовал добавить, вроде ошибки сперва пропали, потом опять вернулись ((

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 разрешил, но не помогло 


Всего: 6926