В общем в файле модели, в которм прописана логика сохранения/редактирования класс называется
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 для сохранения вполне правильные.
Посмотрите как вызывается класс в самописном компоненте
Насколько я понимаю, класс самописного компонента наследуется от стандартного класса 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();
я не совсем понимаю как работает передача по ссылке и вроде бы она может вызывать ошибку (но убирание ампеданса проблему не решает)
Это вызов конструктора, с одним аргументом вместо трёх.
Почему тогда сохранение материалов родных Джумлы работает, а через самописный компонент нет? Все же идет через этот файл. Т.е. родной функционал Джумлы работает. Занчит причина где то в самописном компоненте, разве нет?
Вы видели как ваше меню "прыгает" при прокрутке? Ужас ведь
А почему сразу на 8.2? Попробуйте вначале перейти на 8.0
пробовал, ошибки те же
7.4
мизерный. Я переезд отложил, слишком много переписывать. Не вижу смысла пока
Я продвинулся немного дальше.
В общем в файле модели, в которм прописана логика сохранения/редактирования класс называется
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 (единицу), хз откуда, но это факт.
откройте для себя 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 методы
При нажатии сохранить запрос уходит в контроллер, метод apply
оттуда уже запрос идет в модель итем, метод store (class VuzModelItem extends JModelLegacy - начало этого класса в начале этого поста)
Вот тут меня смущает строка
$row =& $this->getTable();я не совсем понимаю как работает передача по ссылке и вроде бы она может вызывать ошибку (но убирание ампеданса проблему не решает)
Но дальше этой строки запрос не идет, я проверил.
Это вызов конструктора, с одним аргументом вместо трёх.
Почему тогда сохранение материалов родных Джумлы работает, а через самописный компонент нет? Все же идет через этот файл. Т.е. родной функционал Джумлы работает. Занчит причина где то в самописном компоненте, разве нет?
Пробовал добавить, вроде ошибки сперва пропали, потом опять вернулись ((