投稿者「junichi_11」のアーカイブ

CakePHP 1.3 JsHelper

JsHelper

CakePHP 1.3のJsHelperを使ってみました。

1.3ではJavascriptHelperが非推奨となっています。

1.2までは、サポートしていたjavascriptのライブラリはprototypeのみでしたが、JsHelperで3つののライブラリが使えるようになっています。

JsHelperの設定

  1. javascriptライブラリを読み込む。
    $this->Html->script();
  2. キャッシュされたスクリプトを出力
  3. ControllerにJsHelperを追加する。

ライブラリの読み込み

<head>
<?php echo $this->Html->charset(); ?>
<title>
<?php __('Sample'); ?>
<?php echo $title_for_layout; ?>
</title>
<?php
    echo $this->Html->meta('icon');
    echo $this->Html->css('cake.generic');
    // javascriptライブラリの読み込み
    echo $this->Html->script('jquery-1.4.2.min');
    echo $this->Html->script('jquery-ui-1.8.2.min');
    echo $scripts_for_layout;
?>
</head>
<body>
…

    <?php echo $js->writeBuffer();?>
</body>

デフォルトでスクリプトはキャッシュされます。

それを表示するために</body>タグが終わる前までに、

$js->writeBurrer();

を実行しなければいけません。

ヘルパーの追加

class HogeController extends AppController{
    public $name = 'Hoge';
    public $helpers = array('Js' => array('Jquery'));
}

JsHelperの使い方

php5では、メソッドをつなげて使用できるけれど、php4では別々に書かないといけないようです。

php4

$js->get('#hoge');
$js->event('click', $eventCode);

php5

$js->get('#hoge')->event('click', $eventCode);

使用例

get

get($selector)

cssのセレクタを設定する。

effect

effect($name, $options = array())

  • $name
    ‘show’, ‘hide’, ‘fadeIn’, ‘fadeOut’, ‘slideIn’, ‘slideOut’
  • $options
    speed : ‘fast’, ‘slow’

デフォルトではbufferに保存されない

bufferに保存したい場合は、buffer()を使う。

drag

drag($options = array())

$options

  • handle : ???
  • snapGrid : 座標移動の間隔の設定 array(x, y)で縦横の間隔を設定
  • container : ドラッグ可能な範囲
  • start : ドラッグスタート時のイベント処理
  • drag : ドラッグ中のイベント処理
  • stop : ドラッグ終了時のイベント処理

event

event($type, $content, $options = array())

$options

  • wrap : 無名関数でラップする?(デフォルト:true)
  • stop : イベントをストップする?(デフォルト:true)
<h1>JsHelper</h1>
<div id="dragMessage">メッセージ</div>
<div id="dragArea" style="height:200px;width:600px;">
<span id="hoge">ドラッグ要素</span>

<?php
$onStart = '$("#hoge")
                 .css("color", "blue")
                 .text("開始します");
            $("#dragMessage")
                 .text("ドラッグ開始!");
';
$onDrag = '$("#hoge")
                 .css("color", "red")
                 .text("ドラッグ中");';
$onStop = '$("#hoge")
                 .css("color", "green")
                 .text("ドラッグ要素");
            $("#dragMessage")
                 .text("ドラッグ終了!");
';
$js->get('#hoge');
$result = $js->effect('fadeIn', array('speed' => 'slow'));
$js->buffer($result);
$js->drag(array(
    'container' => '#dragArea',
    'start' => $onStart,
    'drag' => $onDrag,
    'stop' => $onStop,
    'snapGrid' => array(10, 10),
    'wrapCallbacks' => false
));
$js->get("#hoge")->event('click', $js->alert('クリックしたな!!'));
echo $js->writeBuffer(array('inline' => false));
?>

jQuery 二重送信防止

二重送信防止

二重送信のイメージ

一度クリックして反応が遅い場合、ユーザがせっかちな場合など、フォームの送信ボタンを連打されてしまう場合がある。

このとき、フォームの情報が2回送信されてしまうことになる。

つまり、同じデータを複数登録されてしまうことがある。

このように複数回のの送信を防止する仕組みはいくつかある。

ここではjQueryのプラグインを使って、防止するする方法を紹介する。

二重送信防止のイメージ(jQueryプラグイン)

次のような仕組みになっている。

最初にボタンをクリックされたときに、そのボタンをグレーアウトにしてクリックできなくする。

二重送信防止用のjQueryのプラグインのダウンロード、使い方は以下のサイトを参照してください。

プラグインのダウンロードおよび参考サイト:
http://www.alink.co.jp/tech/blog/2009/04/05/javascript-jqueryでフォームの2重送信を防ぐ/
http://www.evanbyrne.com/article/jquery-disable-on-submit-plugin
http://neta.ywcafe.net/001046.html

CakePHP Twitter連携 OAuthConsumerを使ってみた

完成イメージ

Twitterへの投稿を 

    $this->Twitter->tweet(“つぶやくぞ”); 

という具合に実行できるようにする。 

準備

Basic認証での投稿はできなくなるらしいので、OAuth認証によるツイートが出来るようにする。 

すでにOAuth認証による投稿ができるクラスとComponentを作っている人がいるので、それを利用する。 

参考にしたサイトではClassを使っていたので、ここではComponentを使ってみる。 

また、ここで作成するものは、ACCESS TOKENを直接WEBページから取得するので、個人的な利用の場合のみ使用可能。 

OAuthConsumerComponetをダウンロード
http://code.42dh.com/oauth/ 

参考にしたサイト: http://www.zontheworld.com/blog/archives/119 

概要

  1. Twitterのアカウントから必要な情報を取得する。
  2. DLしたOAuthConsumerComponentの設定。
  3. TwitterComponentの作成。
  4. ツイート!

Twitterの設定

アプリの登録

ツイッターにログインし 

http://twitter.com/apps 

にアクセス。参考サイトと同様にして、アプリの登録を済ませる。 

必要情報の取得 (TOKEN)

Consumer Key & Consumer Secret

登録したアプリケーションの詳細から取得。 

Access Token & Access Token Secret

http://dev.twitter.com/apps/にアクセス。 

登録したアプリの詳細をみる。 

My Access Tokenをクリック。 

CakePHP の処理

OAuthConsumerComponentの設定

DLしたものを展開して、 

controllers/componetsを自分のcontrollers/componetsに配置。 

vendors/OAuthを app/vendorsに配置。
 

// 取得したToken等をapp/config/bootstrap.phpに追記
define('TWITTER_CONSUMER_KEY', '**************');
define('TWITTER_CONSUMER_SECRET', '**************');
define('TWITTER_ACCESS_TOKEN', '**************');
define('TWITTER_ACCESS_TOKEN_SECRET', '**************');

 

// app/controllers/components/oauth_consumers/twitter_consumer.php
class TwitterConsumer extends AbstractConsumer {
    public function __construct() {
        parent::__construct(TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET);
    }
}

 TwitterComponentの作成

// app/components/twitter.php
<?php
class TwitterComponent extends Object { 
 // Oauth認証を使うためのコンポーネント
 public $components = array('OauthConsumer'); 

 /**
  * ツイートする
  * @param string $tweet ツイートする内容
  * @return
  */
 function tweet($tweet){
  $tw = $this->OauthConsumer->post(
    'Twitter',
    TWITTER_ACCESS_TOKEN,
    TWITTER_ACCESS_TOKEN_SECRET,
    'http://twitter.com/statuses/update.json',
    array('status' => $tweet)
   );
  return $tw;
 }
}
?>

TwitterComponentの使い方

class HogeController extends AppController{
    public $name = 'Hoge';
    public $components = array('Twitter');

    function example(){
        $message = "hogedehogesuru";
        $this->Twitter->tweet($message);
    }
}