Home > Lang Archive

Lang Archive

[Ubuntu]Ubuntu8.10へObjective-C環境をインストールしてみた。[Objective-C]

1週間くらい前からObjective-Cを触り始めて見ました。Cすら一度も触ったことないから分からんことだらけですけど・・・
で、前は初代Macbookを持っていたんですけどThinkpadX61へ乗り換えと同時に手放してしまったので
X61上のUbuntu8.10でObjective-Cを学習しときます。
学習用に「詳解Objective-C2.0」という本を用意しました。この本を終えたら新しくMacbookを購入し直そうと思います。
iPhoneだって持ってないんですけどね・・・・

とりあえずいつも通り、Ubuntu8.10へのObjective-C環境のインストール方法をまとめておきます。

  1. いろいろとインストール。こんだけ入れると取り合えずObjective-Cの環境は整います。
    sudo apt-get install build-essential gobjc gobjc-multilib libgnustep-base-dev gnustep gnustep-devel gnustep-dl2 doxygen
  2. ↑だけインストールするだけだとNSObjectが使えないので↓も行う。(Objective-C2.0本を進めていると、どうしてもNSObjectが必要だったので・・・つかNSObjectが使えないとretain、releaseとかが無い!)
    ・Foundationフレームワークを使えるようにパスが通るディレクトリへリンクを張る為に↓を作成。

    #!/bin/sh
     
    frompath=/usr/include/GNUstep
    topath=/usr/lib/gcc/i486-linux-gnu/4.3/include
     
    for i in "AppKit" "Cocoa" "Cynthiune" "DBKit" "EOAccess" "EOControl" "EOInterface" "EOModeler" "FSNode" "Foundation" "Frameworks" "GNUMail" "GNUstepBase" "GNUstepGUI" "GormCore" "GormObjCHeaderParser" "GormPrefs" "HighlighterKit" "Inspector" "InterfaceBuilder" "Operation" "PostgreSQLEOAdaptor" "ProjectCenter" "Renaissance" "TalkSoupBundles" "WizardKit" "gnustep"
    do
    	ln -s $frompath/$i $topath
    done

    リンク張っているのは/usr/include/GNUstep以下にある全てをリンクしてるだけです。勉強始めたばっかなんで各ファイルにどんな機能、役割があんのかは全くもって不明ですwww
    で、作成したスクリプトファイルを実行。

    sudo sh /保存したスクリプトのパス/link_libobjc.sh

以上でUbuntu8.10へのObjective-C環境構築はおわりです。
これで「詳解Objective-C2.0」に載ってるソースそのままで動くと思います。(どっかで躓いたらまた記事修正しときます。)
最後に、Ubuntu8.10上でソースをコンパイルする時なんですが

gcc ソースファイル名 -o コンパイル後ファイル名 -lobjc -lgnustep-base

としてください。
あと、分からんというか面倒くさいというか、mainソースファイルから自前で作成したヘッダファイル(.hファイル)を読み込んでコンパイルするとき

gcc ソースファイル名 -o コンパイル後ファイル名 -lobc -lgnustep-base -include ヘッダファイル名1 -include ヘッダファイル名2

みたいにしないとコンパイル出来んのですが、複数のヘッダファイルを読み込むとき、「-include ヘッダファイル名」を何度も書くのは面倒くさいですな・・・なんか良い方法あるんですかねぇ?

2009/02/17 追記
Tomuteさんコメントありがとうございます。助かりました。
詳解Objective-C2.0を読み進めていると、Tomuteさんのブログにも書いてるようにコンパイル時に

 error: cannot find interface declaration for ‘NXConstantString

とエラー返してくるので、コンパイルオプションに”-fconstant-string-class=NSConstantString”を追加しないとダメみたいです。またTomuteさんに教えてもらった-Iオプションも追加。

gcc ソースファイル名1 ソースファイル名2 ソースファイル名3 -o コンパイル後ファイル名 -lobjc -lgnustep-base -I/指定ディレクトリ -fconstant-string-class=NSConstantString

こんな風にするみたいです。

< 参考にしたサイト: Tomute’s Notes [Linux] Ubuntu LinuxでObjective-C>

[CakePHP]CakePHP1.2のfind時にDBカラムを型変換して検索条件にする方法。

$cond["to_char(Hoge.date, 'YYYYMMDD') LIKE '%20081222%' and \"Hoge\".\"id\""] = $hoge["Hoge"]["id"];

こんな感じで。
私、PostgreSQLしか使わんのでMySQLはよく分からんけど、
どっちもDB関数使いたければ検索条件のカラム名の前に突っ込んだらイイんじゃないかと。

[CakePHP]CakePHP1.2の日付選択リストの月表記を英語から数字へ変更する方法。[FormHelper]

< ?php
$form->options['month'] = array_combine(range(1, 12), range(1, 12));
?>
< ?php echo $form->year("Hoge.date", date("Y")-1, date("Y")); ?>< ?php echo $form->month("Hoge.date"); ?>< ?php echo $form->day("Hoge.date"); ?>


floatingdays – CakePHP 1.2 のFormHelperで日付選択リストを作る

echo $form->datetime('cal', 'YMD', 'NONE', null, array('monthNames' => false));

っていう方法もそういえば有りましたねぇ。ということでメモメモ。

[Ubuntu]Ubuntu8.10でRailsをアップデートしたよ。[Rails]

Rails2.1.0をインストールしていたけど、新しいRails2.2.2をインストールするよ。

  1. rubygemsのバージョンをアップデートする。
    % sudo gem install rubygems-update
    % sudo gem update rubygems-update
    
  2. Railsをインストールする。
    % sudo gem update rails

    MySQLのドライバーがねーよ!とか言われた人はMysqlのドライバーもインストールする。↓

    %sudo apt-get install libmysqlclient15-dev
    %sudo gem install mysql
    

    他にもインストールしたいのあれば参考に→[Ubuntu]Ubuntu8.10へRailsをインストールしたよ。[Rails]

  3. 既存のアプリケーションが利用しているRailsのバージョンを上げる。
    % cd /var/www/rails/app  ## Railsアプリケーションまで移動する。移動先は自分の環境に合わせて
    % vi config/environment.rb
    RAILS_GEM_VERSION = '2.1.0'
    ↓ ## 使いたいRailsのバージョンへ修正。
    RAILS_GEM_VERSION = '2.2.2'
    % rake rails:update
    

以上でRailsのバージョンが上がったよと。

[CentOS]CentOS5の「PHP、MySQL、PostgreSQL」のバージョンをYumでアップデートする。

なんかサーバーを弄ってたら、PHPとかMySQLとかPostgresのバージョンを無性に上げたくなってきたからバージョンアップした。全部、自前でbuildなんてやってられんので全てYumで管理します。
CentOSのリポジトリのPHPなんて5.1.6とかPostgresが8.1とか・・・ねぇ?って感じだったのでつい・・・
ということでインストールメモ開始。このブログ、インストールメモ専門になってきたな・・・

  1. まず標準のCentOSのリポジトリからPHP、MySQL、PostgreSQLを除外する.。
    # vi /etc/yum.repos.d/CentOS-Base.repo
    [base] ## [base]の項目に↓を追加
    exclude=postgresql* php* mysql*
    [updates] ## [updates]の項目にも↓を追加
    exclude=postgresql* php* mysql*
    
  2. PHPとMySQLをアップデートする用にまずリポジトリ追加。
    # rpm --import http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka
    # vi /etc/yum.repos.d/utterramblings.repo ## ←のファイル作って以下の内容で保存。
    [utterramblings]
    name=Jason's Utter Ramblings Repo
    baseurl=http://www.jasonlitka.com/media/EL$releasever/$basearch/
    enabled=1
    gpgcheck=1
    gpgkey=http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka
    
  3. PostgreSQLをアップデートする用にやっぱりまずはリポジトリ追加。
    # wget http://yum.pgsqlrpms.org/reporpms/8.3/pgdg-centos-8.3-5.noarch.rpm
    # rpm -ivh pgdg-centos-8.3-5.noarch.rpm
    
  4. PHPとMySQLとPostgreSQLをアップデート。
    # yum update
    
    • ※ x86_64な環境の人で、既にMySQLをインストールしている人は一度削除してからインストールしなおしてください。(mysql、mysql-devel、mysql-server)
      # yum -y remove mysql mysql-devel mysql-server
      # yum -y install mysql mysql-devel mysql-server
      
    • ※ 既にPostgreSQLをインストール済の人で「古いバージョンの〜〜〜アップグレードする必要があります。」と言われた場合
      1. dataを削除、またはリネーム
        # mv /var/lib/pgsql/data /var/lib/pgsql/data.old
      2. DB初期化
        # /etc/init.d/postgresql initdb
      3. PostgreSQL再起動
        # /etc/init.d/postgresql restart
  5. リポジトリ追加したらyumでXcacheとかPostGISがインストールできるようになってたからインストールした。
    # yum -y install php-xcache postgis

各設定は以下を参考に。Ubuntu用に書いたけどほとんどいっしょなので。

[Ubuntu]Ubuntu8.10へRailsをインストールしたよ。[Rails]

  1. rubyとかrailsとかImagemagickとかごった煮インストール。
    % sudo apt-get install ruby ruby-dev irb rubygems libruby-extras libgit-ruby librmagick-ruby vim-ruby vim-rails imagemagick libmagick++9-dev sqlite libsqlite0-dev libsqlite3-dev sqlitebrowser libmysqlclient15-dev  postgresql-server-dev-8.3
    % sudo apt-get install lighttpd libfcgi-dev
    % sudo gem install rails
    % sudo gem install rmagick
    % sudo gem install sqlite3-ruby
    % sudo gem install mysql
    % sudo gem install postgres
    % sudo gem install postgres-pr
    % sudo gem install vim-ruby
    % sudo gem install mongrel
    % sudo gem install mongrel_cluster
    % sudo gem install fcgi
    % sudo gem install net-ssh
    % sudo gem install net-sftp
    % sudo gem install Selenium
    % sudo gem install jpmobile
    % sudo gem install ruby-debug
    % sudo gem install refe
    % sudo gem install xml-simple
    
  2. 次にRefeをインストールする。
    • インストール。
      % wget http://i.loveruby.net/archive/refe/refe-0.8.0-withdocsrc.tar.gz
      % tar zxvf refe-0.8.0-withdocsrc.tar.gz
      % cd refe-0.8.0
      % ruby setup.rb config
      % ruby setup.rb setup
      % sudo ruby setup.rb install
      
    • 環境変数を設定する。
      $ vi .zshrc
      # Refe
      REFE_DATA_DIR=/usr/share/refe
      export REFE_DATA_DIR
      

 % sudo gem install xml-simple をインストールのは、Ubuntu8.10で ruby script/generate とかすると以下のwarningを吐く為。

/usr/lib/ruby/1.8/xmlsimple.rb:275: warning: already initialized constant KNOWN_OPTIONS
/usr/lib/ruby/1.8/xmlsimple.rb:280: warning: already initialized constant DEF_KEY_ATTRIBUTES
/usr/lib/ruby/1.8/xmlsimple.rb:281: warning: already initialized constant DEF_ROOT_NAME
/usr/lib/ruby/1.8/xmlsimple.rb:282: warning: already initialized constant DEF_CONTENT_KEY
/usr/lib/ruby/1.8/xmlsimple.rb:283: warning: already initialized constant DEF_XML_DECLARATION
/usr/lib/ruby/1.8/xmlsimple.rb:284: warning: already initialized constant DEF_ANONYMOUS_TAG
/usr/lib/ruby/1.8/xmlsimple.rb:285: warning: already initialized constant DEF_FORCE_ARRAY
/usr/lib/ruby/1.8/xmlsimple.rb:286: warning: already initialized constant DEF_INDENTATION
/usr/lib/ruby/1.8/xmlsimple.rb:287: warning: already initialized constant DEF_KEY_TO_SYMBOL

[PHP]CentOSへXCacheをインストールしたメモ。[XCache]

またインストールメモ。今後、サーバーを作る時用の自分用メモばっか書いてますな、最近。
ということで、CentOS5.2XCacheをインストールしました。

  1. phpizeの為に、php-deveをインストール。
    # yum -y install php-devel
  2. Xcacheの取得 && インストール。
    # cd /usr/local/src
    # wget http://xcache.lighttpd.net/pub/Releases/1.2.2/xcache-1.2.2.tar.gz
    # tar zxvf xcache-1.2.2.tar.gz
    # cd xcache-1.2.2
    # phpize
    # ./configure --enable-xcache --enable-xcache-coverager
    # make
    # make test
    # make install
    

    インストール後、表示されるパスをメモしておく。↓みたいな。

    Installing shared extensions: /usr/lib64/php/modules/
    
  3. XCacheのWebインタフェースを公開ディレクトリへコピー。
    # cp -R admin /var/www/html/
    # cp -R coverager /var/www/html/
    # mv /var/www/html/admin /var/www/html/xcache
    
  4. XCacheの設定。
    # mkdir /tmp/pcov
    # chown apache.apache /tmp/pcov ##←Apache実行ユーザーへ
    # cat xcache.ini >> /etc/php.ini
    # cat /proc/cpuinfo | grep -c processor ##←表示された数値をメモ。
    # echo "< ?php echo md5('pass'); ?>" | php ##←表示された文字列をメモ。
    # vi /etc/php.ini
    

    以下、/etc/php.ini のXCache設定内容。

    • zend_extension = インストール後表示されたパスを指定。
    • xcache.count = # cat /proc/cpuinfo | grep -c processor で表示された数値。
    • xcache.admin.user = “hoge” # 適当なユーザーを指定。
    • xcache.admin.pass = # echo “< ?php echo md5('pass'); ?>” | php で表示された文字列。
    [xcache-common]
    ;; install as zend extension (recommended), normally "$extension_dir/xcache.so"
    ;zend_extension = /usr/local/lib/php/extensions/non-debug-non-zts-xxx/xcache.so
    zend_extension = /usr/lib64/php/modules/xcache.so
    ; zend_extension_ts = /usr/local/lib/php/extensions/non-debug-zts-xxx/xcache.so
    ;; For windows users, replace xcache.so with php_xcache.dll
    ;zend_extension_ts = c:/php/extensions/php_xcache.dll
    ;; or install as extension, make sure your extension_dir setting is correct
    ; extension = xcache.so
    ;; or win32:
    ; extension = php_xcache.dll
    
    [xcache.admin]
    xcache.admin.enable_auth = On
    xcache.admin.user = "hoge"
    ; xcache.admin.pass = md5($your_password)
    xcache.admin.pass = "******************************"
    
    [xcache]
    ; ini only settings, all the values here is default unless explained
    
    ; select low level shm/allocator scheme implemenation
    xcache.shm_scheme =        "mmap"
    ; to disable: xcache.size=0
    ; to enable : xcache.size=64M etc (any size > 0) and your system mmap allows
    xcache.size  =                64M
    ; set to cpu count (cat /proc/cpuinfo |grep -c processor)
    xcache.count =                 1
    ; just a hash hints, you can always store count(items) > slots
    xcache.slots =                8K
    ; ttl of the cache item, 0=forever
    xcache.ttl   =                 0
    ; interval of gc scanning expired items, 0=no scan, other values is in seconds
    xcache.gc_interval =           0
    
    ; same as aboves but for variable cache
    xcache.var_size  =            8M
    xcache.var_count =             1
    xcache.var_slots =            8K
    ; default ttl
    xcache.var_ttl   =           600
    xcache.var_maxttl   =       3600
    xcache.var_gc_interval =     300
    
    xcache.test =                Off
    ; N/A for /dev/zero
    xcache.readonly_protection = Off
    ; for *nix, xcache.mmap_path is a file path, not directory.
    ; Use something like "/tmp/xcache" if you want to turn on ReadonlyProtection
    ; 2 group of php won't share the same /tmp/xcache
    ; for win32, xcache.mmap_path=anonymous map name, not file path
    xcache.mmap_path =    "/tmp/xcache"
    
    ; leave it blank(disabled) or "/tmp/phpcore/"
    ; make sure it's writable by php (without checking open_basedir)
    xcache.coredump_directory =   ""
    
    ; per request settings
    xcache.cacher =               On
    xcache.stat   =               On
    xcache.optimizer =           Off
    
    [xcache.coverager]
    ; per request settings
    ; enable coverage data collecting for xcache.coveragedump_directory and xcache_coverager_start/stop/get/clean() functions (will hurt executing performance)
    xcache.coverager =          On
    
    ; ini only settings
    ; make sure it's readable (care open_basedir) by coverage viewer script
    ; requires xcache.coverager=On
    xcache.coveragedump_directory = "/tmp/pcov"
    
  5. Apacheを再起動。
    # /etc/rc.d/init.d/httpd restart
  6. /var/www/html/coveragerディレクトリへ.htaccessを設置。↓内容。
    AuthUserFile /etc/httpd/conf/.htpasswd
    AuthGroupFile /dev/null
    AuthName "XCache Coverage Viewer"
    AuthType Basic
    #require valid-user
    require user hoge
    

以上。

[cakephp1.2]CakePHP1.2.0.7296 RC2用DRYなエラーメッセージ出力を一部修正しました。[validate]

以前のエントリー[cakephp1.2]CakePHP1.2.0.7296 RC2用DRYなエラーメッセージ出力。[validate]
で載せていた【app/models/app_model.php】内のinvalidFieldsファンクション内で
validate設定の”required”を考慮したコードになっていなかったので修正しました。

[cakephp1.2]CakePHP1.2.0.7296 RC2用DRYなエラーメッセージ出力。[validate]に修正済のコードを載せておきました。

[cakephp1.2]CakePHP1.2でprefixルーティング設定時の注意点。[携帯]

CakePHP1.2.0.7296 RC2で携帯ページを作り始めました。
Versionが1.1の時や、1.2.0.6311 betaなどの時はwebservice機能を使って携帯に対応してましたが、
いつのまにか触らない間にwebservice機能が無くなっていたので、

を参考にしました。基本的にはそのままコードを使わせてもらいました。
あとは、CakePHPガイドブックに載っているMobileComponentや、MobilePictogramConverterで簡単に作れるEmojiComponentを読み込んだりと、以前に作った物をそのまま流用という感じです。

で、肝心の注意点ですが、

Router::connect('/m/:controller/:action/*', array('prefix' => 'mobile'));

とするだけだと、Viewで

< ?php echo $paginator->prev("< < 前へ"); ?> 
< ?php echo $paginator->numbers(); ?> 
< ?php echo $paginator->next("次へ >>"); ?>

と書いていると、携帯用viewは良いんですが、PC用viewでのリンクが
http://localhost:8080/~bubbkis/m/staffs/clientsList/page:2
みたいな感じでPC用の出力画面なのに、URLに「m」が入ってしまいました。
ということで、

if (preg_match("/\/m\//", $_SERVER['REQUEST_URI'])) Router::connect('/m/:controller/:action/*', array('prefix' => 'mobile'));

としましたよ。と。
無駄にRouterクラスまで見に行ったりしてたら半日使っちゃったよ・・・こんだけの事で。

[cakephp1.2]CakePHP1.2.0.7296 RC2用DRYなエラーメッセージ出力。[validate]

※ 2008/10/22追記
【app/models/app_model.php】内のinvalidFieldsファンクション内でvalidate設定の”required”を考慮したコードになっていなかったので修正しました。適当なコード載っけてすみません。

以前にngtnさんのvalidationのメッセージ出力をDRYにしてみるっていうエントリーを見てから、CakePHP1.2ではずっとDRYなエラーメッセージ出力を使わせてもらってたんですが、CakePHPのバージョンを1.2.0.7296 RC2にすると動かなくなってしまいました。

で、動くようにしてみましたよ。偉そうにいうほどの修正量じゃありませんが・・・
修正したのは【app/app_model.php】のみです。全部載っけておきます。

< ?php
config('messages');
class AppModel extends Model {
	var $db = null;
	function __construct() {
		parent::__construct();
		$this->db =& ConnectionManager::getDataSource($this->useDbConfig);
	}
 
	function escape($data=null) {
		return $this->db->value($data);
	}
 
	//テーブル名のゲッタ
	function getTableName() {
		return $this->name;
	}
	//重複チェックのバリデート
	function checkDuplicate($data) {
		$cond = array(key($data) => '= '.current($data));
		if(($id = $this->getID()) !== false){
			$cond[$this->getTableName().'.id'] = '!= '.$id;
		}
		return ($this->findCount($cond) === 0) ? true : false;
	}
 
	/**
	 * invalidFieldsメソッドのオーバーライド
	 *
	 * @param array $data Parameter usage is deprecated, set Model::$data instead
	 * @return array Array of invalid fields
	 * @access public
	 */
	function invalidFields($options = array()) {
		if (!$this->Behaviors->trigger($this, 'beforeValidate', array($options), array('break' => true, 'breakOn' => false)) || $this->beforeValidate($options) === false) {
			return $this->validationErrors;
		}
 
		if (!isset($this->validate) || empty($this->validate)) {
			return $this->validationErrors;
		}
		$data = $this->data;
		$methods = array_map('strtolower', get_class_methods($this));
		$behaviorMethods = array_keys($this->Behaviors->methods());
 
		if (isset($data[$this->alias])) {
			$data = $data[$this->alias];
		} elseif (!is_array($data)) {
			$data = array();
		}
 
		$Validation =& Validation::getInstance();
		$this->exists();
 
		foreach ($this->validate as $fieldName => $ruleSet) {
			if (!is_array($ruleSet) || (is_array($ruleSet) && isset($ruleSet['rule']))) {
				$ruleSet = array($ruleSet);
			}
			$default = array('allowEmpty' => null, 'required' => null, 'rule' => 'blank', 'last' => false, 'on' => null);
 
			foreach ($ruleSet as $index => $validator) {
				if (!is_array($validator)) {
					$validator = array('rule' => $validator);
				}
				$validator = array_merge($default, $validator);
 
				if (isset($validator['message'])) {
					$message = $validator['message'];
				} else {
					$message = __('This field cannot be left blank', true);
				}
 
				$messageParams = array();
				if(isset($validator['message_params'])) {
					$messageParams = $validator['message_params'];
				}
 
				if (empty($validator['on']) || ($validator['on'] == 'create' && !$this->__exists) || ($validator['on'] == 'update' && $this->__exists)) {
					if ((!isset($data[$fieldName]) && $validator['required'] === true) || (isset($data[$fieldName]) && (empty($data[$fieldName]) && !is_numeric($data[$fieldName])) && $validator['allowEmpty'] === false)) {
						$this->invalidate($fieldName, $message, $messageParams);
						if ($validator['last']) {
							break;
						}
					} elseif (array_key_exists($fieldName, $data)) {
						if (empty($data[$fieldName]) && $data[$fieldName] != '0' && $validator['allowEmpty'] === true) {
							break;
						}
						if (is_array($validator['rule'])) {
							$rule = $validator['rule'][0];
							unset($validator['rule'][0]);
							$ruleParams = array_merge(array($data[$fieldName]), array_values($validator['rule']));
							$messageParams = array_values($validator['rule']); 
						} else {
							$rule = $validator['rule'];
							$ruleParams = array($data[$fieldName]);
							$messageParams = array();
						}
						if ( array_key_exists($rule, Messages::$error)) {
							$message = Messages::$error[$rule];
							$validator['message'] = $message;
						}
 
						$valid = true;
 
						if (in_array(strtolower($rule), $methods)) {
							$ruleParams[] = array_diff_key($validator, $default);
							$ruleParams[0] = array($fieldName => $ruleParams[0]);
							$valid = $this->dispatchMethod($rule, $ruleParams);
						} elseif (in_array($rule, $behaviorMethods) || in_array(strtolower($rule), $behaviorMethods)) {
							$ruleParams[] = array_diff_key($validator, $default);
							$ruleParams[0] = array($fieldName => $ruleParams[0]);
							$valid = $this->Behaviors->dispatchMethod($this, $rule, $ruleParams);
						} elseif (method_exists($Validation, $rule)) {
							$valid = $Validation->dispatchMethod($rule, $ruleParams);
						} elseif (!is_array($validator['rule'])) {
							$valid = preg_match($rule, $data[$fieldName]);
						}
						if (!$valid) {
							if (!isset($validator['message'])) {
								if (is_string($index)) {
									$validator['message'] = $index;
								} else {
									$validator['message'] = ife(is_numeric($index) && count($ruleSet) > 1, ($index + 1), $message);
								}
							}
							$this->invalidate($fieldName, $validator['message'], $messageParams);
 
							if ($validator['last']) {
								break;
							}
						}
					}
				}
			}
		}
		return $this->validationErrors;
	}
 
	/**
	 * invalidateのオーバーライド
	 *
	 * @param string $field The name of the field to invalidate
	 * @param string $value Name of validation rule that was not met
	 * @access public
	 */
	function invalidate($field, $value = null, $messageParams = array()) {
		if (!is_array($this->validationErrors)) {
			$this->validationErrors = array();
		}
		if (empty($value)) {
			$value = true;
		}
		if (count($messageParams) > 0) {
			$value = vsprintf($value, $messageParams);
		}
		// 既にセットしてある場合は、区切り文字を挟んで連結する
		if (!empty($this->validationErrors[$field])) {
			$this->validationErrors[$field] .= Messages::$separator . $value;
		} else {
			$this->validationErrors[$field] = $value;
		}
	}
}
?>

こんだけです。いちおう他のスクリプトも。
【app/config/messages.php】

< ?php
class Messages {
	/**
	 * メッセージの区切り文字
	 *
	 * @var string
	 */
	static $separator = "<br />";
 
	/**
	 * validationルールに対応するエラーメッセージ
	 *
	 * @var array
	 */
	static $error = array(
		VALID_NOT_EMPTY	=> '必ず入力してください。',
		VALID_NUMBER 	=> '半角数字を入力してください。',
		VALID_EMAIL 	=> 'メールアドレス形式で入力してください。',
		VALID_YEAR 	=> '年(1000~2999)を入力してください。',
		'alphaNumeric' 	=> '半角英数字を入力してください。',
		'between' 	=> '%1$d文字以上%2$d文字以内の半角数字を入力してください。',
		'blank' 		=> '空でなければなりません。',
		'cc' 		=> 'クレジットカード番号として正しくありません。',
		'comparison' 	=> '入力値%1$s%2$sを満たす値を入力してください。',
		'custom' 		=> '入力値が正しくありません。',
		'date' 		=> '日付形式(%1$s)で入力してください。',
		'decimal' 	=> '小数点第%1$d位までの半角数字を入力してください。',
		'email' 		=> 'メールアドレス形式で入力してください。',
		'equalTo' 	=> '入力値が"%1$s"と一致しません。',
		'extension' 	=> '拡張子が正しくありません。',
		'file' 		=> '',	// 実装されていない
		'ip' 		=> 'IPアドレス形式で入力してください。',
		'minLength' 	=> '%1$d文字以上で入力してください',
		'maxLength' 	=> '%1$d文字以内で入力してください',
		'money' 		=> '入力値が正しくありません。',// 通貨?		
		'multiple' 	=> '',	// 実装されていない
		'numeric' 	=> '半角数字を入力してください。',
		'phone' 		=> '電話番号形式で入力してください。',
		'postal' 		=> '郵便番号形式で入力してください。',
		'range' 		=> '%1$dより大きく%2$dより小さい半角数字を入力してください。',
		'ssn' 		=> 'ソーシャルセキュリティナンバー形式で入力してください。',
		'url' 		=> 'URL形式で入力してください。',
		'userDefined' 	=> '入力値が正しくありません。',
	);
}
?>

【app/views/helpers/app_form.php】

< ?php
class AppFormHelper extends FormHelper {
	/**
	 * errorメソッドのオーバーライド
	 *
	 * @param string $field A field name, like "Modelname.fieldname", "Modelname/fieldname" is deprecated
	 * @param string $text		Error message
	 * @param array $options	Rendering options for <div /> wrapper tag
	 * @return string If there are errors this method returns an error message, otherwise null.
	 * @access public
	 */
	function error($field, $text = null, $options = array()) {
		$this->setEntity($field);
		$options = array_merge(array('wrap' => true, 'class' => 'error-message', 'escape' => false), $options);
 
		if ($error = $this->tagIsInvalid()) {
			if (is_array($text) && is_numeric($error) && $error > 0) {
				$error--;
			}
			if (is_array($text) && isset($text[$error])) {
				$text = $text[$error];
			} elseif (is_array($text)) {
				$text = null;
			}
 
			if ($text != null) {
				$error = $text;
			} elseif (is_numeric($error)) {
				$error = sprintf(__('Error in field %s', true), Inflector::humanize($this->field()));
			}
			if ($options['escape']) {
				$error = h($error);
				unset($options['escape']);
			}
			$messages = explode(Messages::$separator, $error);
			$output = '';
			foreach ( $messages as $message){
				if ($options['wrap'] === true) {
					unset($options['wrap']);
					$output .= $this->output(sprintf($this->Html->tags['error'], $this->_parseAttributes($options), $message));
					$options['wrap'] = true;
				} else {
					$output .= $message;
				}
			}
			return $output;
		} else {
			return null;
		}
	}	
}
?>

【app/controllers/app_controller.php】

<php class AppController extends Controller {
	var $helpers = array('Html', 'Form', 'AppForm');
}
?>
</php>

以上です。使いかたはngtnさんの

validationのメッセージ出力をDRYにしてみるっていうエントリーを見てください。 Continue reading

Home > Lang Archive

Search
Feeds
Meta

Return to page top