ファイルの配置場所:Fuelphpにていいかも機能を実装したい
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 1,726
Fuel: 1.7.0
にて
実装したい機能サイト
コード
を実装したいと思っています。
$(function() {
$('.btn_vote').click(function() {
$(this).toggleClass('on');
var id = $(this).attr('id');
$(this).hasClass('on') ? Vote(id, 'plus') : Vote(id, 'minus');
});
});
function Vote(id, plus) {
cls = $('.' + id);
cls_num = Number(cls.html());
count = plus == 'minus' ? cls_num - 1 : cls_num + 1;
$.get('vote.php', {'file': id, 'count': count}, function() {
cls.html(count)
});
}
<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等)に格納するのが望ましいのでしょうか?
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
下記部分のget_count()
関数はコントローラーではなく、プレゼンター
に組み込むのが妥当かと思います。
<p class="ico_heart vote_01"><?= get_count('vote_01') ?></p>
<p class="btn_vote" id="vote_01"></p>
ルーター設定
下記、アクションコントローラーに組み込む例です。
ここでは、便宜上コントローラー名をsomething
としています。
適宜変更してください。
http://ドメイン/vote
でsomething
コントローラークラスのvote
アクションメソッドを実行するようにルーターを設定します。
// app/config/routes.php
return array(
'index' => 'something/index',
'vote' => 'something/vote',
...
コントローラー
コントローラーを下記のように設置します。
下記はFuelPHPコアのTemplate機能
を使用していますが、好みで変更してください。
// app/classes/controller/something.php
class Controller_Something extends \Controller_Hybrid
{
public $template = 'template/simple';
public function before ()
{
parent::before();
$this->template->header = \View::forge('template/header');
$this->template->footer = \View::forge('template/footer');
}
public function action_index ()
{
$this->template->contents = \Presenter::forge('index/index');
}
public function get_vote ()
{
$this->format = 'json';
$file = \Input::get('file', '初期ファイル名').'.dat';
$count = \Input::get('count', 1);
try {
// 投票書込み
\File::update('data/', $file, $count);
}
catch (\Exception $e) {
// エラー処理
}
$resp = array('success' => true, 'count' => $count);
return $this->response($resp)->send();
}
}
プレゼンター
そして、下記のパスにプレゼンターを設置します。
// app/classes/presenter/index/index.php
class Presenter_Index_Index extends \Presenter_Base
{
public function view () {}
}
プレゼンター基底クラス
投票カウンター関数(get_count())
は、他の\View
でも使いまわしができるように、共通プレゼンターを作成して設置します。
// app/classes/presenter/base.php
class Presenter_Base extends \Presenter
{
public function before ()
{
// 投票カウンター
\View::set_global('get_count', function ($file)
{
return $this->_getCountVote($file);
}, false);
}
protected function _getCountVote ($file)
{
//$filename = 'data/'.$file.'.dat';
//$fp = @fopen($filename, 'r');
//if ($fp) {
// $vote = fgets($fp, 9182);
//} else {
// $vote = 0;
//}
// ↓↓↓ FuelPHPらしくちょっと修正 ↓↓↓
$filename = 'data/'. $file .'.dat';
if (! \File::exists($filename)) {
return 0;
}
try {
// 投票値取得
return (int) \File::read($filename, true);
}
catch (\Exception $e) {
// エラー処理
}
return 0;
}
}
ビュー
あとは、\Viewグローバル関数
を読み込むために下記のようにget_count()
の前に$
を付けます。
<p class="ico_heart vote_01"><?= $get_count('vote_01') ?></p>
<p class="btn_vote" id="vote_01"></p>
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.11%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/08/30 09:44