3

zend_form(Zend Framworkの一部)を使用してフォームを作成していますが、Zend_Formのマルチチェックボックス要素(Zend_Form_Element_MultiCheckbox)を使用してチェックボックスのセットを追加すると、次のように出力されるコードが見つかりました。

<label for="subjects-maths">
    <input type="checkbox" value="maths" id="subjects-maths" name="subjects[]">
    Maths
</label>
<label for="subjects-english">
    <input type="checkbox" value="maths" id="subjects-english" name="subjects[]">
    English    
</label>

つまり、入力はラベルの内側にあります。コードは技術的には問題ありませんが、W3cがそれを見る限り、それは良い習慣に反しており、スタイリングを難しくするので、私が望む方法でもありません。私が欲しいのは次のとおりです。

<div>
    <label for="subjects-maths">        
        Maths
    </label>
    <input type="checkbox" value="maths" id="subjects-maths" name="subjects[]">
</div>
<div>
    <label for="subjects-english">            
        English    
    </label>
    <input type="checkbox" value="maths" id="subjects-english" name="subjects[]">
</div>

したがって、チェックボックス入力をラベルの外に移動するにはどうすればよいですか。また、各オプションをdivで囲むにはどうすればよいですか。私はいわゆるソリューションのインターネット上の多くのページを見てきましたが、実際のオプションのラベルや入力ではなく、周囲のラベル(つまり、この例では件名を言うもの)のみを対象としているため、マルチチェックボックスでは機能しません。

助けてください。

ありがとうポール

4

4 に答える 4

4

デコレータZend_Form_Decorator_ViewHelperは、デフォルトでビューヘルパーZend_View_Helper_FormMultiCheckboxを使用してマルチチェックボックス要素をレンダリングします。そのビューヘルパーは拡張されており、Zend_View_Helper_FormRadioそこから何らかの理由でタグを<label>タグの周りに配置するようにハードコーディングされています<input>

ほとんどのコードをコピーする独自のビューヘルパーを作成する必要がありますが、要素の周囲にタグを付けZend_View_Helper_FormRadio::formRadio()ずにHTMLを作成します。これは、あなたがしたいと思うかもしれない変更を示す別の答えからの抜粋です。<label>

カスタムヘルパーには名前を付ける必要がありますが、アプリがどのように構成されているかを知らなければ、それがどうあるべきか、またはの代わりにアプリをロードする方法をSome_Prefix_Helper_FormMultiCheckbox正確に言うことは困難です。いくつかのヒントについては、プラグインのロードに関するドキュメントを確認してください。Some_PrefixZend_View_Helper_FormMultiCheckbox

于 2011-06-03T20:40:55.230 に答える
3

最善の解決策は、リスによる上記の回答に基づいているようです。ラベル内の入力はハードコーディングされているため、最善の解決策はこの動作を変更することです。これを行うには、Zend_View_Helper_FormRadioクラスを変更するか、独自のカスタムビューヘッダーでオーバーライドします。zendフレームワークを変更することは、フレームワークを更新するたびに更新する必要があり、フレームワークのそのコピーを使用するすべてのプロジェクトに影響を与えるため、カスタムヘッダーオプションをお勧めします。カスタムヘルパーを使用することにより、プロジェクトに固有であり、他の何にも影響を与えず、フレームワークの更新による影響も受けません(ただし、フレームワークの更新によって一部の動作が変更された場合は、ヘルパーを更新する必要がある場合があります)。うまく機能している私がしたことは次のとおりです。

1-ライブラリにモデル/モジュールを作成しました。私のWebサイトに電話しました。これには、最初に、モデルと同じ名前のフォルダーをライブラリーに作成することが含まれます。したがって、私は図書館>ウェブサイトを持っています

編集:ブートストラップまたはapplication.iniのいずれかを介してプラグインライブラリを登録する必要があることを忘れました。追加するだけで最も簡単だと思います。

autoloaderNamespaces [] = "Website_"

appnamespaceの下のどこでも

2-Zend_View_Helper_FormRadioをオーバーライドするクラスWebsite_View_Helper_FormRadioに関連するサブフォルダーとファイルを作成しました。したがって、フォルダとファイルの構造は次のようになります。

ウェブサイト>表示>ヘルパー>FormRadio.php

3-次に、formRadio関数の内容をZend_View_Helper_FormRadioからクラス内のWebsite_View_Helper_FormRadioにコピーしました。次に、squirrelが参照するコードで変更しました。したがって、Zend_View_Helper_FormRadioから継承するWebsite_View_Helper_FormRadioクラスは次のようになります。

class Website_View_Helper_FormRadio extends Zend_View_Helper_FormRadio
{
     public function formRadio($name, $value = null, $attribs = null, $options = null, $listsep = "<br />\n")
    {

          // The code from the formRadio function in Zend_View_Helper_FormRadio with
          // the modification from the code squirrel referred to

    }
}

これにより、FormRadio要素のzendバージョンから継承する変更されたコードを含むクラスの独自のコピーが得られます。

これで、通常のようにZend Form Radio要素を使用できるようになり、改善点が使用されます。

MultiCheckboxまたはチェックボックスに同じ効果を持たせたい場合は、これらの要素がフォームラジオを基本として使用するため、これらにフォームラジオのバージョンを使用させる必要があることに注意してください。これを行うために、ライブラリにこれらの独自のバージョンを作成し、それらをバージョンから継承させます。したがって、マルチチェックボックスには次のものがあります。

ライブラリ>ウェブサイト>表示>ヘルパー>FormMultiCheckbox.php

Zend_View_Helper_FormMultiCheckboxのコピーになります

次に、次の行を置き換えます。

class Zend_View_Helper_FormMultiCheckbox extends Zend_View_Helper_FormRadio

と:

class Website_View_Helper_FormMultiCheckbox extends Website_View_Helper_FormRadio

それが誰かに役立つことを願っています。

于 2011-06-07T14:05:48.240 に答える
3

multiCheckBoxレンダリングのカスタマイズに関する追加情報は次のとおりです

チェックボックスのラベルを追加ではなく追加したかった(このデフォルトの動作はハードコーディングされています)。ZFリファレンスガイドはそれについておしゃべりではないので、私はついにそれをカスタマイズする方法を理解するためにコアコードに入りました。詳細については、をご覧くださいZend_View_Helper_FormRadio::formRadio()

multiCheckBoxオプションを介してチェックボックスデコレータを変更することができます:接頭辞が付いたいくつかのオプションを追加しますlabel_

これが私のフォーム要素です:

$this->addElement('multiCheckbox', 'stars_number', array(
    'filters'         => array('Int'),
    'escape'          => false,        // to allow html in the labels
    'separator'       => '',           // to keep everything inline
    'label_placement' => 'prepend',
    'label_class'     => 'stars',      // custom css needed
    'decorators'      => $decorator_chain, // decorators array defined upper, and passed to many elements of the form
));

これが失敗したグーグルクロールの時間を節約するのに役立つことを願っています...

于 2012-10-05T00:21:10.250 に答える
-1

デコレータラベルを削除し、ラベルデコレータのように機能する独自のデコレータを作成する必要があると思いますが、必要に応じてdivタグとラベルタグを一緒に使用します

于 2011-06-03T15:56:06.907 に答える