0

私は Smarty に基づく Web サイトを移行しており、問題が発生しないようにすべての前提条件を満たそうとしましたが、(「いつものように」追加する可能性があります) 必要なすべてのパッケージをインストールした後、 Web サイトが機能しません (ブラウザーに HTTP 500 エラーが表示されます) エラー ログに次のエラーが見つかりました。

PHP 致命的なエラー: 47 行目の /var/www/vhosts/placeholder.com/httpdocs/includes/sysplugins/smarty_internal_templatebase.php の非オブジェクトに対するメンバー関数 createTemplate() の呼び出し

これは実際には、このコードがある index.php ファイルから表示されます

$smarty = new SmartyEC($page->template);
$smarty->display('index.tpl');

インデックス テンプレートの表示に問題がありますが、その理由がわかりません。

より多くのコンテキストを提供するために、コンストラクターは次のようになります。

<?php

require 'Smarty.class.php';

class SmartyEC extends Smarty{

    function SmartyEC()
    {
        function __construct()  
        {
            parent::__construct();
            $appname ='website';
            $path= Utils::getTemplatesPath();   
            $this->caching = false;

        }       

    }
}

?>

サーバーには PHP 5.3.2 があります。インストールされ、最新バージョンの Smarty もインストールされています。構成パスを確認し、それに応じて変更し、ファイルのインクルードも変更しました。

前もって感謝します!

更新 #1

次のように関数定義を削除しようとしました:

class SmartyEC extends Smarty {
    public function __construct()  
    {
        parent::__construct();
        $appname ='website';
        $path= Utils::getTemplatesPath();   
        $this->caching = false;
    }
}

しかし、エラーは次のようになります。

/var/www/vhosts/website/httpdocs/includes/sysplugins/smarty_internal_templatebase.php:127 にメッセージ「テンプレート ファイル 'index.tpl' を読み込めません」を含むキャッチされない例外 'SmartyException' があります:\nスタック トレース:\n#0 /var /www/vhosts/website/httpdocs/includes/sysplugins/smarty_internal_templatebase.php(374): Smarty_Internal_TemplateBase->fetch('index.tpl', NULL, NULL, NULL, true)\n#1 /var/www/vhosts/ website/httpdocs/index.php(58): Smarty_Internal_TemplateBase->display('index.tpl')\n#2 {main}\n /var/www/vhosts/website/httpdocs/includes/sysplugins/smarty_internal_templatebase でスローされます。 127行目のphp

更新 2

同じエラーが発生するこのトピックCodeIgniter + Smarty = Errorを見つけましたが、ここと同じ状況ではありません。さらに興味深いのは、他のサーバーでは正常に動作するという事実です。私の推測では、プログラミングの問題ではなく、構成の問題があると思われます。

4

2 に答える 2

1

__construct()withinのネストについてSmartyEC()よろしいですか? (修辞的な質問、申し訳ありません)

functions に明示的に名前を付けていた場合public、エラーはすぐに表示されます。

class SmartyEC extends Smarty {
    public function SmartyEC()
    {
        public function __construct()  
        {
            parent::__construct();
            $appname ='website';
            $path= Utils::getTemplatesPath();   
            $this->caching = false;
        }
    }
}

あなたにあげる

Parse error: syntax error, unexpected T_PUBLIC in test.php on line 7

PHP5 以降、class-name-constructors は使用しなくなりました。を使用します__construct()。どこかで明示的に呼び出さない限り$ec = new SmartyEC(); $ec->SmartyEC();、その関数宣言は削除する必要があります。

class SmartyEC extends Smarty {
    public function __construct()  
    {
        parent::__construct();
        $appname ='website';
        $path= Utils::getTemplatesPath();   
        $this->caching = false;
    }
}

$smarty = new SmartyEC($page->template);あなたの例の呼び出しは引数を渡すことにも注意してください- 期待SmartyEC()__construct()期待もしていません。

于 2012-08-13T12:33:06.490 に答える
0

最後に私はそれを手に入れました...それはうまくいかなかった4つの要因の複合体でした:

  1. smarty 3.1.11 から 3.0.7 にダウングレードしました
  2. 古いホスティングに関連する別の構成パスを見つけました-簡単に修正できました
  3. .tpl ファイルには、「{php} some code here {/php}」のような php コードが含まれて $this->allow_php_tag = true;おり、コンストラクター関数内で修正されました。
  4. 正しいアクセス許可を設定しても、システムはコンパイル フォルダーを書き換えることができなかったため、コンパイル フォルダー内のすべてを削除しました。
于 2012-08-13T16:45:55.980 に答える