|
|
dijit表示ヘルパーに基き、
クラスのZend_Dojo_Formファミリーは、
あなたのフォームの範囲内でネイティブにDijitsを利用する能力を提供します。
フォームでDojoフォーム要素を利用するために3つの選択肢があります:
Zend_Dojo::enableForm()を使います。 これは配置されたフォーム項目全てにデコレーターと要素のためのプラグイン・パスを再帰的に加えます。 その上、それは表示オブジェクトをDojo使用可能にします。 しかしながら、この呼び出しの後に配置したサブフォームはどれでも Zend_Dojo::enableForm()に渡されなければいけないことに注意してください。
それぞれDojo特有のフォーム及びサブフォーム実装、
Zend_Dojo_FormとZend_Dojo_Form_SubFormを使います。
これらはZend_Form及びZend_Form_SubFormのドロップインの置き換えとして使うことができ、
適当なデコレーターと要素パスをすべての含み、
Dojo特有のデフォルトのDisplayGroupクラスを設定し、
ビューをDojo使用可能にすることができます。
最後に、最もあきあきしますが、あなた自身で適当なデコレーターと要素パスをセットして、 デフォルトのDisplayGroupクラスをセットし、 ビューをDojo使用可能にすることができます。 Zend_Dojo::enableForm()がすでに行うことなので、 この方法で我慢する理由はほとんどありません。
例1 既存のフォームでDojoを使用可能にする
"ちょっと待って" とあなたは言います;
"私は、自分自身のカスタム・フォーム・クラスでZend_Formをすでに拡張しています!
どのようにしたら、Dojoを使用できますか?"
初めに、
Zend_Formの拡張から
Zend_Dojo_Formの拡張への
最も簡単で単純な変更は
Zend_Form_SubFormのインスタンス化を行う箇所を全て
Zend_Dojo_Form_SubFormのインスタンス化を行うように
更新することです。
2つ目の方法はカスタムフォームの init()メソッドの中で Zend_Dojo::enableForm()を呼び出すことです; フォームの定義を完了させるときは、 Dojoを使用可能にするためにサブフォーム全てを通じて繰り返します:
class My_Form_Custom extends Zend_Form
{
public function init()
{
// フォームでDojoを使用可能にする:
Zend_Dojo::enableForm($this);
// 引き続きここからフォームの定義
// サブフォーム全てでDojoを使用可能にする:
foreach ($this->getSubForms() as $subForm) {
Zend_Dojo::enableForm($subForm);
}
}
}
dijitに特有のフォームデコレーターと要素の使い方は まるで他全てのフォーム・デコレーターまたは要素の使い方のようです。
大部分のフォーム要素はDijit要素デコレーター (要素からdijitパラメータをとって来ます) を使うことができ、 要素で特定されたビュー・ヘルパーに、 これらと他のメタデータを渡すことができます。 しかしながら、フォームやサブ・フォーム及び表示グループをデコレートするために、 いろいろなレイアウトdijitsに該当するデコレーターのセットがあります。
dijitデコレーターの全てで、
デコレートされた与えられた要素のdijitParamsプロパティを探して、
$params配列として使用されるdijitビュー・ヘルパーに押し付けます;
それから、情報の重複が起こらないように、これらは他のどの特性からも分離されます。
ちょうどViewヘルパ・デコレーターのように、
レンダリングのときにビュー・ヘルパーとして使用される要素で、
Dijit要素はhelperプロパティを予期します。
Dijitパラメータは一般的に直接要素から引き出されますが、
dijitParamsキー(そのキーの値は、任意の連想配列でしょう)による、
オプションとして渡されるかもしれません。
各々の要素がユニークなID(要素の getId()メソッドから取得されるように) を持つことは、重要です。 繰り返しが dojo()ビュー・ヘルパーの範囲内で検出されるならば、 デコレーターは通知の引き金を引いて、 識別子に uniqid()からの戻りを追加することによってユニークなIDを作成します。
標準的な使用法では、 単純に最初にデコレーター・チェーンにこのデコレーターを 追加オプションなしで、結びつけます。
例2 Dijit要素デコレーターの使用法
$element->setDecorators(array(
'DijitElement',
'Errors',
'Label',
'ContentPane',
));
Dijitフォーム・デコレーターは、 フォーム・デコレーターと非常に似ています; 実際、それが 同じビュー・ヘルパー名 ('form')を利用するので、実際、基本的に入れ替えて使うことができます。
設定のためにdijit.form.Formは少しもdijitパラメータを必要としないので、 プログラムされたdijitの生成が確実に機能できるように、 DOM IDが渡されるdijitフォーム・ビュー・ヘルパーが必要とすることが主な違いです。 識別子としてフォーム名を渡すことによって、デコレーターはこれを確実にします。
DijitContainerデコレーターは、実は、
いろいろな他のデコレーターが由来する抽象クラスです。
タイトル・サポートの追加で、それはDijit要素の同じ機能を提供します。
多くのレイアウトdijitはタイトルを要求するか、利用することができます;
利用できるのであれば、DijitContainerは要素の説明プロパティを利用して、
渡されるならば、 'legend' もしくは 'title' デコレーター・オプションのどちらかを利用することもできます。
対応する翻訳による翻訳アダプターが存在するならば、タイトルは翻訳されます。
以下は、DijitContainerから継承するデコレーターの一覧です:
AccordionContainer
AccordionPane
BorderContainer
ContentPane
SplitContainer
StackContainer
TabContainer
例3 Dijitコンテナ・デコレーター使用法
// フォームで TabContainer を使う:
$form->setDecorators(array(
'FormElements',
array('TabContainer', array(
'id' => 'tabContainer',
'style' => 'width: 600px; height: 500px;',
'dijitParams' => array(
'tabPosition' => 'top'
),
)),
'DijitForm',
));
// サブフォームで ContentPane を使う
// (AccordionContainer 以外の全てで使うことができます):
$subForm->setDecorators(array(
'FormElements',
array('HtmlTag', array('tag' => 'dl')),
'ContentPane',
));
ビュー・ヘルパーが提供される各々のフォームdijitには、
対応するZend_Form要素があります。
dijitパラメータを操作するための以下のメソッドがそれらすべてにあります:
setDijitParam($key, $value): dijitパラメータを一つセットします。 dijitパラメータがすでに存在すれば、上書きされます。
setDijitParams(array $params): 一度にいくつかのdijitパラメータをセットします。 渡されたパラメータにマッチする既存のパラメータは上書きされます。
hasDijitParam($key): 与えられたdijitパラメータが定義されたか存在している場合はtrueを返します。 それ以外はfalseを返します。
getDijitParam($key): 与えられたdijitパラメータを返します。 利用できない場合は null値を返します。
getDijitParams(): dijitパラメータを全て返します。
removeDijitParam($key): 与えられたdijitパラメータを除去します。
clearDijitParams(): 現行定義されたdijitパラメータを全て消去します。
Dijitパラメータは、dijitParams public プロパティに保存されます。
このように、あなたは単にこのプロパティを要素の上に置くことによって、
既存のフォーム要素をdijit使用可能にすることができます;
あなたは、単にパラメータを操作するのを容易にするために、
上記のアクセッサを持っていません。
その上、dijit固有の要素は以下に該当するデコレーターの独特な一覧を実装します:
$element->addDecorator('DijitElement')
->addDecorator('Errors')
->addDecorator('HtmlTag', array('tag' => 'dd'))
->addDecorator('Label', array('tag' => 'dt'));
実質的に、Dijit要素が、標準的なViewHelperデコレーターの代わりに使われます。
最後に、ベースDijit要素により、 確実にDojoビュー・ヘルパー・パスがビューの上に置かれることになります。
Dijit要素、DijitMultiの変化はMulti abstract フォーム要素の機能を提供します。
そして、開発者が 'multiOptions' を指定できるようにします。
- 一般的に select の option またはラジオ のoptionです。
以下のdijit要素は、標準的なZend Framework配布において出荷されます。
標準的なボタン要素に 由来していないので、 同じ機能を実装して、ドロップインの代わりとして使うことができます。 以下の機能が公開されます:
名前が提供されないならば、 getLabel()はボタン・ラベルとして要素名を利用します。 さらに、翻訳メッセージにマッチした翻訳アダプターが利用できれば、 それは名前を翻訳します。
isChecked()は、 提出される値がラベルにマッチするかどうか決定します; もしマッチするなら、それはtrueを返します。 これは、フォームが提出されたとき、どのボタンが使われたかについて決定することに役立ちます。
さらに、デコレーターのDijitElement及び
DtDdWrapperだけがボタン要素のために使われます。
例4 ボタンdijit要素の使用例
$form->addElement(
'Button',
'foo',
array(
'label' => 'Button Label',
)
);
標準的なチェックボックス要素 に由来していないので、 それは同じ機能を実装します。 これは、以下のメソッドが公開されることを意味します
setCheckedValue($value): 要素がチェックされたときに使う値を設定します。
getCheckedValue(): チェックされたときに要素で使う値を取得します。
setUncheckedValue($value): チェックされていないときに要素で使う値を設定します。
getUncheckedValue(): チェックされていないときに要素で使う値を取得します。
setChecked($flag): 要素をチェック済みにするか否か設定します。
isChecked(): 要素が現在チェック済みか判断します。
例5 チェックボックスdijit要素の使用例
$form->addElement(
'CheckBox',
'foo',
array(
'label' => 'A check box',
'checkedValue' => 'foo',
'uncheckedValue' => 'bar',
'checked' => true,
)
);
コンボボックス dijitビュー・ヘルパー・文書 にみられるように、コンボボックスは選択とテキスト入力の混合です。 そして、自動補完及び、提示された選択肢の代わりを指定できるようにします。 フィルタリング選択は同じことですが、任意の入力を許しません。
注意: ラベル値を返すコンボボックス
コンボボックスはラベル値を返します。 期待に反するオプション値は返しません。 この理由から、コンボボックスは
InArrayバリデーターを自動登録しません。 (FilteringSelectsがそうするけれども)
コンボボックスとフィルタリング選択フォーム要素は、 dojo.dataデータ・ストア(使用された場合)を指定することだけでなく、 選ばれた選択肢を調べて、セットするためにアクセッサとミューテーターを提供します。 それらはDijitMultiから拡張します。 そして、それは setMultiOptions()及び setMultiOption()メソッドによって 選ばれた選択肢を指定できます。 さらに、以下のメソッドを利用できます:
getStoreInfo(): 現行で設定されているデータストア情報を全て取得します。 現行で設定されたデータがなければ、空の配列を返します。
setStoreId($identifier): ストアの識別変数を設定します。 (通常、Dojoで 'jsId' 属性によって言及されます) これは、有効なjavascript変数の名前でなければなりません。
getStoreId(): ストアの識別変数名を取得します。
setStoreType($dojoType): 使用するデータストアクラスを設定します; 例えば "dojo.data.ItemFileReadStore"
getStoreType(): 使用するdojoデータストアクラスを取得します。
setStoreParams(array $params): データ・ストア・オブジェクトを構成するために使われるパラメータをいずれも設定します。 例えば、 dojo.data.ItemFileReadStore データストアでは dojo.dataオブジェクトを返す場所を指す 'url' パラメータを期待します。
getStoreParams(): 現行で設定されているデータストアパラメータをいずれも取得します; もしなければ、空の配列を返します。
setAutocomplete($flag): ユーザーが要素から離れるとき、選ばれた項目が使われるかどうかを示します。
getAutocomplete(): 自動補完フラグの値を取得します。
dojo.dataストアが要素で登録されなければ、
登録された選択肢の配列のキーを検証するInArrayバリデーターを
この要素はデフォルトで登録します。
setRegisterInArrayValidator(false)を呼び出すことでも、
registerInArrayValidator設定キーにfalse値を渡すことでも、
このふるまいを抑制できます。
例6 コンボボックスdijit要素を選択肢入力として使う
$form->addElement(
'ComboBox',
'foo',
array(
'label' => 'ComboBox (select)',
'value' => 'blue',
'autocomplete' => false,
'multiOptions' => array(
'red' => 'Rouge',
'blue' => 'Bleu',
'white' => 'Blanc',
'orange' => 'Orange',
'black' => 'Noir',
'green' => 'Vert',
),
)
);
例7 コンボボックスdijit要素をデータ・ストアと一緒に使う
$form->addElement(
'ComboBox',
'foo',
array(
'label' => 'ComboBox (datastore)',
'storeId' => 'stateStore',
'storeType' => 'dojo.data.ItemFileReadStore',
'storeParams' => array(
'url' => '/js/states.txt',
),
'dijitParams' => array(
'searchAttr' => 'name',
),
)
);
前述の例はComboBoxの代わりに
FilteringSelectを使用します。
通貨テキストボックスは、主に通貨入力をサポートするためにあります。 通貨はローカライズされるかもしれず、小数も非小数もサポートできます。
内部的には、通貨テキストボックスは 数値テキストボックスや バリデーションテキストボックスおよび テキストボックスに由来します; それらのクラスのメソッドが全て利用可能です。 さらに、下記の制約メソッドを使用できます:
setCurrency($currency): 使用する通貨種類を設定します; » ISO-4217 仕様に従うでしょう。
getCurrency():現行の通貨種類を取得します。
setSymbol($symbol): 3文字からなる» ISO-4217 通貨記号を設定します。
getSymbol(): 現行の通貨記号を取得します。
setFractional($flag): 通貨で小数を許すかどうか設定します。
getFractional(): 小数フラグの状態を取得します。
例8 通貨テキストボックスdijit要素の使用例
$form->addElement(
'CurrencyTextBox',
'foo',
array(
'label' => 'Currency:',
'required' => true,
'currency' => 'USD',
'invalidMessage' => 'Invalid amount. ' .
'Include dollar sign, commas, and cents.',
'fractional' => false,
)
);
日付テキストボックスは、 カレンダー・ドロップダウンで日付(クライアント側日付確認とフォーマッティングだけでなく) を選ぶために提供します。
内部的に、日付テキストボックスは バリデーションテキストボックス およびテキストボックス に由来します; それらのクラスのメソッドが全て利用可能です。さらに、 個別の制約を設定するために下記のメソッドを使用できます:
setAmPm($flag)及び getAmPm(): 時刻でAM/PM 文字列を使うかどうか
setStrict($flag)及び getStrict(): 入力を確認した時にマッチする厳しい正規表現を使うかどうか。 デフォルトはfalseですが、空白文字やいくつかの省略形を許します。
setLocale($locale)及び getLocale(): 指定した要素で使うロケールを設定または取得します。
setDatePattern($pattern)及び getDatePattern(): 日付をフォーマットする» unicode 日付形式パターンを提示または取得します。
setFormatLength($formatLength)及び getFormatLength(): 使用する形式の長さの種類を提示または取得します; "long"、"short"、"medium"または"full"のどれか一つです。
setSelector($selector)及び getSelector(): セレクタのスタイルを提示または取得します; "date" や "time" のどちらかでしょう。
例9 日付テキストボックスdijit要素の使用例
$form->addElement(
'DateTextBox',
'foo',
array(
'label' => 'Date:',
'required' => true,
'invalidMessage' => 'Invalid date specified.',
'formatLength' => 'long',
)
);
エディタはリッチなHTML内容を作成して、 編集するために利用できるWYSIWYGエディタを提供します。 dijit.Editorはプラグイン可能で、 必要に応じてカスタム・プラグインで拡張されるかもしれません; 詳しくは» dijit.Editorドキュメントをご覧下さい。
エディタ・フォーム要素は、 下記のいくつかのアクセッサとミューテーターを いろいろなdijitパラメータを操作するために提供します:
captureEventsは、 編集エリア自体と連携するイベントです。 捕獲したイベントを操作するために以下のアクセッサとミューテーターを利用できます:
addCaptureEvent($event)
addCaptureEvents(array $events)
setCaptureEvents(array $events)
getCaptureEvents()
hasCaptureEvent($event)
removeCaptureEvent($event)
clearCaptureEvents()
eventsは、 onClickやonKeyUpなどのような標準的なDOMイベントです。 イベントを操作するために以下のアクセッサとミューテーターを利用できます:
addEvent($event)
addEvents(array $events)
setEvents(array $events)
getEvents()
hasEvent($event)
removeEvent($event)
clearEvents()
pluginsはエディターにツールバーのための追加のツールや、 許可する追加スタイルなどの機能を加えます。 プラグインを操作するために以下のアクセッサとミューテーターを利用できます:
addPlugin($plugin)
addPlugins(array $plugins)
setPlugins(array $plugins)
getPlugins()
hasPlugin($plugin)
removePlugin($plugin)
clearPlugins()
editActionIntervalは、 アンドゥ操作のためにイベントをまとめるために使われます。 デフォルトでこの値は3秒です。 setEditActionInterval($interval)メソッドが値を設定するために使われるかもしれません。 一方で、 getEditActionInterval()が値を取得します。
focusOnLoadは、 ページが読み込まれたとき、 この指定のエディタがフォーカスを受けるかどうか判断するために使われます。 デフォルトでこれはfalseです。 メソッド setFocusOnLoad($flag)が値を設定するために使われるかもしれません。 一方で、 getFocusOnLoad()が値を取得します。
heightはエディターの高さを指定します; デフォルトでこれは300pxです。 メソッド setHeight($height)が値を設定するために使われるかもしれません。 一方で、 getHeight()が値を取得します。
inheritWidthは、 エディタが親コンテナの幅と単純にデフォルトの100%幅のどちらを使うか決定するために使われます。 デフォルトでこれはfalseです。 (すなわち、画面の幅一杯を満たします) メソッド setInheritWidth($flag)が値を設定するために使われるかもしれません。 一方で、 getInheritWidth()が値を取得します。
minHeightはエディターの高さの最小値を設定します; デフォルトでこれは1emです。 メソッド setMinHeight($height)が値を設定するために使われるかもしれません。 一方で、 getMinHeight()が値を取得します。
styleSheetsは、 どの追加CSSスタイルシートがエディタの表示に影響を及ぼすために使われるか示します。 デフォルトでは何も登録されず、それはページ・スタイルを継承します。 エディタ・スタイルシートを操作するために以下のアクセッサとミューテーターを利用できます:
addStyleSheet($styleSheet)
addStyleSheets(array $styleSheets)
setStyleSheets(array $styleSheets)
getStyleSheets()
hasStyleSheet($styleSheet)
removeStyleSheet($styleSheet)
clearStyleSheets()
例10 エディタdijit要素の使用例
$form->addElement('editor', 'content', array(
'plugins' => array('undo', '|', 'bold', 'italic'),
'editActionInterval' => 2,
'focusOnLoad' => true,
'height' => '250px',
'inheritWidth' => true,
'styleSheets' => array('/js/custom/editor.css'),
));
注意: エディタ Dijit は既定で div を使います
エディタ dijit は既定で HTML の DIV を使います。
dijit._editor.RichText資料は、 HTML の TEXTAREA の上にビルドされたそれを持つことが セキュリティに影響するかもしれないことを示します。言うことには、TEXTAREAに上品に退化できる エディタ・ウィジェットを望む機会があるかもしれません。 そのような場面では、 degrade プロパティを true に設定することによってそうすることができます。
// 初期化にて $editor = new Zend_Dojo_Form_Element_Editor('foo', array( 'degrade' => true, )); // フォームを通じた構築 $form->addElement('editor', 'content', array( 'degrade' => true, )); // または初期化後 $editor->degrade = true;
水平スライダーは、 ある範囲で数値を選択するためのスライダーUI部品を提供します。 内部的には、それはフォームによって送信されるhidden要素の値をセットします。
水平スライダーは、抽象的なスライダーdijit要素に由来します。 さらに、スライダー罫線と罫線ラベルをセットして設定するための、 いろいろなメソッドがあります。
setTopDecorationDijit($dijit)及び setBottomDecorationDijit($dijit): スライダーの上側か下側で使うdijitの名前をセットします。 これは、接頭辞 "dijit.form." を含んではいけません。 むしろ final 名だけ - "HorizontalRule" または "HorizontalRuleLabels" のうちの1つ - を含まなければなりません。
setTopDecorationContainer($container)及び setBottomDecorationContainer($container): 罫線コンテナ要素のために使用する名前を指定します; 例えば、'topRule' や 'topContainer'など。
setTopDecorationLabels(array $labels)及び setBottomDecorationLabels(array $labels): RuleLabels dijit型のうちの1つで使用するラベルをセットします。 これらは、インデックスを付けられた配列でなければなりません; 与えられたラベル位置(例えば始めまたは終わり)をスキップするために、 一つの空の場所を指定します。
setTopDecorationParams(array $params)及び setBottomDecorationParams(array $params): 与えられた罫線、 またはRuleLabels dijitを構成するときに使うdijitパラメータです。
setTopDecorationAttribs(array $attribs)及び setBottomDecorationAttribs(array $attribs): 与えられた罫線、 またはRuleLabels HTML要素コンテナのために指定するHTML属性です。
getTopDecoration()及び getBottomDecoration(): 上記のミューテーターによって提示されたように、 与えられた罫線またはRuleLabels定義のためにすべてのメタデータを取得します。
例11 水平スライダーdijit要素の使用例
下記では、-10から10の間の整数を選択する水平スライダーを生成します。 上側には20%、40%、60%そして80%で印をつけられたラベルがあります、 下側には、0、50%そして100%の罫線があります。 値が変わるたびに、値を保存しているhidden要素は更新されます。
$form->addElement(
'HorizontalSlider',
'horizontal',
array(
'label' => 'HorizontalSlider',
'value' => 5,
'minimum' => -10,
'maximum' => 10,
'discreteValues' => 11,
'intermediateChanges' => true,
'showButtons' => true,
'topDecorationDijit' => 'HorizontalRuleLabels',
'topDecorationContainer' => 'topContainer',
'topDecorationLabels' => array(
' ',
'20%',
'40%',
'60%',
'80%',
' ',
),
'topDecorationParams' => array(
'container' => array(
'style' => 'height:1.2em; font-size=75%;color:gray;',
),
'list' => array(
'style' => 'height:1em; font-size=75%;color:gray;',
),
),
'bottomDecorationDijit' => 'HorizontalRule',
'bottomDecorationContainer' => 'bottomContainer',
'bottomDecorationLabels' => array(
'0%',
'50%',
'100%',
),
'bottomDecorationParams' => array(
'list' => array(
'style' => 'height:1em; font-size=75%;color:gray;',
),
),
)
);
数スピナーは、数値を入力するためのテキスト要素です; 設定された量によって値を増加させたり、減少させるための要素を含みます。
下記のメソッドが利用できます:
setDefaultTimeout($timeout)及び getDefaultTimeout(): ボタンが押されたままのときと、値が変更されるときの間の既定のタイムアウトを ミリ秒単位で設定または取得します。
setTimeoutChangeRate($rate)及び getTimeoutChangeRate(): ボタンが押されたままのとき、変化がなされる割合をミリ秒単位で設定または取得します。
setLargeDelta($delta)及び getLargeDelta(): ボタンが押されたままのとき、数値が変わるべき量を設定または取得します。
setSmallDelta($delta)及び getSmallDelta(): ボタンが一度押されたとき、数が変わるべきデルタを設定または取得します。
setIntermediateChanges($flag)及び getIntermediateChanges(): ボタンが押されたままのとき、 各々の値が変化するごとに表示されるべきかどうか示すフラグを設定または取得します。
setRangeMessage($message)及び getRangeMessage(): 利用できる値の範囲を指示しているメッセージを設定または取得します。
setMin($value)及び getMin(): 使用可能な最小値を設定または取得します。
setMax($value)及び getMax(): 使用可能な最大値を設定または取得します。
例12 数スピナーdijit要素の使用例
$form->addElement(
'NumberSpinner',
'foo',
array(
'value' => '7',
'label' => 'NumberSpinner',
'smallDelta' => 5,
'largeDelta' => 25,
'defaultTimeout' => 500,
'timeoutChangeRate' => 100,
'min' => 9,
'max' => 1550,
'places' => 0,
'maxlength' => 20,
)
);
数テキストボックスは、数を入力するためのテキスト要素です; 数スピナーとは異なり、数は手で入力します。 バリデーションと制約は、 数が特定の範囲または形式にとどまることを確実とするために提示できます。
内部的には、数テキストボックスはバリデーションテキストボックス 及びテキストボックスに由来します; それらのクラスのメソッドが全て利用可能です。さらに、 個別の制約を設定するために下記のメソッドを使用できます:
setLocale($locale)及び getLocale(): このdijitを利用するために指定されたまたは代替のロケールを指定または取得します。
setPattern($pattern)及び getPattern(): 数をフォーマットするために使う» 数値パターン形式 を設定または取得します。
setType($type)及び getType(): 使用する数の形式型を取得します。 ('decimal'、'percent'または'currency'のいずれかであるべきです)。
setPlaces($places)及び getPlaces(): サポートする小数位の数を設定または取得します。
setStrict($flag)及び getStrict(): 空白文字及び数字以外の文字についてどの程度ゆるやかに許されるか示す 厳密性フラグの値を設定または取得します。
例13 数テキストボックスdijit要素の使用例
$form->addElement(
'NumberTextBox',
'elevation',
array(
'label' => 'NumberTextBox',
'required' => true,
'invalidMessage' => 'Invalid elevation.',
'places' => 0,
'constraints' => array(
'min' => -20000,
'max' => 20000,
),
)
);
パスワードテキストボックスは、 パスワード入力のみに結び付けられたバリデーションテキストボックスです; その唯一の目的は、dijitテーマを与えられたテキスト入力を クライアント側バリデーションを提示するパスワードのためにできるようにすることです。
内部的には、パスワードテキストボックスはバリデーションテキストボックス 及びテキストボックス に由来します; それらのクラスのメソッドが全て利用可能です。
例14 パスワードテキストボックスの使用例
$form->addElement(
'PasswordTextBox',
'password',
array(
'label' => 'Password',
'required' => true,
'trim' => true,
'lowercase' => true,
'regExp' => '^[a-z0-9]{6,}$',
'invalidMessage' => 'Invalid password; ' .
'must be at least 6 alphanumeric characters',
)
);
ラジオボタンは、他のDojo dijitと一貫したルック&フィールを提示するために、 標準的なラジオ入力要素をラップします。
ラジオボタンはDijitMultiから拡張します。 そして、 setMultiOptions()及び setMultiOption()メソッドによって 選ばれた選択肢を指定できます。
デフォルトでこの要素は、
配列に対して登録された選択肢のキーを確認するInArrayバリデーターを登録します。
setRegisterInArrayValidator(false)または
registerInArrayValidatorのどちらを呼び出しても、
設定キーにfalse値を渡すことによってこのふるまいを抑制できます。
例15 ラジオボタンdijit要素の使用例
$form->addElement(
'RadioButton',
'foo',
array(
'label' => 'RadioButton',
'multiOptions' => array(
'foo' => 'Foo',
'bar' => 'Bar',
'baz' => 'Baz',
),
'value' => 'bar',
)
);
シンプルテキストエリアは、主に標準的なHTMLの textarea のようにふるまいます。 しかし、それは列または行の設定をサポートしません。 その代わり、textarea幅は、標準的なCSS幅を使用して指定されるべきです。 テキストエリアとは異なり、自動的に成長しません。
例16 シンプルテキストエリアdijit要素の使用例
$form->addElement(
'SimpleTextarea',
'simpletextarea',
array(
'label' => 'SimpleTextarea',
'required' => true,
'style' => 'width: 80em; height: 25em;',
)
);
スライダーは 水平スライダー 及び 垂直スライダー の両方に由来するabstract要素です。 スライダーを構成するために、いくつかの一般的なメソッドを公開します:
setClickSelect($flag)及び getClickSelect(): スライダーをクリックしたら値を変更するかどうか示すフラグを設定または取得します。
setIntermediateChanges($flag)及び getIntermediateChanges(): 各々のスライダー変化イベントにdijitが通知を送るかどうか示すフラグを設定または取得します。
setShowButtons($flag)及び getShowButtons(): どちらかの端にボタンが表示されるかどうか示すフラグを設定または取得します。; もし表示されるなら、スライダーの値を変えるために、ユーザーはボタンをクリックできます。
setDiscreteValues($value)及び getDiscreteValues(): スライダーによって表される不連続な値の数を設定または取得します。
setMaximum($value)及び getMaximum(): スライダーの最大値を設定します。
setMinimum($value)及び getMinimum(): スライダーの最小値を設定します。
setPageIncrement($value)及び getPageIncrement(): スライダーがキーボード・イベントで変わる量を設定します。
使用例は、各々の具体的な拡張クラスで提供されます。
SubmitButtonという名前のDijitはありませんが、 どんなjavascriptとの結合も追加で必要とせずに、フォームを送信できるボタンdijitを提供するために、 1つをここに含めます。 それは、まさにボタンdijitのように動作します。
例17 サブミットボタンdijit要素の使用例
$form->addElement(
'SubmitButton',
'foo',
array(
'required' => false,
'ignore' => true,
'label' => 'Submit Button!',
)
);
テキストボックスは、 主に他のdijitsに調和したルック&フィールで入力されるテキストを提供するために含まれます。 しかし、以下のメソッドで表されるいくらかのマイナーなフィルタリングとバリデーション機能も含みます:
setLowercase($flag)及び getLowercase(): 入力を小文字にキャストすべきかどうか示すフラグを設定または取得します。
setPropercase($flag)及び getPropercase(): 入力をProper Case(訳注:先頭を大文字、他を小文字にすること)にキャストすべきかどうか示すフラグを設定または取得します。
setUppercase($flag)及び getUppercase(): 入力を大文字にキャストすべきかどうか示すフラグを設定または取得します。
setTrim($flag)及び getTrim(): 先立つまたは後続する空白を除去すべきかどうか示すフラグを設定または取得します。
setMaxLength($length)及び getMaxLength(): 入力の長さの上限を設定または取得します。
例18 テキストボックスdijit要素の使用例
$form->addElement(
'TextBox',
'foo',
array(
'value' => 'some text',
'label' => 'TextBox',
'trim' => true,
'propercase' => true,
)
);
テキストエリアは、主に標準的なHTMLの textarea のようにふるまいます。 しかし、それは列または行の設定をサポートしません。 その代わり、textareaの幅は、標準的なCSS幅を使用して指定されるべきです; 列は、完全に省略されます。 テキストが追加されるたびに、textareaは垂直に伸びます。
例19 テキストエリアdijit要素の使用例
$form->addElement(
'Textarea',
'textarea',
array(
'label' => 'Textarea',
'required' => true,
'style' => 'width: 200px;',
)
);
時刻テキストボックスは、 時刻を選ぶためにドロップダウンを提示するテキスト入力です。 ドロップダウンは指定された増分で、時刻の特定のウインドウを示すように構成されるかもしれません。
内部的には、時刻テキストボックスは日付テキストボックス、 バリデーションテキストボックス 及びテキストボックスに由来します; それらのクラスのメソッドが全て利用可能です。さらに、 個別の制約を設定するために下記のメソッドを使用できます:
setTimePattern($pattern)及び getTimePattern(): 時刻をフォーマットするための» unicode時間形式パターン を設定または取得します。
setClickableIncrement($format)及び getClickableIncrement(): Time Pickerでクリックできる全ての要素で 増分値を示す» ISO-8601 文字列を設定または取得します。
setVisibleIncrement($format)及び getVisibleIncrement(): 時刻選択にて見える増分を設定します; ISO-8601フォーマットに従わなければなりません。
setVisibleRange($format)及び getVisibleRange(): 時刻選択にていつでも見える時刻の範囲を設定または取得します; ISO-8601フォーマットに従わなければなりません。
例20 時刻テキストボックスdijit要素の使用例
以下は、時刻に2時を表示する、増分が10分毎の時刻テキストボックスをつくります。
$form->addElement(
'TimeTextBox',
'foo',
array(
'label' => 'TimeTextBox',
'required' => true,
'visibleRange' => 'T04:00:00',
'visibleIncrement' => 'T00:10:00',
'clickableIncrement' => 'T00:10:00',
)
);
バリデーションテキストボックスは、 バリデーションと制約をテキスト入力に加える能力を提供します。 内部的には、テキストボックスに由来します。 dijitパラメータを操作するために、以下のアクセッサとミューテーターを加えます:
setInvalidMessage($message)及び getInvalidMessage(): 値がバリデーションされないときに表示するtooltipメッセージを設定または取得します。
setPromptMessage($message)及び getPromptMessage(): 要素の使用方法のために表示されるtooltipメッセージを設定または取得します。
setRegExp($regexp)及び getRegExp(): 要素を確認するために使用する正規表現を取得します。 正規表現は、バウンダリ(PHPのpreg* ファミリーの関数と異なります)を必要としません。
setConstraint($key, $value)及び getConstraint($key): 要素を確認するときに使う追加制約を設定または取得します; サブクラスで主に使われます。 制約は、dijitパラメータの 'constraints' キーに保存されます。
setConstraints(array $constraints)及び getConstraints(): 要素を確認するときに使う個々の制約を設定または取得します; サブクラスで主に使われます。
hasConstraint($key): 与えられた制約が存在するかどうか調べます。
removeConstraint($key)及び clearConstraints(): 要素のために個別またはすべての制約を取り除きます。
例21 バリデーションテキストボックスdijit要素の使用例
以下は、 単語文字(すなわち、空白や大部分の句読点は無効です)だけから成る 一つのストリングを必要とするバリデーション・テキストボックスをつくります。
$form->addElement(
'ValidationTextBox',
'foo',
array(
'label' => 'ValidationTextBox',
'required' => true,
'regExp' => '[\w]+',
'invalidMessage' => 'Invalid non-space text.',
)
);
垂直スライダーは水平スライダー の兄弟分で、あらゆる点でその要素のように動作します。 唯一本当に違うところは、 'top*' 及び 'bottom*' メソッドが 'left*' and 'right*' で置き換えられ、 HorizontalRule 及び HorizontalRuleLabels を使う代わりに、 VerticalRule 及び VerticalRuleLabels が使われることです。
例22 垂直スライダーdijit要素の使用例
下記では、-10から10の間の整数を選択する垂直スライダーを生成します。 左側には20%、40%、60%そして80%で印をつけられたラベルがあります、 右側には、0、50%そして100%の罫線があります。 値が変わるたびに、値を保存しているhidden要素は更新されます。
$form->addElement(
'VerticalSlider',
'foo',
array(
'label' => 'VerticalSlider',
'value' => 5,
'style' => 'height: 200px; width: 3em;',
'minimum' => -10,
'maximum' => 10,
'discreteValues' => 11,
'intermediateChanges' => true,
'showButtons' => true,
'leftDecorationDijit' => 'VerticalRuleLabels',
'leftDecorationContainer' => 'leftContainer',
'leftDecorationLabels' => array(
' ',
'20%',
'40%',
'60%',
'80%',
' ',
),
'rightDecorationDijit' => 'VerticalRule',
'rightDecorationContainer' => 'rightContainer',
'rightDecorationLabels' => array(
'0%',
'50%',
'100%',
),
)
);
例23 Zend_Dojo_Formの利用
直接使うにせよ、それを拡張するにせよ、
Zend_FormでDojoを利用する最も簡単な方法は、
Zend_Dojo_Formを利用することです。
この例ではZend_Dojo_Formの拡張と、
すべてのdijit要素の使用法を示します。
それは4つのサブ・フォームをつくって、TabContainerを利用するためにフォームを飾ります。
そして、それ自身のタブの中に各々のサブ・フォームを表示します。
class My_Form_Test extends Zend_Dojo_Form
{
/**
* select要素で使う選択肢
*/
protected $_selectOptions = array(
'red' => 'Rouge',
'blue' => 'Bleu',
'white' => 'Blanc',
'orange' => 'Orange',
'black' => 'Noir',
'green' => 'Vert',
);
/**
* Form初期化
*
* @return void
*/
public function init()
{
$this->setMethod('post');
$this->setAttribs(array(
'name' => 'masterForm',
));
$this->setDecorators(array(
'FormElements',
array('TabContainer', array(
'id' => 'tabContainer',
'style' => 'width: 600px; height: 500px;',
'dijitParams' => array(
'tabPosition' => 'top'
),
)),
'DijitForm',
));
$textForm = new Zend_Dojo_Form_SubForm();
$textForm->setAttribs(array(
'name' => 'textboxtab',
'legend' => 'Text Elements',
'dijitParams' => array(
'title' => 'Text Elements',
),
));
$textForm->addElement(
'TextBox',
'textbox',
array(
'value' => 'some text',
'label' => 'TextBox',
'trim' => true,
'propercase' => true,
)
)
->addElement(
'DateTextBox',
'datebox',
array(
'value' => '2008-07-05',
'label' => 'DateTextBox',
'required' => true,
)
)
->addElement(
'TimeTextBox',
'timebox',
array(
'label' => 'TimeTextBox',
'required' => true,
)
)
->addElement(
'CurrencyTextBox',
'currencybox',
array(
'label' => 'CurrencyTextBox',
'required' => true,
// 'currency' => 'USD',
'invalidMessage' => 'Invalid amount. ' .
'Include dollar sign, commas, ' .
'and cents.',
// 'fractional' => true,
// 'symbol' => 'USD',
// 'type' => 'currency',
)
)
->addElement(
'NumberTextBox',
'numberbox',
array(
'label' => 'NumberTextBox',
'required' => true,
'invalidMessage' => 'Invalid elevation.',
'constraints' => array(
'min' => -20000,
'max' => 20000,
'places' => 0,
)
)
)
->addElement(
'ValidationTextBox',
'validationbox',
array(
'label' => 'ValidationTextBox',
'required' => true,
'regExp' => '[\w]+',
'invalidMessage' => 'Invalid non-space text.',
)
)
->addElement(
'Textarea',
'textarea',
array(
'label' => 'Textarea',
'required' => true,
'style' => 'width: 200px;',
)
);
$editorForm = new Zend_Dojo_Form_SubForm();
$editorForm->setAttribs(array(
'name' => 'editortab',
'legend' => 'Editor',
'dijitParams' => array(
'title' => 'Editor'
),
))
$editorForm->addElement(
'Editor',
'wysiwyg',
array(
'label' => 'Editor',
'inheritWidth' => 'true',
)
);
$toggleForm = new Zend_Dojo_Form_SubForm();
$toggleForm->setAttribs(array(
'name' => 'toggletab',
'legend' => 'Toggle Elements',
));
$toggleForm->addElement(
'NumberSpinner',
'ns',
array(
'value' => '7',
'label' => 'NumberSpinner',
'smallDelta' => 5,
'largeDelta' => 25,
'defaultTimeout' => 1000,
'timeoutChangeRate' => 100,
'min' => 9,
'max' => 1550,
'places' => 0,
'maxlength' => 20,
)
)
->addElement(
'Button',
'dijitButton',
array(
'label' => 'Button',
)
)
->addElement(
'CheckBox',
'checkbox',
array(
'label' => 'CheckBox',
'checkedValue' => 'foo',
'uncheckedValue' => 'bar',
'checked' => true,
)
)
->addElement(
'RadioButton',
'radiobutton',
array(
'label' => 'RadioButton',
'multiOptions' => array(
'foo' => 'Foo',
'bar' => 'Bar',
'baz' => 'Baz',
),
'value' => 'bar',
)
);
$selectForm = new Zend_Dojo_Form_SubForm();
$selectForm->setAttribs(array(
'name' => 'selecttab',
'legend' => 'Select Elements',
));
$selectForm->addElement(
'ComboBox',
'comboboxselect',
array(
'label' => 'ComboBox (select)',
'value' => 'blue',
'autocomplete' => false,
'multiOptions' => $this->_selectOptions,
)
)
->addElement(
'ComboBox',
'comboboxremote',
array(
'label' => 'ComboBox (remoter)',
'storeId' => 'stateStore',
'storeType' => 'dojo.data.ItemFileReadStore',
'storeParams' => array(
'url' => '/js/states.txt',
),
'dijitParams' => array(
'searchAttr' => 'name',
),
)
)
->addElement(
'FilteringSelect',
'filterselect',
array(
'label' => 'FilteringSelect (select)',
'value' => 'blue',
'autocomplete' => false,
'multiOptions' => $this->_selectOptions,
)
)
->addElement(
'FilteringSelect',
'filterselectremote',
array(
'label' => 'FilteringSelect (remoter)',
'storeId' => 'stateStore',
'storeType' => 'dojo.data.ItemFileReadStore',
'storeParams' => array(
'url' => '/js/states.txt',
),
'dijitParams' => array(
'searchAttr' => 'name',
),
)
);
$sliderForm = new Zend_Dojo_Form_SubForm();
$sliderForm->setAttribs(array(
'name' => 'slidertab',
'legend' => 'Slider Elements',
));
$sliderForm->addElement(
'HorizontalSlider',
'horizontal',
array(
'label' => 'HorizontalSlider',
'value' => 5,
'minimum' => -10,
'maximum' => 10,
'discreteValues' => 11,
'intermediateChanges' => true,
'showButtons' => true,
'topDecorationDijit' => 'HorizontalRuleLabels',
'topDecorationContainer' => 'topContainer',
'topDecorationLabels' => array(
' ',
'20%',
'40%',
'60%',
'80%',
' ',
),
'topDecorationParams' => array(
'container' => array(
'style' => 'height:1.2em; ' .
'font-size=75%;color:gray;',
),
'list' => array(
'style' => 'height:1em; ' .
'font-size=75%;color:gray;',
),
),
'bottomDecorationDijit' => 'HorizontalRule',
'bottomDecorationContainer' => 'bottomContainer',
'bottomDecorationLabels' => array(
'0%',
'50%',
'100%',
),
'bottomDecorationParams' => array(
'list' => array(
'style' => 'height:1em; ' .
'font-size=75%;color:gray;',
),
),
)
)
->addElement(
'VerticalSlider',
'vertical',
array(
'label' => 'VerticalSlider',
'value' => 5,
'style' => 'height: 200px; width: 3em;',
'minimum' => -10,
'maximum' => 10,
'discreteValues' => 11,
'intermediateChanges' => true,
'showButtons' => true,
'leftDecorationDijit' => 'VerticalRuleLabels',
'leftDecorationContainer' => 'leftContainer',
'leftDecorationLabels' => array(
' ',
'20%',
'40%',
'60%',
'80%',
' ',
),
'rightDecorationDijit' => 'VerticalRule',
'rightDecorationContainer' => 'rightContainer',
'rightDecorationLabels' => array(
'0%',
'50%',
'100%',
),
)
);
$this->addSubForm($textForm, 'textboxtab')
->addSubForm($editorForm, 'editortab')
->addSubForm($toggleForm, 'toggletab')
->addSubForm($selectForm, 'selecttab')
->addSubForm($sliderForm, 'slidertab');
}
}
例24 既存のフォームをDojoを使って変更する
Zend_Dojo::enableForm()という静的メソッドを利用して、 既存のフォームをDojoを使って変更することもできます。
最初の例では既存のフォームの例を修飾して見せています。
$form = new My_Custom_Form();
Zend_Dojo::enableForm($form);
$form->addElement(
'ComboBox',
'query',
array(
'label' => 'Color:',
'value' => 'blue',
'autocomplete' => false,
'multiOptions' => array(
'red' => 'Rouge',
'blue' => 'Bleu',
'white' => 'Blanc',
'orange' => 'Orange',
'black' => 'Noir',
'green' => 'Vert',
),
)
);
あるいは、フォームの初期化でわずかな微調整をすることができます:
class My_Custom_Form extends Zend_Form
{
public function init()
{
Zend_Dojo::enableForm($this);
// ...
}
}
もちろん、可能ならば、Zend_Dojo_Formを継承したクラスで単純に置き換えられるか、
置き換えたいでしょう。
そのクラスはすでにDojoが有効のZend_Formの選択リストの代わりです。
|
|
Copyright © 2005-2011 Zend Technologies Inc (compiled by mikaelkael with ZFDocumentor - SVN 22750).

