login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Controller/action objects not found (Opgelost)

Offline DriesA - 25/02/2011 14:54 (laatste wijziging 25/02/2011 14:55)
Avatar van DriesALid Hoi,

Momenteel is dit mijn structuur onder c:\xampplite\htdocs\abes\ :

/application
-/configs
-/controllers
-/forms
-/models
-/views
-Bootstrap.php
/docs
/library
-/Zend
/public
-.htaccess
-index.php
/tests
.zfproject.xml

Mijn index.php in de map public ziet er als volgt uit:
Plaatscode: 140703

Nu heb ik een formulier kunnen maken met als actie "user/process" en in de controllers een nieuwe controller UserController.php gemaakt.
In de process-actie staat er enkel een echo van testcommentaar.

Wanneer ik het forumulier submit (of zelf de url localhost/abes/public/user/process ingeef) krijg ik steeds de melding 'object not found'.
Het lijkt me dus dat Zend niet weet dat hij de url moet ontleden en de bijhorende controller+action openen.

Weet er iemand hoe ik dit kan oplossen?

Alvast bedankt.

9 antwoorden

Gesponsorde links
Offline avdg - 26/02/2011 03:15
Avatar van avdg PHP gevorderde In geval van de controller, geef je beter code van de controller ipv code van de bootstrapper 
Offline DriesA - 26/02/2011 10:59 (laatste wijziging 26/02/2011 11:26)
Avatar van DriesA Lid Hoi,

Dit is de code voor mijn controllers en bootstrapper (inclusief locatie):
htdocs/myProject/application/controllers/IndexController.php:
Plaatscode: 140720
htdocs/myProject/application/controllers/UserController.php:
Plaatscode: 140721
htdocs/myProject/public/index.php
Plaatscode: 140722

Wat ik nu zou verwachten is dat wanneer ik naar http://localhost/myProject/public/user/process zou gaan (url dat from-submit geeft), ik "ok" te zien zou krijgen. In plaats daarvan krijg ik een HTTP error 500.

Alvast bedankt.
Offline MiST - 26/02/2011 17:09 (laatste wijziging 26/02/2011 17:15)
Avatar van MiST Lid En wanneer wordt het form gemaakt volgens jou? 

Want volgens mij blijft het resultaat van getForm() gedurende heel de uitvoering null... Je moet je ervan bewust zijn dat je werkt met klassen en objecten van klassen. Een object bestaat niet voor het gemaakt is. Je moet je formulier dus wel eerst maken.

  1. $form = new Form();


Wil je het bijhouden in je UserController object, moet je het in de scoop van je object doen.

  1. $this->form = new Form();


Denk echter niet dat wanneer je een formulier gemaakt hebt in indexAction() die bij het verzenden van de form dan ook in je object blijft staan. Een pageload = nieuw Controller-object. Dus moet je ook weer je form opnieuw instantiëren in je processAction
Offline avdg - 27/02/2011 03:05
Avatar van avdg PHP gevorderde @MiST: DriesA is maar een beginner in ZF, wind je niet te veel op 

@Dries: Misschien een goed idee om de form eerst in een "model" te steken. Dit wil zeggen dat we een aparte form class maken, om achteraf die code te gebruiken in de controller. Hierdoor heb je minder code in de controller (het principe skinny controllers, fat models).
Zie hiervoor de tutorial op http://framewor...-form.html

Alle code die nodig is om de form te maken steek je dan gewoon in de methode init van je form class (vergeet niet Zend_Form te extenden).


Als je de class hebt, gebruik dan de code boven (in het post van MiST) om de form te laden. Steek deze code in de init methode van je controllers (IndexController en UserController). In principe zou je form dan moeten werken.

En voor de methode processAction mag je de eerste 3 lijntjes in comments uit de comments halen.

De code

  1. $form = $this->getForm();
  2. if (!$form->isValid($_POST)) {
  3. // Failed validation; redisplay form
  4. $this->view->form = $form;
  5. return $this->render('form');
  6. }
  7. $values = $form->getValues();


vervang je door

  1. if (($this->getRequest()->isPost()) && ($this->form->isValid($_POST))) {
  2.  
  3. // Validation succeed
  4. $values = $form->getValues();
  5.  
  6. // continue ...
  7.  
  8. } else {
  9.  
  10. // Validation failed
  11.  
  12. }
Bedankt door: DriesA
Offline MiST - 27/02/2011 11:57 (laatste wijziging 27/02/2011 17:31)
Avatar van MiST Lid Ik wind me niet op. Akkoord, mijn openingszin is niet zo geslaagd maar ik probeer gewoon even enkele belangrijke pijnpunten in het licht te zetten. Volgens mij is de TS niet enkel ZF beginner maar ook OOP beginner, am I right? 

Het is belangrijk dat je de principes van OOP goed begrijpt voor je verdergaat met ZF.

Nog even een beetje inhoudelijke commentaar op avdg zijn post.
* Het is eerder afgeraden PHP globals te gebruiken in ZF omdat zij daar wrappers voor gemaakt hebben. Gebruik dus liever geen $_POST maar $this->getRequest()->getPost() (ook al komt het op hetzelfde neer).

* Steek nooit, maar dan ook nooit formulierinitialisatie code in de init() van je controller. Wat je hier instopt wordt bij ELKE request uitgevoerd. Het kan zijn dat je maar 2 actions hebt en deze alle twee hetzelfde formulier nodig hebben maar dit blijft een slecht ontwerp dan.

* What the hell?! (dit is even niet op avdg bedoeld ;))
  1. return $this->render('form');

Renderen doe je in je view, niet in je Controller. zet <?= $this->form; ?> in je viewscript en je form verschijnt. Hiervoor moet je wel short_open_tag enablen in php.ini of het voluit schrijven: <?php echo $this->form; ?>

That's all folks, carry on 
Offline DriesA - 27/02/2011 12:58
Avatar van DriesA Lid Hey,

Als het fout is, mag/moet het ook gemeld worden 
Ben inderdaad maar een beginner, maar zonder nuttige feedback zoals dit is het ook moeilijker om te leren ;)

Heb dus nu in /application/forms een Loginform.php gemaakt met volgende code:
Plaatscode: 140727

Vervolgens indexcontrller.php aangepast naar dit:
Plaatscode: 140728

UserController.php als volgt:
Plaatscode: 140729

En index.phtml view naar:
Plaatscode: 140730

Gevolg is nu dat ik zelfs het initiele formulier ook niet te zien krijg, maar een HTTP 500 error.
Lijkt dus dat hij form niet kan vinden.

Wat ontbreekt er nog?

Alvast bedankt.

Mvg,
Dries
Offline MiST - 27/02/2011 17:30
Avatar van MiST Lid in je LoginForm.php moet je de variabele $form veranderen door $this.

Dit is hoe OOP in PHP werkt. Het is waarschijnlijk ook de reden voor je error 500 want die variabelen die je gebruikt hebben geen methodes.

Ken/Begrijp je de principes van OOP (Object Oriented programming)?

In je IndexController zou ik de constructie van je formulier toch uit de init() methode houden omwille van bovenstaande reden. (zeker omdat je ook nog een registeraction hebt )

$this->render() moet weg uit je UserController. Dit geeft waarschijnlijk ook een fout. een ActionController heeft geen methode render, tenzij je er zelf een declareert. (Again, OOP principes ;))

je index.phtml is correct, behalve dan het gebruik van <center> tag. Die is deprecated. Gebruik liever "margin: 0 auto" in je CSS. 

By the way, het kan maar een nuttige tip zijn. Zet in je .htaccess de volgende lijn als die er nog niet instaat.

  1. SetEnv APPLICATION_ENV development


Op deze manier krijg je gedetailleerde errormessages.
Vergeet wel niet om development door production te vervangen wanneer je je site live zet ;):)
Bedankt door: DriesA
Offline DriesA - 27/02/2011 18:03
Avatar van DriesA Lid Hoi,

Ik dacht van wel, maar blijkbaar toch niet zo.
Ik heb enkele jaren geleden een cursus OO gezien, maar nooit echt pratisch toegepast (tot nu dan).

Met je opmerkingen krijg ik inderdaad mijn formulier te zien en kan ik weer even verder 
Beide bedankt en waarschijnlijk tot binnenkort voor mijn volgende vraag 
Offline avdg - 28/02/2011 22:17
Avatar van avdg PHP gevorderde Wel, dan mag deze topic in ieder geval dicht denk ik 
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.223s