2009年1月10日星期六

Re: [fw-mvc] Zend_Form: dl not output unless a display group is created

Oh, right! Never used that method before. Thanks!
--
Regards,
Nathan @ T&R Trailer Sales

719-546-2321T
719-404-4697 F
719-250-7831 M


On Sat, Jan 10, 2009 at 5:38 AM, Matthew Weier O'Phinney
<matthew@zend.com> wrote:
> -- Nathan Garlington <garlinto@gmail.com> wrote
> (on Friday, 09 January 2009, 12:13 AM -0700):
>> Sorry, dumb question...I just looked in the source and found the
>> information I needed.
>>
>> I don't want to overwrite the default decorators, but I would like to
>> add some options to some of them. Is the right way to accomplish this
>> call addDecorator($decorator, array $options), which will override the
>> decorator of the same name, but with the new options?
>
> No. Just pull the decorator and set the options:
>
> $element->getDecorator('HtmlTag')->setOption('tag', 'div');
>
>
>> On Thu, Jan 8, 2009 at 8:42 PM, Nathan Garlington <garlinto@gmail.com> wrote:
>> > Does this mean that for the elements in Zend_Dojo_Form I have to add
>> > the DijitElement decorator?
>> >
>> > --
>> > Regards,
>> > Nathan @ T&R Trailer Sales
>> >
>> > 719-546-2321T
>> > 719-404-4697 F
>> > 719-250-7831 M
>> >
>> >
>> >
>> >
>> > On Thu, Jan 8, 2009 at 6:36 PM, Matthew Weier O'Phinney
>> > <matthew@zend.com> wrote:
>> >> -- Nathan Garlington <garlinto@gmail.com> wrote
>> >> (on Thursday, 08 January 2009, 04:01 PM -0700):
>> >>> I see it now...thanks!
>> >>>
>> >>> One last question: I saw this somewhere but when I went to find it
>> >>> just now I can't seem to locate it. Can you tell me briefly what the
>> >>> default form and element decorators are for Zend_Dojo_Form?
>> >>
>> >> FormElements, HtmlTag (dl tag), and DijitForm.
>> >>
>> >>
>> >>> On Thu, Jan 8, 2009 at 3:21 PM, Matthew Weier O'Phinney
>> >>> <matthew@zend.com> wrote:
>> >>> > -- Nathan Garlington <garlinto@gmail.com> wrote
>> >>> > (on Thursday, 08 January 2009, 11:37 AM -0700):
>> >>> >> Thanks for the reply Matthew. It sounds like the problem is with my
>> >>> >> implementation of the extended class. Here's my complete form code.
>> >>> >>
>> >>> >> Also, I'm still trying to improve my implementation of the Zend_Form
>> >>> >> and related classes, so if you see any needless redundancy or areas of
>> >>> >> improvement, please let me know!
>> >>> >>
>> >>> >> /*********************** Form code ***********************/
>> >>> >> class Form_ViewTrailersDojo extends Zend_Dojo_Form
>> >>> >> {
>> >>> >> protected $_fowlerTrailers = null;
>> >>> >> protected $_puebloTrailers = null;
>> >>> >> protected $_trailerTypes = null;
>> >>> >>
>> >>> >> /**
>> >>> >> * @constructor
>> >>> >> */
>> >>> >> public function __construct(
>> >>> >> Zend_Db_Table_Rowset $fowlerTrailers,
>> >>> >> Zend_Db_Table_Rowset $puebloTrailers,
>> >>> >> Zend_Db_Table_Rowset $trailerTypes,
>> >>> >> $options = null )
>> >>> >
>> >>> > First off, you're going to run into some warnings with PHP if you change
>> >>> > the constructor signature. You should likely cherry-pick these objects
>> >>> > from the $options array prior to passing the options array to the parent
>> >>> > constructor:
>> >>> >
>> >>> > public function __construct($options = null)
>> >>> > {
>> >>> > if ($options instanceof Zend_Config) {
>> >>> > $options = $options->toArray();
>> >>> > }
>> >>> > if (!is_array($options)
>> >>> > || (!isset($options['fowlerTrailers'])
>> >>> > || (!$options['fowlerTrailers'] instanceof Zend_Db_Table_Rowset))
>> >>> > || (!isset($options['puebloTrailers'])
>> >>> > || (!$options['puebloTrailers'] instanceof Zend_Db_Table_Rowset))
>> >>> > || (!isset($options['trailerTypes'])
>> >>> > || (!$options['trailerTypes'] instanceof Zend_Db_Table_Rowset))
>> >>> > ) {
>> >>> > throw new Exception('Missing or invalid arguments');
>> >>> > }
>> >>> > $this->_fowlerTrailers = $options['fowlerTrailers'];
>> >>> > $this->_puebloTrailers = $options['puebloTrailers'];
>> >>> > $this->_trailerTypes = $options['trailerTypes'];
>> >>> > unset($options['fowlerTrailers']);
>> >>> > unset($options['puebloTrailers']);
>> >>> > unset($options['trailerTypes']);
>> >>> >
>> >>> > return parent::__construct($options);
>> >>> > }
>> >>> >
>> >>> > It's more verbose, but it ensures there are no potential PHP problems
>> >>> > due to inheritance, and also gives you a nice exception if any arguments
>> >>> > are missing.
>> >>> >
>> >>> >> {
>> >>> >> $this->_fowlerTrailers = $fowlerTrailers;
>> >>> >> $this->_puebloTrailers = $puebloTrailers;
>> >>> >> $this->_trailerTypes = $trailerTypes;
>> >>> >>
>> >>> >> parent::__construct($options);
>> >>> >> }
>> >>> >>
>> >>> >> /**
>> >>> >> * 'fowlerTrailerId' text element
>> >>> >> *
>> >>> >> * Format the types array using the
>> >>> >> * database result passed to the constructor
>> >>> >> *
>> >>> >> */
>> >>> >> public function init()
>> >>> >> {
>> >>> >> /**
>> >>> >> * configure form output and fieldset
>> >>> >> */
>> >>> >> $this->setDecorators( array(
>> >>> >> 'FormElements',
>> >>> >> array('DijitForm', array('id' => 'myTrailerSelectForm', 'method' => 'post')),
>> >>> >> array('BorderContainer', array('id' => 'myBorderContainer', 'style'
>> >>> >> => 'width: 100%; height: 100%;', 'dijitParams' => array('gutters' =>
>> >>> >> 'true') ) ),
>> >>> >> ));
>> >>> >
>> >>> > Well, the problem with the missing <dl> tags is solved -- you're
>> >>> > overriding the decorators with the above, and never giving it the
>> >>> > HtmlTag decorator... (should be between FormElements and DijitForm).
>> >>> >
>> >>> >>
>> >>> >> //$this->setElementDecorators(array('DijitElement', 'Label'));
>> >>> >>
>> >>> >> // fowlerTrailers element
>> >>> >> $trailers = array('' => '');
>> >>> >> foreach( $this->_fowlerTrailers as $row ) {
>> >>> >> ( $row->is_new ) ? $isNew = 'N' : $isNew = 'U';
>> >>> >> $trailers[$row->trailer_id] = "$isNew (" . substr( $row->vin, -4, 4
>> >>> >> ) . ') ' .$row->year . ' ' . $row->mfr . ' ' .
>> >>> >> $row->width . 'X' . $row->length . ' ' . $row->type;
>> >>> >> }
>> >>> >> $this->addElement('FilteringSelect', 'fowlerTrailerId', array(
>> >>> >> 'label' => 'Fowler (' . count( $this->_fowlerTrailers ) . '):',
>> >>> >> 'multiOptions' => $trailers,
>> >>> >> 'style' => 'width: 450px;'));
>> >>> >>
>> >>> >> /**
>> >>> >> * 'puebloTrailerId' text element
>> >>> >> *
>> >>> >> * First, format the types array using the
>> >>> >> * database result passed to the constructor
>> >>> >> *
>> >>> >> * @param array $puebloTrailers
>> >>> >> *
>> >>> >> */
>> >>> >> $trailers = array('' => '');
>> >>> >> foreach( $this->_puebloTrailers as $row ) {
>> >>> >> ( true == $row->is_new ) ? $isNew = 'N' : $isNew = 'U';
>> >>> >> $trailers[$row->trailer_id] = "$isNew (" . substr( $row->vin, -4, 4
>> >>> >> ) . ') ' .$row->year . ' ' . $row->mfr . ' ' .
>> >>> >> $row->width . 'X' . $row->length . ' ' . $row->type;
>> >>> >> }
>> >>> >> $this->addElement('FilteringSelect', 'puebloTrailerId', array(
>> >>> >> 'label' => 'Pueblo (' . count( $this->_puebloTrailers ) . '):',
>> >>> >> 'multiOptions' => $trailers,
>> >>> >> 'style' => 'width: 450px;'));
>> >>> >>
>> >>> >> /**
>> >>> >> * 'type' text element
>> >>> >> *
>> >>> >> * First, format the types array using the
>> >>> >> * database result passed to the constructor
>> >>> >> *
>> >>> >> * @param array $trailerTypes
>> >>> >> *
>> >>> >> */
>> >>> >> $types = array( '' => '' );
>> >>> >> foreach( $this->_trailerTypes as $row ) {
>> >>> >> $types[$row->type] = $row->type;
>> >>> >> }
>> >>> >>
>> >>> >> $this->addElement('FilteringSelect', 'type', array(
>> >>> >> 'label' => 'Type:',
>> >>> >> 'multiOptions' => $types));
>> >>> >>
>> >>> >> /**
>> >>> >> * 'vin' text element
>> >>> >> */
>> >>> >> $this->addElement('TextBox', 'vin', array(
>> >>> >> 'label' => 'Last 4 of VIN:',
>> >>> >> 'attribs' => array('maxlength' => 4, 'style' => 'width: 60px;') ) );
>> >>> >>
>> >>> >> /**
>> >>> >> * 'trailer_id' text element
>> >>> >> */
>> >>> >> $this->addElement('TextBox', 'trailer_id', array(
>> >>> >> 'label' => 'Stock #:',
>> >>> >> 'attribs' => array('maxlength' => 5, 'style' => 'width: 60px;') ) );
>> >>> >>
>> >>> >> /**
>> >>> >> * 'submit' submit button element
>> >>> >> */
>> >>> >> $this->addElement('SubmitButton', 'submitButton', array(
>> >>> >> 'label' => 'View'));
>> >>> >> $this->submitButton->addDecorator('HtmlTag', array('tag' => 'div',
>> >>> >> 'class' => 'buttons', 'placement' => 'prepend', 'openOnly' => true))
>> >>> >> ->removeDecorator('DtDdWrapper');
>> >>> >>
>> >>> >> /**
>> >>> >> * 'back' submit button element
>> >>> >> */
>> >>> >> $this->addElement('Button', 'resetButton', array(
>> >>> >> 'label' => 'Reset',
>> >>> >> 'type' => 'button',
>> >>> >> 'onclick' =>
>> >>> >> "window.location.href='http://www.trtrailer.org/trailers/index/requestId/"
>> >>> >> . mt_rand(50000, 70000) . "/'"));
>> >>> >> $this->resetButton->addDecorator('HtmlTag', array('tag' => 'div',
>> >>> >> 'placement' => 'append', 'closeOnly' => true))
>> >>> >> ->removeDecorator('DtDdWrapper');
>> >>> >>
>> >>> >> $this->addDisplayGroup(array( 'fowlerTrailerId', 'puebloTrailerId',
>> >>> >> 'type', 'vin', 'trailer_id', 'submitButton', 'resetButton'),
>> >>> >> 'myElements');
>> >>> >> $this->myElements->addDecorator('Fieldset', array('legend' =>
>> >>> >> 'Trailer Selector'));
>> >>> >>
>> >>> >> }
>> >>> >> }
>> >>> >
>> >>> > Overall, this looks fine.
>> >>> >
>> >>> > --
>> >>> > Matthew Weier O'Phinney
>> >>> > Software Architect | matthew@zend.com
>> >>> > Zend Framework | http://framework.zend.com/
>> >>> >
>> >>>
>> >>
>> >> --
>> >> Matthew Weier O'Phinney
>> >> Software Architect | matthew@zend.com
>> >> Zend Framework | http://framework.zend.com/
>> >>
>> >
>>
>
> --
> Matthew Weier O'Phinney
> Software Architect | matthew@zend.com
> Zend Framework | http://framework.zend.com/
>

没有评论: