#php #joomla3.0
#php #joomla3.0
Вопрос:
Я работаю над Joomla 3.3.1 и компонентом с именем JTAG Members Directory (немного старая версия). При попытке войти в Display Options
раздел компонента я сталкиваюсь со следующей ошибкой:
Fatal error: Declaration of TableDisplayOptions::load() must be compatible with that of JTableInterface::load() in /home1/nm534555/public_html/mywebsite.org/administrator/components/com_jtagmembersdirectory/tables/displayoptions.php on line 139
Когда я открываю этот файл и нахожу строку 139, я вижу только закрывающую фигурную }
скобку, как показано в следующем коде (целиком displayoptions.php файл):
<?php
defined('_JEXEC') or die('Restricted access');
class TableDisplayOptions extends JTable
{
var $id;
var $display_phone_no;
var $display_facebook_page;
var $display_twitter_page;
var $display_in_frontend;
var $display_nr_email;
var $display_nr_country;
var $display_nr_city;
var $display_nr_state;
var $display_nr_phone_no;
var $display_nr_facebook;
var $display_nr_twitter;
//end
/**
* Contains user data from joomla users table
*
* @var array $userdata
*/
var $display;
/**
* Collection of custom fields objects. If custom fields are less than allowed array is filled with TableCustomFields objects
*
* @var array Collection of custom fields rows
*/
var $custom_fields;
/**
* Number of custom fields allowed.
*/
const CF_ALLOWED = 10;
function __construct(amp;$db)
{
parent::__construct('#__jtmb_display_options', 'id', $db);
// $this->_retrieveOptions();
$this->_retrieveCustomFields();
}
function load($oid=null)
{
parent::load($oid);
$this->_retrieveCustomFields();
}
function bind($from, $ignore = array())
{
//checkboxes workaround
// if(!isset($from['display_last_name'])) $from['display_last_name'] = 0;
if(!isset($from['display_city'])) $from['display_city'] = 0;
if(!isset($from['display_phone_no'])) $from['display_phone_no'] = 0;
if(!isset($from['display_facebook_page'])) $from['display_facebook_page'] = 0;
if(!isset($from['display_twitter_page'])) $from['display_twitter_page'] = 0;
if(!isset($from['cat_id'])) $from['cat_id'] = 0;
//added by Pratik Munot
if(!isset($from['display_nr_email'])) $from['display_nr_email'] = 0;
if(!isset($from['display_nr_country'])) $from['display_nr_country'] = 0;
if(!isset($from['display_nr_city'])) $from['display_nr_city'] = 0;
if(!isset($from['display_nr_state'])) $from['display_nr_state'] = 0;
if(!isset($from['display_nr_phone_no'])) $from['display_nr_phone_no'] = 0;
if(!isset($from['display_nr_facebook'])) $from['display_nr_facebook'] = 0;
if(!isset($from['display_nr_twitter'])) $from['display_nr_twitter'] = 0;
//end
if(!isset($from['display_gallery'])) $from['display_gallery'] = 0;
if(isset($from['auto_sync'])) $from['auto_sync'] = 1;
parent::bind($from, $ignore);
$this->_retrieveCustomFields();
}
function _retrieveOptions()
{
$query = 'SELECT * FROM `#__jtmb_display_options';
$this->_db->setQuery($query);
$this->display = $this->_db->loadObject();
}
function _retrieveCustomFields()
{
// $fields = array();
// $k = $this->_tbl_key;
// if ($this->$k)
// {
$query = 'SELECT field_name, field_label, display_nr_cf FROM #__jtmb_custom_fields LIMIT '.self::CF_ALLOWED;
$this->_db->setQuery($query);
$fields = $this->_db->loadObjectList();
//}
if (count($fields) < self::CF_ALLOWED)
{
require_once 'customfields.php';
while (count($fields) < self::CF_ALLOWED)
{
$fields[] = new TableCustomFields($this->_db);
}
}
$this->custom_fields = $fields;
}
function delete()
{
$query = 'DELETE FROM `#__jtmb_display_options';
$this->_db->setQuery($query);
$this->_db->loadObject();
}
} -----------------------------> This is line 139
?>
Я не могу понять это, я также пытался найти решение на разных форумах, но безрезультатно. Может ли кто-нибудь помочь мне решить эту проблему? Спасибо.
Комментарии:
1. Проверьте объявление
JTableInterface::load()
.2. Где я могу проверить это объявление?
3. В php-файле, где определен этот интерфейс.
4. Это должно быть определено в ядре Joomla, я не могу найти его в файлах компонентов.
Ответ №1:
Ваш класс TableDisplayOptions
реализует интерфейс JTableInterface
(через JTable
class, который TableDisplayOptions
расширяется). Этот интерфейс объявляет метод load
с определенными параметрами. Поскольку это интерфейс, вы ДОЛЖНЫ принимать те же параметры, которые определяет интерфейс.
Поскольку JTable
class уже реализует интерфейс, просто измените TableDisplayOptions::load()
, чтобы принять все параметры как JTable::load()
есть, и передать их родительскому методу.
Комментарии:
1. Хорошо, я понимаю, но где именно мне нужно внести изменения?
2. Используете ли вы какую-либо среду IDE? В eclipse нажмите
load
inparent::load()
, удерживая ctrl, и это приведет вас прямо к родительскому методу. Или просто выполните поиск в каталоге joomla. Тогда просто сделайте ваше определениеload()
метода таким же.3. Я думаю, что я это сделал. Большое спасибо за разъяснения. Также получил помощь от docs.joomla.org/JTable/load .
4. То, что я сделал, это просто добавил еще один параметр
$reset = true
в объявление функции load(), напримерfunction load($oid = null, $reset = true) {
5. Вы должны изменить
parent::load($oid);
наparent::load($oid, $reset);
. Этот метод, вероятно, вызывается из других классов joomla, и если вы не перейдете$reset
к parent , может произойти непредвиденное поведение.