login  Naam:   Wachtwoord: 
Registreer je!
 Forum

[PHP/REGEX] Menuitems replacen AND herhalen (Opgelost)

Offline nvp007 - 28/10/2008 16:59 (laatste wijziging 28/10/2008 17:01)
Avatar van nvp007Nieuw lid Ik ben bezig met het maken van een CMS en ben hiermee praktisch afgerond. Ik stuit echter nog op een probleempje.

Het werkt zo: in de database zit (wat nu van toepassing is) 1) een html-template en 2) de pagina's met hun inhoud, titel, url,...

Doormiddel van regex zoek ik in de "html-templates" naar tags, bijvoorbeeld {title} word vervangen door de titel van de huidige pagina en {content} door de inhoud. Nu zou ik echter het menu moeten parsen, iets complexer. Ik dacht eraan om een tag als deze te gebruiken: {menu}{menuitemurl}{menuitemtitle}{/menu}, zodat bijvoorbeeld dit in de praktijk ingevoegd word:

<ul class="menu">
{menu}<li><a href="{menuitemurl}"><strong>{menuitemtitle}</strong></a></li>{/menu}
</ul>

Alles tussen de {menu} en {/menu} tags moet dus herhaald worden naargelang het aantal pagina's (== aantal menuitems). Heeft iemand er een idee van hoe ik dit het best kan aanpakken? Nu geraakt ik er namelijk niet echt uit.


huidige index.php (waarmee de template en content geladen worden)
  1. <?php
  2. // CMS HTML template parser
  3. include("config.php");
  4. $link = mysql_connect($mysql['server'], $mysql['user'], $mysql['pass']);
  5. $db = mysql_select_db($mysql['db'], $link);
  6.  
  7. // HTML template oproepen
  8. $template_query = "SELECT content FROM " . $mysql['template_html'] . " WHERE `site`='test.be'";
  9. $template_result = mysql_query($template_query);
  10. if(mysql_num_rows($template_result) <= 0) {
  11. die('Fout: geen html-template gevonden');
  12. }
  13. $template = mysql_fetch_assoc($template_result); // template: $template['content']
  14.  
  15. // Gevraagde pagina oproepen
  16. if($_GET['page'] && !empty($_GET['page'])) {
  17. $requestedpage = htmlentities($_GET['page']);
  18. }
  19. else {
  20. $requestedpage = "index";
  21. }
  22. $requested_query = "SELECT open, title, content FROM " . $mysql['content'] . " WHERE `site`='test.be' AND `url`='" . $requestedpage . "'";
  23. $requested_result = mysql_query($requested_query);
  24. $requested = mysql_fetch_assoc($requested_result);
  25. if(mysql_num_rows($requested_result) <= 0 || $requested['open'] == 0) {
  26. header('Location: 404.php');
  27. }
  28.  
  29. // Opgevraagde pagina parsen
  30. $finalpage = preg_replace("[{title}]", $requested['title'], $template['content']);
  31. $finalpage = preg_replace("[{content}]", $requested['content'], $finalpage);
  32.  
  33. // Uiteindelijke pagina naar browser verzenden
  34. echo $finalpage;
  35. ?>


Bij voorbaat dank!

2 antwoorden

Gesponsorde links
Offline mark92 - 28/10/2008 19:50
Avatar van mark92 Gouden medaille

Nieuw lid
Bedoel je soms zoiets:

  1. <?php
  2. #INPUT
  3. $sIn = 'blabla{menu}{test1}{test1}{test2}{test2}{/menu}bla bla';
  4.  
  5. #VERDELEN VAN STRING IN 3 DELEN: hetgeen voor het menu, het menu en hetgeen na het menu
  6. list($aOut[0],$aOut[1]) = preg_split('#\{menu\}#',$sIn,2);
  7. list($aOut[1],$aOut[2]) = preg_split('#\{/menu\}#',$aOut[1],2);
  8.  
  9. #VERDELEN VAN HET MENU IN ITEMS
  10. $aOut[4] = explode('{',str_replace('}','',$aOut[1]));
  11.  
  12. #ITEMS VERVANGEN
  13. $i = 1;
  14. $aOut[1] = '';
  15. while($i < count($aOut[4])){
  16. $aOut[1] .= '<li><a href="'.$aOut[4][$i].'"><strong>'.$aOut[4][$i+1].'</strong></a></li>';
  17. $i++;
  18. $i++;
  19. }
  20.  
  21. #EVENTUEEL HERHALEN VAN BEWERKING
  22.  
  23. #OUTPUT
  24. echo $aOut[0].'<ul class="menu">'.$aOut[1].'</ul>'.$aOut[2];
  25.  
  26. #CONTROLE
  27. echo '<pre>'.htmlentities(print_r($aOut,1)).'</pre>';
  28. ?>
Offline nvp007 - 28/10/2008 20:46 (laatste wijziging 28/10/2008 22:03)
Avatar van nvp007 Nieuw lid Ik weet niet zeker of we het wel helemaal over hetzelfde hebben.

De bedoeling is dat wat tussen de {menu} en {/menu} zelfs random kan zijn, maar de tags {menuitemurl} en {menuitemtitle} binnen de {menu}{/menu} worden vervangen door de waardes die horen bij desbetreffende menuitem, deze actie word herhaald voor ieder menuitem.

EDIT: OPLOSSING

Deze code (dankzij pedorus van tweakers.net)
  1. $menus = array();
  2. $query_menulinks = "SELECT title, url FROM " . $mysql['content'] . " WHERE `site`='brightdesign.be' AND `open`=1";
  3. $result_menulinks = mysql_query($query_menulinks);
  4. while($menulinks = mysql_fetch_assoc($result_menulinks)) {
  5. $menus[$menulinks['title']] = $menulinks['url'];
  6. }
  7.  
  8. $content = array();
  9. function parsecallback($matches) {
  10. global $menus, $content;
  11. if ($matches[1] == 'menu') {
  12. $res = '';
  13. foreach ($menus as $item => $url) {
  14. $content['menuitemtitle'] = $item;
  15. $content['menuitemurl'] = $url;
  16. $res .= parsetemplate($matches[2]);
  17. }
  18. return $res;
  19. }
  20. return $content[$matches[1]];
  21. }
  22.  
  23. function parsetemplate($template) {
  24. '#\{(title|content|menu(?:itemurl|itemtitle)?)}(?:(.*?)\{/\1})?#si',
  25. 'parsecallback', $template);
  26. }
  27.  
  28. echo parsetemplate($finalpage);


Toch bedankt  !
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.21s