Smarty пользовательский плагин для использования базового класса - PullRequest
0 голосов
/ 10 сентября 2010

Вот мой класс, который вызывается на каждой странице:

class ActionHandler {

    var $smarty = NULL;

    public function __construct() {

        if($this->smarty == NULL){

            $this->smarty = new Smarty();

            $this->smarty->template_dir = TEMPLATE_DIR;

            $this->smarty->compile_dir = COMPILE_DIR;

        }

    }

    public function do_something($page_id) {
        return $page_id + 1;
    }
}   

Теперь у меня есть собственный плагин для smarty, который я хочу использовать в своем шаблоне:

function smarty_function_something($params, &$smarty) {
    return ActionHandler::do_something($params['page_id']);
}

Однако я получаю Fatal error: Using $this when not in object context.

Я понимаю почему, но не знаю, как обойти это. Есть идеи?

Ответы [ 2 ]

1 голос
/ 10 сентября 2010

Попробуйте сделать do_something статическим членом ActionHandler

class ActionHandler {

    public static $smarty = NULL;
    public function __construct()
    {
        if($this->smarty == NULL)
       {
            $this->smarty = new Smarty();
            $this->smarty->template_dir = TEMPLATE_DIR;
            $this->smarty->compile_dir = COMPILE_DIR;

       }
   }

    public static function do_something($page_id)
    {
        return $page_id + 1;
    }
}

Поскольку вы пытаетесь получить доступ к нестатическому методу, я * думаю, что __construct выполняется до того, как метод станет доступен, но поскольку вы не создали экземпляр объекта, ключевое слово $this не существует.

Вы должны создать определенные статические методы. если ты идешь MyObject::SomeMethod($param)

Вы также должны взглянуть на Автоматическую загрузку объектов и Автоматическую инициализацию объектов статическими методами.

также вам не нужно специально определять значение для public static $smarty = NULL;, поскольку Null - это значение по умолчанию для любой новой переменной, просто выполните

public static $smarty;

немного углубившись в вашу проблему, вы должны добавить одноэлементный метод, например, так ...

class ActionHandler
{
    public static $smarty;
    public static $singleton;
    public function __construct()
    {
        if($this->smarty == NULL)
       {
            $this->smarty = new Smarty();
            $this->smarty->template_dir = TEMPLATE_DIR;
            $this->smarty->compile_dir = COMPILE_DIR;

       }
   }
    public static GetSingleton()
    {
        if(self::$singleton == null)
        {
             self::$singleton = new ActionHandler();
        }
        return self::$singleton;
    }

    public static function do_something($page_id)
    {
        $_this = self::GetSingleton();


        return $page_id + 1;
    }
}
0 голосов
/ 10 сентября 2010

Вы пропустили несколько фрагментов кода: создание экземпляра объекта Smarty или ActionHandler, регистрация функции шаблона, содержимое шаблона и вызов Smarty::display(), но в моем собственном тестировании ваш код работает нормально. Ни в одном из ваших кодов вы не пытаетесь использовать $this, находясь вне контекста объекта.

Если у вас есть дополнительный код для публикации (предпочтительно полное сокращение, которое все еще вызывает ошибку), которое может помочь с отладкой.

умник-test.php:

<?php

include 'Smarty.class.php';

class ActionHandler {
    var $smarty = NULL;

    public function __construct() {
        if($this->smarty == NULL){
            $this->smarty = new Smarty();
            $this->smarty->template_dir = __DIR__ . '/t';
            $this->smarty->compile_dir = __DIR__ . '/tc';
            $this->smarty->plugins_dir = __DIR__ . '/plugins';
        }   
    }   

    public function do_something($page_id) {
        return $page_id + 1;
    }   
}

$ah = new ActionHandler;
$ah->smarty->display('index.tpl');

Плагины / function.something.php:

<?php

function smarty_function_something($params, &$smarty) {
    return ActionHandler::do_something($params['page_id']);
}

т / index.tpl:

Test: {something page_id=1}

Выход:

Тест: 2

...