Author's Posts

こんにちは!

普段からFacebookのAPIを叩いたりしているのですが、アクセストークンの取得の方法をなんとなくまとめる機会があったので、このブログでも軽くまとめていこうかなと思います。

そもそもアクセストークンって?

アクセストークンとは、APIを叩くために必要な鍵みたいな存在です。 ちょっと重要な情報(非公開にしている投稿や画像、個人情報など)をAPI経由で取得したい!と思ったとき、その情報を取得しても構わない人にアクセストークンを渡すことによってデータへのアクセスを許可する役割があります。

とりあえず重要な情報にアクセスしようとするとアクセストークンが必要になるよ!ってことだけ覚えておくといいかもしれません。

今回取得するFacebookのアクセストークンは自分自身へのアクセストークンを取得する方法なので、例えば自分の持っているFacebookページの投稿に対するインプレッションを記録したり、メッセージを自分だけのアプリ上で送信出来るようにしたり、そういうことをするときに必要になるアクセストークンを取得していきます。

それでは早速やっていきましょう。

Facebookアプリを作成する

まずはFacebookアプリを作成しましょう。 以下のURLにアクセスしてFacebookアプリを作っていきましょう。 Facebook Developers

赤枠の部分をクリックして必要事項を埋めてアプリ制作しましょう。

アプリIDとアプリのシークレットキーを取得出来ました!

あなたの持っている適当なドメインを登録しておかないといけないので登録しておきましょう。 「Add platform」からウェブを追加して「AppDomain」の部分と「サイトURL」の部分にドメインを追加します。

取得したい情報のスコープを持ったURLにアクセスする

アプリIDとシークレットキーを取得したら、自分がどの情報にアクセスしたいのかを以下のリファレンス内から探してきます。

Permissions

今回は自分の誕生日を取得してみようと思うので、user_birthday パーミッションを以下のURLに書きます。 [アプリID]の部分にはさきほど取得したものを、[URL]のとこには持っているドメインのURLを入れてください。

https://graph.facebook.com/oauth/authorize?client_id=[アプリID]&scope=user_birthday&redirect_uri=[URL]

上記のURLにアクセスするとよく見る以下のような画面が出てきます。

アクセストークンを取得する

以下のURLからアクセストークン一覧に飛ぶことが出来ます。 アクセストークン – Facebook Developers

その中からさきほど作ったアプリの名前を検索してみると、「User Token」の部分にランダムな英数字があると思います。 これが取得したいアクセストークンです!!

ちなみに横の「デバッグ」ボタンをクリックすると、そのアクセストークンがいつまで有効なのかや、どの情報にアクセス出来るのかの詳細を見ることが出来ます。

これでアクセストークン取得完了しました!!

実際に使えるかどうか試してみる

それではあなたのFacebookのページを開いてください。(https://www.facebook.com/[ユーザー名] のURLで表されるページ) そのURLの「www」の部分を「graph」に変えてアクセスしてみてください。

情報がJSONで返ってくると思います。この時点で、誕生日情報は、設定で公開していない限り見えないはずです。

そのURLのあとにさきほど取得したアクセストークンをくっつけてアクセスしてみましょう。 URLとしては以下のような形になります。

https://graph.facebook.com/[ユーザー名]?acecss_token=[取得したアクセストークン]

どうでしょうか! さきほどよりたくさんの情報が取得出来たのではないでしょうか。 これでアクセストークンが有効であることが確認出来たと思います!!

最後に

アクセストークンの横にあった「デバッグ」ボタンを押すとわかると思うのですが、アクセストークンには有効期限があります。 おおよそ1時間だと思うのですが、1時間だけのアクセストークンだと意味のないときもあります。 その場合はアクセストークンの期間延長をするための方法があるのですがそれは昔書いた記事を参照してください。

快適なFacebookAPIライフを!!

参考本

10日でおぼえるFacebookアプリ開発入門教室 (10日でおぼえるシリーズ)
多田 智史 岩崎 雅也
翔泳社
売り上げランキング: 343,343
Read more

みなさんこんにちは!

昨日更新した記事が、僕自身の勉強にもなってるなぁと感じたので調子にのって楽しそうなコアライブラリを探しました! 今日書くのはInflectorクラスです。

Inflectorクラスとは

文字列を単数形や複数形にしてくれたりキャメルケースやアンダースコアケースにしてくれたりする知っておくと超ベンリなクラスです。

使うには使いたいクラスで以下のコードを使いたいクラスで書いておきましょう。

App::uses('Inflector', 'Utility');

これで読み込み完了!!

それでは簡単に紹介してみます。 詳しい部分は公式Cookbookを参考すると素晴らしいと思います。

Inflector::pluralize($singular)

単数形のものを複数形にしてくれます。何気に便利かも

$string = "apple"; // 'man', 'person'
$result = Inflector::pluralize($string);
// 結果
// => 'apples' 'men', 'people'

Inflector::singularize($plural)

これは逆に単数形にしてくれるもの!

$string = "apples"; // 'men', 'people'
$result = Inflector::pluralize($string);
// 結果
// => 'apple' 'men', 'person'

Inflector::underscore($camelCase)

キャメルケースをアンダースコアに変換してくれる関数

$string = "TestCase";
$result = Inflector::underscore($string);
// 結果
// => "test_case"

Inflector::camelize($underscored)

これは逆にアンダースコアをキャメルケースにしてくれる関数

$string = "test_case";
$result = Inflector::camelize($string);
// 結果
// => "TestCase"

最後に

これら以外にも文字列をテーブルの命名規則に従ったものに変換してくれる関数Inflector::tableize、クラスの命名規則に従ったものに変換してくれる関数Inflector::classifyなど色々面白いものがたくさんあるので暇なときにでもCookbookを見てみると色々面白いものが見つかるかもしれません!

Webアプリ開発を加速する CakePHP2定番レシピ119
長谷川 智希
秀和システム
売り上げランキング: 12,620
Read more

CakePHP2を使い始めて約2年が経ちましたが最近やっとコアライブラリまで目がいくようになりました(遅い) CakePHPにはコアライブラリとしてたくさんの便利な関数がつまっています。 これらを知っているだけでも開発が相当便利になるなぁと最近感じているのでその中から今回は「String」ライブラリの中から便利だなぁと思う関数を紹介したいと思います。

Stringライブラリの使い方

使いたいクラス内で以下のコードを挿入すればあとはスタティックに使うことが出来ます。

App::use('String', 'Utility');

String::tokenize($data, ":");

String::tokenize($data, $separator = ‘,’, $leftBound = ‘(‘, $rightBound = ‘)’)

$separatorで$dataをトークン化します。$leftBountと$rightBoundの間にある$separatorは無視されるので結構便利です。 データをある定型化しておいてそれを分割するようなときに便利です。

$data = "Tagami:Daiki:DAI199";
$result = String::tokenize($data, ':');
debug($result);
// 結果
// => array('Tagami', 'Daiki', 'DAI199');

String::insert($string, $data, $options = array())

文字列内にシンボルのような形でキーの値を書いておいて、それに対応する$dataの値を入れてくれる関数です。 シンボルの形は$optionsで変更可能です。 ドキュメントは以下です。 class String::insert()

$string = ":name is :age years old.";
$result = String::insert($string, ['name'=>'tagami', 'age'=>23]);
// 結果
// => "tagami is 23 years old."

$string = "*name* is *age* years old.";
$result = String::insert($string, ['name'=>'tagami', 'age'=>23], ['before'=>'*', 'after'=>'*']);
// 結果
// => "tagami is 23 years old."

String::highlight($haystack, $needle, $options = array())

$haystackの文字列の中から$needleに当てはまる文字列を$options[‘format’]で指定した文字列でハイライト表示します。 オプションとしては以下があります。

  • format・・・文字列。ハイライト表示に使うHTMLを指定する
  • html・・・真偽値。trueの場合はHTMLタグを無視してテキスト部分のみハイライト表示する
$string = "これはテストです。テスト出来るかな?";
$result = String::highlight($string, 'テスト', ['format'=>'\1']);
// 結果
// => "これはテストです。テスト出来るかな?"

String::toList(array $list, $and = ‘and’)

最後にちょっと面白い関数があったので紹介します。 $listの文字列を結合して、最後の結合箇所で利用する文字列を指定出来ます。 ちょっと何言ってるかわからないと思うので以下の例を見てみてください。わかるはずです。

$colors = ['red', 'orange', 'yellow', 'blue'];
$result = String::toList($colors);
// 結果
// => "red, orange, yellow and blue"

上のような感じで使います。’and’の部分は変更可能なので以下のようにも使えますね。

$lang = ['日本語', '英語', 'ドイツ語'];
$result = String::toList($lang, 'そして');
// 結果
// => "日本語, 英語 そして ドイツ語"

最後に

意外と知っているだけで自分で実装しなくていいので便利ですよね。 たまにドキュメントをだらだら読むのでまた何かいいものが見つかれば書いていきたいなぁと思います。

今回紹介したもののドキュメントは以下になります。

コアライブラリ – String

これ買いました

Webアプリ開発を加速する CakePHP2定番レシピ119
長谷川 智希
秀和システム
売り上げランキング: 34,352
Read more

こんにちは!

今日はCakePHP2のプラグインである「Upload」プラグインで画像をあげなおす処理を書いてみます。 結果的に無理矢理感が出てしまってますが、とりあえず実装は出来るってことでw 綺麗に書きたい〜〜

Uploadプラグインが動くまで設定

以前Uploadプラグインの記事を書いたのでこれの途中までやってみてください。

CakePHP2で画像アップロードプラグインである「Upload」を試してみた

コードを書く

それでは早速書いていきます。 まずはControllerから

UserController.php

request->is(['post', 'put'])){
            if($this->User->createWithImage($this->request->data)){
                $this->Session->setFlash(__('編集'));
                return $this->redirect(['controller'=>'user', 'action'=>'index']);
            }
        }

        if(!$this->request->data){
            $this->request->data = $this->User->find('first');
        }
    }
}

そしてModel

User.php

 [
            'image'
        ]
    ];

    public function createWithImage($data){
        if(!empty($data[$this->alias]['image']['name']) && !empty($data[$this->alias]['id'])){
            $data[$this->alias]['image']['remove'] = true;
        }

        $this->create();
        if($this->saveAll($data)){

            // removeフラグを消して画像を保存する
            if(isset($data[$this->alias]['image']['remove'])){
                unset($data[$this->alias]['image']['remove']);
            }

            if($this->saveAll($data)){
                return true;
            }
        }
    }

}

最後にView View/User/index.ctp

Form->create('User', ['type'=>'file']);
echo $this->Form->input('image', ['type'=>'file']);
if(isset($this->data['User']['image'])){
    echo $this->Html->image('../file/user/'.$this->data['User']['id'].'/'.$this->data['User']['image']);
}

echo $this->Form->hidden('id');
?>

一番大切な部分はModelのとこの

$data[$this->alias]['image']['remove'] = true;

です。これを指定して保存するとテキストデータ等は保存されますが、画像データは消去されます。

このことに関するドキュメントはこちら Remove a current file without deleting the entire record

一度消去したあとに remove フィールドを消して保存しなおすことで画像アップロードをもう一度行って画像の入れ替えを行いました。

ごりごりですけど一応わかりやすいかなぁと思います!

最後に

お疲れ様でした! やっぱりプラグインを使ってアップロード処理を外にまかせているととても楽ですね。 remove フラグがあるおかげで色々なことが柔軟に出来る気がします。 参考になれば!!

Webアプリ開発を加速する CakePHP2定番レシピ119
長谷川 智希
秀和システム
売り上げランキング: 59,220
Read more

こんにちは!

CakePHPでアプリ作ってるときにあるURLをwww付きに固定したいなぁって思うとき、ありますよね! そんなときに簡単に出来る方法があるのでご紹介します。

.htaccessに書き込む

コードで行うことも可能だと思うのですが今回私が行った方法は.htaccessに付け加える方法です。 もしコードでこうやれば出来るよ!ってのがあればぜひぜひ知りたいので教えてほしいです!

以下のコードをトップディレクトリに置いてある.htaccessに追記して下さい。 全体としては以下のようになります。


   RewriteEngine on
   RewriteCond %{HTTP_HOST} !^www\. [NC] 
   RewriteRule ^(.*)$ "http\:\/\/www.%{HTTP_HOST}/$1" [R=301,L]
   RewriteRule    ^$ app/webroot/    [L]
   RewriteRule    (.*) app/webroot/$1 [L]

もうこれだけ!なんて簡単!!

ただ一応注意しておくと・・・ この方法だとどんな方法でも無理やりwwwがついちゃいます。 なのでlocalhostとかで開発してるときもwww.localhostみたいな感じになっちゃってうざいです。

とりあえず本番環境にだけ適応させるにはこの方法でいいかぁとも思うのですが、やっぱりコード管理が一番安定するかな、とも思ってます。

今後試行錯誤してwwwに統一するコードが出来たらまた紹介させていただきますね!

誰かwwwに統一するときこのコード使ってるよ!ってのがあったら重ね重ねですが教えてくださいw @DAI199までお願いします!!

CakePHPやってるならとりあえず持っておけ本!

CakePHP2 実践入門 (WEB+DB PRESS plus)
安藤 祐介 岸田 健一郎 新原 雅司 市川 快 渡辺 一宏 鈴木 則夫
技術評論社
売り上げランキング: 25,614
Read more

jQueryで親要素や子要素を取得する方法をまとめてみました。

なんだかんだで書いておかないと忘れてしまうので。。。

親要素を取得する

  • parent([条件等])
  • 直近の親要素のみを取得し、1つ上以上の親を探さない。 条件を書かなければ直近の親要素を、条件を書くと条件に一致する場合は要素が、一致しない場合は空の配列が返ってくる 例) #content の親要素である div を取得する

子要素を取得する

  • children([条件等])
  • その要素の子要素のみ取得する。子孫は取ってこない。 条件にあてはまる場合はその要素が、あてはまらない場合は空の配列で返ってくる。 例) 子要素の span を取得する (p に囲まれた span は取得出来ない)

最後に

jQueryを使って長いですが、未だにちょくちょくしか使わないためメソッド名と使い方が覚えられない。。。 ということでメモ記事でした。誰かの参考になれば!!

この本読んでみたい

開眼!  JavaScript ―言語仕様から学ぶJavaScriptの本質
Cody Lindley
オライリージャパン
売り上げランキング: 13,081
Read more

こんにちは!

jQueryで.hover()を使っていたのですが、ふと.on()で.hover()を使うためにはどうやるのだろうか・・・と思って少し調べてみたので書いておきます。

.hover()を使ってみる

まずそもそも.hover()の使い方ですが、以下のような感じになります。

$('#sample1').hover(function(){
    $(this).hide(10);
}, function(){
    $(this).show(10);
});
$(‘#sample1’).hover(function(){ $(this).fadeOut(10); }, function(){ $(this).fadeIn(10); });
マウスオンしてみる

.on()で.hover()を書いてみる

それじゃぁ同じものを.on()で書いてみましょう。

$('#sample2').on({
    'mouseenter': function(){
        $(this).fadeOut(10);
    },
    'mouseleave': function(){
        $(this).fadeIn(10);
    }
});
マウスオンしてみる
$(‘#sample2’).on({ ‘mouseenter’: function(){ $(this).fadeOut(10); }, ‘mouseleave’: function(){ $(this).fadeIn(10); } });

はいこれで出来ました!一丁上がり〜〜

全く関係ないですが今日この本買ってうきうき気分です

JavaScriptで学ぶ関数型プログラミング
Michael Fogus
オライリージャパン
売り上げランキング: 10,105
Read more

Q. CakePHP2でリレーション先までデータを保存したい
A. saveAllメソッドにdeepオプションを渡してあげましょう。 例 ・ArticleがItemを複数持ち、ItemはMetaItemを複数持っている(Naverまとめ的な) Article.php
 array(
            'className' => 'Item',
            'foreignKey' => 'article_id',
            'dependent' => true
            )
    );
}
Item.php
 array(
            'className' => 'MetaItem',
            'foreignKey' => 'item_id',
            'dependent' => true
        )
    );
}
MetaItem.php
 array(
            'className' => 'Item',
            'foreignKey' => 'item_id'
        )
    );
}
保存するデータの構造
array(
    'Article' => array(
        ...
    ),
    'Item' => array(
        (int)0 => array(
            ...
        ),
        (int)1 => array(
            ...
            'MetaItem' => array(
                (int)0 => array(
                    ...
                ),
                (int)1 => array(
                    ...
                )
            )
        )
    )
)
使うメソッド
$this->Article->saveAll($data, array('deep' => true));
・コメント なぜかリレーションが1段階先しか保存してくれない!!って困ったのでぐぐってみるとdeepオプションというのがあるじゃないですか! ということで早速使ってみると見事解決。よかったよかった〜〜 適切なデータ構造を作って渡してあげれば適当に処理してくれるCakePHPありがとうございます!!
詳解CakePHP辞典―2.0/2.1/2.2/2.3対応
滝下 真玄
秀和システム
売り上げランキング: 112,599
Read more

こんにちは!

ModelのhasManyを使って、データをfindしてきたとき、FormHelperでViewにどう表示させるもんか悩んだのでメモ変わりに書いておきます。 多分なんのこっちゃ言ってるかわからないと思うのですが、以下のようなデータがあった場合にFormHelperのデフォルト値に反映させて、まぁいわば編集のような機能をつけたいときに悩んだのです(ようわからん)

array(
    'Article' => array(
        'id' => '1',
        ....
    ),
    'Item' => array(
        (int)0 => array(
            'id' => 1,
            'order' => 1,
            ....
        ),
        (int)1 => array(
            ....
        )
    )
)

こんなデータがあったとします。このデータをControllerからViewに渡していると仮定しときます($this->dataにぶちこむ) これをFormHelperでぱぱっと表示出来る方法はないかと色々探していたら以下のようなものを見つけました。

How to edit form with hasMany (multiple rows)

ようは以下のような感じです。

data['Item'] as $item){
    echo $this->Form->hidden('Item.' . $count . '.id');
    echo $this->Form->hidden('Item.' . $count . '.order');
    // 必要に応じて増やす
    $count++;
}

// Output
// 
// 
// ...
// 

このようにコードを書けばあるArticleに紐づくhasManyなものをまとめて編集したい!のような要望にも答えられるかと思います。 ただ$countがちょっとださいなぁと。 あともう1階層深いリレーションを表示させようとするとイテレートをもう1段階増やさなければならないのでカウンターも増えてしまうのが嫌だなぁと。

もっとうまい方法があるはずなんですが、もし誰かこうやったほうがよくない?みたいなのがあれば教えてください!!

Webアプリ開発を加速する CakePHP2定番レシピ119
長谷川 智希
秀和システム
売り上げランキング: 17,934
Read more

みなさんこんにちは!

リレーションを組んでリレーション先も同時に消す方法を勘違いしていたので自分の戒めのためにメモとして残しておきます。

データを消すときはdeleteメソッドを使ってcascadeをtrueにすればリレーション先も消してくれると思っていました。 ただドキュメントよく見ると、この値、defaultではtrueなんですよね・・・

これではうまく消えない・・・ではどうすればいいのかというとリレーションを組んでいる部分でdependentオプションをtrueにしておかなければならないのです(´・ω・`) つまり2箇所をしっかりtrueにしておけばリレーション先もうまく消えてくれる、ということです。

これだけではブログ記事としてはなんだかなぁなので一応確認しておきます。

データベース、コードの確認

CakePHPは前まとめたもので作ってあることを前提とします。 試してみたい方は以下の記事でプロジェクトを作る部分までやっておいてください。

CakePHP2をComposerでインストールしてプロジェクトを立ち上げるまで

そしてデータベースは以下のようなものを準備します。適当なので気にしないでください。

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE IF NOT EXISTS `items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  PRIMARY KEY (`id`)
);

INSERT INTO `users` (`id`, `name`, `created`, `modified`) VALUES (1, 'test1', NOW(), NOW());
INSERT INTO `items` (`id`, `user_id`, `name`, `created`, `modified`) VALUES (1, 1, 'test2', NOW(), NOW());

User.phpはこんな感じ

Model/User.php

 [
            'className' => 'Item',
            'foreignKey' => 'user_id',
            'dependent' => true,
        ]
    ];
}

Controller/UsersController.php

set('users', $this->User->find('all'));
    }

    public function delete($id = 0){
        if($this->request->is('get')){
            throw new MethodNotAllowedException();
        }
        if($this->Article->delete($id, true)){
            $this->Session->setFlash(__('%s番の記事を削除しました', h($id)));
            return $this->redirect(['controller'=>'users', 'action'=>'index']);
        }
    }
}

最後にView

View/Users/index.ctp


これで/users/にアクセスして削除をおしてみてください。 その後データベースを確認してうまく消えていますか?

User.phpの10行目をコメントアウトしてデータを入れなおしてもう一度消してみてください。 今度はリレーション先が消えていませんよね?それで僕は少しはまりましたw

最後に

CRUDというCakePHPのプラグインがあるのですが、その中身でdeleteメソッドの部分にcascadeを指定する場所がなかったので。あれ?これおかしいのかな?とか思ってた自分が一番おかしかったです(´・ω・`)

何事も常に見なおしてしっかり確認していかないとダメですね。

僕のようなことを繰り返さないためにも

CakePHP2 実践入門 (WEB+DB PRESS plus)
安藤 祐介 岸田 健一郎 新原 雅司 市川 快 渡辺 一宏 鈴木 則夫
技術評論社
売り上げランキング: 95,908
Read more