質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Smarty

Smartyは、PHPアプリケーションで使用されるテンプレートエンジンです。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

0回答

630閲覧

cakePHP3 ajaxでsmartyテンプレートが使えない

orangerange

総合スコア14

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Smarty

Smartyは、PHPアプリケーションで使用されるテンプレートエンジンです。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2020/03/20 08:04

cakePHP3+smarty を利用しています。
AppControllerで
public $viewClass = 'App\View\SmartyView';
を指定し、
src/View/AppView.php を設定しています。

これでブラウザからの通常アクセスではsmartyテンプレート(.tpl)の利用が可能なのですが、
ajaxでアクセスすると505エラーとなり、エラーログを確認すると、

Template file "Ajax/Objects/get_character.ctp" is missing.

のように、.ctpファイルがない旨のエラーが出ます。
(get_character.tplを用意していても、それが利用されません。)
同じこんとローラ/アクションに、ajaxではなくブラウザで直アクセスした場合は、正常にsmartyファイルがレンダリングされます。

ajaxでsmartyを利用する場合、別途何か設定が必要になりますでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nojimage

2020/03/24 05:32

利用しているCakePHPのバージョンとSmartyViewのコードは提示できますか? なお、Controller::$viewClassを利用したViewクラスの変更は、3.1以降非推奨になっています。(ViewBuilder::setClassNameを利用すべきです。
orangerange

2020/03/24 14:32

cakePHP3.6.7 です。 SmartyViewは、中身そのままのコピペですみませんが、 <?php /** * CakePHP Smarty view class * * This class will allow using Smarty with CakePHP * * Original code is https://github.com/yukikikuchi/cakephp3-smartyview * and modified to work with CakePHP 3.0 and later as plugin. * * de146ec27818e7ffd7e0ae364c601b7d * 26c0a65274f7c1fdd2ccad3362e42fac * 4c6ba19aa38c6bd13c077d0c4bdccc14 * f15e73da534926d1d9583ba375c8ab45 * c8b20ef9a7ab24f1121905220d34b791 * 11bc595e005b08c37369d3a33479a118 * * @author Yuki Kikuchi * @package smartyview * @subpackage view * @since CakePHP v 3.0 * @license MIT License */ namespace App\View; use Cake\View\View; use Cake\Network\Request; use Cake\Network\Response; use Cake\Event\EventManager; require_once(ROOT . '/vendor' . DS . 'smarty' . DS . 'Smarty.class.php'); use \Smarty; /** * CakePHP Smarty view class * * This class will allow using Smarty with CakePHP * * @package smartyview * @subpackage view * @since CakePHP v 3.0 */ class SmartyView extends View { protected $_ext = '.tpl'; protected $_smarty = null; public $seed = '15c801700cf10330c4686a9aca0026b3'; public function __construct(Request $request = null, Response $response = null, EventManager $eventManager = null, array $viewOptions = []) { $this->_smarty = new Smarty(); if (!file_exists(TMP . 'smarty')) { mkdir(TMP . 'smarty'); } if (!file_exists(TMP . 'smarty' . DS . 'compile')) { mkdir(TMP . 'smarty' . DS . 'compile'); } if (!file_exists(TMP . 'smarty' . DS . 'cache')) { mkdir(TMP . 'smarty' . DS . 'cache'); } $this->_smarty->compile_dir = TMP . 'smarty' . DS . 'compile' . DS; $this->_smarty->cache_dir = TMP . 'smarty' . DS . 'cache' . DS; $this->_smarty->error_reporting = 'E_ALL & ~E_NOTICE'; $this->_smarty->debugging = true; $this->_smarty->caching = 0; $this->_smarty->clearCompiledTemplate(); $viewOptions['seed'] = '3835d21d4c6997aa6909d3172629a751'; parent::__construct($request, $response, $eventManager, $viewOptions); } protected function _evaluate($viewFile, $dataForView) { foreach ($dataForView as $key => $val) { $this->_smarty->assign($key, $val); } $this->_smarty->assignByRef('this', $this); return $this->_smarty->fetch($viewFile); } } のようになります。
orangerange

2020/03/24 14:57

■補足 > なお、Controller::$viewClassを利用したViewクラスの変更は、3.1以降非推奨になっています。 >(ViewBuilder::setClassNameを利用すべきです。 $this->viewBuilder()->setClassName('App\View\SmartyView'); をinitialize()メソッド内で使用する形に書き換えた所、ajaxでもtplが使用されるようになりました。 ただ、 Controller/AdminAjax/ObjectsControllar 内の getCharacters アクションにアクセスしているにも関わらずエラーログでは、 Template file "AdminAjax/Objects/ajax/get_characters.tpl" is missing. のように表示されます。 ※AdminAjax/Objects/get_characters.tpl については存在し、正常であればこれが利用されるかと思われます。
nojimage

2020/03/26 01:23

ソースコードなど追加の情報は、質問を編集して追記してもらえるとわかりやすいです。 もしかして、RequestHandlerComponentが有効になっていませんか?
orangerange

2020/03/26 13:20

> ソースコードなど追加の情報は、質問を編集して追記してもらえるとわかりやすいです。 失礼しました。 > もしかして、RequestHandlerComponentが有効になっていませんか? まさにAppController内で有効になっていました! 削除した所正常に動くようになりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問