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

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

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

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

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

Q&A

解決済

1回答

2756閲覧

ファイルの配置場所:Fuelphpにていいかも機能を実装したい

amaguri

総合スコア227

JavaScript

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

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

0グッド

0クリップ

投稿2017/08/25 02:04

Fuel: 1.7.0
にて
実装したい機能サイト
コード
を実装したいと思っています。

Javascript

1$(function() { 2 $('.btn_vote').click(function() { 3 $(this).toggleClass('on'); 4 var id = $(this).attr('id'); 5 $(this).hasClass('on') ? Vote(id, 'plus') : Vote(id, 'minus'); 6 }); 7}); 8function Vote(id, plus) { 9 cls = $('.' + id); 10 cls_num = Number(cls.html()); 11 count = plus == 'minus' ? cls_num - 1 : cls_num + 1; 12 $.get('vote.php', {'file': id, 'count': count}, function() { 13 cls.html(count) 14 }); 15}
<p class="ico_heart vote_01"><?= get_count('vote_01') ?></p> <p class="btn_vote" id="vote_01"></p>

上記はviewsファイルに記載

下記はコントローラーに記載
index.php

function get_count($file) { $filename = 'data/'.$file.'.dat'; $fp = @fopen($filename, 'r'); if ($fp) { $vote = fgets($fp, 9182); } else { $vote = 0; } return $vote; }

でいけると思うのですが
vote.php

$file = $_GET['file']; $count = $_GET['count']; $filename = 'data/'.$file.'.dat'; $fp = @fopen($filename, 'w'); flock($fp, LOCK_EX); fputs($fp, $count); flock($fp, LOCK_UN); fclose($fp);

このファイルはfuelphpのフレームワークとして
どこのディレクトリ(MVC等)に格納するのが望ましいのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

下記部分のget_count()関数はコントローラーではなく、プレゼンターに組み込むのが妥当かと思います。

php

1<p class="ico_heart vote_01"><?= get_count('vote_01') ?></p> 2<p class="btn_vote" id="vote_01"></p>

ルーター設定

下記、アクションコントローラーに組み込む例です。
ここでは、便宜上コントローラー名をsomethingとしています。
適宜変更してください。

http://ドメイン/votesomethingコントローラークラスのvoteアクションメソッドを実行するようにルーターを設定します。

php

1// app/config/routes.php 2return array( 3 'index' => 'something/index', 4 'vote' => 'something/vote', 5 ...

コントローラー

コントローラーを下記のように設置します。
下記はFuelPHPコアのTemplate機能を使用していますが、好みで変更してください。

php

1// app/classes/controller/something.php 2class Controller_Something extends \Controller_Hybrid 3{ 4 public $template = 'template/simple'; 5 6 7 public function before () 8 { 9 parent::before(); 10 $this->template->header = \View::forge('template/header'); 11 $this->template->footer = \View::forge('template/footer'); 12 } 13 14 public function action_index () 15 { 16 $this->template->contents = \Presenter::forge('index/index'); 17 } 18 19 public function get_vote () 20 { 21 $this->format = 'json'; 22 23 $file = \Input::get('file', '初期ファイル名').'.dat'; 24 $count = \Input::get('count', 1); 25 26 try { 27 // 投票書込み 28 \File::update('data/', $file, $count); 29 } 30 catch (\Exception $e) { 31 // エラー処理 32 } 33 34 $resp = array('success' => true, 'count' => $count); 35 36 return $this->response($resp)->send(); 37 } 38}

プレゼンター

そして、下記のパスにプレゼンターを設置します。

php

1// app/classes/presenter/index/index.php 2class Presenter_Index_Index extends \Presenter_Base 3{ 4 public function view () {} 5}

プレゼンター基底クラス

投票カウンター関数(get_count())は、他の\Viewでも使いまわしができるように、共通プレゼンターを作成して設置します。

php

1// app/classes/presenter/base.php 2class Presenter_Base extends \Presenter 3{ 4 public function before () 5 { 6 // 投票カウンター 7 \View::set_global('get_count', function ($file) 8 { 9 return $this->_getCountVote($file); 10 }, false); 11 } 12 13 protected function _getCountVote ($file) 14 { 15 //$filename = 'data/'.$file.'.dat'; 16 //$fp = @fopen($filename, 'r'); 17 //if ($fp) { 18 // $vote = fgets($fp, 9182); 19 //} else { 20 // $vote = 0; 21 //} 22 23 // ↓↓↓ FuelPHPらしくちょっと修正 ↓↓↓ 24 25 $filename = 'data/'. $file .'.dat'; 26 27 if (! \File::exists($filename)) { 28 return 0; 29 } 30 31 try { 32 // 投票値取得 33 return (int) \File::read($filename, true); 34 } 35 catch (\Exception $e) { 36 // エラー処理 37 } 38 39 return 0; 40 } 41}

ビュー

あとは、\Viewグローバル関数を読み込むために下記のようにget_count()の前に$を付けます。

php

1<p class="ico_heart vote_01"><?= $get_count('vote_01') ?></p> 2<p class="btn_vote" id="vote_01"></p>

投稿2017/08/27 03:53

Tomak

総合スコア1652

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

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

amaguri

2017/08/30 00:44

ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問