login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Soort van paging maar hoe?

Offline chth - 17/12/2013 10:15
Avatar van chthLid Hallo

Ik vraag me af op welke manier je een efficiënt nieuwe data/gegevens enz laadt in dezelfde pagina.

Dit is nogal een vage omschrijving dus hier zijn een voorbeeld van wat ik graag zou bekomen maar waar ik zelf geen goed idee van heb hoe dit het best gedaan wordt.

voorbeeld:
Een pagina met daarin een formulierveld, in het formulierveld een paar standaard inputs zoals textboxen en checkboxen enz. daarnaast ook een drop-down menu met gegevens die uit een database worden gehaald, bv een opsomming van categorieën. de enige reden waarom die uit een database gehaald worden is vrij simpel, voor als er bijvoorbeeld een nieuwe wordt aangemaakt.

Hoe wordt het nu dus juist gedaan dat alle gegevens gecontroleerd worden zonder dat er naar een andere pagina verwezen wordt en waarna nieuwe content geladen wordt. Wat ik dus wil is dat ofwel de foutmelding, nieuwe content, een bevestiging, ... op dezelfde pagina getoond wordt.

Worden hiervoor gegevens via POST doorgestuurd op de achtergrond en wordt er bv met hidden fields gewerkt of ...?

Ik zou zulke problemen graag op een efficiënte manier oplossen. Kunnen jullie me hierbij helpen?

Alvast bedankt
Mvg

7 antwoorden

Gesponsorde links
Offline Thomas - 17/12/2013 10:59 (laatste wijziging 17/12/2013 11:25)
Avatar van Thomas Moderator Tenzij het formulier megagroot is, dit formulier intensieve operaties moet uitvoeren bij de verwerking ervan (denk aan het uploaden van bestanden of afbeeldingen waar nog bewerkingen op uitgevoerd moeten worden) of wanneer je verwacht dat dit formulier in een heel kort tijdsbestand supervaak ingevuld gaat worden, lijkt mij dat de efficiëntie (wat bedoel je hier precies mee? CPU- of geheugen-gebruik? de moeite die je browser heeft met het renderen van je (complexe? grote?) formulier?) niet zo snel in het gedrang komt?

Als je een "normaal" formulier verstuurt om verwerkt te worden duurt dit verwerken meestal enkele of enkele tientallen milliseconden. Daarnaast is dit (vanwege de aard van HTTP) een stapsgewijs proces; het is niet iets wat constant een beroep op je resources doet?

In het algemeen is het denk ik waarschijnlijk belangrijker dat het formulier gebruiksvriendelijk is, en dat mag (vind ik) best wat kosten. Je moet het zo zien, je zult altijd een soort van afweging moeten maken. Het meest "efficiënte" is waarschijnlijk een platte HTML pagina met een rigoreuze JavaScript controle. Pas als alles helemaal klopt volgens deze controle stuur je het door naar een (PHP-)script om het te verwerken. Heel efficiënt, maar knetter onvriendelijk. Wat nu als er ergens bij het invullen iets mis gaat waardoor de JavaScript breekt, of dat de JavaScript wel accepteert maar PHP (want daar moet je die controles ook uitvoeren! JavaScript controles alleen zijn NOOIT genoeg) niet? Dan moet iemand het formulier opnieuw invullen? Lijkt mij een goede manier om mensen weg te jagen. Ook zijn alerts knetter lelijk en irritant. We leven niet meer in de jaren 90 . Een veel gebruiksvriendelijkere variant is een formulier wat je te allen tijde kunt versturen, en wanneer er iets fout blijkt te zijn, krijg je het formulier weer te zien, met ALLE invoer die je reeds hebt ingevuld, en de ontbrekende/verkeerd ingevulde velden voorzien van een markering en een foutboodschap met een toelichting van wat er fout is, of een hint van wat men verwacht dat je dan wel in moet vullen. Om dit allemaal bij te houden moet je wel wat werk verrichten, bijvoorbeeld door je POST data tijdelijk op te slaan in een sessie, of de navigatie van je formulier zo in elkaar steken dat je de POST data direct terug in kunt vullen in het formulier.

tl;dr: het is een tradeoff; gebruiksvriendelijkheid lijkt mij bij formulieren belangrijker dan efficiëntie (weet niet eens precies wat ik hier onder zou moeten verstaan).

Je zou het ook zo kunnen zien: uit oogpunt van "efficiëntie" van de gebruiker zou het formulier zo gebruiksvriendelijk moeten zijn dat deze het formulier in één poging goed invult .

Neemt niet weg dat je "common sense" kunt gebruiken bij het maken van een gebruiksvriendelijk formulier. Inefficiënte queries en code moet je altijd van wegsturen...

EDIT: spelling en laatste noot

EDIT: wat ik wel vaak zie, bijvoorbeeld bij registratieformulieren waarbij je een handle/nickname moet kiezen is dat er middels AJAX-calls op de achtergrond wordt gecontroleerd of deze nog beschikbaar is. Dat kost ook wat (HTTP requests, script parsing, databasequeries) maar dat is wel heel erg netjes en gebruiksvriendelijk. Niets is zo irritant als een registratieformulier 20x versturen waarbij je telkens de boodschap krijgt dat die NICKNAME AL IN GEBRUIK IS grrrrrrr.

EDIT: Of bedoel je dat je vaak formulieren maakt, en daarbij niet elke keer het wiel opnieuw wilt uitvinden? Dat soort efficiëntie? Dan loont het misschien de moeite om een framework te gebruiken of er zelf eentje te schrijven, toegespitst op het maken van formulieren. Dat stelt je dan in staat om snel formulieren te bouwen en standaard controles uit te voeren op invoer. Je zou hierbij objectgeoriënteerde code kunnen schrijven. Speerpunten van object georienteerd programmeren zijn herbruikbaarheid en uitbreidbaarheid. Is ook, mits correct toegepast, efficiënt.

EDIT: En het ironische daarvan is, dat doordat je extra complexiteit introduceert, bijvoorbeeld in de vorm van een framework, het geheel ("de code") over het algemeen wat trager wordt.

Wederom een tradeoff:
+complexiteit/gebruikersgemak (voor zowel programmeur als eindgebruiker)
-snelheid

Maar hardware is vandaag de dag (stukken) snel(ler) dus het maakt minder uit dan voorheen hoe (in)efficiënt code is, neemt niet weg dat dit aspect maar buiten beschouwing moet worden gelaten, het speelt -in ieder geval hier- een minder grote rol.
Offline chth - 18/12/2013 12:30
Avatar van chth Lid Hartelijk bedankt voor de uitgebreide uitleg 

Ik had meer gehoopt op een iets praktische beschrijving van hoe dit effectief geprogrammeerd wordt?

Zoals bijvoorbeeld:
Je hebt een pagina met een aantal geregistreerde gebruikers. Per gebruiker heb je de optie om deze te verwijderen, admin te maken enz.

De code om telkens zo een extra opdracht uit te voeren per gebruiker, neem je die ofwel in dezelfde pagina op of roep je telkens een aparte verwijderpagina op om die bewerking uit te voeren.

En stel dat je het in dezelfde pagina opneemt, hoe wordt dit dan geschreven? Door telkens gegevens in sessies te plaatsen, door te sturen via hidden fields met POST of ...?

alvast bedankt ;)


Offline Thomas - 18/12/2013 15:51
Avatar van Thomas Moderator Als je dit zelf wilt gaan schrijven hangt dit af van je programmeerniveau, wat voor kwaliteit het systeem moet hebben en hoe je deze in wilt gaan zetten (wat moet het doen/kunnen).

Is het voor een professionele site, voor een kleine groep gebruikers of is dit meer een soort van programmeeroefening?

Ook zijn er een heleboel standaard pakketten verkrijgbaar, denk bijvoorbeeld aan Joomla.

In je bovenstaande voorbeeld, wat nou niet direct het eenvoudigste is (een beheersysteem voor leden), kun je een heleboel zaken onderscheiden, die je ook apart kunt behandelen:
- een ledenadministratie ("leden admin")
- een rollen/rechten administratie ("rechten admin")
- een soort van authorisatiesysteem die je toegang geeft tot deze functionaliteit ("loginsysteem")
- een formuliersysteem voor het snel bouwen van formulieren/het valideren van de data

Je kunt dit op een heleboel manieren indelen en programmeren, maar welke vorm je ook gebruikt, je indeling zal waarschijnlijk gecentreerd zijn rondom "acties", bijvoorbeeld in het geval van de "leden admin" hierboven:
- het toevoegen van een lid
- het wijzigen van informatie van een lid
- het verwijderen van een lid
- het zoeken van informatie over een lid op grond van zoektermen
- het tonen van een overzicht van leden, gesorteerd en gepagineerd
Dat zijn zaken (acties) die ik in een "leden admin" zou verwachten.

Al deze acties moeten op een of andere manier herkend/geinterpreteerd kunnen worden door een machine. Dit kun je doen door deze acties toegankelijk te maken door het aanroepen van een unieke URL. Stel bijvoorbeeld dat je alle leden-admin-functionaliteit groepeert in één PHP-bestand ledenadmin.php, dan zou je de acties beschikbaar kunnen maken via een parameter in je URL:
ledenadmin.php?actie=gebruiker_toevoegen
En voor bepaalde bewerkingen die betrekking hebben op één specifiek lid, zal je moeten vertellen welk lid dit is:
ledenadmin.php?actie=gebruiker_wijzigen&id=12
ledenadmin.php?actie=gebruiker_verwijderen&id=12
en als je zoekt, geef je de zoekparameters mee:
ledenadmin.php?actie=zoeken&naam=henk

Dan heb je nog de routering van deze URL naar de code die de actie daadwerkelijk uitvoert, want je moet het systeem ook vertellen hoe je dit moet doen als je deze code zelf schrijft.

En je moet er natuurlijk voor zorgen dat niet ieder (ongeauthoriseerd) persoon toegang heeft tot deze acties, het zou namelijk vervelend zijn als iemand leden kan verwijderen door het simpelweg aanroepen van:
ledenadmin.php?actie=gebruiker_verwijderen&id=1
ledenadmin.php?actie=gebruiker_verwijderen&id=2
ledenadmin.php?actie=gebruiker_verwijderen&id=3
et cetera...

De ledeninformatie zit in je database en trek je uit je database op het moment dat je die nodig hebt. Dit hangt af van je actie.

In je sessie zou ik enkel informatie stoppen die te maken heeft met:
- authorisatie informatie, op deze manier wordt onthouden dat je bent ingelogd
- mogelijk zoektermen of de laatst bekeken pagina van je ledenoverzicht
Hier zou ik niet allerhande informatie in proppen die je toch maar 1% van de tijd nodig hebt... Je sessie is NIET bedoeld als rijdend archief, daarvoor heb je je database.

Als je het niet helemaal zelf wilt schrijven, maar snel iets wil bouwen, zou je Zend Framework kunnen proberen. Ik weet verder niet hoe het zit met jouw programmeerniveau of -ervaring, maar op sitemasters staan best een aantal tutorials over Zend Framework die goed te volgen zijn. Je hebt dan wel webruimte nodig die PHP/MySQL ondersteunt en enige ervaring met object georienteerd programmeren en (in het verlengde daarvan) MVC. Als deze termen je niets zeggen zou ik met iets eenvoudigers beginnen. In dat geval is het bekijken van scripts hier (al was het maar voor inspiratie) en het zelf uitproberen / beredeneren van zaken nog de beste leerschool. Dit is ook een geleidelijk proces, het lijkt me niet verstandig in het midden te beginnen als je de basis nog niet helemaal begrijpt...

Ik zou zeggen, probeer eens wat uit, en kom dan met vragen als je vastloopt. Bekijk de tutorials en scripts.
Offline chth - 18/12/2013 18:02
Avatar van chth Lid Wel het is namelijk zo dat ik php graag wel zou kunnen de basis ken ik toch wel al denk ik. Ik ben overlaatst een tijdje bezig geweest met onderstaande code om het probleem van vorige post op te lossen. Daar ik dus totaal niet wist of ik wel juist bezig was ben ik er dan ook maar even mee gestopt. Zou je eens even onderstaande code kunnen bekijken en eventuele opmerkingen geven van wat beter kan of van wat op een andere manier moet worden uitgewerkt?

Zoals je zal zien werk ik dus via commando's (cmd) die ik meegeef in de url samen met de user_id waarna ik dan ook telkens controleer of de persoon over de juiste rechten beschikt.

Hartelijk bedankt voor je tijd die je al aan eerdere reacties spendeerde.

  1. <?php
  2. if (isset($_SESSION['user_id'])) { //user logged in
  3.  
  4. if (isset($_GET['user']) && trim($_GET['user']) != "" && is_numeric($_GET['user'])) { //checking for get['user'] and display menu
  5. echo "<div class='div_menu'>";
  6. echo "<ul class='menu_list'>";
  7. echo "<li><h3></h3></li>";
  8. echo "<li><a href='?p=accounteditor&user=". $_GET['user'] ."&cmd=edit&sub=general' title='Algemeen'>Algemeen</a></li>";
  9. echo "<li><a href='?p=accounteditor&user=". $_GET['user'] ."&cmd=edit&sub=password' title='Wachtwoord wijzigen'>Wachtwoord</a></li>";
  10. if ($_SESSION['rank'] == 3){
  11. echo "<li><a href='?p=accounteditor&user=". $_GET['user'] ."&cmd=edit&sub=rank' title='Rang wijzigen'>Rang</a></li>";
  12. }
  13. echo "</div>";
  14. } else {
  15. echo "<div class='div_menu'>";
  16. echo "Kon menu-items niet ophalen.";
  17. echo "</div>";
  18. }
  19.  
  20. include_once("/includes/dbconnect.php");
  21. if ($_SERVER['REQUEST_METHOD'] == "POST") {
  22. if (isset($_POST['user_id']) && $_POST['user_id'] === $_GET['user'] && isset($_POST['edit']) && $_POST['edit'] == "Wijzigen") { //edit general settings
  23. //array leegmaken
  24. include_once("/includes/functions.php");
  25. $error = array();
  26. $aInput = array();
  27.  
  28. $sql_sel_general = "SELECT emailadres, displayname FROM users WHERE user_id = :user_id";
  29. $stmt_sel_general = $db->prepare($sql_sel_general);
  30. $stmt_sel_general->bindparam(':user_id', $_GET['user'], PDO::PARAM_STR);
  31. $stmt_sel_general->execute();
  32.  
  33. if ($stmt_sel_general->rowcount() > 0) {
  34. $row_general = $stmt_sel_general->fetch(PDO::FETCH_ASSOC);
  35. } else {
  36. $error['no_result'] = "Er is iets misgelopen bij het ophalen van uw gegevens.";
  37. }
  38.  
  39.  
  40. //nog controleren of gegevens al in gebruik zijn
  41.  
  42. if ((isset($_POST['emailadres']) && !empty($_POST['emailadres'])) || (isset($_POST['displayname']) && !empty($_POST['displayname']))) {
  43.  
  44. if (trim($_POST['emailadres']) != "" && valid_mail($_POST['emailadres'])) {
  45. $emailadres = trim($_POST['emailadres']);
  46. $aInput = true;
  47. } else {
  48. $emailadres = $row_general['emailadres'];
  49. $aInput = false;
  50. }
  51.  
  52. if (trim($_POST['displayname']) != "" && strlen(trim($_POST['displayname'])) < 25 && strlen(trim($_POST['displayname'])) > 5) {
  53. $displayname = trim($_POST['displayname']);
  54. $aInput = true;
  55. } else {
  56. $displayname = $row_general['displayname'];
  57. $aInput = false;
  58. }
  59.  
  60.  
  61. } else {
  62. echo "<div class='div_info'>";
  63. echo "Er werd niks gewijzigd.";
  64. echo "</div>";
  65. header("Refresh: 3; ?p=accounteditor&user=". $_POST['user_id'] ."&cmd=edit&sub=general");
  66. }
  67.  
  68. if (count($aInput) > 0) {
  69. if (count($error) == 0) {
  70. $sql_upd_general = "UPDATE users SET emailadres = :emailadres, displayname = :displayname WHERE user_id = :user_id";
  71. $stmt_upd_general = $db->prepare($sql_upd_general);
  72. $stmt_upd_general->bindparam(':emailadres', $emailadres, PDO::PARAM_STR);
  73. $stmt_upd_general->bindparam(':displayname', $displayname, PDO::PARAM_STR);
  74. $stmt_upd_general->bindparam(':user_id', $_POST['user_id'], PDO::PARAM_STR);
  75.  
  76. if ($stmt_upd_general->execute()) {
  77. echo "<div class='div_succes'>";
  78. echo "Uw gegevens werden gewijzigd.";
  79. echo "</div>";
  80. //header("Refresh: 2; ?p=accounteditor&user=". $_POST['user_id'] ."&cmd=edit&sub=general");
  81. } else {
  82. echo "<div class='div_error'>";
  83. echo "Er is iets misgelopen waardoor uw gegevens niet konden gewijzigd worden.";
  84. echo "</div>";
  85. //header("Refresh: 3; ?p=accounteditor&user=". $_POST['user_id'] ."&cmd=edit&sub=general");
  86. }
  87.  
  88. } else {
  89.  
  90. }
  91. } /*else {
  92. echo "<div class='div_info'>";
  93. echo "Er werd niks gewijzigd.";
  94. echo "</div>";
  95. //header("Refresh: 3; ?p=accounteditor&user=". $_POST['user_id'] ."&cmd=edit&sub=general");
  96. }*/
  97.  
  98.  
  99.  
  100. } elseif (isset($_POST['user_id']) && $_POST['user_id'] === $_GET['user'] && isset($_POST['edit']) && $_POST['edit'] == "Wachtwoord wijzigen") { //edit password
  101. //array leegmaken
  102. $error = array();
  103.  
  104. $sql_sel_pass = "SELECT password FROM users WHERE user_id = :user_id";
  105. $stmt_sel_pass = $db->prepare($sql_sel_pass);
  106. $stmt_sel_pass->bindparam(':user_id', $_POST['user_id'], PDO::PARAM_STR);
  107. $stmt_sel_pass->execute();
  108.  
  109. if ($stmt_sel_pass->rowcount() > 0) {
  110. $row_password = $stmt_sel_pass->fetch(PDO::FETCH_ASSOC);
  111. $password = $row_password['password'];
  112. } else {
  113. $error['no_result'] = "Er is iets misgelopen bij het ophalen van uw gegevens.";
  114. }
  115.  
  116. if (!isset($_POST['old_password']) || trim($_POST['old_password']) == "" || md5($_POST['old_password']) !== $password ) {
  117. $error['old_password'] = "Vul uw oud wachtwoord in.";
  118. }
  119.  
  120. if (!isset($_POST['new_password']) || trim($_POST['new_password']) == "" || strlen($_POST['new_password']) < 6 || strlen($_POST['new_password']) > 50) {
  121. $error['new_password'] = "Kies een nieuw wachtwoord tussen de 6 en 50 tekens.";
  122. }
  123.  
  124. if (!isset($_POST['new_password_verif']) || trim($_POST['new_password_verif']) == "" || $_POST['new_password_verif'] !== $_POST['new_password']) {
  125. $error['password_verif'] = "Herhaal uw nieuw wachtwoord.";
  126. }
  127.  
  128. if (count($error) == 0) {
  129. $sql_upd_pass = "UPDATE users SET password = :new_password WHERE user_id = :user_id";
  130. $stmt_upd_pass = $db->prepare($sql_upd_pass);
  131. $stmt_upd_pass->bindparam(':new_password', md5($_POST['new_password']), PDO::PARAM_STR);
  132. $stmt_upd_pass->bindparam(':user_id', $_POST['user_id'], PDO::PARAM_STR);
  133.  
  134. if ($stmt_upd_pass->execute()) {
  135.  
  136. echo "<div class='div_succes'>";
  137. echo "Wachtwoord gewijzigd.";
  138. header("Refresh: 3; ?p=accounteditor&user=". $_POST['user_id'] ."&cmd=edit");
  139. echo "</div>";
  140. } else {
  141. echo "Er is iets misgelopen bij het wijzigen van uw wachtwoord.";
  142. }
  143. } else {
  144.  
  145.  
  146. echo "<div class='div_content_with_left_menu'>";
  147. echo "<div class='change_password_form'>";
  148. echo "<form action='' method='POST'>";
  149. echo "<table>";
  150. echo "<tr><td colspan='2'><h2>Wachtwoord wijzigen</h2></td></tr>";
  151. echo "<tr><td>Oud wachtwoord: </td><td><input "; if (isset($error['old_password'])) {echo "class='input_error'";} else {echo "class='input'";} echo " type='password' name='old_password' /></td></tr>";
  152. echo "<tr><td>Nieuw wachtwoord: </td><td><input "; if (isset($error['new_password'])) {echo "class='input_error'";} else {echo "class='input'";} echo " type='password' name='new_password' /></td></tr>";
  153. echo "<tr><td>Herhaal nieuw wachtwoord: </td><td><input "; if (isset($error['new_password_verif'])) {echo "class='input_error'";} else {echo "class='input'";} echo " type='password' name='new_password_verif' /></td></tr>";
  154. echo "<tr><td></td><td><input type='submit' name='edit' value='Wachtwoord wijzigen' class='button' /></td></tr>";
  155. //echo "<input type='hidden' name='cmd' value='edit_password' />";
  156. echo "<input type='hidden' name='user_id' value='". $_POST['user_id'] ."' />";
  157. echo "</table>";
  158. echo "</form>";
  159. echo "</div>";
  160.  
  161. echo "<div class='change_password_form_error'>";
  162. foreach($error as $error_message) {
  163. echo "$error_message <br />";
  164. }
  165. echo "</div>";
  166. echo "</div>";
  167. }
  168. }
  169. } else {
  170.  
  171. if (isset($_GET['cmd']) && isset($_GET['user']) && trim($_GET['user']) != "" && is_numeric($_GET['user']) && $_GET['cmd'] == "edit") {
  172.  
  173.  
  174. if ($_SESSION['rank'] == 3 || $_SESSION['user_id'] == $_GET['user']) {
  175.  
  176. $error = array();
  177.  
  178. $sql_edit_user = "SELECT emailadres, password, displayname, rank, enable FROM users WHERE user_id = :user_id";
  179. $stmt_edit_user = $db->prepare($sql_edit_user);
  180. $stmt_edit_user->bindparam(':user_id', $user_id, PDO::PARAM_STR);
  181. $user_id = $_GET['user'];
  182. $stmt_edit_user->execute();
  183.  
  184.  
  185.  
  186. if ($stmt_edit_user->rowcount() > 0) {
  187.  
  188. echo "<div class='div_content_with_left_menu'>";
  189. if (!isset($_GET['sub']) || empty($_GET['sub']) || $_GET['sub'] == "general") { //general settings
  190.  
  191. $user_info = $stmt_edit_user->fetch(PDO::FETCH_ASSOC);
  192. $displayname = $user_info['displayname'];
  193. $emailadres = $user_info['emailadres'];
  194.  
  195. echo "<form action='' method='POST'>";
  196. echo "<table>";
  197. echo "<tr><td colspan='3'><h2>Algemeen</h2></td></tr>";
  198. echo "<tr><td>Gebruikersnaam: </td><td> $displayname </td><td> <input type='text' name='displayname' class='input'/></td></tr>";
  199. echo "<tr><td>E-mailadres: </td><td> $emailadres </td><td> <input type='test' name='emailadres' class='input' /></td></tr>";
  200. echo "<tr><td></td><td></td><td><input type='submit' name='edit' value='Wijzigen' class='button' /></td></tr>";
  201. echo "<input type='hidden' name='user_id' value='". $_GET['user'] ."' />";
  202. echo "</table>";
  203. echo "</form>";
  204.  
  205. } elseif (isset($_GET['sub']) && $_GET['sub'] == "password") { //password
  206.  
  207. echo "<form action='' method='POST'>";
  208. echo "<table>";
  209. echo "<tr><td colspan='2'><h2>Wachtwoord wijzigen</h2></td></tr>";
  210. echo "<tr><td>Oud wachtwoord: </td><td><input type='password' name='old_password' class='input' /></td></tr>";
  211. echo "<tr><td>Nieuw wachtwoord: </td><td><input type='password' name='new_password' class='input' /></td></tr>";
  212. echo "<tr><td>Herhaal nieuw wachtwoord: </td><td><input type='password' name='new_password_verif' class='input' /></td></tr>";
  213. echo "<tr><td></td><td><input type='submit' name='edit' value='Wachtwoord wijzigen' class='button' /></td></tr>";
  214. //echo "<input type='hidden' name='cmd' value='edit_password' />";
  215. echo "<input type='hidden' name='user_id' value='". $_GET['user'] ."' />";
  216. echo "</table>";
  217. echo "</form>";
  218.  
  219. } elseif (isset($_GET['sub']) && $_GET['sub'] == "rank") { //rank
  220. if ($_SESSION['rank'] == 3) {
  221.  
  222. } else {
  223. echo "U bent niet gemachtigd om deze bewerking uit te voeren";
  224. }
  225.  
  226. } else {
  227. echo "Er is iets misgelopen.";
  228. }
  229. echo "</div>";
  230. } else {
  231. echo "<div class='div_error'>";
  232. echo "Deze account bestaat niet.";
  233. echo "</div>";
  234. }
  235.  
  236. } else {
  237. echo "U bent niet gemachtigd om deze bewerking uit te voeren.";
  238. }
  239. } else {
  240. echo "Er is iets misgelopen bij het ophalen van de gegevens.";
  241. }
  242. }
  243. } else { //not logged in
  244. echo "U bent niet gemachtigd om deze bewerking uit te voeren.";
  245. }
  246. ?>
Offline Thomas - 18/12/2013 22:22
Avatar van Thomas Moderator Wow haha. echo echo echo echo. Je kunt PHP blokken starten en stoppen hoor .

Anyway, dit is niet echt leesbaar/onderhoudbaar met het stapelen van al die if/elseif/else blokken. Als je zo code schrijft zou ik op zijn minst wat annotatie (commentaar in de code) toevoegen om ervoor te zorgen dat je weet welk deel wat doet.

Voor al deze blokken zou ik aparte actions maken, immers, ze vervullen verschillende rollen: het afdrukken van een formulier, het verwerken van een formulier etc.

In plaats van:

  1. <?php
  2. if (<een of andere conditie>) {
  3. // <heeel lang blok met allerlei code>
  4. } else {
  5. echo "jij mag dit niet";
  6. }
  7. ?>


Kun je ook dit doen:
  1. <?php
  2. if (<een of andere conditie>) {
  3. die('jij mag dit niet');
  4. }
  5. // en vervolgens mag je dit
  6. // <heel lang blok met allerlei code>
  7. ?>

Zo kun je voorkomen dat je al die controles op elkaar moet stapelen. En als je die controles dan ook nog eens netjes opdeelt in acties wordt het geheel een stuk overzichtelijker.

Ik heb ff supersnel iets in OOP in elkaar geflanst, onder andere geinspireerd door Zend Framework en een CMS waar ik in het verleden aan/mee gewerkt heb. Hiermee kun je best snel pagina's etc bouwen, misschien ga ik hier nog een soort van frameworkje van bouwen, probeer het eens uit.

Ook een goede programmeergewoonte is "one entry" (of hoe het ook heet) oftewel één voordeur voor je applicatie, in dit geval index.php. Ik geef hierbij aan hoe de folderstructuur zou moeten zijn:

jouw_folder/index.php
  1. <?php
  2. require_once './pagetype.php'; // the PageType class, from which all other pagetypes are derived
  3.  
  4. $rootDir = getcwd(); // for security, we do not want to include external sources...
  5. $defaultPage = 'default/page';
  6.  
  7. $page = isset($_GET['page']) ? $_GET['page'] : $defaultPage;
  8. $page = str_replace('/', DIRECTORY_SEPARATOR, $page); // Windows/Linux style directory (back)slashes
  9.  
  10. // check if the page we are trying to load exists
  11. if (file_exists($rootDir.DIRECTORY_SEPARATOR.$page.'.php')) {
  12. $content = $rootDir.DIRECTORY_SEPARATOR.$page.'.php';
  13. } else {
  14. // page did not exist after all, load default page, or perhaps an error page
  15. $page = str_replace('/', DIRECTORY_SEPARATOR, $defaultPage);
  16. $content = $rootDir.DIRECTORY_SEPARATOR.$defaultPage.'.php';
  17. }
  18.  
  19. require_once $content;
  20.  
  21. // rewrite $page to a classname (for example admin/members becomes AdminMembers)
  22. $className = implode('', array_map('ucfirst', explode(DIRECTORY_SEPARATOR, $page)));
  23.  
  24. if (class_exists($className)) {
  25. // create an instance of this class and execute its routing routine (will select an appropriate action to perform)
  26. $contentInstance = new $className();
  27. $contentInstance->exec();
  28. } else {
  29. // some error in the naming convention...
  30. die('classname not found: '.$className);
  31. }
  32. ?>


jouw_folder/pagetype.php
  1. <?php
  2. abstract class PageType
  3. {
  4. // determine which action (method) to perform; the default action (method) is actionDefault
  5. public function exec() {
  6. $action = 'action'.(isset($_GET['action']) ? ucfirst($_GET['action']) : 'Default');
  7. if (method_exists($this, $action)) {
  8. $this->$action();
  9. } else {
  10. $this->actionDefault();
  11. }
  12. }
  13.  
  14. // a link function, for convenience
  15. protected function link($page='', $args=array(), $escape=false) {
  16. $link = 'index.php?page='.$page;
  17. if (count($args)) {
  18. $temp = array();
  19. foreach ($args as $k => $v) {
  20. $temp[] = urlencode($k).'='.urlencode($v);
  21. }
  22. $link .= '&'.implode('&', $temp);
  23. }
  24. return ($escape ? htmlentities($link) : $link);
  25. }
  26.  
  27. // all classes which are derived from PageType need to at least implement this method (actionDefault)
  28. // all action-methods you write should either be protected (so you can still extend these)
  29. // or private; they do not have to be public because they should be called through the
  30. // only public method all these PageType classes have: exec()
  31. protected abstract function actionDefault();
  32. }
  33. ?>


jouw_folder/default/page.php
  1. <?php
  2. class DefaultPage extends PageType
  3. {
  4. protected function actionDefault() {
  5. ?>Hello World.<?php
  6. }
  7. }
  8. ?>


En dan wat je maar wilt bijmaken, bijvoorbeeld een ledenadmin:
jouw_folder/admin/members.php
  1. <?php
  2. class AdminMembers extends PageType
  3. {
  4. protected function _menu() {
  5. ?><ul>
  6. <li><a href="<?php echo $this->link('admin/members', array('action' => 'test'), true) ?>">go to test</a></li>
  7. <li><a href="<?php echo $this->link('admin/members', array('action' => 'addMember'), true) ?>">add member</a></li>
  8. </ul><?php
  9. }
  10.  
  11. protected function actionDefault() {
  12. $this->_menu();
  13. ?><p>This is the default member page.</p><?php
  14. }
  15.  
  16. protected function actionTest() {
  17. $this->_menu();
  18. ?>This is a test.<?php
  19. }
  20.  
  21. protected function actionAddMember() {
  22. $this->_menu();
  23. ?><form action="<?php echo $this->link('admin/members', array('action' => 'addMemberProcess'), true) ?>" method="post">
  24. <p><label for="id_user_name">user name</label><input type="text" id="id_user_name" name="user_name" /></p>
  25. <p><button type="submit">add member</button></p>
  26. </form><?php
  27. }
  28.  
  29. protected function actionAddMemberProcess() {
  30. if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  31. echo '<pre>'.print_r($_POST, true).'</pre>';
  32. }
  33. // afterwards redirect -for example- to the overview, like this
  34. // remember redirects are not supposed to be HTML-escaped
  35. /*
  36.   header('Location: '.$this->link('admin/members'));
  37.   exit;
  38.   */
  39. }
  40. }
  41. ?>


aanroepen met jouw_folder/index.php?page=admin/members&action=test et cetera.

Includes voor sessie/database zou je in index.php op kunnen nemen, of in de indivdiuele pagetype classes.

En dit is maar een variant, er zijn er legio verschillende denkbaar, alleen deze werkt redelijk intuitief en is supersimpel. Mogelijk geeft je dit wat inspiratie hoe je je code beter kunt organiseren.
Offline chth - 19/12/2013 19:14
Avatar van chth Lid Dan ga ik mij eerst wat meer verdiepen in OOP.
Weet je hier toevallig ook een goede tutorial of iets dergelijks voor?

Nogmaals bedankt voor je hulp 
Offline Thomas - 20/12/2013 14:39
Avatar van Thomas Moderator Nou, er zit een linkje "tutorials" bovenin de pagina. Blader eens door de PHP rubriek heen zou ik zeggen...

Of, you know, doe eens gek en gooi eens een zoekterm in Google. #YOLO

Je kunt ook in eerste instantie voor een tussenvorm kiezen, in PHP is het prima toegestaan om zowel OOP als procedureel (rechttoe-rechtaan) te programmeren.

Overigens is objectgeoriënteerd programmeren geen noodzakelijke voorwaarde voor het aanbrengen van structuur in je eigen code, maar het kan helpen.
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.363s