ブログ・エス技研

当ブログは引越しをしました。10秒後に自動で転送しますが、転送されない場合は、http://blog.s-giken.net/ をご覧ください。
ブログ・エス技研 TOP  >  2013年08月

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --年--月--日 --:-- ] カテゴリ:スポンサー広告 | TB(-) | CM(-)

WordPressのアップグレードの英語版と日本語版の公開のタイムラグは?

8月2日、私は業務で WordPressのバージョンアップ対応の作業をしていました。

しかし、タイミングが悪く、バックアップ作業をしているときに最新のバージョンが 3.5.2から 3.6に変わっていることに気づきました。

何がタイミング悪いか、っていいますと、あまりにもバージョンアップのタイミングにバッティングしてしまったためにまだ日本語版が出ていない!ということなんです。
スケジュールでは、今日バージョンアップの対応を行って、明日からその他のメンテナンスを開始する予定になっているのだけども.....


今日バージョンアップして、きょう公開予定のスケジュールじゃなかったことがせめてもの救いでした。

でも、日本語版がいつリリースするのかが全く分からないため、今後のスケジュールをどう変更すればいいのかが分かりませんでした。
あちこちのサイトを調べてみるものの、英語版がリリースされてから日本語版がリリースされるまでにどれくらいのタイムラグがあるのかが全く分かりませんでした。

どこにも情報がないということは、わざわざ情報にする必要がないくらいに短いタイムラグなのでは??なんていう甘い期待もいだきつつ.....


結果、翌日の 8月3日には日本語版がリリースされていたようです。


ですが、私が管理画面上で 3.6の日本語版の案内が表示されているのに気付いたのは 8月8日でした。
単に、どのように表示されるのかを理解しておらず、表示されていたものを勘違いしていた可能性は十分にありますが。

そんなワケで、メジャーバージョンアップでもない限り、翌日くらいには日本語版がリリースされるんじゃないかと思います。
スポンサーサイト
[ 2013年08月29日 08:55 ] カテゴリ:WordPress | TB(0) | CM(0)

CakePHP 2.3 Search Pluginで検索処理 その5入力項目に複数項目入力した場合の AND検索、OR検索

今回の検索は、入力項目に複数のキーワードを入力した際に、AND検索したり、OR検索したりする検索方法です。
今回の処理は、その2(http://ssgiken.blog.fc2.com/blog-entry-31.html)をベースにしていますので、そちらもご覧ください。


CakePHPの Search Pluginでは、AND検索、OR検索の方法も簡単に実装できるように用意されています。
今回は、下記のように Modelの「nickname」に「'connectorAnd' => ' ', 'connectorOr' => ','」を追加することで、それぞれ AND検索、OR検索を実装しています。
AND検索の場合は「ー ン」の様に、OR検索の場合は「太郎,多恵子」の様に入力することでそれぞれ検索を行えます。

Googleの検索が半角スペースで区切ることで AND検索になりますので、「'connectorAnd' => ' '」としていますが、「' '(半角スペース)」と記述していある部分を好きな記号に変更することでオリジナルの区切り文字を設定することができます。

ただ、OR検索は、Googleの場合は「or」と入力することで OR検索になりますが、CakePHPのこの Search Pluginの場合は、区切り文字を 2文字以上のものを設定することができませんので、「'connectorOr' => ','」の方は「','(カンマ)」を設定しています。

--------------(/app/Model/User.php)
<?php
class User extends AppModel {  
    :
    :
  // 検索対象のフィルタ設定
  public $filterArgs = array(
    array('name' => 'id',       'type' => 'value', 'field' => 'User.id'),
    array('name' => 'username', 'type' => 'like',  'field' => 'User.username'),
    array('name' => 'nickname', 'type' => 'like',  'field' => 'Profile.nickname', 'connectorAnd' => ' ', 'connectorOr' => ','),
  );
    :
    :
}
--------------


上記の方法は、検索対象が部分一致検索('type' => 'like')の場合のみ有効です。

完全一致検索('type' => 'value')の場合は、下記の様に「connectorAnd」「connectorOr」を設定してもエラーにはなりませんが、正しい検索結果は戻ってきません。

--------------(/app/Model/User.php)
<?php
class User extends AppModel {  
    :
    :
    array('name' => 'id',       'type' => 'value', 'field' => 'User.id', 'connectorAnd' => ' ', 'connectorOr' => ','),
    :
    :
}
--------------

私は、このことが分からず、かなーりハマりました。エラーが起こらないために何が悪いのかが分かりにくいんですよね。

ではどうするか。
下記の様に「'type' => 'subquery'」を設定し、「searchIn」の関数を設定し、queryに編集する文字列を生成します。
subqueryを設定し、入力値を戻すだけで IN句を生成してくれるようです。

--------------(/app/Model/User.php)
<?php
class User extends AppModel {  
    :
    :
  // 検索対象のフィルタ設定
  public $filterArgs = array(
    array('name' => 'id',       'type' => 'subquery', 'method' => 'searchIn', 'field' => 'User.id'),
    array('name' => 'username', 'type' => 'like',  'field' => 'User.username'),
    array('name' => 'nickname', 'type' => 'like',  'field' => 'Profile.nickname'),
  );

  function searchIn($data = array()) {
    $query = $data['id'];
    return $query;
  }
    :
    :
}
--------------

ただ、この場合、「1,2,3」の様に「,(カンマ)」で区切らないとエラーになります。
そのため、もし、入力値が数字のみと分かっている場合は、「searchIn」の関数の中身を下記の様にしてみるのもいいでしょう。
1行目で数字以外を「,」に変換し、2行目でカンマが連続している場合はカンマ一つに変換する処理を入れて、3行目、4行目で先頭と最後尾のカンマを削除しています。
これであれば、数値以外が入力されても問題はないでしょう。

--------------(/app/Model/User.php)
  function searchIn($data = array()) {
    $query = mb_ereg_replace ( '[^0-9]', ',', $data['id'] );
    $query = mb_ereg_replace ( ',+', ',', $query );
    $query = mb_ereg_replace ( '^,', '', $query );
    $query = mb_ereg_replace ( ',$', '', $query );
    return $query;
  }
--------------



その他、これを応用して、例えば、必ず表示させる情報がある場合の対応も可能です。

具体的なイメージとしては、会員サイトで会員ごとにお知らせを配信しているとします。
通常は、会員ごとに配信するので会員 IDを付与してお知らせを配信しますが、全会員に向けて一斉配信したいお知らせがあった場合に、特定の IDを付与したお知らせはすべての会員に配信したい、そんな状況を想定します。

処理の方法は、「$data['id'] .= ',20';」の行を追加するだけです。
今回は、サンプルとして「20」の IDは必ず表示させるようにしていますが、IDを 0にするといった方法でもいいと思います。(もっとスマートな書き方もありますが...)

--------------(/app/Model/User.php)
  function searchIn($data = array()) {
    $data['id'] .= ',20';
    $query = mb_ereg_replace ( '[^0-9]', ',', $data['id'] );
    $query = mb_ereg_replace ( ',+', ',', $query );
    $query = mb_ereg_replace ( '^,', '', $query );
    $query = mb_ereg_replace ( ',$', '', $query );
    return $query;
  }
--------------


【CakePHP2.3 Search Plugin検索処理 目次】
CakePHP2.3 Search Pluginで検索処理 その1設置方法
CakePHP2.3 Search Pluginで検索処理 その2表示件数を動的に変える方法
CakePHP2.3 Search Pluginで検索処理 その3入力エリア一つで複数の項目を同時に検索する方法
CakePHP2.3 Search Pluginで検索処理 その4前方一致検索、後方一致検索、不等号による検索、between句による範囲検索
CakePHP2.3 Search Pluginで検索処理 その5入力項目に複数項目入力した場合の AND検索、OR検索
CakePHP2.3 Search Pluginで検索処理 その6ORDER、sortソートの機能
CakePHP2.3 Search Pluginで検索処理 その7queryを使って 日付の範囲検索
[ 2013年08月26日 00:55 ] カテゴリ:CakePHP 2.x | TB(0) | CM(0)

WordPressで WPtouchを入れたら「このウェブページにはリダイレクト ループが含まれています」と表示されてページが表示されなくなった

WordPressでスマホ対応を行うため、WPtouch Mobile Pluginを設置し、有効にしたところトップページだけが「このウェブページにはリダイレクト ループが含まれています」というメッセージが表示されて、表示されなくなりました。

原因は、「WPtouch ホームページ」に設定したページが「トップページ」と同じページであったため、そこでリダイレクトのループをしていたようです。



「WPtouch ホームページ」の項目ですが、デフォルトでは「WordPress Settings」になっています。また、プルダウンの中身は、固定ページで作成しているページが編集されています。

デフォルトの設定の「WordPress Settings」のままであれば何の問題もなかったのですが、これを、ホームページ(トップページ)として設定しているページがプルダウンの中にありましたので、それを選択してしまっていたのです。

そのため、WPtouchでトップページを表示させようとしてリダイレクトし、WordPressでは改めてトップページを表示しようとしてリダイレクトさせる...ということになってしまいループしていたようです。

原因が分かれば対応も簡単で、デフォルトの設定である「WordPress Settings」に戻すことできちんと表示されるようになりました。


この「WPtouch ホームページ」の項目ですが、スマホからアクセスがあった場合に通常設定のホームページを表示させるのではなく、スマホの場合はスマホ用のホームページを表示させ、そこから各ページに遷移していってもらおう、という場合に使う項目のようですね。
やはりスマホからのアクセスの場合は、スマホ用のページがあった方がいいですからね。せめて、トップページくらいはスマホ専用のものにしておきましょう。という場合に使えるということでしょう。

スマホ対応について、どのように考え、どのようにスマホサイトを構築したらいいのか、下記のサイトが参考になると思います。単純にプラグインを入れただけでは逆効果かもしれない、ということですね。

 レスポンシブWEBデザイン・スマホ対応のWordPressテンプレートは本当に必要?
 http://mesiopress.com/rwd-smartphone-wordpress-theme-3574.html


ちなみに、最初は別ページで書きましたが、モバイルテーマを OFFにしたら戻れなくなった事件(http://ssgiken.blog.fc2.com/blog-entry-39.html)が原因で散々悩んだこともありまして、リダイレクトのエラーが原因で表示されないのはトップページだけであることは分かっていましたので、それにまつわるテンプレートや設定を見直すことで比較的早く原因にはたどり着くことができましたね。
ただ、やはり初めて使うプラグインは分からないことも多い、ってことですね。


もう一つちなみに、ちなみに、WPtouch Mobile Plugin ですが、まず、管理画面の「WPtouch Language」で「Japanese」を設定しましょう。
英語が堪能な方はデフォルトのままで問題ないですが、「Japanese」を設定することで管理画面が日本語表記になりますので、幸せになれるでしょう。


また、WPtouchを使うことでセキュリティホールが生まれることや、それによりアクセス数の変動があることなど参考になるサイトがありましたので、下記に掲載しておきます。

【緊急】WordPressでスマホ用WPtouch使ってる初心者は注意です
http://www.landerblue.co.jp/blog/?p=7369

スマホ対応でモバイルトラフィックが20倍に?!いわいがWordPressで行ったたった一つの設定!!
http://iwaimotors.com/blog/2013/08/mobile_up/
[ 2013年08月23日 21:50 ] カテゴリ:WordPress | TB(0) | CM(0)

WordPressで WPtouchを入れてモバイルテーマを「OFF」にしたら元に戻れなくなった

WordPressでスマホ対応を行うため、WPtouch Mobile Pluginを設置しました。
そして、モバイルページには確認のために公開ページを表示したところ、ページの一番下には「モバイルテーマ」の「ON/OFF」を切り替えるボタンがありました。

ボタンがあれば押してみるのが心情だと思うのですが、私も何も考えずにその「OFF」のボタンを押してみたのです。
そうすると、モバイルページから PC用のページに切り替わり、そして....「モバイルテーマ」の切り替えスイッチが表示されなくなり、元に戻ることができなくなったのでありました。

テンプレートを非表示にしてみても、再度ナビゲーションを消してみても、フッターを消してみても表示されないのです。

最初は、Chromeの Developer Toolsで疑似的にスマホ環境を作っていましたので、ほかの環境ではどうなのか、とFireFoxの FireMobileSimulatorで表示させてみると最初はボタンは表示されるが、やはり一度「OFF」を押すと次から表示されなくなる。
実機でやってみても同じ。
そして、Mobilizerをインストールして....と徐々に表示できる環境が減っていくという恐怖...動作検証ができなくなると開発に支障が出てくる...
と思いさすがに根本的な解決策を探さないわけにはいかず、調べてみることにしました。

そうすると意外にあっさりと解決策が見つかりました。
下記サイトが参考になります。

http://9ensan.com/blog/wordpress/wptouch-pc-iphone-button/

それくらい同じような問題を抱えているか方が多いということですね。


-------------------------------
<?php 
if (function_exists('wptouch_switch')) {
  wptouch_switch();
  remove_action( 'wp_footer', 'wptouch_switch' );
}
?>
-------------------------------

この表記をフッターの下に編集すれば OKです。

テンプレートファイルで「get_footer();」を記述している下に編集する方法でも OKですが、この方法ではすべてのテンプレートに編集していく必要がありますので、私は「footer.php」の一番下、「</html>」タグの下に編集することで対応をしました。

上記サイトにも書かれていますが、「wp_footer」が存在しないと表示処理自体が実行されないので、ページの上部などに表示させるということは難しいようです。



ちなみに、スマホの確認環境を構築するためのシミュレーター情報を載せておきます。

「FireMobileSimulator」
 http://firemobilesimulator.org/

もともとは、FireFox用のプラグインだったために Fire...という名称ですが、現在は Chrome版もあります。
非常に便利なのですが、機能を ONにすると、すべてのウインドウ、タブが共通して同様の設定した環境に代わってしまうため、これを使う場合には、確認は FireFoxを使うが、開発用のブラウザは chromeを使う、といった複数のブラウザを利用して開発を行うようなことになるでしょう。


「Google Developer Tools」
 http://www.submit.ne.jp/1199
 http://tech.nitoyon.com/ja/blog/2013/04/23/chrome-responsive-debug/

Google Chromeに標準搭載されているツールを使うという方法です。
Chromeを使っている場合は、特に新たにツールをインストールせずに使えるため、日頃開発に使っていないパソコンなどでも使える可能性が高いため、使い方を覚えておいて損はないでしょう。
また、FireMobileSimulatorと違い、タブごとに設定されますので、複数のタブごとに環境を切り替えて見比べる、といった使い方もできますので、こちらの方が重宝する場面もあるでしょう。
ただ、上記の 2つ目のサイトにもありますが、完全にエミュレートできるわけではないことには注意が必要でしょう。


「Mobilizer」
 http://www.springbox.com/mobilizer/

これは、ブラウザにプラグインを入れて使うタイプのものではなく、独立したアプリケーションのシミュレーターです。
インストールの方法も使い方も簡単ですが、インストールに際しては、「.air」拡張子の AIRのアプリケーションであるため、下記のサイトを参考にしながら AIRをインストールしてから使う必要があります。
 http://naruhiko1111.com/1635.html
[ 2013年08月22日 21:44 ] カテゴリ:WordPress | TB(0) | CM(0)

CakePHP 2.3 Search Pluginで検索処理 その4前方一致検索、後方一致検索、不等号による検索、between句による範囲検索

今回は、前方一致検索、後方一致検索、不等号による検索を行います。
今回の処理は、その2(http://ssgiken.blog.fc2.com/blog-entry-31.html)をベースにしていますので、そちらもご覧ください。

順番的にはもっと最初の方で提示するべき項目だと思いますが、これまでは「value」による完全一致検索、「like」による部分一致検索で処理を作ってきました。

ですが、この辺で改めて、完全一致検索、部分一致検索以外の検索の方法を書いておきます。

とはいえ、これについては、特に難しいものではありませんので、下記のサイトなどを見ていただくと分かるんじゃないかと思います。
http://mawatari.jp/archives/introduction-of-cakedc-search-plugin-for-cakephp



前方一致検索
「ユーザ名」の項目を前方一致検索する場合は、下記の通り「'before' => false, 'after' => true,」を追加します。Model以外の修正はありません。
--------------(/app/Model/User.php)
<?php
class User extends AppModel {  
    :
    :
  // 検索対象のフィルタ設定
  public $filterArgs = array(
    array('name' => 'id',       'type' => 'value', 'field' => 'User.id'),
    array('name' => 'username', 'type' => 'like',  'before' => false, 'after' => true, 'field' => 'User.username'),
    array('name' => 'nickname', 'type' => 'like',  'field' => 'Profile.nickname'),
  );
    :
    :
}
--------------

後方一致検索
「ユーザ名」の項目を後方一致検索の場合は、下記の通り「'before' => true, 'after' => false,」を追加します。Model以外の修正はありません。
--------------(/app/Model/User.php)
<?php
class User extends AppModel {  
    :
    :
  // 検索対象のフィルタ設定
  public $filterArgs = array(
    array('name' => 'id',       'type' => 'value', 'field' => 'User.id'),
    array('name' => 'username', 'type' => 'like',  'before' => true, 'after' => false, 'field' => 'User.username'),
    array('name' => 'nickname', 'type' => 'like',  'field' => 'Profile.nickname'),
  );
    :
    :
}
--------------


不等号による検索
「ユーザID」の項目を不等号によって検索をする場合は、下記の通り「id」を Modelと Viewのページにそれぞれ「id_from」「id_to」の項目変更しています。
不等号は「field」の項目の後ろに「>=」「<=」を記述します。

まぁ、今回は、すでにある項目を流用するため IDを不等号検索に使いましたが、実実装に関しては IDを from、toで検索することはないでしょうね。

--------------(/app/Model/User.php)
<?php
class User extends AppModel {  
    :
    :
  // 検索対象のフィルタ設定
  public $filterArgs = array(
    array('name' => 'id_from',  'type' => 'value', 'field' => 'User.id >='),
    array('name' => 'id_to',    'type' => 'value', 'field' => 'User.id <='),
    array('name' => 'username', 'type' => 'like',  'field' => 'User.username'),
    array('name' => 'nickname', 'type' => 'like',  'field' => 'Profile.nickname'),
  );

  // 検索対象のフィールド設定
  public $presetVars = array(
    array('field' => 'id_from',  'type' => 'value'),
    array('field' => 'id_to',    'type' => 'value'),
    array('field' => 'username', 'type' => 'value'),
    array('field' => 'nickname', 'type' => 'value'),
    array('field' => 'limit',    'type' => 'value'),
  );
    :
    :
}
--------------

--------------(/app/View/Elements/searchForm.ctp)
    :
    :
    <dt><label>ユーザID</label></dt>  
    <dd><?php echo $this->Form->input('id_from', array(  
      'type' => 'text', 'div' => false, 'label' => false))?>  
        <?php echo $this->Form->input('id_to', array(  
      'type' => 'text', 'div' => false, 'label' => false))?></dd>  
    :
    :
--------------


続けて、between句による範囲指定の方法です。

不等号による範囲指定での検索は、betweenによる範囲検索より検索スピードが劣るとされています。
そのため、betweenによる範囲指定も探してみましたが、うまく実装することができませんでした...

現時点では、「/app/View/Elements/searchForm.ctp」は同じものを使います。
そして、Modelは、以下のように設定します。

--------------(/app/Model/User.php)
<?php
class User extends AppModel {  
    :
    :
  // 検索対象のフィルタ設定
  public $filterArgs = array(
    array('name' => 'id_from',  'type' => 'expression', 'method' => 'idBetween', 'field' => 'User.id BETWEEN ? AND ?' ),
    array('name' => 'username', 'type' => 'like',  'field' => 'User.username'),
    array('name' => 'nickname', 'type' => 'like',  'field' => 'Profile.nickname'),
  );

  function idBetween($data = array()) {
    $query[] = $data['id_from'];
    if ( $data['id_to'] ) {
      $query[] = $data['id_to'];
    } else {
      $query[] = 999999;
    }
    return $query;
  }
    :
    :
}
--------------

「'type' => 'expression'」を設定し、「method」で配列を渡す関数を通すことで、自動的に「between句」を生成してくれます。
この方法でも、「id_from」に値が入力されれば正しく betweenで検索されます。

ですが、「id_from」の値が入っていない場合(「id_to」のみの入力の場合)は、入力がないものとして処理されません。


「id_to」のみの入力の場合も検索の処理をさせる方法については、分かりませんでした!!!
分かる方、どなたか教えてくださいっ!!


【CakePHP2.3 Search Plugin検索処理 目次】
CakePHP2.3 Search Pluginで検索処理 その1設置方法
CakePHP2.3 Search Pluginで検索処理 その2表示件数を動的に変える方法
CakePHP2.3 Search Pluginで検索処理 その3入力エリア一つで複数の項目を同時に検索する方法
CakePHP2.3 Search Pluginで検索処理 その4前方一致検索、後方一致検索、不等号による検索、between句による範囲検索
CakePHP2.3 Search Pluginで検索処理 その5入力項目に複数項目入力した場合の AND検索、OR検索
CakePHP2.3 Search Pluginで検索処理 その6ORDER、sortソートの機能
CakePHP2.3 Search Pluginで検索処理 その7queryを使って 日付の範囲検索
[ 2013年08月19日 00:45 ] カテゴリ:CakePHP 2.x | TB(0) | CM(0)

WordPressのバージョンアップをしたら「the_content」でコンテンツが表示されなくなった

WordPressのアップデートを行い、バージョンを 2.9.2から 3.6にしました。

そうしたら、それまで「the_content」で情報を取得して表示していた固定ページの情報が表示されなくなりました。
その対応方法についてご紹介いたします。


固定ページでは、入力された情報を取得するためには、
--------------------------------
<?php the_content(); ?>
--------------------------------
と記述します。

この方法はバージョン2.9.2では問題なく動作していました。
しかし、バージョン3.6ではこの記述方法は正しい表記ではなくなったようで、これだけでは動作しませんでした。


http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0

上記の公式サイトを読む限りでは、ループの中で使うと書かれており、バージョンアップしたことで何か仕様が変わってしまったのだということを理解しました。

その後、あれこれ探し回ったところ、「/wp-content/themes/テーマ名/page.php」内「the_content();」の処理の記述がありましたので、それを流用し、下記のように記述をしたところ問題なく表示されるようになりました。

--------------------------------------
<?php
  if (have_posts()) : while (have_posts()) : the_post();
    the_content();
  endwhile; endif;
?>
--------------------------------------


また、このブログを書くに当たり、さらに情報収集したところ、下記のサイトにも似たようなことが書かれておりましたので、併せて参考にしてみるのもよさそうです。
http://dhive.jp/blog/yama/9505.html


また、下記のフォーラムでのやり取りを見つけまして、これを読む限りでは、バージョン3.1.4までは「the_content();」単独で呼び出すことができていたようですが、バージョン3.3.2ではループの中で呼び出さなくてはいけない仕様になっていたようですね。
http://ja.forums.wordpress.org/topic/10152?replies=11

バージョン3.2か、3.3から仕様が変わったのでしょうね....
[ 2013年08月16日 21:35 ] カテゴリ:WordPress | TB(0) | CM(0)

CakePHP 2.3 Search Pluginで検索処理 その3入力エリア一つで複数の項目を同時に検索する方法

今回の検索は、入力エリアは 1つですが、複数の項目にわたって検索を行いたい、という場合の検索方法です。

例えば、ニュースなどの記事の検索で、タイトルと本文を検索したいが、入力は分けずに 1つの入力で両方を検索したい、という場合などの対応です。


具体的には、「ユーザ名」の検索項目で入力したものを、ユーザ名、ニックネームのいずれかにマッチする情報を取得してくるように変更してみましょう。
今回の処理は、その2(http://ssgiken.blog.fc2.com/blog-entry-31.html)をベースにしていますので、そちらもご覧ください。


これは、非常に簡単です。

13行目の fieldの値を「'User.username'」一つだったものを「array ( 'User.username', 'Profile.nickname' )」という形式で検索するフィールドを配列に入れて指定してあげるだけです。
これで、検索する対象となる項目を追加することができました。

もっと項目を増やしたい場合は、配列に項目名を追加するだけで OKです。

--------------(/app/Model/User.php)
<?php
class User extends AppModel {  
  public $name = 'User';  
  
  // 検索プラグイン  
  public $actsAs = array('Search.Searchable');  

  // 検索対象のフィルタ設定
  public $filterArgs = array(
    array('name' => 'id',       'type' => 'value', 'field' => 'User.id'),
    array('name' => 'username', 'type' => 'like',  'field' => array ( 'User.username', 'Profile.nickname' ) ),
    array('name' => 'nickname', 'type' => 'like',  'field' => 'Profile.nickname'),
  );

  // 検索対象のフィールド設定
  public $presetVars = array(
    array('field' => 'id',       'type' => 'value'),
    array('field' => 'username', 'type' => 'value'),
    array('field' => 'nickname', 'type' => 'value'),
    array('field' => 'limit',    'type' => 'value'),
  );


  // アソシエーション  
  public $hasOne = array(  
    'Profile' => array(  
      'className'  => 'Profile',  
      'foreignKey' => 'user_id',  
      'conditions' => null,  
      'fields'     => null,  
      'dependent'  => true,  
    ),  
  );  
}  
--------------


【CakePHP2.3 Search Plugin検索処理 目次】
CakePHP2.3 Search Pluginで検索処理 その1設置方法
CakePHP2.3 Search Pluginで検索処理 その2表示件数を動的に変える方法
CakePHP2.3 Search Pluginで検索処理 その3入力エリア一つで複数の項目を同時に検索する方法
CakePHP2.3 Search Pluginで検索処理 その4前方一致検索、後方一致検索、不等号による検索、between句による範囲検索
CakePHP2.3 Search Pluginで検索処理 その5入力項目に複数項目入力した場合の AND検索、OR検索
CakePHP2.3 Search Pluginで検索処理 その6ORDER、sortソートの機能
CakePHP2.3 Search Pluginで検索処理 その7queryを使って 日付の範囲検索
[ 2013年08月12日 00:39 ] カテゴリ:CakePHP 2.x | TB(0) | CM(0)

サイトのアクセス解析結果 サイトによってブラウザの利用割合が全然違う

先日、SyntaxHighlighterの設置をしている際に、IEだけ最終行が欠けて見えるという不具合がありました。そのため、どれくらいの人が影響を受けるのだろう、と思ってユーザのブラウザチェックをしてみました。

その結果が以下の通り。
Dサイトが当サイトで、それ以外は、私が運営しているブログのユーザのブラウザの比較をしてみました。(現在も記事を更新しているブログは当サイトも含めて 2つだけですが...。)


     Aサイト  Bサイト  Cサイト  Dサイト
IE    71.43%   60.84%   56.50%   32.21%
Chrome  13.78%   13.83%   13.89%   34.51%
FireFox   3.53%   10.19%    5.43%   24.23%
safari   3.53%   12.52%   21.23%    7.82%


Aサイト:金融関連ブログ
Bサイト:不動産ブログ
Cサイト:教育関連ブログ
Dサイト:当サイト


すると予想通り、というか、予想外というか、当サイトは IEユーザが一番多いわけではなかったわけです。

で、興味深い結果としては、ブログの内容によって大きな差があるということですね。
いずれのブログも 1ヶ月でのアクセス数が 600~1000位なので、ひとりのユーザが定期的に見に来てくれていた場合は、その方の環境に大きく影響を受けている可能性はありますけども。


当ブログは、IE、Chromeがほぼ拮抗し、若干減って FireFox。いかにもエンジニアの方々が見に来てくれているといった比率ですね。
また、これまでメインのコンテンツの一つだった GoogleSwiffyが IEで動かないということもこんな比率になった原因かもしれないですね。

続いて、Aサイト。
IEが突出して多いですね。そのサイトは、私自身が Operaを使って更新しているために Operaが FF、safariと同程度あるのです。
それはさておき、ユーザ層がいまいちピンときませんが、株などに興味があってサイトを見に来る方は、ブラウザなどは特に意識せず、最初から入っているものをそのまま使っている方が多いのかもしれないですね。
もしくは、このサイトが一番アクセス数が少ないために、ある特定のユーザが IEを使っており、その方が定期的に見に来てくれるからその方のアクセスが強く影響をしているかもしれないですね。

Bサイトと Cサイトは似たような傾向ですが、Cサイトの safariの高さには驚かされますね。
これは、Cサイトがお母さんが対象となる内容であるため、お母さん方はパソコンからではなく iPhone/iPadなどからみているということになるのでしょうね。


ということで、改めて、モバイルの比率を調べてみました。


     Aサイト  Bサイト  Cサイト  Dサイト
desktop  91.60%   89.35%   83.08%   99.23%
tablet   6.55%   10.37%   14.76%    0.77%
mobile   1.85%    0.28%    2.15%    0.00%


予想は当たっていましたね。
Cサイトはタブレットの比率が高いですね。しかも PC以外の 76%が iPadでしたので、予想通りということですかね。

しかし、当サイトの 99%が PCからのアクセスというのもすごいですね。モバイルからのアクセスは 0!っていうのも極端ですねぇ。

当然といえば当然ですが、サイトの内容によって、PCユーザ向けでいいのか、モバイルユーザもしっかり対応する必要があるのか、また、どのブラウザを対象として考えておく方がいいのか、それを考えながらサイトの構築、ブログの構築をする必要があると言うことですね。
[ 2013年08月08日 18:54 ] カテゴリ:ただの日記 | TB(0) | CM(0)

CakePHP 2.3 Search Pluginで検索処理 その2表示件数を動的に変える方法

前回、CakePHP2.3 Search Pluginで検索処理 その1設置方法(http://ssgiken.blog.fc2.com/blog-entry-30.html)で検索の処理を作成しました。
検索の処理を入れるだけならば、あちこちのサイトを参考にしながらそれほど困った思いをせずとも導入できるんじゃないかと思いますが、検索方法は多種多様で、ここをもう少しこんな感じで検索したいなぁ、と導入事例から少し変わった検索方法を考えると途端に情報が少なくなり、どうやって実装していいのかわからないといった状況に陥りがちです。

そんなわけで、私が実際に必要に駆られて作成した検索の処理を交えながら、多種多様な検索方法のうちの少しでも情報提供できたら、と思っています。


そんなわけで、第2回目は、表示件数を動的に変える方法です。

前回の説明では 1行 3件で固定で設定しましたが、1ページに 10件、30件、50件といった件数で検索するユーザに表示件数を指定させたい場合もあるでしょう。

そんなときの方法です。


基本的な処理は、前回のものをそのまま使っていますので、それを参考にしてください。
その上で、今回の解説の部分を追加していきます。


まずやるべきことは、検索フォームに表示件数の項目を追加することです。
「表示件数」と編集されている行以下 3行を追加します。

ここで追加する項目名を「limit」とすることが重要なポイントで、これで件数を制限することができます。「limit」以外の項目名にすることはできません。

--------------(/app/View/Elements/searchForm.ctp)
<?php echo $this->Form->create('User', array('url' => '/users/index'))?>  

<fieldset>  
  <legend>Search or Search!</legend>  
  <dl>  
    <dt><label>ユーザID</label></dt>  
    <dd><?php echo $this->Form->input('id', array(  
      'type' => 'text', 'div' => false, 'label' => false))?></dd>  
    <dt><label>ユーザ名</label></dt>  
    <dd><?php echo $this->Form->input('username', array(  
      'type' => 'text', 'div' => false, 'label' => false ))?></dd>  
    <dt><label>ニックネーム</label></dt>  
    <dd><?php echo $this->Form->input('nickname', array(  
      'type' => 'text', 'div' => false, 'label' => false ))?></dd>  

    <dt><label>表示件数</label></dt>  
    <dd><?php echo $this->Form->input('limit', array(  
      'type' => 'text', 'div' => false, 'label' => false ))?></dd>  

  </dl>  
  <?php echo $this->Form->submit('検索', array('div' => false, 'escape' => false))?>  
</fieldset>  
<?php echo $this->Form->end()?>  
--------------


続いて、Modelです。
「array('field' => 'limit', 'type' => 'value'),」の行を追加するだけです。
これは、入力された値をフォームに表示させる処理ですので、入力エリアが追加された場合にはこの行を追加していきます。

--------------(/app/Model/User.php)
<?php
class User extends AppModel {  
  public $name = 'User';  
  
  // 検索プラグイン  
  public $actsAs = array('Search.Searchable');  

  // 検索対象のフィルタ設定
  public $filterArgs = array(
    array('name' => 'id',       'type' => 'value', 'field' => 'User.id'),
    array('name' => 'username', 'type' => 'like',  'field' => 'User.username'),
    array('name' => 'nickname', 'type' => 'like',  'field' => 'Profile.nickname'),
  );

  // 検索対象のフィールド設定
  public $presetVars = array(
    array('field' => 'id',       'type' => 'value'),
    array('field' => 'username', 'type' => 'value'),
    array('field' => 'nickname', 'type' => 'value'),
    array('field' => 'limit',    'type' => 'value'),
  );


  // アソシエーション  
  public $hasOne = array(  
    'Profile' => array(  
      'className'  => 'Profile',  
      'foreignKey' => 'user_id',  
      'conditions' => null,  
      'fields'     => null,  
      'dependent'  => true,  
    ),  
  );  
}  
--------------

また、前回の流れで「/app/Controller/UsersController.php」の中には「'limit' => 3,」という設定がしてありますが、これは適宜変更してください。
この項目が設定してある場合は、「表示件数」の入力がない場合のデフォルト値として使用されます。設定がない場合は「'limit' => 20,」が設定されているものとして処理されます。また、limitの設定がある、なしにかかわらず、「表示件数」の入力がある場合は、そちらが優先して処理されます。

ただし、「limit」の設定がある場合は、それ以上大きな数値が入力されても limitで設定されている値がが最大値として設定されます。サーバの負荷を考え、1ページの表示件数を制限したい場合には設定しておく必要がある項目でしょう。
「limit」の設定がない場合は、デフォルト値は無関係に入力された件数が優先されて何件でも表示されます。


また、Controllerの中で「public $presetVars = array();」と設定し、Modelで「public $presetVars = array(......」の配列を設定し、再び、Controllerで「$this->presetVars = $this->User->presetVars;」として値を取得するという処理を書いています。
この部分ですが、Modelのところで少し説明しましたが、検索フォームから入力された値を、再度画面を表示する際に入力エリアに入力された値を編集するために使われている処理で、今回作ったプログラムではそれを明示して書いています。

この部分は、Controllerの「public $presetVars = array();」を「public $presetVars = true;」とすることで自動化することも可能です。(この場合は、Controllerの「$this->presetVars = $this->User->presetVars;」の部分も消す必要があります。)

ただ、「$presetVars = true;」という設定は、Modelを使って入力値を自動的に設定する処理となっているため、Modelにない項目(DBの項目ではないもの)は、自動的に処理をすることができません。
つまり、今回は「limit」という値を追加しましたが、limitはテーブルにない項目ですので、そのような項目を追加した場合は「$presetVars = true;」の設定では limitの値を取れなくなるため、前回からの流れにあるように、入力された項目を明示的に書いていく必要が出てきます。



おまけ
処理の途中に、『「limit」とすることが重要なポイント』と書きましたが、この方法を発見するまでにおおよそ 1か月くらいかかってしまいました...

どこかに表示件数を動的に設定できる方法を書いている方がいるのではないか、と考えて、ググり続けること 3日....
しかし、3日間ググり続けてもその方法を見つけることができず、一度はあきらめました。
あきらめたとはいえ、その処理を作らないわけにはいかなかったため、createdの項目を検索項目に利用して、その値を取得して強引に「limit」の値に突っ込むという方法を編み出して、恥ずかしい処理ながら見ため的には表示件数を動的に設定する方法を作り上げました。
(検索フィールドから入力された値を取得する方法をしっかり理解していれば、そんな強引な方法を取らなくてもよかったわけですが、CakePHPを触り始めて数週間目だった 1か月前の私にはそれくらいしかできなかったワケです。)

ですが、1か月ほど経ったある日、別の作業をしているときにふとひらめいたのです。
Controllerの「limit」でページ数を制限しているなら、入力の項目名を「limit」にしてみたらいいんじゃない??と。

するとどうでしょうっ!!

 おぉっ!!うまくいったっ!!

この瞬間がプログラムを作っていてよかったなぁって思える瞬間の一つですかね。


【CakePHP2.3 Search Plugin検索処理 目次】
CakePHP2.3 Search Pluginで検索処理 その1設置方法
CakePHP2.3 Search Pluginで検索処理 その2表示件数を動的に変える方法
CakePHP2.3 Search Pluginで検索処理 その3入力エリア一つで複数の項目を同時に検索する方法
CakePHP2.3 Search Pluginで検索処理 その4前方一致検索、後方一致検索、不等号による検索、between句による範囲検索
CakePHP2.3 Search Pluginで検索処理 その5入力項目に複数項目入力した場合の AND検索、OR検索
CakePHP2.3 Search Pluginで検索処理 その6ORDER、sortソートの機能
CakePHP2.3 Search Pluginで検索処理 その7queryを使って 日付の範囲検索
[ 2013年08月05日 23:49 ] カテゴリ:CakePHP 2.x | TB(0) | CM(0)
プロフィール

エス技研

Author:エス技研
性別:男性
職業:Web系エンジニア
エンジニアになって 15年ほど経ちますが、その途中で 5年ほどディレクタ、マネジメントを中心とした業務を行っていたためにやや現場を離れていましたが、転職をきっかけに 2012年に現場に復帰し、新たな技術を楽しみながら勉強しています。
メインの環境は LAMP環境です。

FC2ブログランキング
FC2カウンター
FC2拍手ランキング
GoogleAdWords
カレンダー
07 | 2013/08 | 09
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
検索フォーム
ブロとも申請フォーム
QRコード
QR
フリーエリア


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。