Zend Form Constructor

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 19-09 22:44
Ik ben bezig om Zend_Form onder de knie te krijgen, nu is er een lading aan documentatie, dat is het probleem niet.

Maar in de documentatie wordt elk form element, elke validator en filter als apart object aangemaakt, waarvan weer verschillende methoden worden aangeroepen.

Ik wil graag dat de 'default message' van een validator wordt overschreven, normaal kan dat met

PHP:
1
2
3
4
5
6
$validator->setMessages(
array (
   'missingToken' => 'No token to match agains',
   'Same' => 'The tokens are the same'
)
);


Maar ik wil graag dat ik het in de zend form constructor kan (voorbeeld)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$form = new Zend_Form(
            array(
                'action' => '',
                'method' => 'post',
                'elements' => array(
                    'username' => array(
                        'text',
                        array(
                            'label' => 'Gebruikersnaam',
                            'required' => true,
                            'validators' => array(
                                array('stringLength', true, array(4, 15)),
                                array('identical', true, array($this->_users->checkUsername($_POST['username'])), 'messages' => array(
                                    'Same' => 'Gebruikersnaam bezet. '
                                ))
                            ),
                            'filters' => array(
                                'striptags'
                            )
                        )
                    )
                    'submit' => array(
                        'submit',
                        array(
                            'label' => 'Versturen'
                        )
                    )
                )
            )
        );


Het gaat me dus in dit geval om regel 13 (ik dacht dat is de oplossing, maar die doet dus niets), daar heb ik een method gemaakt die kijkt of een username bestaat, en ik wil dan graag dat hij zegt van 'hee die is hetzelfde als een andere klant'.

Nu kan ik wel elk object los gaan maken, maar ik vind alles in de constructor gooien veel fijner werken (veel minder code)

Dus de vraag is eigenlijk, hoe kan ik die setMessages() in de Zend_Form constructor uitvoeren, bij de betreffende validator.

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • zwippie
  • Registratie: Mei 2003
  • Niet online

zwippie

Electrons at work

Gebruik in ieder geval $this->getRequest()->getParam('username') in plaats van die ranzige $_POST. ;)

Ik neem tenmiste aan dat je ook de rest van het Zend Framework gebruikt? Hoeft niet natuurlijk. Maar indien wel, volgens mij unset Zend_Controller ergens de $_POST en $_GET variabelen, zal ik nog even opzoeken.

[ Voor 6% gewijzigd door zwippie op 24-06-2009 23:46 ]

How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.


Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 19-09 22:44
zwippie schreef op woensdag 24 juni 2009 @ 23:45:
Gebruik in ieder geval $this->getRequest()->getParam('username') in plaats van die ranzige $_POST. ;)

Ik neem tenmiste aan dat je ook de rest van het Zend Framework gebruikt? Hoeft niet natuurlijk. Maar indien wel, volgens mij unset Zend_Controller ergens de $_POST en $_GET variabelen, zal ik nog even opzoeken.
Ja, dit was dan ook meer op te testen.

Nee, ik probeer zoveel mogelijk het Zend Framework te gebruiken. En over dat unsetten, dat doet hij volgens mij niet.

Maar... dit lost mijn probleem nog niet op... ;) Mischien weet je het antwoord, alvast bedankt.

editz:

Door te spelen en verder te lezen ben ik er eerst achter gekomen, dat je 3 argumenten hebt in de zend_validator in de zend_form constructor.

De eerste is welke validator, de tweede true of false, en de 3e een array van optionele argumenten. Hierin kan een array 'messages' worden geplaatst, waarvan de inhoud dan overeen moet komen met de benamingen in de validators. (missingToken, notSame e.d) en dan werkt het :D

Thanks anyways.

[ Voor 24% gewijzigd door ZpAz op 24-06-2009 23:55 ]

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

zwippie schreef op woensdag 24 juni 2009 @ 23:45:
Gebruik in ieder geval $this->getRequest()->getParam('username') in plaats van die ranzige $_POST. ;)
Terug naar $_REQUEST dus eigenlijk?

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 19-09 22:44
CodeCaster schreef op woensdag 24 juni 2009 @ 23:52:
[...]

Terug naar $_REQUEST dus eigenlijk?
Ik heb geen ervaring met $_REQUEST (nooit mee gewerkt eigenlijk)

Maar $_POST, $_GET VS getParam is ongeveer.

- Als hij niet bestaat geeft hij null terug, ipv een error. En ook de parameters verstuurd via een nette URL (www.mijnurl.nl/controller...e/waarde2/detweedewaarde/) zijn ook meteen via dezelfde methode aan te roepen.

Met $_REQUEST heb ik geen ervaring, dat was meer pre PHP4 ofzo dacht ik. (Ben een beetje ingestapt aan het einde van 4, begin 5).

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Als je toch alles in de constructor wil doen, waarom zou je dan nog een class maken? Dan kun je er net zo goed een losstaande functie van maken. 8)7

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 19-09 22:44
NMe schreef op woensdag 24 juni 2009 @ 23:57:
Als je toch alles in de constructor wil doen, waarom zou je dan nog een class maken? Dan kun je er net zo goed een losstaande functie van maken. 8)7
Hij voert in dit geval zelf alle methods van Zend_Form, Zend_Validator, Zend_Filter e.d uit (wat wel degelijk losstaande classes zijn welke los zijn te gebruiken.

Hierdoor is het mogelijk om Zend_Filter, en Zend_Validator o.a gewoon los te gebruiken. (Het idee van classes toch, reusability)

En zeg nou zelf, dit is een stuk korter dan los eerst elke validator instantieren, elke filter, deze weer koppelen aan elke Zend_Form_Element (elke textbox e.d), terwijl dit gewoon ophetzelfde uitkomt, maar dan op een andere manier geschreven. Waarbij je de code makkelijk met 50% of meer reduceert.

Naast een array zou je er ook een diverse lading aan verschillende configuratiebestanden heen kunnen sturen, zie hier een voorbeeld: http://devzone.zend.com/article/3030

[ Voor 21% gewijzigd door ZpAz op 25-06-2009 00:08 ]

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • zwippie
  • Registratie: Mei 2003
  • Niet online

zwippie

Electrons at work

CodeCaster schreef op woensdag 24 juni 2009 @ 23:52:
[...]

Terug naar $_REQUEST dus eigenlijk?
Je hebt een beetje gelijk. Ik moest even in de ZF code duiken, maar voor zover ik kan zien gebeurt er inderdaad eigenlijk weinig spannends met de $_POST en $_GET variabelen in Zend_Controller_Request_Http. $_REQUEST wordt niet gebruikt zo te zien.


Verder extend ik Zend_Form altijd en gebruik de init() methode om de elementen toe te voegen. Volgens mij wordt het setMessages() verhaal dan ook een stuk eenvoudiger. Veel van die ini/fat constructor constructies zijn het imho vaak nét niet.

How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

ZpAz schreef op donderdag 25 juni 2009 @ 00:03:
En zeg nou zelf, dit is een stuk korter dan los eerst elke validator instantieren, elke filter, deze weer koppelen aan elke Zend_Form_Element (elke textbox e.d), terwijl dit gewoon ophetzelfde uitkomt, maar dan op een andere manier geschreven. Waarbij je de code makkelijk met 50% of meer reduceert.
Ooooooh, ja...we zijn code aan het reduceren, want dat is inderdaad heel belangrijk. 8)7

Leesbaarheid van code gaat altijd boven beknoptheid. En zoals ik al zei: als je toch alle functionaliteit in één functie gaat stoppen, dan heb je geen klassen meer nodig. En daarmee wil ik niet zeggen dat je dat dan maar moet doen, daarmee zeg ik dat het maf is om dit soort dingen na te streven en je gewoon verkeerd bezig bent. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 19-09 22:44
Imho is de code nog prima leesbaar, mischien nog wel leesbaarder dan alles los instantieren. *smaak*

En nee ik stop niet alle functionaliteit in een enkele functie, elke klasse is nog los te gebruiken waar nodig. (De validators, en filters bijvoorbeeld zoals zonet ook al aangegeven).

[ Voor 4% gewijzigd door ZpAz op 25-06-2009 00:22 ]

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Dan maak je een functie die alles voor je doet en een Zend_Form object returnt.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 19-09 22:44
Ik ben je kwijt :)

Die functie heb ik niet gemaakt, dit is standaard beschikbaar in Zend_Form (de constructor) en je zou als je wilt via allerlei formaten (van ini tot xml tot arrays) de formulieren kunnen maken. (Dus wat er in komt, waar het aan moet voldoen e.d).

Nu vind ik zelf de ini en xml wat overdreven, maar de array notatie ben ik zelf wel weg van.

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Je wil dat een standaard class anders gaat functioneren dan wat hij doet. Dat ga je er niet zomaar in knutselen, daar zul je zelf een wrapper functie voor moeten schrijven die de parameters aanneemt die je eraan wil doorgeven, en die functie zal dan alle losse stappen zelf moeten doen en aan het einde het geïnstantieerde object doorgeven aan de aanroepende code.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 19-09 22:44
NMe schreef op donderdag 25 juni 2009 @ 00:42:
Je wil dat een standaard class anders gaat functioneren dan wat hij doet. Dat ga je er niet zomaar in knutselen, daar zul je zelf een wrapper functie voor moeten schrijven die de parameters aanneemt die je eraan wil doorgeven, en die functie zal dan alle losse stappen zelf moeten doen en aan het einde het geïnstantieerde object doorgeven aan de aanroepende code.
Ik wil helemaal niet dat hij zich anders gedraagt dan hij standaard doet, dit is namelijk een standaard functionaliteit. Ik heb geen regel code veranderd binnen Zend_Form, of één van de andere klasses die aangeroepen worden.

Het idee van zend_form is juist op een erm, logische manier formulieren te kunnen genereren en afhandelen. Een mogelijkheid om er gebruik van te maken is door elk object apart te instantieren en via addEelement, addModifier e.d toe te voegen. Of alle parameters via de constructor mee te geven.

Dit is gewoon standaard functionaliteit van Zend_Form.

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
ZpAz schreef op donderdag 25 juni 2009 @ 00:46:
[...]
Dit is gewoon standaard functionaliteit van Zend_Form.
Blijkbaar niet, want anders had dit topic er niet geweest ;)

Maar zo'n gek idee is het toch niet? Je maakt gewoon een functie
PHP:
1
2
3
4
5
6
function CreateZendForm( someParams )
{
    //Create Zend Form here
}

$form =  CreateZendForm( myParamsHere );

Je hebt dan precies wat je wilt.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Woy schreef op donderdag 25 juni 2009 @ 09:37:
[...]

Blijkbaar niet, want anders had dit topic er niet geweest ;)

Maar zo'n gek idee is het toch niet? Je maakt gewoon een functie
PHP:
1
2
3
4
5
6
function CreateZendForm( someParams )
{
    //Create Zend Form here
}

$form =  CreateZendForm( myParamsHere );

Je hebt dan precies wat je wilt.
Of je doet het nog een beetje the Zend way:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class My_Form extends Zend_Form
{
    public function init()
    {
        $this->setMethod('post');
        $this->setAction('my-action');

        $this->addElement('text', 'username', array(
            'label'      => 'Name',
            'required'   => true,
            'size'       => '25',
            'validators' => array(
                array('stringLength', true, array(4,15)),
                array('identical', true, array(
                    $this->_users->checkUsername($this->getRequest()->username)),
                    'messages' => array('Same' => 'Gebruikersnaam bezet'))
                ),
            'filters'    => array('StringTrim', 'StripTags')
        ));

        $this->addElement('submit', 'submit', array(
            'ignore'   => true,
            'label'    => 'Send message',
        ));
    }
}
$form = new My_Form;

Want @TS: Je code wordt veel beter bruikbaar als je gewoon je forms onder application/forms zet of application/modules/my_module/forms. Je hebt dan betere leesbaarheid, onderhoudbaarheid en is je form beter herbruikbaar :)

[ Voor 7% gewijzigd door mithras op 25-06-2009 10:00 ]


Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 19-09 22:44
Het is wel standaard functionaliteit, alleen wist ik niet welke naam ik de 'messages' array moest noemen, en waar deze moest staan. En dat was mijn vraag dan ook, en misschien had ik dat wat verkeerd geformuleert.

@Mithras , over de herbruikbaarheid heb je helemaal gelijk.

[ Voor 12% gewijzigd door ZpAz op 25-06-2009 10:03 ]

Tweakers Time Machine Browser Extension | Chrome : Firefox

Pagina: 1