C-limber's highへようこそ。
C-limber's highは山登りのサイトではなく、福岡システム開発WEB制作会社 C-limber(クライマー)株式会社の技術メモブログです。
福岡システム開発ホームページ制作をお探しの方はお気軽にご相談下さい。

ラベル yii の投稿を表示しています。 すべての投稿を表示
ラベル yii の投稿を表示しています。 すべての投稿を表示

2015年4月14日火曜日

[Cake2]Model内でsessionを使うには

14:33 Posted by Unknown , , No comments
井口です。
cake2でのお仕事中です。

自由なYiiから抜けだしてCake2やると
やっぱり窮屈に感じてしまいます。

Model内でのSession取扱い、というか使い方
cakephp - Accessing Session in Model - Stack Overflow

App::uses('CakeSession', 'Model/Datasourse');
$session=new CakeSession();

// ここからはsession変数使って色々書ける
$session->check('hoge');

cake2とYiiを比べてみて思うのは、
cakeのほうがフレームワークとしての歴史が長い分、色々な書き方で書けるような気がしました。
でもただそれが、「こういう書き方でも書けてしまうんだよね」的なものなのかなという印象も受けました。
とっちらかってるイメージです。
ViewやModelが命名規則や、「data」変数で部分部分で自動でくっついて自動化されてますが、
それが逆にちょっと複雑になると、「逆にめんどくさい」状態になってしまうのかなと感じてます。
もっとcake2勉強したら違うのかもしれませんが。
cake3ではオブジェクト指向色が強まるらしいですが、cake2とcake3が違いすぎてはまた逆に結果的にめんどくさくなるのではないかなと思います。
view側も配列もりもりで、少々見づらいですね。

逆にYiiはcakeに比べてすごくシンプルです。
View内でModelをぶん回すのは当たり前。
Model内に機能を追加しまくって、そのModelを各所でぶん回すっていうシンプルで強力な作りだと思います。
ComponentにもModelさえ渡しちゃえば、結構自由に戦えちゃう感じです。
Fat Model。Modelありき。
余計にYiiが好きになりました。

弊社もYii2に近日移行予定です。
楽しみです。

以上です。


--------------------------------------
弊社では独自管理画面によるシステム開発、Web制作など幅広く対応しております。
お気軽に問い合わせ下さい。
福岡のシステム開発・Web制作 C-limber(クライマー)株式会社

2014年3月20日木曜日

[Yii][WordPress]WordPressとYiiを共存させる

12:13 Posted by 匿名 , , No comments
井口です。

WordPressとYiiを共存させてみた話です。

WordPressのプラグインをYii Frameworkを使って作るという事ではなく、
別管理画面をYiiで作り、WordPressの関数・レイアウトを使いながら、
WordPressから吐き出されるheaderやらfooterやらを
Yiiのレイアウトとして読ませるといった感じで進めました。


WordPress自体は、

require('wp-blog-header.php');
このファイルさえ読み込めば、WordPress内の設定やコンテンツをWordPressの関数を使って読み込めるようになるらしいです。
[参考にしたサイト]
外部の php クラスや関数から WordPressの関数あるいはタグを含めた API を扱う方法 : Wordpressをインストールしてみた


しかし普通にやると、
require_once($yii);
した後では、YiiとWordpressは関数のautoload機能でぶつかってしまいます。

class_exists($foo, false)
とすると、yiiはclassを探すのを辞めてくれるらしいですが、
WordPress内の、機関部分をclass_exists($foo, false)として行ったらなにか問題も起きそうです。
[参考にしたサイト]
Undesireable behaviour of class_exists - Yii Framework Forum

なので、今回した対処は簡単に、
--------------------------------------
1) WordPressのbootstrapを先に読む
require('wp-blog-header.php');
してから
require_once($yii);
する。
2) 管理画面とフロント部のエントリスクリプトを別に読む
→ 管理画面用にフロント部用に別々のエントリスクリプト(index.php)を用意してあげる。
--------------------------------------

これでうまく行きました。

あとは、WordPress内の適用されたheader.phpや、footer.phpを、レイアウトのviewスクリプトで直接requireするだけです。

// テーマから直接読み込む
require_once('....../header.php');

以上です

[追記]
エントリスクリプトをわけるのに、フォルダ分けとか考えてましたが、
よく考えたらmod_rewriteで分岐させれますね。。
以下の例は、faq/regist/* と recruit/regist/* へのアクセスはフロント、それ以外を 管理画面へ分岐する設定です。
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#RewriteRule . index.php

#表ページ用 rooting
RewriteRule ^(faq|recruit)/regist/(.*)$ index.php

#管理画面ページ用 rooting
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . admin.php
弊社ではWordPressのカスタマイズ案件、独自管理画面によるシステム開発、Web制作など幅広く対応しております。
お気軽に問い合わせ下さい。
福岡のシステム開発・Web制作 C-limber(クライマー)株式会社


2014年3月15日土曜日

[Yii]リダイレクトについて

22:33 Posted by 匿名 , No comments
井口です。

Yiiでリダイレクトの書き方、ちょっと特殊です。以下メモ。

モジュール名:shop
コントローラ名:csv
アクション名:upload
パラメータ:shop_id=10

にリダイレクトさせる場合、コントローラのアクション内で、

  $this->redirect(array('csv/upload', 'shop_id'=>10));

ポイントは、
・arrayで渡してる点
・はじめの値が、'shop/csv/upload'ではなく、'csv/upload'としている事

arrayで渡すと、controller名、action名を解析してくれるみたいです。
あと、module名は省略しても、自動で察してくれるみたいです。
module名を指定する場合は、'/shop/csv/upload'と、module名の前に/スラッシュを付けるか、
  $this->redirect(Yii::app()->createUrl('/shop/csv/upload', array('shop_id'=>10)))
Yii::app()->createUrl()しちゃってください。

以上です。

2014年2月14日金曜日

[Yii] CDbCritria::compare()でのフィールド指定

19:36 Posted by 匿名 , , No comments
サンプル
$criteria->compare('column_a', 'A', false);
$criteria->compare('column_b', 'B', false);
$criteria->compare('column_c', 'C', false, 'OR');
$criteria->compare('column_d', 'D', false);

上記ソースは以下のようになる。
WHERE column_a = 'A'
WHERE (column_a = 'A') AND column_b = 'B'
WHERE ((column_a = 'A') AND column_b = 'B') OR column_c = 'C'
WHERE (((column_a = 'A') AND column_b = 'B') OR column_c = 'C') AND column_d = 'D'

2014年1月22日水曜日

[Yii]dataProviderのソートの設定

18:30 Posted by 匿名 No comments
Yii Frameworkの醍醐味、
dataProviderでの便利すぎるsort機能のカスタマイズ方法をメモします。

CActiveDataProvider、CArrayDataProviderの両方で使える方法です。

dataProviderへのコントローラ側の設定
$dataProvider=new CArrayDataProvider($datas, array(
    'pagination'=>array('pageSize'=>20),
    'sort'=>array(
        'defaultOrder'=>'regist_date desc ', // デフォルトの並び
        'attributes'=>array( // 並び替えのキーを指定(日本語キー可能=>modelのattributesを無視したネーミング可能!)
           'クラス'=>array(
                'asc'=>'category_id ASC',
                'desc'=>'category_id DESC',
            ),
            '名前'=>array(
                'asc'=>'name ASC',
                'desc'=>'name DESC',
            ),
            '性別'=>array(
                'asc'=>'sex ASC',
                'desc'=>'sex DESC',
            ),
        ),
    ),
));

CActiveDataProviderを使う場合は
$dataProvider=new CArrayDataProvider($datas, array(
    'pagination'=>array('pageSize'=>20),
    'sort'=>array(
        'defaultOrder'=>'regist_date desc ', // デフォルトの並び
        'attributes'=>array( // 並び替えのキーを指定(日本語キー可能=>modelのattributesを無視したネーミング可能!)
            'flow'=>array(
                'asc'=>'day ASC, place ASC, start_time ASC',
                'desc'=>'day DESC, place DESC, start_time DESC',
            ),
            'regist_time',
            'start_time'=>array( // モデルのattributesの並び順のカスタム可能
                'asc'=>'day ASC, start_time ASC',
                'desc'=>'day DESC, start_time DESC',
            ),
            'speech_type', // モデルのattributesも普通に可能 項目名は日本語に自動で変換されます
            'place',
            'place',
            'length',
        ),
    ),
));

view側の設定は
$this->widget('zii.widgets.CListView', array(
  'ajaxUpdate' => false,
  'dataProvider' => $dataProvider,
  'itemView' => '_table_view',
  'template' => '{summary}{pager}{sorter}{items}',
  'summaryCssClass' => 'table_summary',
  'summaryText' => '{count}件中 {start}件から{end}件まで表示',
  'pager' => array(
    'cssFile' => false,
    'htmlOptions' => array('class'=>'pagination'),
    'firstPageLabel'=>'最初',
    'lastPageLabel'=>'最後',
    'nextPageLabel'=>'次へ',
    'prevPageLabel'=>'前へ',
    'selectedPageCssClass'=>'active',
    'header' => '',
  ),
  'sorterHeader'=>'並び順',
  'sortableAttributes'=>array( // sort可能なキーをここで指定する
    'flow',
    'regist_time',
    'start_time',
    'speech_type',
    'place',
    'length',
  ),
));

一見複雑に見えますが慣れてしまえば抜け出せなくなるぐらいの便利さがあります。
Yii Framework すごいです。

2013年11月15日金曜日

[yii] CDbCriteriaの書き方いろいろ

13:10 Posted by 匿名 No comments
Yii FrameworkのCDbCriteriaを毎日毎日書いてるわけですが、

$criteria=new CDbCriteria();

としたあと、書き方の選択肢がいくつかあるので、そのメモです。

他のtableをjoinする場合  

$criteria->join.=' LEFT JOIN {{table_a}} a ON t.table_a_id=a.id ';




※メインのtableは t というデフォルトの別名が付きます。
※複数のtableをjoinする場合、CDbCriteriaのjoinプロパティは一つしか無い(配列ではなく文字列なので)ので.(ドット)で連結する事に注意!
※{{table_name}}で指定する事で、動的にprefixを無視してtable名を読み込めます。便利ですね


■ paramsの持たせ方

配列なので当たり前だけど後からどんどん追加できます。

$criteria->params[':name']="%{$name}%"; // 文字列
$criteria->params[':test_1']=$test_1; // 数値等


■ 一つのtextFieldで複数のfieldをテキスト検索する場合  

$criteria->addCondition('t.title LIKE :title OR t.comment LIKE :comment');
$criteria->params[':title']="%{$search['text']}%";
$criteria->params[':comment']="%{$search['text']}%";


■ where in で検索する方法

普通にリファレンスに書いてありますけどね、、一応メモ
$criteria->addInCondition('group_id', $group_id_array);


■ createCommandでも書けます

$commands=Yii::app()->db->createCommand()
   ->from('{{member}} t')
   ->leftJoin(
    '{{member_category_relation}} c',
    't.id=c.member_id AND c.group_id=:group_id'
    ,
    array(
     ':group_id'=>$this->_group->id,
    )
   )
   ->select(array(
    't.id AS id',
    'name',
    'category_id',
    't.update_time AS update_time'))
   ->where(
    array('in', 't.id', $member_ids)
   );
  // 後から追加も可能
  $commands->order=$order_sql;

  // コマンド実行
  $datas=$commands->queryAll();

2013年11月8日金曜日

[yii] 時間系バリデートの記載

22:47 Posted by 匿名 No comments
yiiのCActiveRecordのvalidateは超便利ですけど、

時間系のバリデートのformatの指定の仕方がちょっと特殊です。

特殊というか、PHPのdate関数と違います。

詳細はこちらを。。

CDateTimeParser | Class Reference | Yii PHP Framework

使えば使うほどyiiが楽しくなる感じ。
他のフレームワークでもこうなのかな。

少なくともZendFramework1系はこんな感じはなかったけど。

2013年7月29日月曜日