konto usunięte

Temat: Displaygroup + ViewScript

Witam, czy miał ktoś może okazję użyć dekoratora ViewScript do displaygroup z formularzu? W sieci jest multum przykładów jak użyć ViewScript przy pojedynczym elemencie, ale nie mogłem znaleźć nigdzie jakiegokolwiek dla grupy.
Załóżmy, że chcemy osiągnąć taki kod:


<div>
<h2>Hagłówek grupy</h2>
<p> Kilka słów instrukcji </p>

ELEMENTY FORMULARZA NALEŻĄCE DO GRUPY

</div>


Jeśli ktoś miał okazję robić coś podobnego bardzo proszę o pomoc.
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: Displaygroup + ViewScript

ja robilem :)

Krok 1:
Zrob sobie wlasny dekorator dla display grupy:

/**
* @class FreeCode_Form_Decorator_CustomDisplayGroup
* @brief Custom form decorator.
*/
class FreeCode_Form_Decorator_CustomDisplayGroup extends Zend_Form_Decorator_Abstract
{

/**
* Render display group.
* @param string $content
* @return string
*/
public function render($content)
{
$element = $this->getElement();
if ($element->getView() === null)
return $content;

$id = $element->getName();
$attribs = $element->getAttribs();

$class = (isset($attribs['class']) ? ' '.$attribs['class'] : '');

if (isset($attribs['legend']))
$legend = '<div id="'.$id.'_legend" class="legend">'.FreeCode_Translator::_($attribs['legend']).'</div>';
else
$legend = '';

$content = '<div id="'.$id.'_elements" class="elements">'.$content.'</div>';

$html =
'<div id="'.$id.'" class="display_group'.$class.'">'.
$legend.
$content.
'</div>';

return $html;
}

}

Krok 2: Zrob sobie klase dziedziczaca po Zend_Form a w niej:

public function __construct($options = null)
{
parent::__construct($options);

$this->addDisplayGroupPrefixPath('FreeCode_Form_Decorator', 'FreeCode/Form/Decorator/');
}

//---------

/**
* Overloaded for adding custom decorators to display group.
* @param array $elements
* @param mixed $name
* @param mixed $options
* @return void
*/
public function addDisplayGroup(array $elements, $name, $options = null)
{
$return = parent::addDisplayGroup($elements, $name, $options);

$displayGroup->addDecorator('CustomDisplayGroup');

return $return;
}

//-----

Krok 3: Zrob display grupe w klasie formularza:

Przykladowo:

$this->addElements(array(
$login,
$name,
$email,
$www,
$bio,
$submit
));

$this->addDisplayGroup(
array('login', 'name', 'email'),
'_required',
array('legend' => 'Required')
);

$this->addDisplayGroup(
array('www', 'bio'),
'_custom',
array('legend' => 'Custom')
);

$this->addDisplayGroup(array('submit'), 'buttons');

gdzie login, name, email to id elementow Zend_Form_Element_* ktore maja byc w danej grupie

W wyniku dostaniesz dokladnie to co chciales uzyskac, dekorator generuje potrzebny kod, mozesz go dowolnei przeksztalcic, polecam pakowac wszystko w divy wtedy zmiana wygladu wszystkich formularzy to jedynie kosmetyka css

konto usunięte

Temat: Displaygroup + ViewScript

Pomysł jest ciekawy i daje sporo możliwości, jednak mi zależało na prostszej drodze, dlatego chciałem użyć ViewScript.
Wykombinowałem w końcu takie rozwiązanie:

Formularz


<?php
class My_Form extends Zend_Form {

$this->addElement('text', 'email', array(
'label' => 'E-mail:',
'required' => true,
),
));

$this->addElement('password', 'password', array(
'label' => 'Hasło:',
'required' => true,
));

$this->addElement('password', 'password2', array(
'label' => 'Powtórz hasło:',
'required' => true,
));

$this->addDisplayGroup(array('email','password','password2'), 'login_info');
$login_info = $this->getDisplayGroup('login_info');
$login_info->setDecorators(array(
array('ViewScript',
array(
'viewScript' => 'group.phtml',
'class' => 'form_element',
'options' => array('header' => 'Qwerty')
)
)
));

}
?>



Dekorator - plik group.phtml



<p><?=$this->options['header']?></p>
<? $elements = $this->element->getElements(); ?>
<? if(count($elements)): ?>
<? foreach($elements as $element): ?>
<?=$this->formErrors($element->getMessages())?>
<div class="formElement">
<? $labelOptions = array(); $element->isRequired() ? $labelOptions = array('class' => 'required') : ''; ?>
<?=$this->formLabel($element->getName(), $element->getLabel(), $labelOptions)?>
<?=$this->{$element->helper}($element->getName(),$element->getValue(),$element->getAttribs());?>
</div>
<?endforeach;?>
<?endif;?>




W zasadzie z pliku group.phtml mogę całkowicie dowolnie kształtować wygląd formularza, nawet na poziomie pojedynczego pola należącego do grupy.Marek Syrek edytował(a) ten post dnia 20.04.10 o godzinie 13:57
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: Displaygroup + ViewScript

Marek Syrek:
Dekorator - plik group.phtml
>...
no ja chcialem sie calkiem pozbyc takich widokow,
u mnie caly formularz generuje ci sie:

<?= $this->form ?>

i tyle :P

konto usunięte

Temat: Displaygroup + ViewScript

Ja również generuję formularz
 <?= $this->form ?> 
w widoku. To, co napisałem, to widok, ale dla dekoratora.
Grzesiek Nng

Grzesiek Nng freelancer

Temat: Displaygroup + ViewScript

Witam,

Ja mam problem z dekoratorem dla DisplayGroup
Zrobiłem sobie podobny dekoratora do Łukasza poniżej zamieszczam jego kod


class My_Decorator_Group extends Zend_Form_Decorator_Abstract {
public function render($content){
$element = $this->getElement();
if ($element->getView() === null)
return $content;
$id = $element->getName();
$attribs = $element->getAttribs();
$class = (isset($attribs['class']) ? ' '.$attribs['class'] : '');
if (isset($attribs['legend']))
$legend = '<div id="'.$id.'_legend" class="legend">'.$attribs['legend'].'</div>';
else
$legend = '';
$content = '<div id="'.$id.'_elements" class="elements">'.$content.'</div>';
$html = '<div id="'.$id.'" class="display_group'.$class.'">'. $legend . $content . '</div>';
return $html;
}
}


Oraz sposób wykorzystania dekoratora w klasie dziedziczącej po Zend_Form


$decorator = new My_Decorator_Group();
$this->addDisplayGroup( array('login', 'haslo'), 'required', array('decorators' => array($decorator), 'legend' => 'Wymagane') );


I wynikiem działania jest taki


<div class="display_group" id="required">
<div class="legend" id="required_legend">Wymagane</div>
<div class="elements" id="required_elements"></div>
</div>


Jak widać prawie się udało tylko dekorator nie umieścił naważniejszego pola login i haslo w div-e :-)

Jeżeli ktoś wie co zrobiłem nie tak to bardzo proszę o pomoc
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: Displaygroup + ViewScript

zobacz czy w klasie dekoratora w metodzie render masz cokolwiek w $content
Grzesiek Nng

Grzesiek Nng freelancer

Temat: Displaygroup + ViewScript

No właśnie nie mam nic w $content i nie wiem jak z wnętrza dekoratora dobrać się do elementów umieszczonych w grupie takich jak pola login i haslo
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: Displaygroup + ViewScript

sproboj uzyc dekoratora tak jak ja czyli przeciaz addDisplayGroup w klasie formularza, bo kod samego dekoratora masz identyczny ;p
Grzesiek Nng

Grzesiek Nng freelancer

Temat: Displaygroup + ViewScript

Dobra zorbilem cos takiego w konstruktorze przeniosłem przed wywołanie rodzica addDisplayGroupPrefixPath()
a w metodzie addDisplayGroup()
zmienilem
$displayGroup->addDecorator('Group');
na
$this->addDecorator('CustomDisplayGroup');
ponieważ nie mam zdefiniowanej takiej zmiennej $displayGroup domyslam się ze należy użyć $this


class Application_Form_Login extends Zend_Form{

public function __construct($options = null){
$this->addDisplayGroupPrefixPath('My_Decorator', 'My/Decorator/');
parent::__construct($options);
}
public function addDisplayGroup(array $elements, $name, $options = null){
$return = parent::addDisplayGroup($elements, $name, $options);
$this->addDecorator('Group');
return $return;
}
}
public function init(){
.........

$this->addDisplayGroup( array('login', 'haslo'), 'required', array('legend' => 'Wymagane') );

}


Wynikiem czego jest:


<div class="display_group" id="">
<div class="elements" id="_elements"></div>
</div>


Ktoś ma jakiś pomysł jak rozwiązać ten problem??Grzesiek Nng edytował(a) ten post dnia 26.05.10 o godzinie 16:26



Wyślij zaproszenie do