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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

4385閲覧

お気に入り登録機能を実装したのですが、ここから先がわかりません。。。

atsupoooon

総合スコア47

CakePHP

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

1クリップ

投稿2016/02/20 08:27

cakephp2.6

お気に入り機能を実装したと思っています。
●概要●
⑴ユーザがログインして。
⑵お気に入りボタンを押したらボタンが押せなくなり、お気に入り追加完了

処理としてajaxで画面推移なしで、お気に入り追加しましたの表示をさせる

Favoritesのテーブル構成
id
user_id
post_id

になります。

今現状で、お気に入り登録ボタンを押して、
ajaxでFavorites内にデータは、格納できました。
お気に入り登録が完了しましたの表示もでます。

ここから、ボタンを押しているものは、ボタンが押せないの
判定がいると思いますが、これをどのように実装するかわかりません。

調べるとjqueryで実装する必要があるようなないような。

view

php

1<?php 2 echo $this->Form->create('favorite', 3 array('controller' => 'favorites','type'=>'post')); 4 echo $this->Form->input('Favorite.user_id', array( 5 'type'=>'hidden', 6 'value' => $userdata['id'] 7 )); 8 echo $this->Form->input('Favorite.post_id', array( 9 'type'=>'hidden', 10 'value'=>$post['Post']['id']) 11 ); 12 echo $this->Js->submit('Favorite', array( 13 'before' => $this->Js->get('#favo-js-submit')->effect('fadeIn'), // => beforeSend (Local Event) 14 'success' => $this->Js->get('#favo-js-submit')->effect('fadeOut'), // => success (Local Event) 15 'url' => '../favorites/favo_btn', // Ajax処理で呼び出すURL(controller/action) 16 'update' => '#favo-js-submit', // ajax更新の結果を出力する要素 17 )); 18 echo $this->Form->end(); 19 echo $this->Js->writeBuffer(); 20 ?> 21 22 <div id="favo-js-submit"></div> 23 <div id="favo-js-submit"></div>

favoriteのコントローラー

php

1//お気に入り登録機能 2 public function favo_btn(){ 3 4 // Ajax or not 5 if (!$this->request->is('ajax')){ 6 $this->redirect( '/js_submit_form'); 7 } 8 // save OK 9 if ($this->Favorite->save($this->data)) { 10 $this->render( '/Elements/Ajaxs/favoajaxupdated','ajax'); 11 12 // save NG 13 } else { 14 $this->set('valerror', $this->Favorite->validationErrors); 15 $this->render( '/Elements/Ajaxs/favoajaxupdated','ajax'); 16 } 17 }

以上になります。

宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

お気に入りボタンを押した場合と、
すでにお気に入り済みでページを開いた場合とで2パターン必要かと思いましたので、
そのように書いています。
$isFavoはControllerから渡したり他の条件に置き換えてください。

PHP

1// id=favo_buttonのdisabledを有効にするjs 2$js_disabled = '$("#favo_button").attr("disabled", "disabled");'; 3 4// すでにお気に入り済みならdisabledを有効に 5$attr = array(); 6if($isFavo) $attr = array('disabled' => true); 7 8// ボタン作成 9echo $this->Js->submit( 'Favorite' 10 , array( 'id' => 'favo_button' // ボタンのidをfavo_buttonに 11 , 'htmlAttributes' => $attr 12 , 'before' => $this->Js->get('#favo-js-submit')->effect('fadeIn') 13 , 'success' => $this->Js->get('#favo-js-submit')->effect('fadeOut').$js_disabled // ajax成功時にこのボタンを押せなくする 14 , 'url' => '../frees/favo_btn' 15 , 'update' => '#favo-js-submit'));

と、ここまで書いてて思ったのですが、お気に入りの解除があるのであればdisabledにしちゃダメなのかな。

2016/02/23 お気に入り解除に関する追記

(2016/02/24 <?php?>でくくりました。)

PHP

1<?php 2// View側 3 4// id=favo_buttonの文言を変更するjs 5$js_favo_change = ' 6 if($("#favo_button").attr("value") == "お気に入り登録"){ 7 $("#favo_button").attr("value", "お気に入り解除"); 8 }else{ 9 $("#favo_button").attr("value", "お気に入り登録"); 10 } 11'; 12 13// ボタンの文言を設定 14if(!$isFavo){ 15 $caption = 'お気に入り登録'; 16}else{ 17 $caption = 'お気に入り解除'; 18} 19 20// ボタン作成 21echo $this->Js->submit( $caption 22 , array( 'id' => 'favo_button' // ボタンのidをfavo_buttonに 23 , 'before' => $this->Js->get('#favo-js-submit')->effect('fadeIn') 24 , 'success' => $this->Js->get('#favo-js-submit')->effect('fadeOut').$js_favo_change // ajax成功時に文言を切り替える 25 , 'url' => '../frees/favo_btn' 26 , 'update' => '#favo-js-submit')); 27?>

投稿2016/02/22 01:17

編集2016/02/29 00:09
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

atsupoooon

2016/02/23 03:26

回答ありがとうございます。 お気に入りの解除を実装も実装したいのです。 上記の記述では、 仮に view/1 のページに推移した時に、お気に入り登録されているかを 判定してお気に入り済みならdisabledを有効にしてボタンが押せなくなる という流れで間違いないでしょうか。 解除まで行うとなれば、下記内に解除の記述が必要なりますよね?? // ボタン作成 echo $this->Js->submit( 'Favorite' , array( 'id' => 'favo_button' // ボタンのidをfavo_buttonに , 'htmlAttributes' => $attr , 'before' => $this->Js->get('#favo-js-submit')->effect('fadeIn') , 'success' => $this->Js->get('#favo-js-submit')->effect('fadeOut').$js_disabled // ajax成功時にこのボタンを押せなくする , 'url' => '../frees/favo_btn' , 'update' => '#favo-js-submit'));
退会済みユーザー

退会済みユーザー

2016/02/23 04:52 編集

>上記の記述では、~ 合ってますよー。 他にはページを開いた時にajaxでボタンの状態を取得設定するようなロジックも考えられます。 解除も実装するのであれば、disable関係は要らなくて、文言の書き換えで対応すると楽じゃないでしょうか。 いずれにしてもsuccess時のjsで対応出来るはずです。 例として凄く素直に書いたコードを追記しておきます。
atsupoooon

2016/02/23 16:33

d_s_1 さん 回答ありがとうございます。 一度、実装してみます!!
atsupoooon

2016/02/24 03:10

試してみましたら、エラーがここの部分で 'success' => $this->Js->get('#favo-js-submit')->effect('fadeOut').$js_favo_change, 未定義の変数でエラーがでました。 おそらく、$js_favo_changeが原因かと思い、JavaScriptの位置を変更したりも したのですが、変わらずです。 <script> // id=favo_buttonのdisabledを有効にするjs $js_favo_change = ' if($("#favo_button").attr("value") == "お気に入り登録"){ $("#favo_button").attr("value", "お気に入り解除"); }else{ $("#favo_button").attr("value", "お気に入り登録"); } '; </script> なぜなのでしょうか・・
退会済みユーザー

退会済みユーザー

2016/02/24 03:15

??? なぜ<script>タグが・・・ $js_favo_changeという変数はPHPの変数ですよー。 successにはjsを文字列で指定しますので、$js_favo_changeに文字列のjsのコードを入れています。
退会済みユーザー

退会済みユーザー

2016/02/24 03:34 編集

あ、理解しました。 「$js_favo_change = ~」をjsと間違ってscriptタグの中に入れたんですね。 確かに中身はjsのコードではありますが、扱いはあくまでPHP上における文字列です。 全て1つのViewの中でPHPとして実行して下さい。 本来ロジックをViewの中に書くものではありませんので、 動作しましたらロジック部分はControllerやModelへと移すことを薦めます。
atsupoooon

2016/02/24 21:26

回答ありがとうございます。 回答ありがとうございます。 そういことだったのですね! 完全にjsと認識していました。。。 問題なくいけました。 あとは、これで解除した時にDBのから指定の情報を削除するロジックを 書けば問題ないですよね。 頑張って書いています!! あと、1つお伺いしたいのですが、 d_s_1 さんが 「他にはページを開いた時にajaxでボタンの状態を取得設定するようなロジックも考えられます。」 とおっしゃていたボタンの状態を取得するロジックとは、 こういうことなのでしょうか。 view1は、お気に入り登録済み → ボタンの文字:登録済み view2は、お気に入り未登録 → ボタンの文字:未登録 ということなのでしょうか?
退会済みユーザー

退会済みユーザー

2016/02/25 01:39 編集

動いたようで良かったです。 引き続き頑張ってください! >ボタンの状態を取得するロジック そのようにView1,View2を用意してボタンを変更するのも勿論アリですが、 私が想定していた手法とは別でした。 質問のJSHelperを用いたajaxは、actionを通過して得たViewを、指定した箇所へ嵌めこむ機能です。 これを用いずに、例えば引数にIDを指定して呼び出すと、そのIDがお気に入り登録されているかどうかをJSON形式で返すAPIを用意します。 // 例。指定IDのお気に入り状態を返す function is_favo($id=null){  $this->autoLayout = false;  $this->autoRender = false;  if($this->Favo->isFavo($id)){   echo json_encode(array('is_favo' => 1));  }else{   echo json_encode(array('is_favo' => 0));  } } あとはこのAPIを叩いて、ボタンの文言を変えたり、画像を変えたりするだけです。 <script> <!--  // お気に入りの状態に合わせてボタンの文言を変更  function change_favo(){   $.getJSON('http://lvh.me/favos/is_favo/1?time' + new Date() / 1000,    function(data, status){     if(data.is_favo == 1){      $('.favo_button').attr('value', "お気に入り解除");     }else{      $('.favo_button').attr('value', "お気に入り登録");     }    }   );  }  // ページ読み込み完了時にchange_favo  $(document).ready(   function(){    change_favo();   }  ); --> </script> 動作の確認はしてません。なんとなくの処理の流れが分かってもらえれば。 この手法であればJSHelperのViewを取得するより、データの通信量が大きくならないです。 とはいえ微々たるものではあるので、仕様や大人の事情と相談しまして、 どの手法を取るのか選択すると良いかと思います。
atsupoooon

2016/02/26 15:10

コメントありがとうございます!! 早速実装してみます! いろいろ質問に答えていただき誠にありがとうございます。 大変勉強になります。 また、なにかお伺いするかと思いますが、宜しくお願い致します。
guest

0

javascript

1// idがfav_btnの要素を無効にする 2$('#fav_btn').attr('disabled',true);

投稿2016/02/21 00:59

sekitaka_1214

総合スコア509

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

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

atsupoooon

2016/02/21 15:01

コメントありがとうございます。 jqueryの処理のところより、まずajaxでの処理方法がわかりません。 jqueryのみで可能なのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問