メイン

ethna アーカイブ

2018年01月03日

エンターでデフォルトアクションを指定する方法

 次のようなフォームのテキスト入力ボックス内でエンターすると formタグ内で最初の submitボタンが動作する。
<form method="post" action="{$script}">
<input type="submit" name="action_Change" value="変換" />
<input type="text" name="word" value="{$form.word}" />
<input type="submit" name="action_Search" value="検索" />
</form>
 ethna の type="hidden" value="dummy" では IE で実現できない。
 単純なものならフォームを分離すればよいが、どうしても分離できない場合の解決方法は...▼

続きを読む "エンターでデフォルトアクションを指定する方法" »

2015年12月23日

Ethnaでキャプチャ認証を利用する

captcha auth  WEBでの認証で見かける、ロボットプログラムによるスパムリクエストから回避するためのキャプチャをphpベースの国産フレームワークEthnaで利用するための必要最小限の実装。
●使用するライブラリ
Securimage 3.6.2 → securimage.tar.gz [7,596,023]
http://www.phpcaptcha.org/download/

●GDライブラリが必要
php-gd 5.3.3-46.el6_6
インストールは▼
$ sudo yum list installed | grep php-gd
$ yum info php-gd
$ sudo yum -y install php-gd
$ sudo service httpd restart
●ethna は安定板で
$ ethna -v
Ethna 2.5.0 (using PHP 5.3.3)
●ethna のプロジェクトを生成
ethna add-project capt
●本家の securimage.tar.gz を capt/lib へ展開する(本家のサンプルを直接試す場合ドキュメントルートに展開する)。今回、画像認証のみ利用するので
$ ll capt/lib/securimage
    144556 Jan 28  2014 AHGBold.ttf
    119812 Oct 13 13:03 securimage.php
の2ファイルだけで十分。カスタマイズは...▼

続きを読む "Ethnaでキャプチャ認証を利用する" »

2014年07月20日

某VPSへのセットアップおさらい2

 mysqlデータベースと連携したphp WEBアプリまで。

●WEBサーバー
apache がインストールされているか確認
$ sudo yum list installed | grep httpd
なければ apache をインストール
Server version: Apache/2.2.15 (Unix)
Server built: Apr 3 2014 23:56:16
$ yum info httpd
$ sudo yum -y install httpd
自動起動になっていなければ自動起動に変更
$ chkconfig --list | grep httpd
$ sudo chkconfig httpd on
apacheを起動してウェルカムページ確認
$ sudo service httpd start
http://IPアドレス/ ●apacheグループに所属させる
$ sudo usermod -G apache admin
$ id admin
●データベースサーバー
mysql-server がインストールされているか確認
$ sudo yum list installed | grep mysql-server
mysql Ver 14.14 Distrib 5.1.73 なければ mysql をインストール
$ yum info mysql-server
$ sudo yum -y install mysql-server
mysql-server を起動
$ sudo service mysqld start
初期化(パスワード・匿名ユーザー・サンプルデータベースの扱いなど)
$ sudo mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MySQL to secure it, we'll need the current
password for the root user.  If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): (初めてならエンター)
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

Set root password? [Y/n] Y
New password: *****************
Re-enter new password: *****************
Password updated successfully!
Reloading privilege tables..
 ... Success!

By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.
	:
Remove anonymous users⁄ [Y/n] Y
	:
Disallow root login remotely⁄ [Y/n] Y
	:
Remove test database and access to it⁄ [Y/n] Y
	:
Reload privilege tables now⁄ [Y/n] Y
	:
日本語を使用する場合
sudo mv /etc/my.cnf /etc/my.cnf.org
sudo cp /etc/my.cnf.org /etc/my.cnf
sudo vi /etc/my.cnf
[mysqld]のブロックに最低限
[mysqld]
default-character-set = utf8
skip-character-set-client-handshake
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8
を追記してmysqlサーバ再起動
$ sudo service mysqld restart
自動起動になっていなければ自動起動に変更
$ chkconfig --list | grep mysql
$ sudo chkconfig mysqld on
mysql-server へログオン確認
$ mysql --show-warnings -u root -p
●php php エンジンがインストールされているか確認
$ sudo yum list installed | grep php
PHP 5.3.3 (cli) (built: Dec 11 2013 03:29:57) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies なければ php をインストール
$ sudo yum info php
$ sudo yum -y install php
php でマルチバイトストリング(日本語)を使えるか確認
$ sudo yum list installed | grep php-mbstring
なければ php-mbstring をインストール
$ yum info php-mbstring
$ sudo yum -y install php-mbstring
php から mysql を使用できるか確認
$ sudo yum list installed | grep php-mysql
なければ php-mysql をインストール
$ yum info php-mysql
$ sudo yum -y install php-mysql
確認用の phpファイルを作成
$ vi /var/www/html/info.php
$ cat /var/www/html/info.php
<?php
phpinfo();
?>
apacheを再起動
$ sudo service httpd restart
ここまで apache の設定ファイル httpd.conf はデフォルトのまま。
手元のブラウザで php の情報ページを確認。
http://IPアドレス/info.php
システム情報が表示されるので確認後 削除。
●phpライブラリpear
pear がインストールされているか確認
$ sudo yum list installed | grep php-pear
なければ pear をインストール
$ yum info php-pear
$ sudo yum -y install php-pear
pear バージョン確認
$ pear version
$ pear list
PEAR Version: 1.9.5 下記のエラー
$ sudo pear install -a ethna/ethna

Notice: Array to string conversion in PEAR/REST/13.php on line 80
PHP Notice:  Array to string conversion in /usr/share/pear/PEAR/REST/13.php on line 80

Warning: Invalid argument supplied for foreach() in PEAR/REST/13.php on line 84
PHP Warning:  Invalid argument supplied for foreach() in /usr/share/pear/PEAR/REST/13.php on line 84
PHP Fatal error:  Cannot use string offset as an array in /usr/share/pear/PEAR/REST/10.php on line 263
を解決するため
$ sudo pear clear-cache
pear アップグレード
$ sudo pear list-upgrades
$ sudo pear upgrade pear
●phpフレームワーク ethna ethna をインストール
$ sudo pear channel-discover pear.ethna.jp
$ sudo pear install -a ethna/ethna
ethna コマンド確認
$ ethna -v
Ethna 2.5.0 (using PHP 5.3.3)

●GDライブラリ
phpで画像の拡大・縮小をするためインストール
$ sudo yum list installed | grep php-gd
$ yum info php-gd
$ sudo yum -y install php-gd

2014年01月15日

FORM_TYPE_FILE(Ethna)のコツ

アプリケーションで使用するフォームパラメータを APPID_ActionForm の $form_template にまとめて記述しておけば各アクションで必要最小限の記述に省略可能。
APPID/app/action/Action1.php
    var $form = array(
            :
        'parameter1'    => array(),
        'parameter2'    => array(
            'required'  =>    true,
        ),
        'parameter3'    => array(),
            :
ただし、FORM_TYPE_FILE では注意が必要。次のように
APPID_ActionForm
    var $form_template = array(
            :
        'file'    => array(
            'type'        => VAR_TYPE_FILE,
            'form_type'   => FORM_TYPE_FILE,
            'name'        => '画像ファイル',
            'file_type'   => 'image/jpeg',
            'file_size_max'    => '1MB',
        ),
            :
file_type や file_size_max を指定すると、エラーなどでファイルアップロードするフォームへ遷移する可能性があるアクションで
APPID/app/action/Action1.php
    var $form = array(
            :
        'file'            => array(),
            :
と省略し $this->af->validate() すると、漏れなくチェックされる為 "invalid tmp_name."、"tmp_nameが不正です。"、"Invalid file type."、"ファイルタイプが正しくありません。"となってしまう。正解は▼

続きを読む "FORM_TYPE_FILE(Ethna)のコツ" »

2013年06月09日

Ethna_AppObjectのバグ???

 Ethna で SQLite の くだりで偶然発見。
Ethna_AppObject::searchId()
636行目

	$row = $this->my_db_ro->fetchRow($r, DB_FETCHMODE_ASSOC);
650行目
	$row = $this->my_db_ro->fetchRow($r, DB_FETCHMODE_ASSOC);

Ethna_AppObject::searchProp()
692行目
	$row = $this->my_db_ro->fetchRow($r, DB_FETCHMODE_ASSOC);
706行目
	$row = $this->my_db_ro->fetchRow($r, DB_FETCHMODE_ASSOC);

Ethna_AppObject::_setPropByDB()
793行目
	$this->prop = $this->my_db_ro->fetchRow($r, DB_FETCHMODE_ASSOC);

正しくは... ▼

続きを読む "Ethna_AppObjectのバグ???" »

2013年06月08日

Ethna で SQLite の試み

今さらながら Ethna-2.5.0 で データベース MySQL から SQLite に切り替えてみる。
SQLite と言っても互換性が無くなってしまった SQLite2 。ここまでの環境
CentOS release 6.4 (Final)
PHP Version 5.3.3
 DB 1.7.14 stable
 PEAR 1.9.4 stable
sqlite 2.8.17
sqlite3 3.6.20
で、Ethna-2.5.0 + MySQL5 前提Webアプリのデータベースを SQLite2 に切り替え。
極力 SQLベタ書きをさける為の Ethna_AppObject は、そのままではNG。
原因は PEAR:DB::fetchRow(DB_FETCHMODE_ASSOC) の結果セット各列のキーが
mysql だと
	field
SQLite2 だと
	tables"."field
で異なる為。 ※ DBを切り替えたらキャッシュを削除しないと混乱する。
最小限の修正手順... ▼

続きを読む "Ethna で SQLite の試み" »

2011年08月27日

vps でフレームワーク ethna 導入

●pear がインストールされているか確認
[root@www ~]# yum list installed | grep php-pear
●なければ pear をインストール
[root@www ~]# yum info php-pear
[root@www ~]# yum -y install php-pear
●pear バージョン確認
[toshi@www ~]$ pear version
PEAR Version: 1.4.9
PHP Version: 5.1.6
Zend Engine Version: 2.1.0
Running on: Linux www.remix.asia 2.6.18-308.4.1.el5 #1 SMP Tue Apr 17 17:08:00 EDT 2012 x86_64
[root@www ~]# pear list
Installed packages, channel pear.php.net:
=========================================
Package          Version State
Archive_Tar      1.3.1   stable
Console_Getopt   1.2     stable
DB               1.7.14  stable
PEAR             1.4.9   stable
Structures_Graph 1.0.4   stable
XML_RPC          1.5.0   stable
XML_Util         1.2.1   stable
●pear バージョンが低ければアップグレード
[root@www ~]# pear list-upgrades
[root@www ~]# pear upgrade-all
[root@www ~]# pear upgrade --force Archive_Tar
[root@www ~]# pear upgrade --force Console_Getopt
[root@www ~]# pear upgrade --force PEAR
●ethna インストール設定
[root@www ~]# pear channel-discover pear.ethna.jp
Adding Channel "pear.ethna.jp" succeeded
Discovery of channel "pear.ethna.jp" succeeded
●ethna インストール
[root@www ~]# pear install -a ethna/ethna
WARNING: "pear/DB" is deprecated in favor of "pear/MDB2"
downloading Ethna-2.5.0.tgz ...
Starting to download Ethna-2.5.0.tgz (241,455 bytes)
..................................................done: 241,455 bytes
downloading DB-1.7.14.tgz ...
Starting to download DB-1.7.14.tgz (133,103 bytes)
...done: 133,103 bytes
downloading Smarty-2.6.26.tgz ...
Starting to download Smarty-2.6.26.tgz (67,946 bytes)
...done: 67,946 bytes
downloading simpletest-1.1.0.tgz ...
Starting to download simpletest-1.1.0.tgz (289,405 bytes)
...done: 289,405 bytes
install ok: channel://pear.ethna.jp/Ethna-2.5.0
install ok: channel://pear.php.net/DB-1.7.14
install ok: channel://pear.ethna.jp/Smarty-2.6.26
install ok: channel://pear.ethna.jp/simpletest-1.1.0

続きを読む "vps でフレームワーク ethna 導入" »

2010年08月12日

Ethna のアプリケーションマネージャ

Ethna 2.1.* まではコントローラへマネージャーを登録し
 'マネージャ名' => '表名',
なら、ActionClass や ViewClassの中では次のように使用。
 $this->マネージャー名->メソッド();
Ethna 2.5.0 では下記URL記載の理由
http://ethna.jp/ethna-document-dev_guide-appobj-manager.html#y9120283
で廃止され、ActionClass や ViewClassの中で必要になった時点で次のように使用。
 $m = $this->backend->getManager('表名');
 $m->メソッド();
あちこちに、この'表名'が散在し始めるので次のような試み。
データベースの items表 users表を、マネージャー mgrItems と mgrUsers で処理するシチュエーション。

続きを読む "Ethna のアプリケーションマネージャ" »

2010年07月08日

検索条件の論理積に相当するアイデア

あらかじめビット判定した列をVIEWで追加定義・・・それより次のがスッキリ。
$field = array(
    bindec('00000000000000000000000000000001'),
    bindec('00000000000000000000000000000100'),
    bindec('00000000000000000000000000010000'),
       :
);
のような配列を定義して
$filter['field'] = new Ethna_AppSearchObject( $field, OBJECT_CONDITION_EQ );
と記述すれば次のように生成。
WHERE field IN (1,4,16)
ethnaへ手を入れずに済みDB依存も少ない。

2010年07月07日

検索条件に論理積を使いたい訳

Ethna_AppSearchObjectで前回拡張した論理演算子の論理積を使わないと例えば次のように記述。
$filter['pkey']	= new Ethna_AppSearchObject( null, OBJECT_CONDITION_NE );
$filter['pkey']->addObject( 'field', new Ethna_AppSearchObject( bindec('00000000000000000000000000000001'), OBJECT_CONDITION_EQ ), OBJECT_CONDITION_AND);
$filter['pkey']->addObject( 'field', new Ethna_AppSearchObject( bindec('00000000000000000000000000000100'), OBJECT_CONDITION_EQ ), OBJECT_CONDITION_OR);
$filter['pkey']->addObject( 'field', new Ethna_AppSearchObject( bindec('00000000000000000000000000010000'), OBJECT_CONDITION_EQ ), OBJECT_CONDITION_OR);
 :
これは次のように生成。
WHERE ( (pkey IS NOT NULL) AND field=1 OR field=4 OR field=16 )

2010年07月06日

検索条件に論理積を使いたい

Ethna_AppSearchObject の 検索条件(Ethna 2.5.0 の標準)
OBJECT_CONDITION_NE
OBJECT_CONDITION_EQ
OBJECT_CONDITION_LIKE
OBJECT_CONDITION_GT
OBJECT_CONDITION_LT
OBJECT_CONDITION_GE
OBJECT_CONDITION_LE
OBJECT_CONDITION_AND
OBJECT_CONDITION_OR
に加え論理演算子の論理積を使えるようにする(MySQL5.0依存)。
Ethna_AppSQL.php の getCondition()で検索条件を判定しSQLを組み立てているので Ethna_AppSQL::getCondition()をオーバーライド。
しかし Ethna_AppObject内でオーバーライドしなければならないメソッドが多数あり、今回急ぎの為 コアのソースを直接修正。

続きを読む "検索条件に論理積を使いたい" »

2010年03月04日

Ethna 2.3.x 以前でsmartyプラグイン

iモードのようなクッキーの使えない古い端末でセッションを実現するシチュエーション。
smartyプラグインとしておけばaction_formでhiddenパラメータとして定義しなくともよい。
手順は次のとおり

続きを読む "Ethna 2.3.x 以前でsmartyプラグイン" »

2009年12月07日

URLハンドラーを実現する必要最小限手順

ethna アプリケーションを
http://www.domain/index.php?action_F=0&p=0123
 ↓
http://www.domain/exe/F/0123

http://www.domain/index.php?action_A=0&e=456
 ↓
http://www.domain/exe/A/456

http://www.domain/index.php?action_E=0&e=789
 ↓
http://www.domain/exe/E/789

で動作させる。
●mod_rewite
●PHP5限定?PEARのNet_URL_Mapper
には依存しない。
●シェルを使えないレンタルサーバーを考慮しシンボリックリンクを張らない。
これを実現する必要最小限の方法は次のとおり。

続きを読む "URLハンドラーを実現する必要最小限手順" »

2009年12月03日

ローカル環境で Ethna_MailSender を使う その3

環境によって、Ethna_MailSender::send()する度に、
    mb_internal_encoding( 'EUC-JP' );
    mb_language( 'japanese' );
    $mailSender =& new Ethna_MailSender( $this->backend );
    if( isset( $this->cfg['DEFINE']['MAIL']['SENDER'] ) ){
        $mailSender->setOption( '-f YahooAuctions@remix.asia' . "\r\n" );
    }
などと初期化するところを継承で
    $mailSender =& new myMailSender( $this->backend );
だけにするには

続きを読む "ローカル環境で Ethna_MailSender を使う その3" »

2009年12月02日

ローカル環境で Ethna_MailSender を使う その2

その1のままでは、ユーザー「mymail」でログインしないと送信できない。
必ずのFrom:ヘッダーに Yahoo! JAPAN ID の登録メールアドレスを指定する必要がある為

mail myfriend@gmail.com -- -f "mymail@domain.com"

で送信可能。YahooBBのsmtpで、本題の php の mail() を使う Ethna_MailSender で使うには、Ethna_MailSender::send()する前に

$ethna_mailSender->setOption( '-f mymail@domain.com' . "\r\n" );

とすれば、php::mail() のadditional_parametersを渡すことがでで送信可能。
 -----------------------------------
 -f オプションを使って エンベロープの sender アドレスを設定
 http://php.net/manual/ja/function.mail.php
 × setOption( 'From: mymail@domain.com' . "\r\n" );
 http://ethna.jp/doc/__filesource/fsource_Ethna__classEthna_MailSender.php.html#a69
 -----------------------------------

この場合必要最小限の /etc/postfix/main.cf 設定内容は

続きを読む "ローカル環境で Ethna_MailSender を使う その2" »

2009年11月20日

Smarty から Ethna_AppObject を使う

 テーブル名:user
から
 キー列名:ucd
 検索コード:123
で引き当てた
 名前列名:name
をテンプレートで表示し空の場合
 ID列名:id
を表示する。
action や view で次のように記述。

続きを読む "Smarty から Ethna_AppObject を使う" »

2009年11月14日

ethna でモバイル版Google AdSense その2

全てのビューで広告を取得していた「ethna でモバイル版Googleアドセンス その1」を特定のビュー&テンプレートで広告を取得するよう改善。

続きを読む "ethna でモバイル版Google AdSense その2" »

2009年11月06日

ethna でモバイル版Googleアドセンス その1

サイト運営者IDの埋め込まれた「モバイル コンテンツ向け AdSense」ページで「AdSenseコード」を取得し、lib/googleAdsenseMobile.php として配置。
テンプレートに埋め込みたい為 101行目辺りからの
/*
$google_ad_handle = @fopen(google_get_ad_url(), 'r');
if ($google_ad_handle) {
  while (!feof($google_ad_handle)) {
    echo fread($google_ad_handle, 8192);
  }
  fclose($google_ad_handle);
}
*/
をコメントアウト。app/APPID_Controller.php に
require_once 'googleAdsenseMobile.php';
を追加し、さらにコメントアウトした部分に相当するコードを app/APPID_ViewClass.php へ追加。

続きを読む "ethna でモバイル版Googleアドセンス その1" »

2009年10月25日

1つのシステムで見栄えを切り替える その2

ethna の action・view は共通としテンプレートだけを切り替える。以前の
/blog/remix/2009/09/post_186.html
を改良。
shopA は
APPID/template/ja/shopA/Index.tpl
shopB は
APPID/template/ja/shopB/Index.tpl
さらに、shopXを追加したときにテンプレートが無ければ自動的に標準の
APPID/template/ja/shop/Index.tpl
を使う。
'A','B','X' をデータベースなどから取得してテンプレートを動的に切り替え、'shop' を config値 から取得する。

続きを読む "1つのシステムで見栄えを切り替える その2" »

2009年10月18日

Ethna 2.5.0 リリース

http://ethna.jp/ethna.html

2009年10月12日

Ethna_Config と データベース その2

前回の構造の場合
$backend->config->get('GROUPS');
$backend->config->get('COLOR');
として使うところ
$config = array(
        :
    'DEFINE' => array(
        'GROUPS' => array(
//          100,   ←DBから取得
//          200,   ←DBから取得
//          300,   ←DBから取得
        ),
        'COLOR' => array(
            'RED' => 1,
            'BLUE'=> 2,
        ),
    ),
のようなネストした連想配列構造にすると

続きを読む "Ethna_Config と データベース その2" »

2009年10月11日

Ethna_Config と データベース

データベースから取得した値をconfig値として扱うシチュエーション。
$config = array(
        :
    'GROUPS' => array(
//      100,   ←DBから取得
//      200,   ←DBから取得
//      300,   ←DBから取得
    ),
    'COLOR' => array(
        'RED' => 1,
        'BLUE'=> 2,
    ),

続きを読む "Ethna_Config と データベース" »

2009年10月08日

Ethnaのセッション その2

セッションの動きを確認するサンプル
プロジェクト作成直後のテンプレート APPID/template/ja/index.tpl に
<textarea wrap=off cols=80 rows=16>{$session|var_dump}</textarea>
を追加。
プロジェクト作成直後のアクション APPID/app/action/Index.php に

続きを読む "Ethnaのセッション その2" »

2009年10月03日

Ethnaのセッション

$this->session->start(null);
→ ini_set('session.use_cookies', 0); クッキーを使わない

$this->session->start(0);
$this->session->start();
→ ini_set('session.use_cookies', 1); クッキーを使う
無期限のセッションではない。ブラウザを閉じるまで同一セッションとして扱う。

$this->session->start(600);
から最大10分以内であれば、ブラウザを閉じて再びアクセスすると ethna が自動復帰し同一セッションとして扱う。

期限切れのセッションファイルが残るので明示的に削除が必要。

2009年10月02日

ethna のフォーム デフォルト値 その2

class APPID_Form_Index extends APPID_ActionForm{
    var $form = array(
        'sadjust' = array(
            'default' = '2000-01-01 00:00:00'
            ),
'default'値はvalueにセットされない。フォームヘルパーで表示される。ここまでは前回。さらに

続きを読む "ethna のフォーム デフォルト値 その2" »

2009年10月01日

Ethna_Session のデータ構造

Ethna_Session のデータ構造は
$_SESSION['REMOTE_ADDR']
$_SESSION['__anonymous__']
$_SESSION['ethna_csrf'] ← Ethna_Util::setCsrfID() 使った場合
$_SESSION[★★★]

session->set(★★★,保持したい値)
session->get(★★★)
という具合に使用するので

続きを読む "Ethna_Session のデータ構造" »

2009年09月17日

ethnaのフォーム定義をDBから取得する 補足

mysql のカラムの型が char,varchar,text だった場合、ethna が 'string' として扱い
「ethnaのフォーム定義をDBから取得する」では
デフォルトで文字列長をフォーム定義の'max'値としているため
checkbox や radio では 明示的に max=>null などとします!

2009年09月16日

ethna のEthna_DB_PEAR:getMetaData()でNOTICE

テーブル定義情報を取得する為
$ethnadb =& $this->backend->getDB();
$a =& $ethnadb->getMetaData( $vv ); ←★
で、
(NOTICE): global.getmetadata(class/DB/Ethna_DB_PEAR.php:220): [PHP] E_NOTICE: Only variables should be assigned by reference in /home/toshi/Ethna/Ethna-2.5.3/class/DB/Ethna_DB_PEAR.php on line 220
メッセージが。
参照渡しの戻り値の問題。出ない環境もあったので調べると

続きを読む "ethna のEthna_DB_PEAR:getMetaData()でNOTICE" »

2009年09月15日

ethnaのフォーム定義をDBから取得する その3

前回のままではテーブルの列の数だけSQLが発行されてしまうので
の方法で連想配列からルックアップできるように改善。
class APPID_ColumnsManager extends Ethna_AppManager に
getResultArray() を作成しておき、
class APPID_ActionForm extends Ethna_ActionForm
の _setFormTemplate を次のように改造

続きを読む "ethnaのフォーム定義をDBから取得する その3" »

2009年09月14日

ethnaのフォーム定義をDBから取得する その2

前回はテーブルの列名をフォーム名とフォームの表示名にセット。
テーブルの列名には仕様書には日本語表記があるはずで、本当はこれをフォームの表示名にしたい。
データベース テーブル 列のコメントを利用するため、MySQL 5 に依存する。
まずは、テーブルの各列のコメントに表示名を設定。
CREATE TABLE tableA(
 acd     INT         COMMENT '番号'
,aid     VARCHAR(10) COMMENT 'ID'
,acreate DATETIME    COMMENT '作成日時'
,amemo   TEXT        COMMENT 'メモ'
)ENGINE = INNODB
CHARACTER SET utf8 COLLATE utf8_general_ci;
このコメント(表示名)を ethna の Ethna_AppObject で使えるようにするには次のとおり。

続きを読む "ethnaのフォーム定義をDBから取得する その2" »

2009年09月13日

ethnaのフォーム定義をDBから取得する その1

アプリケーションの多くのフォーム定義はデータベース テーブルと密接。例えば
CREATE TABLE tableA(
 acd     INT
,aid     VARCHAR(10)
,acreate DATETIME
,amemo   TEXT
)ENGINE = INNODB
CHARACTER SET utf8 COLLATE utf8_general_ci;
なら ↓
'acd'    => array(
    'name'     => 'acd',
    'form_type'=> FORM_TYPE_TEXT,
    'type'     => VAR_TYPE_INT,
    'filter'   => 'ltrim,rtrim,ntrim',
),
'aid'    => array(
    'name'     => 'aid',
    'form_type'=> FORM_TYPE_TEXT,
    'type'     => VAR_TYPE_STRING,
    'max'      => 10,
    'filter'   => 'ltrim,rtrim,ntrim',
),
'acreate'=> array(
    'name'     => 'acreate',
    'form_type'=> FORM_TYPE_TEXT,
    'type'     => VAR_TYPE_DATETIME,
    'filter'   => 'ltrim,rtrim,ntrim',
),
'amemo'  => array(
    'name'     => 'amemo',
    'form_type'=> FORM_TYPE_TEXTAREA,
    'type'     => VAR_TYPE_STRING,
    'filter'   => 'ltrim,rtrim,ntrim',
),
という具合に大量のフォーム定義をテーブルのメタ情報から取得する。
スケルトンで生成する他に、今回は下記のように動的にフォーム定義を生成する。

続きを読む "ethnaのフォーム定義をDBから取得する その1" »

2009年09月12日

ethnaでformの配列を個別にチェックしたい

formの配列長が可変長だったっ場合、普通に作ると

メアド入力欄
  • メアドを正しく入力してください。

    となるところを

    メアド入力欄
  • メアドを正しく入力してください。
  • メアドを正しく入力してください。

    のように、どの配列インデックスで間違いがあったか分かるようにする為、次のような応急処置。
  • 続きを読む "ethnaでformの配列を個別にチェックしたい" »

    2009年09月05日

    ethnaのスケルトン

    で生成された各ファイルの
    @author {$author}
    に自分の名前を展開させる。

    環境は、
    Vine Linux 4.2 (Lynch Bages)
    Ethna-2.3.7、Ethna-2.5.0-preview3、Ethna-2.5.0-preview5

    CentOS release 5.3 (Final)
    Ethna-2.5.0-preview3

    続きを読む "ethnaのスケルトン" »

    2009年09月03日

    1つのシステムで見栄えを切り替える

    ethna の action・view は共通でテンプレートだけを切り替える。
    shopA は
    APPID/template/ja/shopA/Index.tpl
    shopB は
    APPID/template/ja/shopB/Index.tpl
    さらに、shopXを追加したときにテンプレートが無ければ自動的に標準を使う。
    APPID/template/ja/standard/Index.tpl
    次のように実現する(実験的アプローチ)

    続きを読む "1つのシステムで見栄えを切り替える" »

    2009年08月13日

    Ethna-2.5.0-preview5 のバグ?

     WEBアプリケーションの開発中不思議な現象に遭遇。環境は
    Ethna-2.5.0-preview5
    Smarty Version 2.6.26
    PHP Version 5.1.6
    CentOS release 4.6 (Final)
    view の preforward() 内の先頭に、Ethna::raiseNotice() を記述すると次のメッセージが出力される。
    Notice: Undefined index: file in /webapp/APPID/lib/Ethna/class/Plugin/Logwriter.php on line 195
    Notice: Undefined index: line in /webapp/APPID/lib/Ethna/class/Plugin/Logwriter.php on line 202
    
    Ethna のコアである Ethna_Plugin_Logwriter のログ出力箇所情報取得 _getBacktrace() の debug_backtrace() で、"file"と"line" 要素が取得できていないらしい。
    問題を切り分けると、次のような結果に。

    続きを読む "Ethna-2.5.0-preview5 のバグ?" »

    2009年08月02日

    テンプレート機能を使ったファイルダウンロード

     PHPでCSVファイルやTSVファイルのダウンロードファイルを生成するシチュエーション。
     EthnaのSmartyテンプレートを利用する。このことを応用しているEthna_MailSenderで可能。
    APPID/ja_JP/Format/AddressCSV.tpl
    作成日時:{$smarty.now|date_format:"%Y/%m/%d %H:%M:%S"}
    生成元機:{$cfg.url}
    合計{$row[0]}件
    氏名,電話,都道府県,住所
    {foreach from=$row[1] item=a}
    "{$a.name}","{$a.tel}","{$a.prefecture}","{$a.address}"
    {/foreach}
     データ取得の仕様が変わらなければ、このテンプレートだけで簡単に書式を変更できる。
     このテンプレート形式でデータファイルをダウンロードするにはアクションなどで次のように使う。

    続きを読む "テンプレート機能を使ったファイルダウンロード" »

    2009年08月01日

    Ethna_MailSender 例

     PHPで定型文面をメール送信するシチュエーション。
     EthnaのSmartyテンプレートを利用したEthna_MailSenderを使う例。
    APPID/ja_JP/mail/Thankyou.tpl
    From:owner@domain.com
    Subject:お知らせ
    
    お世話になります。{$cfg.url}よりお知らせです。
    {$row|var_dump}
    {$smarty.now|date_format:"%Y/%m/%d %H:%M:%S"}
    という具合にSmarty流に時刻やデータをはめ込む。あとはアクションなど次のように使う。.

    続きを読む "Ethna_MailSender 例" »

    2009年05月06日

    ethna のフォーム デフォルト値

    ethna のフォームパラメータ default はPOSTされたフォーム値のデフォルトではなく?フォームヘルパーに対するデフォルト
    'limit' => array(
        'name'      => 'limit',
        'required'  => false,
        'form_type' => FORM_TYPE_SELECT,
        'type'      => VAR_TYPE_INT,
        'option'    => array(
            '10'=>'10',
            '20'=>'20',
            '30'=>'30',
        ),
        'default'    =>    '20',
    ),
    ページャーで1頁当たりの表示件数が空だった場合のデフォルト値として扱うのであれば
    $formDef= $this->action_form->getDef( 'limit' );
    $limit = $formDef['default'];

    2009年03月22日

    ethnaでviewテーブルを扱う

    Ethna 2.5.0-preview3 +PHP 5.2.6 + MySQL Server 5.1.30
    では
    $object = $this->backend->getObject( 'viewname', 'cd', 123 );
    $object->isValid()
    の振る舞いがおかしい。引き当てていながら false となる。
    MySQL の view のつもりでgoogle検索しても ethna の view に関するドキュメントばかり・・・

    続きを読む "ethnaでviewテーブルを扱う" »

    2009年03月21日

    アップロード ファイル名のチェック その2

    なぜか
    「フォーム定義 」
    http://ethna.jp/ethna-document-dev_guide-form.html
    に「フォーム値の自動検証を行う(プラグイン編) 」
    http://ethna.jp/ethna-document-dev_guide-form-validate_with_plugin.html
    へのリンクがない。以前作成した file の拡張子チェックは、バリデータプラグインがセオリーのようです↓

    続きを読む "アップロード ファイル名のチェック その2" »

    2009年03月20日

    ethna の getObjectPropList その4

    実際にはたくさんのテーブルがあり、アドレッシングは複雑になるものの
    foreach( $row[1] as $k => $v )
    	$row[2][$v['CD']] =& $row[1][$k];
    
    とすると、記述を統一できる。$row は、

    続きを読む "ethna の getObjectPropList その4" »

    2009年03月19日

    ethna の getObjectPropList その3

    マジックナンバー2はちょっと・・・という場合
    foreach( $row[1] as $k => $v )
      $row['CD'][$v['CD']] =& $row[1][$k]['PRICE'];
    
    イメージは

    続きを読む "ethna の getObjectPropList その3" »

    2009年03月18日

    ethna の getObjectPropList その2

    データベース 商品テーブルから、主キーCDで価格を引き当てたい場合、
    キー
    aa\200
    bb\100
    cc\150
    のような連想配列 $price[] を新たに作り出すところ、前回のgetObjectPropListで取得したデータ構造を使ってメモリを節約する。
    $row = $this->getObjectPropList( '商品テーブル'
    ,   $select // SELECT
    ,   $where  // WHERE
    ,   $order  // ORDER BY
    ,   $offset // OFFSET
    ,   $limit  // LIMIT
    );
    foreach( $row[1] as $k => $v )
      $row[2][$v['CD']] =& $row[1][$k]['PRICE'];
    とすると $row は↓

    続きを読む "ethna の getObjectPropList その2" »

    2009年03月17日

    ethna の getObjectPropList

    データベース 商品テーブル






    CD(primary key)NAMEPRICE
    aaapple\200
    bbgrape\100
    ccorange\150

    PEAR::DB の DB_FETCHMODE_ASSOCモードで取得すると













    0



    CDNAMEPRICE
    aaapple\200

    1



    CDNAMEPRICE
    bbgrape\100

    2



    CDNAMEPRICE
    ccorange\150


    ethna の class APPID_RanksManager extends Ethna_AppManager のメソッド getObjectPropList() で取得すると

    続きを読む "ethna の getObjectPropList" »

    2009年03月14日

    テーブル定義書の自動生成 その3

     仕様書が無くソースコードだけが残るのが最悪。せめて最終的なソースコードを元に仕様書のベースを生成したい。
    ethna にはない description 要素を追加。
    APPID_ActionForm extends Ethna_ActionForm{
        var $form_template = array(
            'fieldName'    => array(
                'name'     => '列に対するWEBでの表示名',
                'required' => false,
                'form_type'=> FORM_TYPE_RADIO,
                'type'     => VAR_TYPE_INT,
                'option'   => array(
                    '1'=>'A',
                    '2'=>'B',
                ),
                'description'=>    array(
                    '2択',
                    'コードで格納 etc...',
                ),
            ),
                ~
        );
    }
    このままでは「プラグインがない」とワーニング。
    app/plugin/APPID_Plugin_Validator_Description.php を作成。
    class APPID_Plugin_Validator_Description extends Ethna_Plugin_Validator{
        var $accept_array = true;
    
        function &validate( $name, $var, $params ){
            return $this->ok();    ///    説明なのでなにもしない
        /// return $this->error('エラーだよ', E_APP_FORM_INVALIDVALUE);
        }
    }
    例えば↓このように出力すればそのままエクセルに貼り付けて・・・

    続きを読む "テーブル定義書の自動生成 その3" »

    2009年03月13日

    テーブル定義書の自動生成 その2

     列名を日本語表記する。WEBをデータベースのフロントエンドとすると、機械的に全部の列をフォーム定義することがほとんど。列とフォーム要素は1対1として action の継承元で
    class APPID_ActionForm extends Ethna_ActionForm{
        var $form_template = array(
            'fieldName'    => array(
                'name'     => '列に対するWEBでの表示名',
                'required' => false,
                'form_type'=> FORM_TYPE_RADIO,
                'type'     => VAR_TYPE_INT,
                'option'   => array(
                    '1'=>'A',
                    '2'=>'B',
                ),
            ),
                ~
        );
    }
    という具合。さらに、view の継承元で
    class APPID_ViewClass extends Ethna_ViewClass{
        function _setDefault(&$renderer){
            $smarty->assign_by_ref( 'formDef', $this->action_form->getDef() );
        }
    }
    とすれば、template で↓

    続きを読む "テーブル定義書の自動生成 その2" »

    2009年03月12日

    テーブル定義書の自動生成

    MySQL の DESC 命令で、テーブル定義設計書を ethna で出力。当然MySQL依存。
    class APPID_TABLEManager extends Ethna_AppManager{
        function &getMeta( $column=null ){
            $ethnadb =& $this->backend->getDB();
            $peardb  =& $ethnadb->db;
            $statment = "DESC tableName {$column}";
            $resultSet = $peardb->getAll( $statment, null, DB_FETCHMODE_ASSOC );
            if( PEAR::isError( $resultSet ) ){
                $message = $resultSet->getCode().':'.$resultSet->getMessage();
                Ethna::raiseWarning( $message );
            }
            return $resultSet;
        }
    }
    あとは、view で、
        $manager =& $this->backend->getManager( 'tableName' );
        $this->action_form->setApp( 'tableName', $manager->getMeta() );
    とすれば、template で
    <table border=1>
        <caption>tableName</caption>
        <tr>
            <th>項番</th>
            <th>列名</th>
            <th>データ型</th>
            <th>制約</th>
        </tr>
    {foreach from=$app.tableName item=p key=c name=x}
        <tr>
            <td align=right>{$c}</td>
            <td align=left>{$p.Field}</td>
            <td align=left>{$p.Type}</td>
            <td align=left>
                {if 'PRI'==$p.Key}PRIMARY KEY{/if}
                {if 'auto_increment'==$p.Extra}AUTO_INCREMENT{/if}
                {if 'NO'==$p.Null}NOT NULL{else} {/if}
                {if ''!=$p.Default}DEFAULT {$p.Default}{else} {/if}
            </td>
        </tr>
    {/foreach}
    <table>
    かなりベタ。

    2009年01月18日

    アップロード ファイル名のチェック

    ethna の regexp チェックは VAR_TYPE_FILE属性の時は効かないので custom で実装してみる。
    class APPID_ActionForm extends Ethna_ActionForm{
        var $form_template = array(
            'uploadName' => array(
                'name'        => 'アップロードファイル',
                'required'    => false,    ///    各アクションフォームで必須に
                'form_type'    => FORM_TYPE_FILE,
                'type'        => VAR_TYPE_FILE,
                'max'        => '10000',    ///    10000KBまで
                'custom'    => 'checkFile',
                'extension'    => array( 'zip', 'lzh' ),
                'regexNG'    => '[^\.a-z0-9_-]+',
                'regexp_error'    =>    'ファイル名に禁止文字が含まれています',
            ),
                ...
        );
            ...
        
        /**
        *    カスタムチェックメソッド: アップロードファイルをチェックする
        *        拡張子制限
        *        禁止文字正規表現制限
        *
        *    @access public
        *    @param  string  $name   フォーム項目名
        *    @return object  Ethna_Error エラーオブジェクト(エラーが無い場合はnull)
        */
        function &checkFile( $name ){
            $form_vars = $this->check( $name );
            if ($form_vars == null) {
                return null;
            }
            ///    拡張子制限
            $fileRequest = $_FILES[$name]['name'];
            if( array_key_exists( 'extension', $this->form[$name] ) ){
                $extension = $this->form[$name]['extension'];
                if( ! eregi( '('.implode(')|(',$extension).')$', $fileRequest ) ){
                    return $this->action_error->add( $name, "{form}は拡張子「".implode('」「',$extension)."」形式のみです" );
                }
            }
            ///    禁止文字正規表現制限
            if( array_key_exists( 'regexNG', $this->form[$name] ) ){
                $regexNG = $this->form[$name]['regexNG'];
                if( array_key_exists( 'regexp_error', $this->form[$name] ) ){
                    $regexp_error = $this->form[$name]['regexp_error'];
                }
                if( eregi( $regexNG, $fileRequest ) ){
                    return $this->action_error->add( 'uploadName', $regexp_error, E_FORM_REGEXP );
                }
            }
            return null;
        }
    }
    
    あとは、各アクションで

    続きを読む "アップロード ファイル名のチェック" »

    2008年12月17日

    APPID-ini.php 内の設定値を参照

    Ethna の smarty テンプレートで、APPID/etc/APPID-ini.php 内の設定値を参照するには {$config.~}。
    ちなみに Ethna 2.1.2 時代には、

    続きを読む "APPID-ini.php 内の設定値を参照" »

    2008年12月05日

    OFFSET記述できない古いmysql

    今まで問題なく動作していた ethna の Ethna_AppObject::searchProp()、Ethna_AppManager::getObjectPropList() で別の環境で突然SQLのシンタックスエラーが。

    nativecode=1064 ** You have an error in your SQL syntax near 'OFFSET 0' at line 1

    未だに古い mysql server 3.23.58 を使っているサーバー。OFFSET句を記述できない?
    互換性の切り替えはあるのか・・・。時間がないので、Ethna_AppObject から継承されている APPID_TABLEID.php 内のメソッドを↓こんな感じでオーバーライド。

    続きを読む "OFFSET記述できない古いmysql" »

    2008年11月19日

    ethnaのビューとテンプレート

    注文を検索するアクションで一覧のビューへ遷移するような場合
    ethna add-action Order_Search
    ethna add-view Order_List
    ethna add-template Order_List
    とすると、それぞれ
    APPID/app/action/Order/Search.php
    APPID/app/view/Order/List.php
    APPID/template/ja/Order/List.tpl
    という具合に「Order」ディレクトリが作られるが

    続きを読む "ethnaのビューとテンプレート" »

    2008年11月17日

    ethna で mysql のテーブル JOIN

    正規化されたスキーマではテーブル結合は付きもの。
    mysql が5以降であれば、VIEW を CREATE し ethna コマンドで add-app-object。
    ただし、mysqlが4もしくは3の為 VIEW を作れない環境の場合アプリケーション側で結合。
    例えば注文明細一覧取得のようなシチュエーションならこうする。

    続きを読む "ethna で mysql のテーブル JOIN" »

    2008年11月12日

    フレームワーク

    最新LLフレームワークエクスプローラ
    Ruby on Rails,
    Maple/Ethna(PHP),
    Catalyst(Perl),
    TurboGears(Python)
    5大フレームワーク徹底攻略

    2008年10月01日

    ethna アクションの値に dummy を使うシチュエーション

    フォームの中にsubmitが2つ以上あるケース。

    テキスト入力ボックス内でエンターするとIE6ではアクション名が渡らない。

    解決方法は

    続きを読む "ethna アクションの値に dummy を使うシチュエーション" »

    2008年09月06日

    アクション配列でアクション切り替え

    ethna で、編集中のフォーム内に増減するアイテムなかから1つを処理するアクション。
    ポリシーとして、クライアント依存する javascript は使わない。
    他にフォームの入れ子はNG

    例えば、ショッピングサイトの買い物カゴ

    送付先 商品101 商品102 商品103

    同時に複数削除できるが、1つずつ削除する構成にするには

    続きを読む "アクション配列でアクション切り替え" »

    About ethna

    ブログ「Remix.asia」のカテゴリ「ethna」に投稿されたすべてのエントリーのアーカイブのページです。過去のものから新しいものへ順番に並んでいます。

    前のカテゴリはdatabaseです。

    次のカテゴリはGitです。

    他にも多くのエントリーがあります。メインページアーカイブページも見てください。