jQuery:画面の位置を自動で調整する「windows.js」

jQueryの「windows.jsプラグインを使用してみました。
windows.js」プラグインは画面のスクロール位置自動調整してくれるプラグインです。

jquery_windows_1

スクロール位置が中途半端な場合、指定した位置まで画面が移動して自動補正します。

下記のような画面の途中でスクロールを止めます。

jquery_windows_2

指定した秒数が経過したら、位置が自動でスクロールするのです。

jquery_windows_3

windows.js」プラグインは下記よりダウンロードできます。

http://nick-jonas.github.io/windows/

下記にjQueryの「windows.jsプラグインの使用して、
画面のスクロール位置自動補正させた際の使用方法をメモします。


「windows.js」プラグインで画面位置を自動調整

JS

jQueryとwindows.jsファイルを読み込みます。
windows.jsを使用するように設定します。

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<script src="js/jquery.windows.js"></script>
<script type="text/javascript">
$(function() {
    $('.window').windows({
        snapping: true,
        snapSpeed: 500,
        snapInterval: 1000,
        onScroll: function(s){},
        onSnapComplete: function($el){},
        onWindowEnter: function($el){}
    });
});
</script>

snapping:自動スクロールするかを指定します。
snapSpeed:スクロールする速度を指定します。
snapInterval:自動スクロールするまでの時間を指定します。

CSS

CSSでセクションごとのbackgroundと位置を指定します。
backgroundは画像を指定してもOKです。

<style type="text/css">
html, body {
    margin: 0;
    padding: 0;
    height: 100%;
}

.window {
    width: 100%;
    height: 100%;
    position: absolute;
}

#area1 {
    background: #d5d7dd;
    top: 0%;
}

#area2 {
    background: #1babb7;
    top: 100%;
}

#area3 {
    background: #6ab29f;
    top: 200%;
}
</style>

HTML

セクションに「class=”window”」を指定します。

<section id="area1" class="window"></section>
<section id="area2" class="window"></section>
<section id="area3" class="window"></section>

上記の設定をすると、中途半端な位置にスクロールがある場合、
画面位置を自動で調整してくれるようになります。

CakePHP:データベースが更新されない時の対処方法

CakePHPで開発をしている時にデータベースの一部のデータが更新されないということがありました。

データベースのフィールドを追加し、CakePHPでデータを更新すると新しく追加したフィールドだけが更新されないのです。
しかし、他のフィールドは正常に更新されます。

どこか間違えている箇所があると思い、何度もソースを見直したのですが、原因が分からずにいました。

なので「app」配下のディレクトリを一つ一つ確認していたら、怪しいと思ったファイルを発見しました。
下記のディレクトリ内にデータベースのテーブル構造を格納するモデルキャッシュファイルがあったのです。

app/tmp/cache/models

そのキャッシュファイル削除したら正常にデータが更新されました。

忘れないように、下記にCakePHPデータベース更新されない時の対処方法をメモします。


データベースが更新されない時の対処方法

CakePHPではデータベースのテーブル構造を格納するキャッシュファイルが作成されます。
データベースのフィールドを追加した場合、キャッシュファイルが前の情報のままだとデータが正しく更新されません。

その際は下記のディレクトリのキャッシュファイルを削除します。

app/tmp/cache/models

削除すると新しいキャッシュファイルが作成され、正常に更新することができるようになります。


CakePHPでデータベースのテーブルの構造を変更した場合は、キャッシュファイルを削除するのが良いと思います。

CakePHP:CakePHPで静的ページを追加

CakePHP静的ページを追加する場合、「app/views/pages」か「app/webroot」の下にフォルダやファイルを配置すると思います。

今回、「app/webroot」の下に静的コンテンツを追加した時に困ったことがあったのでメモします。


CakePHPで静的ページを追加「app/webroot」

「app/webroot」の下に追加したいコンテンツを設置します。

/app/webroot/hoge/index.html

下記のようにアクセスした場合は正常にページが表示されます。

http://ドメイン/hoge/index.html
http://ドメイン/hoge/

しかし、最後の「/」をなしの状態でアクセスすると、
下記のように「app/webroot」が付いたURLにリダイレクトされてしまいました。

http://ドメイン/hoge

↓(リダイレクトされてしまう)

http://ドメイン/app/webroot/hoge/

上記のように「app/webroot」がついたURLにリダイレクトされたくなかったので、
ドキュメントルートの直下に置いてる「.htaccess」を変更して下記のように対処しました。

<IfModule mod_rewrite.c>
   RewriteEngine on
   RewriteRule    ^hoge$ /hoge/index.html [R=301,L]
   RewriteRule    ^$ app/webroot/    [L]
   RewriteRule    (.*) app/webroot/$1 [L]
</IfModule>

下記の一行を追加しました。
「hoge」でアクセスした場合、「hoge/index.html」にリダイレクトするようにしています。

   RewriteRule    ^hoge$ /hoge/index.html [R=301,L]

ただ、これだと「http://ドメイン/app/webroot/hoge/」でアクセスした時にページが表示されてしまいます。

色々調べていて下記のサイトを発見しました。
参考になりました。ありがとうございます。

CakePHP 静的コンテンツのURLについて | Fusic Developers Weblog

「app/webroot」の直下にある「.htaccess」を下記のように変更しています。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
    RewriteCond %{THE_REQUEST} "^(.+?) (.*?)/app/webroot/(.*?) (.+?)$"
    RewriteRule ^(.*?)$ %2/%3 [R=301,L,NE]
</IfModule>

下記の二行を追加しています。

    RewriteCond %{THE_REQUEST} "^(.+?) (.*?)/app/webroot/(.*?) (.+?)$"
    RewriteRule ^(.*?)$ %2/%3 [R=301,L,NE]

「app/webroot」がある場合、「app/webroot」を省いたものでリダイレクトするようです。

上記の設定をすると「app/webroot」がついたURLでアクセスした際に、
リダイレクトされてアクセスすることができました。


上記以外にも他に良い方法があれば知りたいです。

php:文字列の出力でechoとprintの違い

php文字列を出力する際は、echoprintを使用すると思います。

php初心者の方から

echoとprintをどちらを使えばいいのか?
echoとprintの違いはなんなのか?
どちらを使用するのが正しいのか?

などを聞かれたことがあります。

私はphpを覚えた時から文字列の出力はechoを使用していたので、
あまり気にしたことがありませんでした。

echo」と「print」を比較して、違いを調べてみたので下記にメモします。


「echo」と「print」の違い

○ 引数が違う

echoの場合は引数を「,」区切りで複数指定できます。

echo 'aaa', 'bbb';

出力結果

aaabbb

printの場合は引数は一つのみです。

print 'aaabbb';

下記の場合、エラーになります。

print 'aaa', 'bbb';

○ 戻り値が違う

echoの場合は戻り値がないです。
下記の場合、エラーになります。

$val = echo 'aaa';

printの場合は戻り値があり、1を返します。

$val = print 'aaa';
print $val;

出力結果

aaa1

文字列ではなく「1」が返ります。


私なりの結論ですが、phpで文字列を出力するのは、echoとprintのどちらも正しいです。

どちらでも文字列を出力するのは変わらないので、
その時の環境やルールに合わせるのがいいと思います。

また、printは戻り値があるから、echoの方が処理速度が速いようです。

CakePHP:CakePHPでBasic認証を簡単に設定

CakePHPコントローラーごとにベーシック認証をかけたい場合、
Securityコンポーネントを使用すると簡単に設定することができます。

通常、Basic認証は「.htaccess」で設定しますが、
「.htaccess」を使用しないで設定できるのでとても楽です。

サイト全体に設定せずにコントローラーごとに設定したい場合などは良いと思います。

下記にCakePHPSecurityコンポーネントを使用してコントローラーごとにベーシック認証を設定する方法をメモします。


CakePHPでBasic認証を設定

Basic認証を使用したいコントローラーに下記の設定をします。

コントローラー(Controller)

Securityコンポーネントを使用するよう呼び出します。

class SampleController extends AppController {
	// Securityコンポーネント
	var $components = array('Security');

}

共通処理のbeforeFilter()にBasic認証の設定をします。

	function beforeFilter() {
		parent::beforeFilter();

		// Basic認証の設定
		$this->Security->loginOptions = array('type' => 'basic');

		// ユーザー名、パスワードの設定(複数可能)
		$this->Security->loginUsers = array('hoge' => 'password');

		// 全てのアクションに設定
		$this->Security->requireLogin('*');
	}

上記の設定をするだけなので簡単にBasic認証を設定することができます。
また、アクションごとにも設定することができるので便利です。