Неустранимая ошибка: объявление TableDisplayOptions::load() должно быть совместимо с объявлением JTableInterface::load()

#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 in parent::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 , может произойти непредвиденное поведение.