*zucht*quote:Op woensdag 19 februari 2014 15:30 schreef ManianMan het volgende:
[..]
Het script kan de dobbelstenen niet vastzetten wel het overige.
I.quote:Op woensdag 19 februari 2014 15:34 schreef KomtTijd... het volgende:
[..]
*zucht*
- Wat zou het script moeten doen?
- Wat gaat er verkeerd?
- Wat heb je zelf al geprobeerd om het probleem te isoleren?
Wel boek?quote:Op woensdag 19 februari 2014 16:38 schreef CrashO het volgende:
Gad-ver-damme.
Wat voor boek is dit?
Variablen binnen quotes, geen accolades. shorthand notaties. Onveilige code. Lappen html in echo's.. een cast naaar int..
De persoon die dit als "lesstof" aansmeert verdient een vuurpeleton
Die code van ManianMan, Hij heeft het over nazoeken in het boek...quote:
quote:Op woensdag 19 februari 2014 15:25 schreef Darkomen het volgende:
Gezien het school werk is, heb je al opgezocht wat een 'Undefined index' is?Gewoon de hele mikmak aangooien met error_reporting(-1) icm met ini_set('display_errors',1)SPOILEROm spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.![]()
Thanksquote:Op woensdag 19 februari 2014 16:42 schreef CrashO het volgende:
[..]
Die code van ManianMan, Hij heeft het over nazoeken in het boek...Nam dus aan dat het uit of aan de hand van een boek is. Die lap met pure code-aids.
Je probleem is trouwens dat je een spatie in de naam van je inputs hebt aan het eind..
name="steen_1 " in je formulier en dan uitlezen met $_POST['steen_1'] gaat niet werken. Haal die spatie eruit en hij werkt.
Ik ben pas begonnen met PHP, heb eerst een hele website gebouwd maar ben nu dus bezig met het echte werk. Ik ben dus nog in de leerfase. Als ik niet weet wat er fout kan zijn, dan kan ik uren de codes bewerken.quote:Op woensdag 19 februari 2014 15:45 schreef KomtTijd... het volgende:
"Hij doet het niet" is geen antwoord op de vraag "wat gaat er verkeerd"
En "de tekst controleren en een random functie veranderen" is geen antwoord op de vraag "wat heb je gedaan om het probleem te isoleren".
Ga eerst eens na WAT het niet doet. En dan WAAROM dat het niet doet. Kortom leer debuggen.
Het boek 'Academic Service basiscursus PHP 5.4' van Victor Peters, welk boek raden jullie mij dan aan?quote:Op woensdag 19 februari 2014 16:38 schreef CrashO het volgende:
Gad-ver-damme.
Wat voor boek is dit?
Variablen binnen quotes, geen accolades. shorthand notaties. Onveilige code. Lappen html in echo's.. een cast naar int..
De persoon die dit als "lesstof" aansmeert verdient een vuurpeletonVisualBasic docent die omgeschoolt is naar php?
Tip 1: Gebruik indenting zodat je code leesbaar en onderhoudbaar is!quote:Op woensdag 19 februari 2014 14:33 schreef ManianMan het volgende:
Weet iemand wat ik fout doe? Ik wil dus een Yahze spelletje maken zodat je geen dobbelstenen nodig hebt. Echter gaat er iets mis
( ! ) Notice: Undefined index: steen_0 in D:\wamp\www\hoofdstuk7\Yahze.php on line 30
( ! ) Notice: Undefined index: steen_1 in D:\wamp\www\hoofdstuk7\Yahze.php on line 30
( ! ) Notice: Undefined index: steen_2 in D:\wamp\www\hoofdstuk7\Yahze.php on line 30
( ! ) Notice: Undefined index: steen_3 in D:\wamp\www\hoofdstuk7\Yahze.php on line 30
( ! ) Notice: Undefined index: steen_4 in D:\wamp\www\hoofdstuk7\Yahze.php on line 30
[..]
...Daarom moet je leren debuggen. En niet bij de eerste de beste undefined index je complete code ergens op een forum dumpen en wachten tot iemand zich hard genoeg verveelt om een spatie voor je eruit te vissen.quote:Op woensdag 19 februari 2014 17:12 schreef ManianMan het volgende:
Ik ben pas begonnen met PHP, heb eerst een hele website gebouwd maar ben nu dus bezig met het echte werk. Ik ben dus nog in de leerfase. Als ik niet weet wat er fout kan zijn, dan kan ik uren de codes bewerken.
Dank je wel voor de tipsquote:Op woensdag 19 februari 2014 17:14 schreef zoem het volgende:
[..]
Tip 1: Gebruik indenting zodat je code leesbaar en onderhoudbaar is!
Tip 2: Gebruik var_dump() om te controleren wat de inhoud van een variabele is. Echo is daar niet geschikt voor.
Tip 3: Html-forms ondersteunen array data via name="naam[sleutel]", zodat je niet naam_nummer hoeft te doen.
Tip 4: Valideer de user data ($_POST), al kan ik me voorstellen dat dat voor nu niet je belangrijkste punt is.
Endif/endfor zou ik niet in pure php-code gebruiken, tenzij indenting onhandig wordt (o.a. templates). Is geheel persoonlijke voorkeur, maar wel common practice in php.
Als ik die andere testcode vervang door deze krijg ik:quote:
Het formulier wordt evengoed succesvol verzonden.quote:Array ( [chronoform] => keuze_form [event] => submit [Itemid] => 108 [option] => com_content [view] => article [id] => 4 [input_text_12] => Naam [input_text_13] => straat [input_text_14] => adres [input_text_15] => 0612345678 [input_text_16] => @hotmail.com [input_radio_17] => optieA [chrono_verification] => NSmDa [input_submit_18] => Submit [9bb14d3f9a07a586dbbbb6be7abe30e5] => 1 [IPADDRESS] => 77.164.90.163 )
Ik zie anders niks aan radioboxes wat een array moet zijn.quote:Op woensdag 19 februari 2014 19:01 schreef karton2 het volgende:
[..]
Als ik die andere testcode vervang door deze krijg ik:
[..]
Het formulier wordt evengoed succesvol verzonden.
1 2 3 4 5 | <?php if ( !isset($form->data['radioboxes']) || count($form->data['radioboxes']) == 0 ) { return; } ?> |
Vraagje, staat deze opdracht letterlijk zo in het boek beschreven?quote:Op woensdag 19 februari 2014 17:20 schreef ManianMan het volgende:
[..]
Dank je wel voor de tips, ik ga ze direct in gebruik nemen oftewel via trial & error maar het ging mij eigenlijk om dat mijn vriendin die opgenomen is in het ziekenhuis te Rotterdam en haar vader die bij haar is dit kunnen gebruiken om yahtzee te spelen.
Ik heb het overgetypt dus jaquote:Op woensdag 19 februari 2014 19:37 schreef totalvamp het volgende:
[..]
Vraagje, staat deze opdracht letterlijk zo in het boek beschreven?
Verbranden of terugbrengen. Dit is bagger zoals eerder verteld..quote:
Kan je dat uitleggen in wat begrijpelijker taal?quote:Op woensdag 19 februari 2014 19:36 schreef totalvamp het volgende:
[..]
Ik zie anders niks aan radioboxes wat een array moet zijn.
Waarschijnlijk knalt hij er al uit met
[ code verwijderd ]
aangezien die data niet bestaat.
1 2 3 4 | <?php $cars=array("Volvo","BMW","Toyota"); echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . "."; ?> |
SPOILEROm spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
quote:Op woensdag 19 februari 2014 20:14 schreef karton2 het volgende:
[..]
Kan je dat uitleggen in wat begrijpelijker taal?
Hardop gedacht geschreven:
Wat ik begrijp is dat een array een soort map is waar je informatie in kan opslaan.
Als ik dit voorbeeld zie:
[ code verwijderd ]
Dan heet de array (de map dus) "$cars" en de informatie die in die array is opgeslagen: Volvo, BMW en Toyota.
Echo kan je op het scherm weergeven wat je in de array hebt staan.?
In mijn code zie ik die array weer terugkomen met de naam "$files_array", met daarin de link naar twee .pdf bestanden.
Paar regels verder bij "foreach" komt "$files_array" weer terug waarin de twee opties van de radioboxes staan beschreven: $k en $v.
Bij "if" staat dat als $k is gekozen dan moet hij de data uit de radiobox verwerken; hetzelfde geldt voor $v.
Hoe weet hij dan eigenlijk dat $k pdf01 is en en $v bij pdf02..?
Ik probeer het gewoon te begrijpen, maar het lukt niet echt
In ieder geval voor het gemak de php code toegevoegd.Ik heb deze gekregen van mijn broer maar welk boek raad je dan aan?SPOILEROm spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
Ik lees zelf geen PHP boeken, vooral omdat als het boek uitkomt sommige technieken alweer verouderd zijn.quote:Op woensdag 19 februari 2014 20:16 schreef ManianMan het volgende:
[..]
Ik heb deze gekregen van mijn broer maar welk boek raad je dan aan?
quote:Op woensdag 19 februari 2014 20:14 schreef karton2 het volgende:
[..]
Kan je dat uitleggen in wat begrijpelijker taal?
Hardop gedacht geschreven:
Wat ik begrijp is dat een array een soort map is waar je informatie in kan opslaan.
Als ik dit voorbeeld zie:
[ code verwijderd ]
Dan heet de array (de map dus) "$cars" en de informatie die in die array is opgeslagen: Volvo, BMW en Toyota.
Echo kan je op het scherm weergeven wat je in de array hebt staan.?
In mijn code zie ik die array weer terugkomen met de naam "$files_array", met daarin de link naar twee .pdf bestanden.
Paar regels verder bij "foreach" komt "$files_array" weer terug waarin de twee opties van de radioboxes staan beschreven: $k en $v.
Bij "if" staat dat als $k is gekozen dan moet hij de data uit de radiobox verwerken; hetzelfde geldt voor $v.
Hoe weet hij dan eigenlijk dat $k pdf01 is en en $v bij pdf02..?
Ik probeer het gewoon te begrijpen, maar het lukt niet echt
In ieder geval voor het gemak de php code toegevoegd.Hoe kan ik dit makkelijk uitleggenSPOILEROm spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
Zie een array als een lijst van dingen. Elk ding kan een naam hebben.
1
2
3
4
5
6
7
8
9
10<?php
// Deze array bevat geen keys
$cars = ['Audi', 'Opel'];
//Deze wel
$car = [
'merk' => 'Audi',
'model' => 'a8'
];
?>
In het onderste voorbeeld heb je dus een array waarbij je de keys zelf hebt neergezet.
Als je nu het volgende zou doen met deze arrays:
1
2
3
4
5
6
7
8
9
10
11<?php
foreach($cars as $key => $brand) {
echo $key; // Dit zal 0 en 1 zijn
echo $brand; // Audi, Opel
}
foreach($car as $k => $v) {
echo $k; // Merk, Model
echo $v; // Audi, a8
}
Wat foreach doet is dus over alle waarden in een array lopen en daarvan de key(ookwel index genoemd) en de waarde doorgeven.
Als je zelf geen keys meegeeft zal hij altijd bij 0 beginnen en dan optellend.
[ Bericht 0% gewijzigd door #ANONIEM op 19-02-2014 20:43:11 ]
Ik deel deze mening volledigquote:Op woensdag 19 februari 2014 20:20 schreef totalvamp het volgende:
Ik lees zelf geen PHP boeken, vooral omdat als het boek uitkomt sommige technieken alweer verouderd zijn.
Wat je moet gaan leren is denken in Classes en Objecten en op voorhand bepalen wat je nodig hebt.
Ik zou dus een tutorial opzoeken over hoe je een class maakt en deze gebruikt.
Een framework is handig inderdaad, ik zou het alleen niet bij 1 laten.quote:Op woensdag 19 februari 2014 21:12 schreef zoem het volgende:
Het werken met een degelijk framework (Zend Framework, Symfony, etc) helpt ook om grip te krijgen op de werking en gedachte achter OOP-structuren. Echter moet je dan wel al wat basiskennis bezitten. Iets maken is uiteindelijk de beste leerschool.
quote:Op woensdag 19 februari 2014 21:12 schreef zoem het volgende:
Het werken met een degelijk framework (Zend Framework, Symfony, etc) helpt ook om grip te krijgen op de werking en gedachte achter OOP-structuren. Echter moet je dan wel al wat basiskennis bezitten. Iets maken is uiteindelijk de beste leerschool.
quote:Op woensdag 19 februari 2014 21:15 schreef totalvamp het volgende:
[..]
Een framework is handig inderdaad, ik zou het alleen niet bij 1 laten.
Helemaal mee eens, maar als je nog niet weet wat een array is, heb je nog wel een héééééééle lange weg te gaan voordat je je in ditsoort dingen wilt gaan verdiepen.quote:Op woensdag 19 februari 2014 21:18 schreef ursel het volgende:
conferences, gebruikersgroepen bezoeken en webinars volgen om te zien waar technieken heen gaan vandaag de dag.
Dankzij jouw uitleg snap mijn code nu wat beter, dankjewel!quote:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | Data Array: Array ( [option] => com_chronoforms [tmpl] => component [chronoform] => inschrijf_form [event] => submit [Itemid] => [input_text_12] => naam [input_text_13] => straat [input_text_14] => postcode / plaats [input_text_15] => tel [input_text_16] => email [input_radio_17] => radiobox keuze [chrono_verification] => AE3zY [input_submit_18] => Submit [a65f6c919aedc844149f022974440e8d] => 1 ) Validation Errors: Array ( ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php if ( !isset($inschrijf_form->data['input_radio_17']) || count($inschrijf_form->data['input_radio_17']) == 0 ) { return; } $files_array = array ( 1 => JPATH_SITE.'http://www.etcetera.pdf', 2 => JPATH_SITE.'http://www.etcetera.pdf', ); $attach_files = array(); foreach ( $files_array as $k => $v ) { if ( in_array($k, $inschrijf_form->data['input_radio_17']) ) { $attach_files[] = $v; } } $inschrijf_form->data['file_array'] = $attach_files; print_r($_POST) ?> |
Ja, de admin ontvangt een email met daarin de ingevulde gegevens.quote:Op donderdag 20 februari 2014 00:38 schreef zoem het volgende:
Even los van de bijlage, wordt er uberhaupt wel een mail gestuurd na het submitten van het formulier? Als dat al niet werkt ligt het probleem niet bij de bijlage.
Probeer eerst eens terug begrijpen wat je code precies doet voordat je random dingen gaat aanpassen. wat je nu hebt staan slaat namelijk helemaal nergens op.quote:Op donderdag 20 februari 2014 00:18 schreef karton2 het volgende:
De PHP mét inschrijf_form en input_radio_17:
[ code verwijderd ]
Het formulier verstuurt nog steeds geen PDF naar de gebruiker.
Mijn vraag is echter of het formulier en de PHP in theorie zou moeten werken.
Zo ja; dan weet ik dat de code klopt en dat ik verder zoeken naar een instelling die ik over het hoofd zie.
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | <?php /** * Bouw generieke generator op met eventuele extra data uit child classes * * Voorbeeld voor de options * $options = array( * 'allTpls' => 'getAllFormTpls', * 'listTpl' => '/generator/listTemplates', * 'elementTpl' => '/generator/element', * 'generatorTpl' => '/generator/generator', * 'modifyTpl' => '/generator/modify', * 'configurationTpl' => '/generator/configuration', * ); * * @param string $type Generator type, bijv. report, form. Zal bijv. worden gebruikt in de benanimg van id's in html etc * @param array $options array met opties, zie hierboven voor alle mogelijk onderdelen * @throws \library\generator\Exception Rethrows alle exceptions * @return void */ public function __construct($type, $options) { parent::__construct($this->dbOptions); //bouw db in de OMS parent class op try { $this->setOptions($options); //set $this->options } catch (Exception $exc) { throw $exc; //rethrow } $this->setObjects($this->dbOptions); //haal alle toegankelijke objecteninformatie op dmv een functie in de ixPlanta class $this->secure = new Secure(); //instantieer de secure class try { $this->setType($type); //set $this->type } catch (Exception $exc) { throw $exc; //rethrow } try { //set $this->company $this->setCompany(true); //@TODO ondersteuning voor meerdere companies inbouwen? } catch (Exception $exc) { throw $exc; //rethrow } $this->setProject(); //set project en projectDbName gebaseerd op de IXPLATTFORM constante $this->setDesign(); //set design doc gebaseerd op de IXPLATTFORM constante try { $this->setViews(); //set $this->views met alle views uit $this->options } catch (Exception $exc) { throw $exc; //rethrow } try { $this->setTemplates(); //set $this->templates met alle templates uit $this->options } catch (Exception $exc) { throw $exc; //rethrow } try { $this->setChunkTplChunks(); //set $this->chunktpl met alle templates uit $this->templates } catch (Exception $exc) { throw $exc; //rethrow } try { $this->setUserGroupNames(); //set $this->userGroupNames } catch (Exception $exc) { throw $exc; //rethrow } } public function setType($type){ if (isset($type) && is_string($type)) { $this->type = $type; //set type } else { throw new \Exception('Invalid type'); } }?> |
En dat is nu niet het geval.quote:You should not be catching the exception unless you intend to do something meaningful.
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php try { ga_dood(); } catch (Exception $e) { # Ik weet dat ik doodga, maar het boeit niet, tenzij ik foutmelding X krijg if ($e->getMessage() == "Nu moet je wel doodgaan") { throw($e); } } # life is like a box of chocolates ?> |
Ik las heel jouw post en dacht ik ga posten erop, tot ik deze post lasquote:Op donderdag 20 februari 2014 10:07 schreef Sitethief het volgende:
Hmm, ik heb ze nu gewoon verwijderd, las net ergens dit:
[..]
En dat is nu niet het geval.
De belangrijkste regels voor het werken met excepties zijn:quote:Op donderdag 20 februari 2014 10:07 schreef Sitethief het volgende:
Hmm, ik heb ze nu gewoon verwijderd, las net ergens dit:
[..]
En dat is nu niet het geval.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php /** * @param string $type * * @throws \InvalidArgumentException */ public function setType($type) { if (!is_string($type) { throw new \InvalidArgumentException('$type must be a string'); } $this->type = $type; } ?> |
Asserts hebben het nadeel dat ze uitgezet kunnen worden. Ik kan dus instellen dat ze bij mij niet afgaan, waardoor ik niet gewaarschuwd wordt voor ongeldige waardes. Om die reden vind ik asserts eigenlijk geen geschikte optie voor public API, en wel voor private en protected functies.quote:Op donderdag 20 februari 2014 12:51 schreef slacker_nl het volgende:
Wat ik vaak doe is dat ik ga kijken of de situatie goed is om iets te doen, meestal assert ik dan de opties en ga ik ook dood als het fout gaat.
Dus als $this->set_company($company); doodgaat omdat company undef is:
Dan zorg ik ervoor dat 1) de param niet undef kan zijn en dat m'n caller er gelijk uitklapt en $company bijvoorbeeld bepaalde waarde is controleer ik vooraf of die waarde wel correct is en dat doen we dan met bijvoorbeeld een constante. En dan kan je door je gehele applicatie dat checken en mogelijk Exceptions throwen.
Alleen zijn al die dingen geen userinput maar input van classes die op deze class bouwen, die dus een generator willen opbouwen met hun instellingen, dus bijv. een class van mijn collega gebouwd.quote:Op donderdag 20 februari 2014 23:04 schreef Light het volgende:
[..]
De belangrijkste regels voor het werken met excepties zijn:
1. Gebruik excepties alleen voor exceptionele situaties.
2. Gooi nooit Exception (maar bijvoorbeeld een InvalidArgumentException)
3. Vang altijd Exception, niet alleen het specifieke type dat wordt gegooid
Dus als je bijvoorbeeld user input aan het controleren bent, moet je geen excepties gooien. Het is (in mijn ogen) verwacht gedrag dat die input niet voldoet aan de eisen die je eraan stelt.
[ code verwijderd ]
Docblocks zijn heel handig om aan te geven wat een functie doet, welke argumenten er worden verwacht, welk type er teruggegeven wordt en wat er aan excepties kan worden verwacht. Je kunt er uiteraard ook bijzetten wat een functie doet.
Als je de code gepost door Sitethief bedoelt: die (constructor) is fout, maar hij heeft het daarna op de juiste manier gecorrigeerd. Het tussendoor opvangen van exceptions en het daarna gelijk rethrowen is natuurlijk onzinnig. Niet alleen vanwege het feit dat het overbodige code is, maar het kan ook de call stack trace beïnvloeden. Ik ben het dan ook geheel eens met Light over het gebruik van exceptions.quote:
Hoe vaak ben je al 'doodgegaan' als ik vragen mag? Ik vind het zo'n gekke bewoordingquote:Wat ik vaak doe is dat ik ga kijken of de situatie goed is om iets te doen, meestal assert ik dan de opties en ga ik ook dood als het fout gaat.
Ik ben al heel vaak doodgegaan. En m'n code nog meer!quote:Op vrijdag 21 februari 2014 10:26 schreef zoem het volgende:
[..]
Als je de code gepost door Sitethief bedoelt: die (constructor) is fout, maar hij heeft het daarna op de juiste manier gecorrigeerd. Het tussendoor opvangen van exceptions en het daarna gelijk rethrowen is natuurlijk onzinnig. Niet alleen vanwege het feit dat het overbodige code is, maar het kan ook de call stack trace beïnvloeden. Ik ben het dan ook geheel eens met Light over het gebruik van exceptions.
[..]
Hoe vaak ben je al 'doodgegaan' als ik vragen mag? Ik vind het zo'n gekke bewoording
Je frontend code moet dat goed afvangen, je backend code moet doodgaan op het moment dat de input incorrect is. Ipv Exceptions zou je ook nog trigger_error kunnen gebruiken.quote:Op donderdag 20 februari 2014 23:04 schreef Light het volgende:
Dus als je bijvoorbeeld user input aan het controleren bent, moet je geen excepties gooien. Het is (in mijn ogen) verwacht gedrag dat die input niet voldoet aan de eisen die je eraan stelt.
Dat is waar, maar ik maak asserts publiek, zodat als je ze wilt gebruiken het wel kan, en als je het niet doet, doe ik het alsnog voor je, alleen kan je vooraf al zien of een call zou gaan werken of niet. Het is een beetje defensief programeren.quote:Op donderdag 20 februari 2014 23:08 schreef Light het volgende:
[..]
Asserts hebben het nadeel dat ze uitgezet kunnen worden. Ik kan dus instellen dat ze bij mij niet afgaan, waardoor ik niet gewaarschuwd wordt voor ongeldige waardes. Om die reden vind ik asserts eigenlijk geen geschikte optie voor public API, en wel voor private en protected functies.
Ik heb zelf dit in mijn code:quote:Op vrijdag 21 februari 2014 10:53 schreef slacker_nl het volgende:
[..]
Dat is waar, maar ik maak asserts publiek, zodat als je ze wilt gebruiken het wel kan, en als je het niet doet, doe ik het alsnog voor je, alleen kan je vooraf al zien of een call zou gaan werken of niet. Het is een beetje defensief programeren.
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | <?php namespace System\Core; use \System\Core\Container; use System\Core\Traits\ArrayAccessor; use System\Core\Traits\ArrayIterate; /** * Class Base * @package System\Core */ class Base implements \ArrayAccess, \Iterator { use ArrayAccessor, ArrayIterate; /** * @param callable $closure */ public function __construct(\Closure $closure = null) { if(is_callable($closure)) { return $closure($this); } return $this; } /** * @param Container\Settings $settings */ public function setSettings(Container\Settings $settings = null) { if(is_object($settings)) { foreach($settings as $k => $v) { $this->{$k} = $v; } } } /** * @param Container\Settings $settings */ public function setDependencies(Container\Settings $settings = null) { $this->setSettings($settings); } /** * @param $name * @param array $args * @return bool */ public function __call($name, Array $args = []) { $type = substr($name, 0, 3); $var = strtolower(substr($name, 3)); switch($type) { case 'set': $this->$var = $args[0]; break; case 'get': return isset($this->$var)?$this->var:false; break; } } } |
Ik heb ook code gezien die gebruikt werd om te bepalen of iets wel of niet geldig is en die een exceptie gooide in het geval de input niet geldig was. Als de input wel geldig was, werd gewoon netjes true teruggegeven.quote:Op vrijdag 21 februari 2014 10:50 schreef slacker_nl het volgende:
[..]
Je frontend code moet dat goed afvangen, je backend code moet doodgaan op het moment dat de input incorrect is. Ipv Exceptions zou je ook nog trigger_error kunnen gebruiken.
Ja bij sommige frameworks zie je inderdaad een InvalidInputException o.i.d.quote:Op vrijdag 21 februari 2014 15:06 schreef Light het volgende:
[..]
Ik heb ook code gezien die gebruikt werd om te bepalen of iets wel of niet geldig is en die een exceptie gooide in het geval de input niet geldig was. Als de input wel geldig was, werd gewoon netjes true teruggegeven.
Afhankelijk van de situatie kan het valide zijn om inputcontrole bij een setter te plaatsen, en dan een exceptie te gooien als de input niet geldig is. Je kunt er ook voor kiezen dat niet te doen en in de class een method validate() oid te implementeren die dan gewoon true of false teruggeeft afhankelijk van de waardes van de verschillende velden. En daar zijn ook combinaties van mogelijk.
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | <?php namespace Controller; use Model\User; use System\Core\Controller; use System\Core\Form\Element; use System\Core\Form\Input; use System\Helpers\Html; /** * Class Login * @package Controller */ class Login extends Controller { public function index() { $this->form->addElement(new Element\Fieldset([ 'elements' => [ new Input\Text([ 'name' => 'username', 'required' => true, 'baseValue' => 'Username', 'validator' => ['Length' => ['min' => 3]] ]), new Input\Password([ 'name' => 'password', 'baseValue' => 'Password', 'validator' => ['Length' => ['min' => 5]] ]), new Element\Submit([ 'name' => 'login', 'value' => 'Login' ]) ] ])); if($this->request->isPost()) { if($this->form->validate()) { $user = User::find_by_username($this->request->post('username')); if(isset($user->id)) { if(password_verify($this->request->post('password'),$user->password)) { $_SESSION['user'] = ['id' => $user->id]; $user->login_attempts = 0; $this->url->redirect($this->url->createUrl()); } else { $user->login_attempts += 1; } $user->save(); } } } $this->template->load('login', ['form' => $this->form]); echo $this->template; } } |
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | <?php namespace System\Core; /** * Class Form * @package System\Core */ class Form extends Base { private $elements = array(); public $method = 'post'; public $name = ''; public $valid = true; public $enctype = 'application/x-www-form-urlencoded'; /** * @param $element */ public function addElement($element) { $this->elements[$element->name] = $element; } public function show() { foreach($this->elements as $e) { echo $e; } } /** * @return bool */ public function validate() { foreach($this->elements as $e) { if(false === $e->validate()){ $this->valid = false; } } return $this->valid; } /** * @return array */ public function __sleep() { return $this->elements; } /** * @return string */ public function __toString() { $output = '<form method="' . $this->method . '" name="' . $this->name . '" enctype="'.$this->enctype.'">'; foreach($this->elements as $e) { $output .= $e; } $output .= '</form>'; return $output; } } |
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | <?php namespace System\Core\Form; use \System\Core; use \System\Core\Form\Validator; /** * Class Input * @package System\Core\Form */ class Input extends Element { public $required = false; public $baseValue = ''; public $checked = false; public $validator; public $description; public $options = array(); public $value = ''; public $min; public $max; public $step; public $validMessage = ''; public $valid; protected $settings; use Core\Traits\getObjVars; /** * @param array $data */ public function __construct(array $data) { foreach($data as $k => $v) { $this->$k = $v; } if($this->request->isPost()) { if(false !== $this->request->post($this->name)) { $this->value = $this->request->post($this->name); } } } /** * @return string */ public function getClass() { return isset($this->class)?' class="'.$this->class.'"':''; } /** * @return string */ public function getRequired() { return false === $this->required?'':' required aria-required="true"'; } /** * @return string */ public function getMinMaxStep() { return ' min="'.$this->min.'" max="'.$this->max.'" step="'.$this->step.'" '; } /** * @return string */ public function getValue() { return ' value="'.$this->value.'"'; } /** * @return string */ public function getLabel() { return isset($this->label)?'<label for="'.$this->name.'">'.$this->label.'</label>':''; } /** * @return string */ public function getDescribed() { return isset($this->description)?'aria-describedby="'.$this->name.'-format"':''; } /** * @return string */ public function getDescription() { return isset($this->description)?'<span id="'.$this->name.'-format" class="help">'.$this->description.'</span>':''; } /** * @param $value */ public function setValue($value) { $this->value = $value; } } |
Ik zou in die Form class geen field $valid maken maar het resultaat gewoon binnen de functie houden. Verder kun je die validate() functie nog wat optimaliseren door te stoppen met valideren zodra je een element gevonden hebt dat niet valid is (maar dat kan uiteraard niet als validate() meer doet dan alleen valideren).quote:Op vrijdag 21 februari 2014 15:27 schreef totalvamp het volgende:
[..]
Ja bij sommige frameworks zie je inderdaad een InvalidInputException o.i.d.
Wat ik zelf doe is de validatie op de validate() manier
Dit is bijvoorbeeld mijn logincontroller
[ code verwijderd ]
Form class:
[ code verwijderd ]
Input class:
[ code verwijderd ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php /** * @return bool */ public function validate() { $valid = true; foreach($this->elements as $e) { if(false === $e->validate()){ $valid = false; break; } } return $valid; } ?> |
Dit is meer voor eventueel een extra optie zodat je later in de code ook kan kijken of je form geldig was.quote:Op vrijdag 21 februari 2014 21:54 schreef Light het volgende:
[..]
Ik zou in die Form class geen field $valid maken maar het resultaat gewoon binnen de functie houden. Verder kun je die validate() functie nog wat optimaliseren door te stoppen met valideren zodra je een element gevonden hebt dat niet valid is (maar dat kan uiteraard niet als validate() meer doet dan alleen valideren).
[ code verwijderd ]
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |