ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Ethnaコミュの質問トピック

  • mixiチェック
  • このエントリーをはてなブックマークに追加
はじめまして、最近Ethnaを使い始めたdecoyと申します。
宜しくお願い致します。

質問をするトピックがありませんでしたので作りました。
早速、質問なんですがEthnaはデフォルトでは
action_(アクション名)=trueとする事で
指定されたアクションを実行し、フォームから送信する際に
name="action_(アクション名)"とすれば
遷移するようになっていますが

例えば_getActionName_Formをオーバーライドして
アクションを呼び出す際にact=loginとした場合は
遷移の際、name=の後、どのように記述すれば遷移出来ますでしょうか。
name="act_login"等、試してみましたがどれもうまく遷移できませんでした。

何方か分かる方がいらっしゃいましたらご教授頂けますと幸いで御座います。
以上、宜しくお願い致します。

コメント(168)

haltさん・おかむさん

回答ありがとうございます、安心しました。
作り変え無いといけないかと思い、非常にあせっていました(^^ヾ

はじめまして。
PHPを勉強したての初心者でphp(特にクラス)も理解できてませんが、宜しくお願いします。

やりたいことは、特定のアクション実行時、画面表示+指示したファイル名で内容のファイル出力する。

アクションクラスで $this->af->setApp('f_name', 'ファイル名');とか設定
smarty_outputfilterで'f_name'がnullで無ければファイルの書き込みする様に試してみたんですが
'f_name'の値が取得できません。($f_name=$this->af->get('f_name');とかよく判らず色々試したんですがうまく行きません)
取得するためのイイ手段或いは、もっと手軽に目的を果たす方法はないでしょうか?
>>アホルダーさん

アクションクラスでファイル名を指定するのであればアウトプットフィルターは使わないで、アクションクラスのperform内で
$this->af->setApp('file_content',file_get_contents('ファイル名'));
とかやって、テンプレートに
{$app.file_content}
とかやっちゃうのはダメなんでしょうか?
はじめまして、最近Ethna(2.5.0)をはじめたものです。

ひとつ質問をさせていただきたいのですが、
DBにあるデータを表示させると、日本語が文字化けします。
データはすべてUTF-8(utf8_unicode_ci)にしているのですが、
化けてしまうんです。

データベース上では問題なく表示されています。
なにか処理が足りないんでしょうか?
お分かりの方いらっしゃいましたら、お教えいただけませんか?

環境は、windows xampp php5 mysql5 ethna2.5.0 です。


> マサルさん

アクションのはじめに1度、次のSQLを投げるようにしたらどうでしょうか。
これはクライアントに使用するエンコーディングを指定します。

set names 'utf8';
naotoさん、ご回答ありがとうございます。

やってみましたがダメでした。
ちなみにDBもethna側も両方UTF-8です。

それでいろいろ調べたところ、
DB側の文字コードを(phpMyAdminによって)、
「utf-8」から「latin1」に変更したところ、うまくいきました。
(今までは、データをutf-8でDBに入れていました。)

なぜutf-8じゃだめなのかよくわかりませんが、
とりあえず解決したので報告します。

naotoさん、ありがとうございました^^
>>マサルさん

そういう方法で解決しても、なんだか気になりますね。
DBの文字コードをlatin1にしたところで、格納されているデータがUTF-8ならば、今度はソート規則などで問題が出そうな気がします。

MySQLのCNFの[mysqld]セクションに
default-character-set = utf8
skip-character-set-client-handshake
を付け加えてみてはどうなるでしょうか。
しゅうさんへ

提示頂いた方法で直りました!
ありがとうございます、助かりました^^
ethnaのwikiをみて思ったんですが、
ここのcalendar2とかって、どうやって使うんでしょうか?
いろいろ調べたけどよく分からなくて・・・
お分かりになる方いらっしゃいますか?

http://ethna.jp/index.php?PukiWiki/1.4/Manual/Plugin/A-D#afda2820


>ethnaのwiki
いや、これはEthnaの機能ではなく、Wikiの機能です・・・。あせあせ

・・・・もしかして、Wikiの機能と知ってて質問してる?
あ、そうか・・失礼しましたあせあせ(飛び散る汗)
Wikiをよく知らないもので、勘違いしていました。
しょーもない質問すみません;;
getObjectPropListをつかってDBからデータを拾いたいんですが、
offsetとstartを使ったところでエラーが出てしまいます。どうしてでしょう?

return $this->getObjectPropList('hoge', null, null, null, 1, 1);
※1, 1の部分

それと、みなさんはDBとつなぐとき、どうやっていますか?
(AppObject/AppManagerとか、
PDOつかうとか、S2Ethnaとかいろいろ・・)
私は慣れてしまったのでAppObject一本やりなんですが・・・。うまい!

第一引数が'hoge'ってことは、
Applicationid_hoge extends Ethna_AppObject
なクラスを作ってるっていうことですか?普通1文字目は大文字だったりしますが。

あと、debugをONにしてどんなエラーが出ているか見てみると分かりやすいかと思います。
takitohさん、ありがとうございます!
なるほど、AddObjectですか。
単純に皆さんなにを使っているのか気になりました^^



●HogeでAppObjectをつくり、AppManager内にgetObjectPropListを書いています。

class プロジェクトID_HogeManager extends Ethna_AppManager
{
function &test(){
return $this->getObjectPropList('Hoge', null, null, null, 0, 1);
}
}



エラーはこんな感じです。

プロジェクトID[25286](ERR): Ethna_DB_PEAR._query(/lib/Ethna/class/DB/Ethna_DB_PEAR.php:306): Query Error SQL[SELECT COUNT(DISTINCT `hoge`.``) AS `id_count` FROM `hoge` ] CODE[1054] MESSAGE[SELECT COUNT(DISTINCT `hoge`.``) AS `id_count` FROM `hoge` [nativecode=1054 ** Unknown column 'hoge.' in 'field list']] [ERROR CODE(4)]


var_dumpをすると、延々といろんなものが出続けています(;_;)


↓これだとOKなんですけどねぇ・・
$this->getObjectPropList('hoge');
AppManagerはlimitを設定すると、2つSQLを出します。1つめのは、テーブルでの該当する全行数を獲得し、2つ目のがデータ取得。1つめのがlimit設定時に特有のものです。

そのエラーをみるに、テーブルにprimary keyが設定されていないか、AppObjectのprop_defの中にkeyを設定した要素がないかですかね。
takitohさん、お答えありがとうございます!

テーブルにprimarykeyを設定していなかったので、
してみたところ、無事できました!
なるほど、それは気がつきませんでした。

ありがとうございました!!
度々お世話になります。
現在DBからのデータを表示するものを作っていますが、
Pagerで10レコードごとに区切っています。
(Ethna_Util::getDirectLinkListとかを使ってます)

全レコードに対しての処理なら問題ないのですが、
条件検索した時に問題が発生しました。

検索条件、もしくは検索して返ってきたDBデータを
2ページ目以降に持ち越すことが出来ませんでした。

1ページ目はフォームからPOSTした情報があるので、
きちんとDBから拾えるのですが・・。

検索条件の変数を何らかの方法で持ちまわすのか、
それとも他の方法があるのか・・

こういう場合はどうやるのが一番スマートなんでしょうか?
>>146

フォームから入力された情報をセッション変数に格納するか、最初からPOSTじゃなくてGETで渡す方法があるかな。

自分だったら、GETで情報を引き渡す方法を取るかと思います。理由としては、検索結果をブックマークに登録したりすることが可能だからです。
yama3さん、コメントありがとうございます。

なるほど。

Ethnaならではのやり方がある、
ということではないんですね。

ということは通常はGETにし、
入力された情報(持ちまわす情報/変数)がすごく多い場合は
セッション変数にする、というカンジでしょうか。

ありがとうございます^^
EthnaとかPHPとかCGIとかそういうのよりレイヤーが上の段階です、HTTPのメソッドはリソースに対してどう振る舞うかで決めるのが原則です。(別に破っても問題があるわけではない)

GET リソースの取得。GETでのアクセスはリソースの内容に影響を与えない。
POST リソースの新規作成
PUT 既存のリソースのアップデート
DELETE リソースの削除
(上記は、 http://www.thinkit.co.jp/free/article/0609/8/4/ から引用)

http://yohei-y.blogspot.com/2005/04/rest-5-get-post-put-delete.html
も参考になるかと思います。

なので、検索の場合はGETメソッドですね。
なるほど、内容や量で分けるというよりは、
目的別に使い分けるように心がける、ということですね。
それでもGETが長くなりすぎる場合は・・
設計ミスということでしょうか^^;;


takitohさん、ありがとうございます。
Ethnaを使い始めて2年くらいになります。
その間、だんだんと使い勝手が悪くなってきて。
ぜひ皆さんのご意見を聞かせてください。

「アプリケーション構築手順(3) 」に注意事項として下の4点がありました。

*アクションクラスにアプリケーションの核となる処理を記述しない
*アクションクラスはどんなに長くても100〜200行程度におさめる
*他のアクションクラスと重複する処理を記述しない
*重複する処理がある場合は、そのアクションクラスを継承するか、アプリケーションのマネージャ的処理に移行する

上記に従って、そのアクションでしか使わない定例処理(メソッド)であっても
プライベートメソッドとして実装するのではなく
マネージャーに書くようになり、現在、1つのマネージャー内に大量のメソッドが記述されています。
似たようなメソッドもあるし、見づらくなってきました。
似ているメソッド名はSQLを記述するメソッドに多いです。
また、これは全てのプログラムを1つのプロジェクト内で済ませていることも原因かなと思っています。

以前Javaで開発していた時は、内容の曖昧さからマネージャーというクラス名を嫌い
このような時はクラス名を変更するか、クラスを分割していたのですが
今は○○といえば○○マネージャーというように考えてしまい、
クラス分けすると、該当するマネージャーファイルにすぐアクセスできないのではないか
という懸念からクラス分けする雰囲気ではないです。

ぜひ皆様のご意見をお聞かせください。
度々失礼致します。
EthnaでOR検索でDBからデータを取得をさせたいときは
皆さんどうやっているのでしょうか?

SQL文でいうと、こんなカンジのです。

SELECT * FROM table where item01=1 or item02=1 or item03=1

宜しくお願い致します。
>151 ハッシーさん
私はJavaは全然知らないのですが、Ethnaの場合1テーブル1Managerになってしまい分割できないし、確かにManagerクラスは太ると思います。私も2年ほどやってるやつは2000行になってるのがあります。

GREEなんかどうなってるんでしょうね・・・

>152
私はAppObjectを使います。
SELECT * FROM table where item01=1 or item02=1 or item03=1
なら
$so = new Ethna_AppSearchObject(1, OBJECT_CONDITION_EQ);
$so->addObject('item02', new Ethna_AppSearchObject(1, OBJECT_CONDITION_EQ), OBJECT_CONDITION_OR);
$so->addObject('item03', new Ethna_AppSearchObject(1, OBJECT_CONDITION_EQ), OBJECT_CONDITION_OR);
$manager->getObjectPropList('Table', null, array('item01' => $so));


>takitoh(いとう)さん
共感の言葉をいただきました。
ありがとうございます。
なるほど。元々Managerは太りやすい体質なのですね。
私もGREEがどうやっているのか気になります。
もし知ることができたら、こちらで発表させていただきますね。

>マサルさん
私はSQLを使っています。
Ethna_DBを継承したオリジナルのクラスを作成し
・SQLを実行した結果、単一の値を返すメソッド
・SQLを実行した結果、配列を返すメソッド
の2つを実装します。
そしてControllerで、オリジナルのクラスを使うように設定します。
後はCOUNT(*)系とSELECT系を上記のメソッドを通じて実行し
return array($length, $prop_list);
のように配列で返しています。

つまりApp_Objectが内部でやっていることをマネています。
私の開発環境の場合、
・複数のテーブルを結合するシーンがほぼ全て
・SQLの方が新しくチームに加わった人もスムーズに開発できる
ことから今の状態になりました。
>マサルさん
Ethna_Util::getDirectLinkListで困っているようなので
1つ私からもアドバイスを。
検索ボタンが押された場合に実行される
actionとviewがありますね。
actionには「どういった検索値が渡ってくるか」を書き
その後、viewでEthna_Util::getDirectLinkListを書くと思うのですが
この時に「全てのフォーム値を取得」し、
$link='?action_○○=true¶m1=A¶m2=B'のようにしてください。
これでgetDirectLinkListを呼べば最後に&offset=○が追加されて
最終的に「?action_○○=true&¶m1=A¶m2=B&offset=○」というリンクになります。
このリンクであれば全てのパラメーターが次のページに引き継がれます。
GETのためにURLが長くなるのは気にしなくてもいいです。設計ミスじゃないです。

>takitoh(いとう)さん
ありがとうございます!
なるほど、AppObjectですか。
Ethnaという視点でいけば、これが正攻法なんでしょうかね。
分かりやすく例文まで書いて頂き、感謝です。


>ハッシーさん
ありがとうございます!
クラスを作ってしまうんですか。
でも確かにこれなら、複数開発にはいいかも。
複雑なリクエストもSQL文を使うのなら柔軟にいけますね。

Ethna_Util::getDirectLinkListについても書いていただき、ありがとうございます。
長くても大丈夫ですか!よかったー。
説明いただいたやり方で無事動いています。
ありがとうございます。

色々と参考になりました!
>takitoh(いとう)さん

すみません、追記です。
ご提示いただいたとおりにやってみたところ、
条件を満たしていないのに、
常に「item01=1」の状態になってしまいました。

$so = new Ethna_AppSearchObject(1, OBJECT_CONDITION_EQ);
↑最初の定義のフィールドだけが常に取得されてしまう状態です。
 (今回でいえば、item01です)

いろいろやってみましたが、
すべてORにはなりませんでした。
何かやり方が間違っているのでしょうか?
LLフレームワークBOOKS「Ethna×PHP」をやっています。
P89〜で質問です。

やった事は以下です。

/home/ethna/project
に移動して
$ ethna add-project sample
と入力

次に
/ethna/project/sample
へ移動し
$ethna add-action pg_add
$ethna add-view -t pg_add

次にsample/app/action/Pg/Add.phpの前半部分を以下の様に編集しました。
ーーーーーーーーーーーーー
class Sample_Form_PgAdd extends Sample_ActionForm
{
var $form = array(
'pg_name' => array(
'type' => array(VAR_TYPE_STRING), // Input type
'form_type' => FORM_TYPE_TEXT, // Form type
'name' => 'なまえ', // Display name

// Validator (executes Validator by written order.)
'required' => true, // Required Option(true/false)
'min' => null, // Minimum value
'max' => null, // Maximum value
'regexp' => null, // String by Regexp
// Filter
// filter' => 'null', // Optional Input filter to convert input
' filter' =>'ltrim,rtrim,ntrim',
),

);
}
ーーーーーーーーーーーーーーー
次に、同じファイルの後半部分を以下の様に編集しました。
class Sample_Action_PgAdd extends Sample_ActionClass
{
function prepare()
{
$this->af->validate();

return null;
}

function perform()
{
$pg_name = $this->af->get('pg_name');
var_dump($pg_name);

//$obj =& $this->getSomething($pg_name);
//if (Ehna::isError($obj)){
// $this->ae->addObject(null,$obj);
  //}

$length = strlen($pg_name);
$this->af->setApp('length',$length);

return 'pg_add';

//return 'add_data';
}
}
ーーーーーーーーーーーーーーーー
  そして、sample/template/ja_JP/Pg/add.tplには
  <input name="foobar[]" value="foo" />
<input name="foobar[]" value="bar" />

そして、以下URLをブラウザに入力すると
http://localhost/sample/index.php?action_pg_add=true
以下の様に出ます。
ーーーーーーーーーーーーーーーー
配列で受け取るボックスが2つ表示されて、ひとつには「foo」もうひとつには「bar」と入っています。
  ーーーーーーーーーーーーーーーー

  そしてこのあと、本にしたがって、「働くプログラマ」の記述をしていきましたが、
  データベースへ登録できるような画面にはならないのです。
  もしかしたら、テンプレートの記述に何か加えないといけないのでしょうか?
  本だと、これはただの例ですと書いてあるようにも受け取れますし、一部省略されているからそれを読み取って(考えて)記述してくださいと言っている様にも受け取れます。
  もし、ここまででDB登録までができるのなら、やり方を教えて頂けないでしょうか?
  P.111のビューの記述のとこまでやってみましたがやはり謎が解けません。  
  何かアドバイスを頂けないでしょうか?

プログラム以前の問題ですが、DBに登録というのはどういう手順で登録されるかを考えてみましょう。

1. 登録フォームが表示される。
2. 入力してSubmit
3. 登録が完了される。

1と2は同じ画面でOKですよね。

3は別の画面になります。

ということは、最低限Action/View/Templateのセットは2つ作らないとダメです。

今、pg_addを作りましたが、それは1.2.のものになります。

3.のAction/View/Templateを作りましょう。たとえばこんな感じ。

$ethna add-action pg_add_do
$ethna add-view -t pg_add_do

そして、そのActionのprepareで値の妥当性( $this->af->validate() )と、を行って、問題なければそのActionのperformでDBへの登録を行います。

もう一つ、2.から3.へ移動するには次へのActionを指定してあげないとダメです。それは、Templateに
<input type="hidden" name="action_pg_add_do" value="1">
を書きます。
>>162の人は女名義の別アカウントで全く同じ文章でメッセージで質問してきましたよ。
副垢という規約違反してるような人は相手にしないほうが良いですよ。
私の所にも来ました。
質問は仕方ないとして、好ましいやり方とは思えませんね。
メッセージだけなら無視したのですが、こっちにも投稿してたので。同じ疑問で困ってる人ももしかしたら万一いれば役に立ちますし。

あと、まぁ、やり方はどうあれ自分で考えて頑張ってる人を無下にするのもどうかと思いまして。返事が無いのが気になりますけど、、、できたのかな?
Ethna がインストール出来ないのです。
以前やったときは問題なかったのですが…

最近新たにSentOS5.5にインストールして、ethnaを入れようとしたのですが
以下の状況です。
何かわかれば教えて頂けないでしょうか?

ethna -Vをやると、以下です。
[root@localhost ~]# ethna -V
bash: ethna: command not found

次に以下です
[root@localhost ~]# pear channel-discover pear.ethna.jp
Discovery of channel "pear.ethna.jp" failed

ちなみにpearは1.4.3です。
[root@localhost ~]# pear -V
PEAR Version: 1.4.3
PHP Version: 5.1.6
Zend Engine Version: 2.1.0
Running on: Linux localhost.localdomain 2.6.18-238.el5 #1 SMP Thu Jan 13 16:24:47 EST 2011 i686

どんなことでもいいので教えて頂けると助かります。

ログインすると、残り134件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

Ethna 更新情報

Ethnaのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング