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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Smarty

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

Q&A

解決済

3回答

8281閲覧

「Smarty」のテンプレート内の「JavaScript」が動きません

t33

総合スコア33

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Smarty

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

0グッド

0クリップ

投稿2016/11/22 17:25

編集2016/11/22 18:05

##イメージ説明
「Smarty」のテンプレート内に「src="js/func.js"」と外部ファイルに記述した「JavaScript」を読込もうとすると
なぜかJavaScriptが動作しません。どのようにしたら外部ファイルを読込めるようになるのか分からなかった為質問致しました。
初心者で申し訳ありませんが、ご回答の程よろしくお願い致します。

###備考
・{literal}の記述はしています。
・外部ファイルを読込まずに、Smartyテンプレート内に直接JavaScriptを記述した場合はきちんと動作することを確認しました。

###スクリプト
【Smartyテンプレート内のJavaScript記述部分】

Javascript

1{literal} 2<script type="text/javascript" src="js/func.js" charset="UTF-8"> 3</script> 4{/literal} 5

※上記の「src="js/func.js"」を取って、直接Javascriptを記述すると動作します。

【func.js】

javascript

1document.write("test");

###エラーが出ているスクリーンショット
イメージ説明

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2016/11/22 17:29 編集

デベロッパーツールなどで何かエラーメッセージなどは出ていませんか? jsディレクトリの配置が間違っているだけのように見受けられます。
t33

2016/11/22 17:38

ご返信ありがとうございます。GETのエラーが2つ出ていました。(理由は分かりません。。)①<script type="text/javascript" src="js/func.js" charset="UTF-8">②</script>の部分で出ています。
退会済みユーザー

退会済みユーザー

2016/11/22 17:43 編集

そのエラーメッセージが大事なんですけど…どこを伝えればいいかわからない場合は、スクリーンショット貼ってください。
t33

2016/11/22 18:05

スクリーンショットを追加致しました。
guest

回答3

0

ベストアンサー

相対パスの指定の仕方は理解できていますか?

表示中のURLが
http://localhost/index.php

のとき、index.php と同じ階層に jsディレクトリが存在していますか?


以下の質問へ回答してください。

(1)表示しているファイル(.php)を設置しているファイルパスは?
(2)テンプレートの配置しているファイルパス

投稿2016/11/22 17:59

編集2016/11/22 18:09
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

t33

2016/11/22 18:08

はい、同じ階層にjsディレクトリが存在しています。
退会済みユーザー

退会済みユーザー

2016/11/22 18:10 編集

曖昧な表現で、どうとでも取れるので、回答に追記した質問に回答してください。
t33

2016/11/22 18:30 編集

(1)表示しているファイル(.php)を設置しているファイルパスは? ⇒C:\xampp\htdocs です。 (2)テンプレートの配置しているファイルパス ⇒C:\xampp\htdocs\js です。 ⇒ごめんなさい間違えました。テンプレートはC:\xampp\php_libs\smarty\templatesです。 JSファイルはC:\xampp\htdocs\jsです。
退会済みユーザー

退会済みユーザー

2016/11/22 18:15

テンプレートファイルをなぜjsに? デフォルトだと、templatesのはずですが。
退会済みユーザー

退会済みユーザー

2016/11/22 18:19 編集

もし言っていることがわからない場合は、先ほど撮っていただいたエディタの左側に、ファイル構造がわかるディレクトリツリーがあるのかな? そこのファイル名が全部見えるようにしてショットを撮ってください。
t33

2016/11/22 18:23

「Smarty」の「templates」は別のディレクトリに置いています。 C:\xampp\php_libs\smarty\templates もしかしてこれが原因でしょうか。。
退会済みユーザー

退会済みユーザー

2016/11/22 18:25 編集

全体の関係の問題なので、断片的な情報では判断できません。 ディレクトリ名で止めないで、ファイル名まで合わせて記述してください。
退会済みユーザー

退会済みユーザー

2016/11/22 18:29 編集

ところで、ショットに撮った画面は一体なんと言うアプリケーション? ブラウザのアプリケーションではないようですが…デベロッパーツールってブラウザのものを言っているんですが。
t33

2016/11/22 18:32

「Chrome」のデベロッパーツール(F12を押したときに表示されるもの)を使用しました。これのことかなと思ったのですが検討違いでしたらすみません。
退会済みユーザー

退会済みユーザー

2016/11/22 18:33

それならOKです。
退会済みユーザー

退会済みユーザー

2016/11/22 18:35

ファイルパスは問題ない様子です。ということは、ファイルの拡張子をOSで表示するように設定されていますか? ありがちなのが、func.js.txt と言うファイル名になっていて、404エラーになるケースですね。
t33

2016/11/22 18:35

おそらく全て表示していなかったから分かりにくかったのだと思います。
t33

2016/11/22 18:41 編集

拡張子をOSで表示するように設定しています。 拡張子も確認という意味も含めて、ディレクトリをまとめます。 ①表示しているファイル(.php)・・・C:\xampp\htdocs\index.php ②JavaScript外部ファイル・・・C:\xampp\htdocs\js\func.js ③使用しているテンプレート・・・C:\xampp\php_libs\smarty\templates\login.tpl (コピペをしてファイル名は貼り付けたので、以上の通り間違いありません。)
退会済みユーザー

退会済みユーザー

2016/11/22 18:41

それなら、全く問題ないですね。
退会済みユーザー

退会済みユーザー

2016/11/22 18:47

meta に baseか何か設定してます?
t33

2016/11/22 18:49

使用しているテンプレート内に「HTML」を全て記載しているのですが、 metaタグは使っていませんでした。。
退会済みユーザー

退会済みユーザー

2016/11/22 18:51

他のブラウザでも同じ現象?
t33

2016/11/22 18:57

Firefoxを入れて試してみたのですが、表示されませんでした。。
退会済みユーザー

退会済みユーザー

2016/11/22 18:59

自分の場合、こう言うわけのわからない現象の時は一度、func.js のファイル名を違うものに変えてみたりしますね。
t33

2016/11/22 19:02 編集

ファイル名が関わってくる場合もあるのですね・・・。 Smartyを使わずにindex.phpに src="js/func.js"としたもので試してみたのですが正しく動作しました。 Smartyのテンプレート内に記載するとダメかもです。
退会済みユーザー

退会済みユーザー

2016/11/22 19:06 編集

ファイル名じゃなくてキャッシュの疑いです。 > Smartyを使わずにindex.phpに どう記述したのか不明なのでそれでOKとは言えません。 > Smartyのテンプレート内に記載するとダメかもです。 そんなことはない。
退会済みユーザー

退会済みユーザー

2016/11/22 19:07

templates_c の中のファイルを全消しすれば、動くかも。
t33

2016/11/22 19:19

全消ししたら動きました!!
t33

2016/11/22 19:20

これはつまりテンプレートのキャッシュが悪さをしていたということなのでしょうか。
退会済みユーザー

退会済みユーザー

2016/11/22 19:21

そこか。 ということは、default_timezone の設定を疑うべきですね。 index.php のソース全体を提示してください。
t33

2016/11/22 19:29

define('_ROOT_DIR', __DIR__ . '/'); require_once _ROOT_DIR . '../php_libs/init.php'; $controller = new MemberController(); $controller->run(); exit; です。index.php自体は以上で終わりなのですが、モデルとコントローラーを呼び出していて 全て記載すると量がそこそこある為全て表示するのは厳しいかもしれません。
退会済みユーザー

退会済みユーザー

2016/11/22 19:31

じゃあ、new Smarty(); を記述している部分ですね。new Smarty 以下の数行を提示してくださいな。
t33

2016/11/22 19:42

// 画面表示クラス $this->view = new Smarty; // Smarty関連ディレクトリの設定 $this->view->template_dir = _SMARTY_TEMPLATES_DIR; $this->view->compile_dir = _SMARTY_TEMPLATES_C_DIR; $this->view->config_dir = _SMARTY_CONFIG_DIR; $this->view->cache_dir = _SMARTY_CACHE_DIR; // 入力チェック用クラス $this->form = new HTML_QuickForm(); // JavaScriptのメッセージを日本語に修正 $this->form->setJsWarnings("入力エラーです。", "上記項目を修正してください。"); // HTML_QickFormとSmartyを使うためのクラス $this->renderer = new HTML_QuickForm_Renderer_ArraySmarty($this->view); // 共通の変数 $this->view->assign('is_system', $this->is_system ); $this->view->assign('SCRIPT_NAME', _SCRIPT_NAME); $this->view->assign('add_pageID', $this->add_pageID()); ここになると思うのですが、いかがでしょうか。
退会済みユーザー

退会済みユーザー

2016/11/22 19:53 編集

OKです。 $this->view->cache_dir = _SMARTY_CACHE_DIR; の下に、 // 強制的に中間ファイルを再生成する設定です。 // リリース時には false; にする $this->view->force_compile = true;  // 追加してください。 --- あと、すべてのファイルから共通で読み込まれるファイルに date_default_timezone_set('Asia/Tokyo'); を追加しておきます。 Smartyの中間ファイルは、通常、テンプレートファイルが新しくなった時に、再生成されるのですが、その照合にタイムスタンプを利用しています。時間の比較する部分が壊れてしまったり、Smartyの文法エラーがある状態で実行してしまうと、この部分が壊れてしまったまま、中間ファイルが新しくならないことがあります。その場合、今回のように中間ファイルを削除してしまえば、動くのですが、そもそも設定が原因の場合もあるので、上記の2点をやっておけば、そう頻繁にはおきなくなります。
t33

2016/11/22 20:04

詳細なご説明本当にありがとうございます。 おかげさまで、原因と対策方法に関しては理解出来ました。 $this->view->force_compile = true; ↑こちらはどこかのタイミングで「false」にしなければまずいのでしょうか。 リリース時に「false」と記載して頂いていますが、具体的にどのタイミングで記載すればよいのか分かりませんでした。
退会済みユーザー

退会済みユーザー

2016/11/22 20:07

本番環境ですね。 今は開発中なので、頻繁にテンプレートをいじるわけですから、毎回コンパイルする設定。サーバーにアップして、運用の段階では、falseにすると言うことです。
t33

2016/11/22 20:10

なるほど分かりました。非常にすっきり致しました! お教え頂き本当にありがとうございました。
guest

0

jsを直で描く場合はliteralが必要ですが、<script>で読み込む場合は、literalタグはいりません。
phpで出力されたhtmlを普通のhtmlに貼り付けてもエラーはおこるのではないでしょうか?
そこから一つづつエラーを消してみてはいかがでしょうか?

投稿2016/11/22 18:52

kaji

総合スコア648

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

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

t33

2016/11/22 20:14

ご返信ありがとうございます。 Kosuke_Shibuyaさんにお教え頂いたのですが、 Smartyの「templates_c」のキャッシュデータが原因であることが分かりました。 詳細と対策に関しては、Kosuke_Shibuyaさんにご提示頂いた方法で解決出来ました。
guest

0

src="js/func.js" の部分を src="https://example.com/js/func.js" など、フルパスに置き換えてみてください。(基本的にJavaScriptはフルパスで記述すればよいと思います)

投稿2016/11/22 17:43

kei344

総合スコア69400

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

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

退会済みユーザー

退会済みユーザー

2016/11/22 17:48

問題の原因が、templates/ の中に js/ を作っている気がするので、その方法はちょっと危険かと…
t33

2016/11/22 17:56

指定の仕方がミスしているのかもしれないのですが、 src="http://localhost/js/func.js" のようにフルパスを指定したのですが同じエラーが出てしまいます。
t33

2016/11/22 17:58

XAMPPを使ってローカルサーバーの環境でテストしているのですが、 jsのフォルダはC:\xampp\htdocs\jsに入れてあります。 (ここに置くのは一般的にまずいのでしょうか・・・。知識がない為ご教授頂けると幸いです。)
kei344

2016/11/22 17:59

To: Kosuke_Shibuyaさん そうなのですね。指摘ありがとうございます。 To: t33さん http://localhost/js/func.js にブラウザでアクセス出来ますか?出来ないならパス構造の理解がそもそも間違っている可能性があります。 Smarty は一部の改修以外触ったことが無いため、的外れな回答だったようです。すみませんが私の回答は無視してください。
t33

2016/11/22 18:12 編集

To kei344さん http://localhost/js/func.js にブラウザでアクセスしたところ、javascriptで記述した文字列が出てきたのですがこれはアクセス出来たことになるでしょうか。(javascriptで行いたいプログラムが動いているわけではなく、スクリプトの文字列が表示されるだけです。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問