トップページ > オープンソース アーカイブ

オープンソース アーカイブ

WordPress 3.1.2アップデート

初めて自動アップデートなるもので、このホームページのWordPressのアップデートを行ってみた。
何が起こるか分からず怖いので、事前にデータベースとディレクトリ丸ごとバックアップし、ここを参考に、一部の PHP ファイルを CGI モードで実行するよう編集して、「えいやっ」でアップデートを実行。
何の問題も発生しなかったので、プラグインも自動アップデートを実行。自作のプラグインも無事生き残ってるし、無事アップデータ完了。

  • コメント (Close): 0
  • トラックバック(Close): 0

Zen Cart 管理者機能の設定内容

管理者機能の管理者機能の設定内容は、TABLE_CONFIGURATION で定義されたテーブルに格納されます。

1. 例えば、配送方法に関するモジュールをインストールした場合には、
  configuration_key = ‘MODULE_SHIPPING_INSTALLED’
のレコードにモジュールファイル名がセミコロン区切りで設定されています。

2. モジュール固有の設定項目も同じテーブルに追加されます。各モジュールが持つ設定項目のキーは、モジュールクラスの keys メソッドで取得することができます。
 

  • コメント (Close): 0
  • トラックバック(Close): 0

Zen Cart 管理者機能の追加

Zen Cart に管理者機能を追加する際のファイルの配置は以下の通りです。以下は、ext_customers での例になります。

1. 機能の本体(リクエストされるファイル)
  admin/ext_customers.php

2. プログラム本体から直接 include するPHPファイル、及び css、js、画像
  admin/ext_customers/
 PHP ファイルは、外部から参照されては困るため、ディレクトリ内に次の内容で .htaccess を配置します。

<Files *.php>
Order Deny,Allow
Deny from all
Allow from localhost
</Files>

3. プログラムが利用する関数の定義
  admin/include/functions/extra_functions/ext_customers.php

  • コメント (Close): 0
  • トラックバック(Close): 0

Zen Cart 管理者サブメニュー追加

Zen Cartのカスタマイズ案件を引き受けた際に、ファイル配置について意外と悩みましたので、今後のためにメモしておきます。

拡張のサブメニューを作成するなら、
  admin/includes/boxes/extra_boxes/
にファイルを追加します。

ファイル名の規則は次の通り。
  (機能名)_(メインメニュー名)_dhtml.php
メインメニュー名のところに指定したメニューのサブメニューとして自動で追加されます。
ファイルに記載する内容は、同一ディレクトリ内の
  product_music_extras_dhtml.php
が参考になります。

ファイル内に記載する文字列定義は、
  admin/includes/languages/(言語)/extra_definitions/
の下に言語ごとに作成することが推奨されます。ファイル名は、機能名と一致させておくと良いです。

言語ごとに定義の必要のない項目(ファイル名など)は、
  admin/includes/extra_definitions/
の下に作成することが推奨されます。やはり、ファイル名は、機能名と一致させておくと良いです。

  • コメント (Close): 0
  • トラックバック(Close): 0

WordPress 2.9.2アップデート

しばらくホームページのメンテを怠っており、その間にWordPressも随分とバージョンが新しくなっていました。という訳で、本サイトもWordPress 2.9.2日本語版にアップデートしてみました。プラグインのアップデートも合わせて行いました。
見た目上、特に何も変わっていないので、問題なくアップデートが行えたようです。

  • コメント (Close): 0
  • トラックバック(Close): 0

お知らせをプラグイン化

WordPress2.7.1のアップデートによって、サイドバーのお知らせの日付表示が機能しなくなっていました。この機能はWordPress本体を修正して実現していたため、アップデートで該当ファイルが上書きされたことが原因でした。

毎回アップデート後にWordPress本体に修正を加えるのは面倒なため、この機能を「最近の投稿(日時あり)」ウィジェットプラグインとして実現することにしました。基本的な機能は、既存の「最近の投稿」ウィジェットと同じで、加えて「日付フォーマット」と「タイトルの前に表示する文字」をウィジェットの管理から設定可能としています。

「最近の投稿(日付あり)」ウィジェットプラグイン

ダウンロードしたファイルを展開して出来たディレクトリ(widget-recent-entries-with-date)をプラグインディレクトリにコピーし、プラグイン管理から「Recent entries with date widget」を「使用する」で利用可能です。

※本プログラムは、WordPressのウィジェット、プラグインの開発方法の学習用に作成したものです。ご利用時のトラブルの責任は負いかねますので、その点はご了承ください。

  • コメント (Close): 0
  • トラックバック(Close): 0

WordPress 2.7.1アップデート

WordPress 2.7.1日本語版がいつの間にかリリースされていましたので、本サイトもアップデートしてみました。とりあえず問題は発生していないようです。

  • コメント (Close): 0
  • トラックバック(Close): 0

CakePHP 10.2 ACL 開発例の補足

CakePHPのオンラインドキュメントには、親切な開発例が2つ掲載されており、基本的な開発手順を学ぶ助けとなります。
しかし、「10.2 ACL を制御するシンプルなアプリケーション」では、手順が若干省略されているために分かりにくい個所がいくつかあります。
ここでは、学習の手助けとなる補足情報を記載しておきます。

10.2.1 アプリケーションの準備
この章では、bakeを利用した各テーブルに対するモデル、コントローラ、ビューの作成手順が省略されています。
以下に、bakeを利用したモデル、コントローラ、ビューの作成手順を記載します。(bakeでappディレクトリの初期設定が行われている事が前提)

1. bakeを起動すると、コマンドの一覧が表示されます。

$ cd (appディレクトリ)
$ cake bake
Welcome to CakePHP v1.2.1.8004 Console
---------------------------------------------------------------
App : (app名)
Path: (appディレクトリ)
---------------------------------------------------------------
Interactive Bake Shell
---------------------------------------------------------------
[ D]atabase Configuration
[ M]odel
[ V]iew
[ C]ontroller
[ P]roject
[ Q]uit
What would you like to Bake? (D/M/V/C/P/Q) 

2. モデルを作成するためMを選択すると、データベースの一覧が表示されます。最初にGroupのモデルを作成するために1を選択し、対話形式で設定を行います。
Would you like to supply validation criteria for the fields in your model? (y/n)
でyを選択すると、一部のフィールドでvalidation optionsの選択を要求されますが、全て初期設定のままリターンキーで問題ありません。
Would you like to define model associations (hasMany, hasOne, belongsTo, etc.)? (y/n)
はnを選択し、
Cake test suite not installed. Do you want to bake unit test files anyway? (y/n)
はyを選択します。
一通り設定が終わると初期画面に戻りますので、Groupと同様の手順でPost、User、Widgetのモデルを作成していきます。

> M
---------------------------------------------------------------
Bake Model
Path: (appディレクトリ)/models/
---------------------------------------------------------------
Possible Models based on your current database:
1. Group
2. Post
3. User
4. Widget
Enter a number from the list above, type in the name of another model, or 'q' to exit  
[q] > 1
Would you like to supply validation criteria for the fields in your model? (y/n) 
[y] > 

Field: id
Type: integer
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1 - alphaNumeric
2 - between
3 - blank
.
.
27 - url
28 - userDefined
29 - Do not do any validation on this field.
... or enter in a valid regex validation string.
  
[29] > 
.
.
Would you like to define model associations (hasMany, hasOne, belongsTo, etc.)? (y/n) 
[y] > n

---------------------------------------------------------------
The following Model will be created:
---------------------------------------------------------------
Name:       Group
Validation: Array
(
    [name] => notempty
)

Associations:
---------------------------------------------------------------
Look okay? (y/n) 
[y] > y

Baking model class for Group...

Creating file (appディレクトリ)/models/group.php
Wrote (appディレクトリ)/models/group.php
Cake test suite not installed.  Do you want to bake unit test files anyway? (y/n) 
[y] > 

You can download the Cake test suite from http://cakeforge.org/projects/testsuite/

Baking test fixture for Group...

Creating file (appディレクトリ)/tests/fixtures/group_fixture.php
Wrote (appディレクトリ)/tests/fixtures/group_fixture.php

Baking unit test for Group...

Creating file (appディレクトリ)/tests/cases/models/group.test.php
Wrote (appディレクトリ)/tests/cases/models/group.test.php

3. 次にコントローラを作成するためCを選択します。モデルと同様に、Group、Post、User、Widgetに対して処理を行います。
ほとんどは初期設定のままリターンキーで問題ありませんが、
Would you like to use scaffolding? (y/n)
はnを、
Would you like to include some basic class methods (index(), add(), view(), edit())? (y/n)
はyを選択します。

> C
---------------------------------------------------------------
Bake Controller
Path: (appディレクトリ)/controllers/
---------------------------------------------------------------
Possible Controllers based on your current database:
1. Groups
2. Posts
3. Users
4. Widgets
Enter a number from the list above, type in the name of another controller, or 'q' to exit  
[q] > 1
---------------------------------------------------------------
Baking GroupsController
---------------------------------------------------------------
Would you like to build your controller interactively? (y/n) 
[y] > 
Would you like to use scaffolding? (y/n) 
[n] > n
Would you like to include some basic class methods (index(), add(), view(), edit())? (y/n) 
[n] > y
Would you like to create the methods for admin routing? (y/n) 
[n] > 
Would you like this controller to use other helpers besides HtmlHelper and FormHelper? (y/n) 
[n] > 
Would you like this controller to use any components? (y/n) 
[n] > 
Would you like to use Sessions? (y/n) 
[y] > 

---------------------------------------------------------------
The following controller will be created:
---------------------------------------------------------------
Controller Name:  Groups
---------------------------------------------------------------
Look okay? (y/n) 
[y] >  

Creating file (appディレクトリ)/controllers/groups_controller.php
Wrote (appディレクトリ)/controllers/groups_controller.php
Cake test suite not installed.  Do you want to bake unit test files anyway? (y/n) 
[y] > 

You can download the Cake test suite from http://cakeforge.org/projects/testsuite/

Baking unit test for Groups...

Creating file (appディレクトリ)/tests/cases/controllers/groups_controller.test.php
Wrote (appディレクトリ)/tests/cases/controllers/groups_controller.test.php

4. 最後にビューを作成するためVを選択します。他と同様に、Group、Post、User、Widgetに対して処理を行います。
Would you like to create some scaffolded views (index, add, view, edit) for this controller?
NOTE: Before doing so, you’ll need to create your controller and model classes (including associated models). (y/n)
はyを
Would you like to create the views for admin routing? (y/n)
はnを選択します。

> V
---------------------------------------------------------------
Bake View
Path: (appディレクトリ)/views/
---------------------------------------------------------------
Possible Controllers based on your current database:
1. Groups
2. Posts
3. Users
4. Widgets
Enter a number from the list above, type in the name of another controller, or 'q' to exit  
[q] > 1
Would you like to create some scaffolded views (index, add, view, edit) for this controller?
NOTE: Before doing so, you'll need to create your controller and model classes (including associated models). (y/n) 
[n] > y
Would you like to create the views for admin routing? (y/n) 
[y] > n

Creating file (appディレクトリ)/views/groups/index.ctp
Wrote (appディレクトリ)/views/groups/index.ctp

Creating file (appディレクトリ)/views/groups/view.ctp
Wrote (appディレクトリ)/views/groups/view.ctp

Creating file (appディレクトリ)/views/groups/add.ctp
Wrote (appディレクトリ)/views/groups/add.ctp

Creating file (appディレクトリ)/views/groups/edit.ctp
Wrote (appディレクトリ)/views/groups/edit.ctp
---------------------------------------------------------------

View Scaffolding Complete.

10.2.2 Auth を追加する準備

10.2.3 ACL のデータベーステーブルの初期化

10.2.4 リクエスタとして振舞う
後半にグループの追加について記載がありますが、こちらはWebブラウザで

http://(アプリケーションURL)/groups/add

にアクセスし、グループを作成することを指しています。
ユーザの追加についても同様で、

http://(アプリケーションURL)/users/add

でユーザを作成することを指しています。Groupの欄には、グループのidを指定します。

10.2.5 ACO の作成
ここでは、controllersという名のトップレベルのACOの作成手順が解説してありますが、作成方法として
・コマンドラインから作成する方法
・プログラムの中にACL作成用のコードを一時的に作成し、一度だけ実行後にコードを削除する方法
の2種類が解説されています。前者の方法を選ぶのが素直に思います。
尚、AuthComponent に根ノードの存在を教えるコードは、AppControllerクラスのbeforeFilter()メソッドの最後に追加します。

function beforeFilter() {
    // AuthComponent のコンフィギュレーション
    $this->Auth->authorize = 'actions';
    $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
    $this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login');
    $this->Auth->loginRedirect = array('controller' => 'posts', 'action' => 'add');
    
    $this->Auth->actionPath = 'controllers/';
}

10.2.6 ACO の作成を自動化するツール
ここでは、前ページで作成した controllers ACOの下に、app/controllers ディレクトリ内に準備した全てのコントローラ、及びアクションのACOを自動作成する手順が記載されています。
AppControllerクラスに、buildAcl()メソッドを作成し、beforeFilter()メソッドの最後にbuildAcl()を呼び出すコードを記述するのが素直かと思います。

function beforeFilter() {
    // AuthComponent のコンフィギュレーション
    $this->Auth->authorize = 'actions';
    $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
    $this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login');
    $this->Auth->loginRedirect = array('controller' => 'posts', 'action' => 'add');
  
    $this->Auth->actionPath = 'controllers/';
    
    $this->buildAcl();
}

ブラウザで、

http://(アプリケーションURL)/users

等に一回アクセスしACOの作成が確認できたら、AppControllerクラスからbuildAcl()メソッドと、beforeFilter()メソッド内のbuildAcl()の呼び出し行を削除します。
最後にAuthComponentを無効化するコードの除去の記述がありますが、これは、GroupsController、UsersControllerクラスとに追加したbeforeFilter()メソッド内の
$this->Auth->allowedActions = array(‘*’);
の行の削除を指しますが、これは後で行います。

10.2.7 パーミッションの設定
最初にコマンドラインからパーミッションを設定する方法が記載されていますが、これはコマンド利用方法の解説であり、そのまま実行しても機能しません。
ここでも、やはり一時的なコードを使ってパーミッションを設定します。UsersControllerクラスにinitDB()メソッドを追加し、beforeFilter()メソッドの最後にinitDB()の呼び出し行を追加します。

function beforeFilter() {
    parent::beforeFilter(); 
    $this->Auth->allowedActions = array('*');
    $this->initDB();
}

尚、initDB()メソッドですが、次のように修正しておく必要があります。

function initDB() {
    //$group =& $this->User->Group;
    App::import('Model', 'Group');
    $group = new Group();

    // 管理者グループには全てを許可する
    $group->id = 1;     
    $this->Acl->allow($group, 'controllers');
 
    // マネージャグループには posts と widgets に対するアクセスを許可する
    $group->id = 2;
    $this->Acl->deny($group, 'controllers');
    $this->Acl->allow($group, 'controllers/Posts');
    $this->Acl->allow($group, 'controllers/Widgets');
    $this->Acl->allow($group, 'controllers/Users/logout');
 
    // ユーザグループには posts と widgets に対する追加と編集を許可する
    $group->id = 3;
    $this->Acl->deny($group, 'controllers');        
    $this->Acl->allow($group, 'controllers/Posts/add');
    $this->Acl->allow($group, 'controllers/Posts/edit');        
    $this->Acl->allow($group, 'controllers/Widgets/add');
    $this->Acl->allow($group, 'controllers/Widgets/edit');
    $this->Acl->allow($group, 'controllers/Users/logout');
}

先頭部分は、$this->User->GroupがNULLであるためにエラーが発生する問題の対応です。
あと、マネージャグループ、ユーザグループのユーザでログインするとログアウトできない問題があったため、それぞれallowパーミッションを追加しています。

ブラウザで、

http://(アプリケーションURL)/users

等に一回アクセスしパーミッションの作成が確認できたら、UsersControllerクラスからinitDB()メソッドと、beforeFilter()メソッド内のinitDB()の呼び出し行を削除します。併せて、GroupsController、UsersControllerクラスのbeforeFilter()メソッドから
$this->Auth->allowedActions = array(‘*’);
の行を削除します。

function beforeFilter() {
    parent::beforeFilter(); 
    //$this->Auth->allowedActions = array('*');
    //$this->initDB();
}

10.2.8 ログイン

10.2.9 ログアウト

10.2.10 最後に

  • コメント (Close): 0
  • トラックバック(Close): 0

MT4のPHPプラグイン

MT4のプラグイン作成に関する情報は意外と少ないようです。
とりあえず、本家の技術情報提供ブログにMT3.3用のサンプルがありましたので、一通り動作チェックとソースコードの確認をしてみました。

残念なことに、サンプルプログラムには、ダイナミックパブリッシング用のPHPプラグインは含まれていません。こちらの作成方法については、こちらに記載があります。この情報を参考に、ローカライズ技術の解説のサンプルのPHP版を作成してみました。

myplugin03_php.zip

圧縮ファイルを展開するとMyPlugin03ディレクトリが作成されますので、このディレクトリをpluginsディレクトリの下にコピーします。
後は、公開をダイナミックに設定してあるテンプレートの中で、<$MTWelcome$>を記述すると動作が確認できます。

機能は元のサンプルプラグインと同一となっていますので、ローカライズ技術の解説の方を参照ください。

MT4のPHPプラグインは、smartyのプラグイン機能を利用しているため、smartyに強い方は習得が早そうです。

  • コメント (Close): 0
  • トラックバック(Close): 0

MT4のカテゴリの一括変更

身内のブログを移転する際に、MovableTypeを3.35から4.23にバージョンアップしました。

その際に、これまでに別のカテゴリとして登録していた記事を一つに纏めたいという要望があり、その対応を行いました。

各カテゴリに属する記事が少ない場合は、[ブログ記事の管理]で記事の絞り込みを行い、全て選択した上での一括編集ということになるのでしょうが、件数が多い場合にはこの手順ではとてもやってられません。そこで、MovableTypeが利用しているPostgreSQLのデータベースを直接変更することにしました。

事前準備として、ブログIDと変更前、変更後のカテゴリIDを調べておきます。これらの値は、[カテゴリの編集]画面のURLから容易に知ることができます。

例えば、変更前カテゴリのURLが、

http://dummy/mt.cgi?__mode=view&_type=category&blog_id=1&id=10

変更後カテゴリのURLが、

http://dummy/mt.cgi?__mode=view&_type=category&blog_id=1&id=24

の場合、それぞれの値は次の通りとなります。

ブログID:1
変更前カテゴリID:10
変更後カテゴリID:24

後は、psqlやphpPgAdminでデータベースに接続した上で、次のSQLを実行するだけとなります。

UPDATE mt_placement
SET placement_category_id = 24
WHERE placement_blog_id = 1 AND placement_category_id = 10;

一度変更してしまったものは容易には元に戻せないため、事前にバックアップを取ったり、ブログIDやカテゴリIDを十分に確認した上で作業を行うことをお勧めします。

  • コメント (Close): 0
  • トラックバック(Close): 0

トップページ > オープンソース アーカイブ

カテゴリー
お知らせ

トップページへ戻る