1. Приветствуем Вас на неофициальном форуме технической поддержки XenForo на русском языке. XenForo - коммерческий форумный движок от бывших создателей vBulletin, написанный на PHP.

1.4.8 Using $this when not in object context

Тема в разделе "Вопросы и ответы по XenForo Framework", создана пользователем Warchiefs, 29.07.2015.

Загрузка
  1. Warchiefs

    Warchiefs Активный пользователь

    Регистрация:
    05.04.13
    Сообщения:
    14
    Симпатии:
    0
    Версия XF:
    1.1.3
    Fatal error: Using $this when not in object context in /Applications/MAMP/htdocs/xf/library/XenForo/Model.php on line 159

    Данная ошибка вылезает при использовании xen: callback, который пытается получить данные из модели, наследуемой от XenForo_Model. Насколько я понял, в callback не разрешено использовать не статические методы, следовательно данный метод не подходит для отображений данных из БД.

    Собственно вопрос, подскажите каким еще способом можно передать параметры из шаблона в код, то есть в моём случае из шаблона передается user_id, и данные, соотв-ие данному юзеру выводятся в нескольких шаблонах форума.

    Решаемая задача: вывод кастомных столбцов из стнадартной таблицы БД в нескольких стандартных шаблонах: message_user_info, profile_page (страница профиля, может не верно указываю шаблон, на данном этапе я хочу написать рабочий код, а потом уже искать куда его встраивать), visitor и тд.

    Действовал так: добавил столбцы в таблицу ксени через phpmyadmin, создал модель, вытягивающие данные из модели, типа такого:

    public function getItemByUserId($user_id)
    {
    return $this->_getDb()->fetchOne("SELECT item FROM xf_user WHERE user_id = '$user_id' ");}

    Получил ошибку о том, что используется не статический метод в этой модели. Поменял вот так:

    public static function getItemByUserId($user_id)
    {
    return self::_getDb()->fetchOne("SELECT item FROM xf_user WHERE user_id = '$user_id' ");}

    Сам callback:
    <xen:callback class="Example_Model_Example" method="getItemByUserId" params="1"></xen:callback>
     
  2. akinak

    akinak Местный

    Регистрация:
    12.02.13
    Сообщения:
    259
    Симпатии:
    243
    Версия XF:
    1.1.3
    В статическом методе пишем что-то вроде:

    $threadModel = XenForo_Model::create('XenForo_Model_Thread');

    $thread = $threadModel->getThreadById($id);
    Ну а в самой модели $this уже можно использовать вовсю.

    То есть модель пишем наследником от XenForo_Model, а класс для callback - это оберточный класс, с 1 статическим методом обычно.
     
    Warchiefs нравится это.
  3. Warchiefs

    Warchiefs Активный пользователь

    Регистрация:
    05.04.13
    Сообщения:
    14
    Симпатии:
    0
    Версия XF:
    1.1.3
    Спасибо, однако проблему решил методом хука
     
  4. akinak

    akinak Местный

    Регистрация:
    12.02.13
    Сообщения:
    259
    Симпатии:
    243
    Версия XF:
    1.1.3
    Я и сам обычно хуками делаю по привычке, но это вообще говоря не правильно, их поддержку вроде как прекратили давно. Официально разработчики рекомендуют через колл-беки все же.
     
  5. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Так ведь очевидно, что Вы пытаетесь использовать $this не в объекте, так как callback вызывает метод без создания экземпляра класса (то есть объекта). Таким образом, чтобы получить необходимые объекты, нужно их для начала создать, либо получить ссылки на них. Например, для доступа к базе данных достаточно было:
    PHP:
    $db XenForo_Application::getDb();
    Ну а дальше делайте с ним то, что хотите. В Вашем коде это было бы так:
    PHP:
    public function getItemByUserId($user_id)
    {
        
    $db XenForo_Application::getDb();
        return 
    $db->fetchOne("SELECT item FROM xf_user WHERE user_id = '$user_id' ");
    }
     

Поделиться этой страницей