Zend Frameworkでアプリケーションを設計する場合、Zend_Formコンポーネントを使用すると、エンティティの処理が大幅に容易になります。設定されたバリデーター、フィルターなどでフォームが作成されると、データベース内のデータの作成と編集の両方で使用されます
多くの場合、エンティティには、プレビューイメージ、ダウンロードするファイル名、ギャラリー内の写真など、ファイルタイプの要素が含まれます。 ただし、File要素のある形式のエンティティを変更する場合にのみ、 標準のZend_Form_Element_Fileデコレータがエンティティ変更フォームに適していないことが明らかになります。 ダウンロードしたファイルの存在を表示したり、このファイルを削除したりすることはできません。
つまり、エンティティを変更のために開くと、フォームの他のすべての要素にデータベースの値が入力されますが、Zend_Form_Element_Fileにはこれがありません。
この記事では、ZendFramework 1.11でCRUD(create-read-update-delete)を作成する一環としてZend_Form_Element_Fileを操作する実装を共有します。
デコレータの作成方法、フォームへのデコレータの添付方法、およびコントローラを操作するための手順の詳細な説明は、habrakatの下で待っています。
Zend_Form_Element_File-一般情報、機能
データベースに新しいエンティティを追加すると、Zend_Form_Element_Fileは次の(標準)方法のようになります。
エンティティを変更するとき、Zend_Form_Element_Fileはデフォルトで似ています。 私たちのタスクは、この要素の外観を次のように減らすことです。
したがって、現在ロードされているファイル名、新しいファイルを指定する要素自体(古いファイルはそれに置き換えられます)、および既にダウンロードされたファイルを削除し、編集中のエンティティの写真列をゼロにするチェックボックスが表示されます。
Zend_Form_Element_File用の独自のデコレータを作成します
これを行うには、application / forms / Decoratorsフォルダーで、次のクラスのFile.phpファイルを作成します
- <?php
- クラス Application_Form_Decorators_File は Zend_Form_Decorator_Abstractを拡張します
- {
- パブリック 関数 buildLabel ( )
- {
- $ element = $ this- > getElement ( ) ;
- $ label = $ element- > getLabel ( ) ;
- if ( $ translator = $ element- > getTranslator ( ) ) {
- $ label = $ translator- > translate ( $ label ) ;
- }
- if ( $ element- > isRequired ( ) ) {
- $ label 。= '*' ;
- }
- $ label 。= ':' ;
- return $ element- > getView ( )
- -> formLabel ( $ element- > getName ( ) 、 $ label ) ;
- }
- パブリック 関数 buildInput ( )
- {
- $ element = $ this- > getElement ( ) ;
- $ helper = $ element- > helper ;
- return $ element- > getView ( ) -> $ helper (
- $要素 -> getName ( ) 、
- $要素 -> getValue ( ) 、
- $要素 -> getAttribs ( ) 、
- $要素 -> オプション
- ) ;
- }
- パブリック 関数 buildErrors ( )
- {
- $ element = $ this- > getElement ( ) ;
- $ messages = $ element- > getMessages ( ) ;
- if ( empty ( $ messages ) ) {
- return '' ;
- }
- return '<div class = "errors">' 。
- $要素 -> getView ( ) -> formErrors ( $ messages ) 。 '</ div>' ;
- }
- パブリック 関数 buildDescription ( )
- {
- $ element = $ this- > getElement ( ) ;
- $ desc = $ element- > getDescription ( ) ;
- if ( empty ( $ desc ) ) {
- return '' ;
- }
- '<div class = "description">'を 返し ます。 $ desc 。 '</ div>' ;
- }
- パブリック 関数レンダー( $ content )
- {
- $ element = $ this- > getElement ( ) ;
- if ( ! $ element instanceof Zend_Form_Element ) {
- $コンテンツを 返し ます 。
- }
- if ( null === $ element- > getView ( ) ) {
- $コンテンツを 返し ます 。
- }
- $ separator = $ this- > getSeparator ( ) ;
- $プレースメント = $ this- > getPlacement ( ) ;
- $ label = $ this- > buildLabel ( ) ;
- $ input = $ this- > buildInput ( ) ;
- $ errors = $ this- > buildErrors ( ) ;
- $ desc = $ this- > buildDescription ( ) ;
- $ renderingContent = $ element- > getView ( ) -> partial (
- 'decorators / file.phtml' 、
- array ( 'element' => $ element ) ) ;
- $ output = '<tr> <td>'
- 。 $ラベル 。 '</ td> <td>' 。 $ renderingContent
- 。 $入力
- 。 $エラー
- 。 $ desc
- 。 '</ td> </ tr>' ;
- スイッチ ( $配置 ) {
- ケース ( self :: PREPEND ) :
- $ outputを 返し ます 。 $セパレーター 。 $コンテンツ ;
- ケース ( self :: APPEND ) :
- デフォルト :
- $コンテンツを 返し ます 。 $セパレーター 。 $出力 ;
- }
- }
- }
したがって、出力に必要な情報を追加することで、要素の外観を「部分的に」収集できます。 指示を使用して
- $ renderingContent = $ element- > getView ( ) -> partial (
- 'decorators / file.phtml' 、
- array ( 'element' => $ element ) ) ;
途中で、現在の要素(Zend_Form_Element_File)に関する情報を$要素(
ファイルアプリケーション/ビュー/スクリプト/デコレータ/ file.phtmlを次の内容でレンダリングします。
- 写真をアップロードしました ' <?Php echo $ this- > element- > getDescription ( ) ; ?> '。<br>
- 新しいファイルを指定して、写真を変更できます。 写真の変更が不要な場合は、このフィールドを空白のままにします。 <br>
- 写真を削除するには、チェックボックスをオンにします。
- <input name = " <?php echo $ this- > element- > getName ( ) ; ?> _checkbox" type = "checkbox" value = "on" /> <br />
フォームでデコレーターを使用する
エンティティを変更する場合にのみカスタムデコレータが必要なので、エンティティを追加する場合は、標準のデコレータを残します。
- if ( $ this- > _options [ 'type' ] == 'edit' && ! is_null ( $ this- > _options [ 'photo_file' ] ) )) {
- $ photo- > setDescription ( $ this- > _options [ 'photo_file' ] ) ;
- $ photo- > setDecorators ( 配列 (
- array ( 'ViewScript' 、 array ( 'viewScript' => 'decorators / file.phtml' ) ) 、
- 「ファイル」 、
- 'エラー' 、
- array ( array ( 'data' => 'HtmlTag' ) 、 array ( 'tag' => 'td' 、 'class' => 'element' ) ) 、
- array ( 'Label' 、 array ( 'tag' => 'td' ) ) 、
- 配列 ( array ( 'row' => 'HtmlTag' ) 、 配列 ( 'tag' => 'tr' ) )
- ) ) ;
- } else {
- $ photo- > setDecorators ( 配列 (
- 「ファイル」 、
- 'エラー' 、
- array ( array ( 'data' => 'HtmlTag' ) 、 array ( 'tag' => 'td' 、 'class' => 'element' ) ) 、
- array ( 'Label' 、 array ( 'tag' => 'td' ) ) 、
- 配列 ( array ( 'row' => 'HtmlTag' ) 、 配列 ( 'tag' => 'tr' ) )
- ) ) ;
- }
コントローラーでデコレーターを使用する:
アップロードされた画像ごとに、フィルターを使用してプレビューが作成されます。したがって、画像を削除するときは、プレビューも削除する必要があります。
- //削除が確認された場合-ファイルを削除し、データベース内でnullにします
- if ( ! is_null ( $ this- > getRequest ( ) -> getParam ( 'photo_checkbox' ) )) && $ this- > getRequest ( ) -> getParam ( 'photo_checkbox' ) == 'on' ) {
- if ( file_exists ( PUBLIC_PATH 。 '/ userfiles / images / full /'。$ item- > photo ) ))
- unlink ( PUBLIC_PATH 。 '/ userfiles / images / full /'。$ item- > photo ) ;
- if ( file_exists ( PUBLIC_PATH 。 '/ userfiles / images / thumb /'。$ item- > photo ) ))
- unlink ( PUBLIC_PATH 。 '/ userfiles / images / thumb /'。$ item- > photo ) ;
- $ item- > photo = null ;
- }
- //新しいファイルが指定され、アップロードされた場合、古いファイルを削除して、データベースに新しいファイルを書き込みます。
- // File要素が入力されていない場合、$ form-> photo-> getFileName()== array(null);
- if ( ! is_null ( $ form- > photo- > getFileName ( ) ) && count ( $ form- > photo- > getFileName ( ) ) != 0 ) {
- if ( file_exists ( PUBLIC_PATH 。 '/ userfiles / images / full /'。$ item- > photo ) )) {
- unlink ( PUBLIC_PATH 。 '/ userfiles / images / full /'。$ item- > photo ) ;
- }
- if ( file_exists ( PUBLIC_PATH 。 '/ userfiles / images / thumb /'。$ item- > photo ) )) {
- unlink ( PUBLIC_PATH 。 '/ userfiles / images / thumb /'。$ item- > photo ) ;
- }
- $ item- > photo = $ form- > getValue ( 'photo' ) ;
- }
ソースコード:
トピックが関連する場合、Zend_Form_Element_File(gdlibおよびimagic)を介してダウンロードされた画像を処理するためのフィルターの作成に関する資料がまだあります。
コメントありがとうございます。コメントや提案を受け付けています。 少し前にZend Frameworkの研究を始めましたが、同様の問題の解決策を見つけることができませんでした。自分で解決する必要がありました。 何かが正しく行われておらず、(または)ZFスタイルではない場合-コメントの購読を停止してください、私はそれを修正します。
現在の実装は正常に機能しています。