login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Identiek id met funtie. (Opgelost)

Offline Milo - 23/12/2009 09:18 (laatste wijziging 23/12/2009 09:18)
Avatar van MiloNieuw lid Hallo,

Ik ben verder gegaan met het maken van mijn ubb parser voor mijn nieuwe forum, dit gaat eigenlijk helemaal voorspoedig, maar omdat mij de code tags niet lukte heb ik die van internet gehaald en helemaal kunnen aanpassen op 1 ding na.

Ik wil namelijk boven iedere code een knopje select all zodat als je daarop drukt de gehele code word gelecteerd.

Nu ben ik ook een prutser in javascript en heb ik dat stukje code van internet gehaald, dit werkt ook.

Maar nu het probleem: die knop heeft een id nodig om de inhoud van een <div id="1"> te kunnen selecteren, als dit id overal gelijk is selecteerd hij altijd de eerste code, dit wil ik dus niet.

Mijn vraag: Hoe kan ik zorgen dat ik altijd overal een identiek id mee kan geven.

Wat dacht ik eerst: Ik laat het topic id vanuit de database meesturen, maar je kan meerde code velden in 1 bericht hebben dus dat gaat ook niet, want dan hebben die code velden dezelfde id.

Hoe roep ik mijn highlight aan:
  1. <?php
  2. $string = preg_replace('_\[code\](.*?)\[/code\]_ise', "phphighlite(' \\1 ')", $string);
  3. ?>


hoe ziet die highlight er dan uit:
  1. <?php
  2. function phphighlite($code)
  3. {
  4. //PHP 4+ only
  5.  
  6. if(floor(phpversion()) < 4)
  7. {
  8. $return = $code;
  9. }
  10. else
  11. {
  12. $code = str_replace('<br>', '', $code);
  13. $code = str_replace('<br />', '', $code);
  14. $code = str_replace('&gt;', '>', $code);
  15. $code = str_replace('&lt;', '<', $code);
  16.  
  17. $code = str_replace('&amp;', '&', $code);
  18. $code = str_replace('$', '$', $code);
  19. $code = str_replace('\n', '\n', $code);
  20. $code = str_replace('\r', '\r', $code);
  21. $code = str_replace('\t', '\t', $code);
  22. $code = str_replace('&quot;', '"', $code);
  23.  
  24. $code = stripslashes($code);
  25.  
  26. if(!strpos($code, '<?') and substr($code, 0, 2) != '<?')
  27. {
  28. $code = '<?\n'.trim($code).'\n?>';
  29. $addedtags = 1;
  30. }
  31.  
  32. $oldlevel = error_reporting(0);
  33. error_reporting($oldlevel);
  34. $code = ob_get_contents();
  35.  
  36. $a = explode('<br />', $code);
  37. $b = explode('\n', $code);
  38.  
  39. $c = count($a);
  40. $d = count($b);
  41.  
  42. $data = $c + $d;
  43.  
  44. $return .= '<br /><img src="PAGINAS/CSS/IMAGES/FORUM/SelectAll.png" onClick="fnSelect(\'testarea\')" onmouseover="this.style.cursor=\'pointer\'">';
  45.  
  46. $return .= '<div class="code">';
  47. $return .= '<div class="code-regelnr">';
  48. for($i = '1'; $i < $data; $i++)
  49. {
  50. $return .= $i.'<br />';
  51. }
  52. $return .= '</div>';
  53.  
  54. $return .= '<div class="code-tekst">';
  55. $return .= '<div id="testarea">';
  56. $return .= $code;
  57. $return .= '</div>';
  58. $return .= '</div>';
  59. $return .= '</div>';
  60.  
  61. if($addedtags)
  62. {
  63. $openingpos = strpos($buffer, '<?');
  64. $closingpos = strrpos($buffer, '?');
  65. $return = substr($return, 0, $openingpos).substr($return, $openingpos + 5, $closingpos - ($openingpos + 5)).substr($return, $closingpos + 5);
  66. }
  67. }
  68.  
  69. return $return;
  70. }
  71. ?>

11 antwoorden

Gesponsorde links
Offline MiST - 23/12/2009 10:01
Avatar van MiST Lid maak een functie om <div id="?"> tags te genereren? zet dan een integer op 1 ($divs = 1) in het begin van je document, en elke keer je die methode aanroept, wordt $divs met 1 verhoogd?

Niet zo optimaal me dunkt, maar het werkt wel 
Offline Milo - 23/12/2009 10:05 (laatste wijziging 23/12/2009 10:31)
Avatar van Milo Nieuw lid Whaa, daar had ik nooit op gekomen, ik ga t even proberen te verwezenlijken en dan hier posten, en natuurlijk testen ;)

Gr,


Edit:
Hoe had u dat in gedachte dan want ik heb nu dit:
  1. <?php
  2. $id = 1;
  3. function phpidgenerator($divid)
  4. {
  5. $divid = $id + 1;
  6.  
  7. return $divid;
  8. }
  9. ?>

En dan gaat hij overal een 1 neerzetten :S
Offline Berten - 23/12/2009 10:54
Avatar van Berten PHP beginner Milo:

Je moet ook nog je $id met 1 verhogen.

dus
  1. <?php
  2. $id = 0;
  3. function phpidgenerator($divid)
  4. {
  5. $id++;
  6. $divid = $id + 1;
  7.  
  8. return $divid;
  9. }
  10. ?>


Ik heb het hier zelf niet getest, maar zie niet in waarom dit niet zou werken
Offline Milo - 23/12/2009 11:04
Avatar van Milo Nieuw lid Maar dan staan ze allebei weer op 2 :S
Offline Ultimatum - 23/12/2009 11:14
Avatar van Ultimatum PHP expert Dat komt omdat elke keer als je deze functie aanroept hij $id weer reset naar 0 en dan 2x gaat otellen. Je moet of $id static maken of die moet je ergens anders gaan onthouden.
Offline Milo - 23/12/2009 11:16 (laatste wijziging 23/12/2009 11:16)
Avatar van Milo Nieuw lid Dit klinkt misschien dom maar wat houd static maken in?
Offline NTS64 - 23/12/2009 12:13 (laatste wijziging 23/12/2009 12:14)
Avatar van NTS64 PHP gevorderde Volgens mij doelt Ultimatum op de variable scope...
Je verhoogt de variabele $id telkens met één in je functie, dus in de variable scope van je functie, niet in de globale variable scope... Daarvoor moet je eerst het keyword global voor gebruiken. Maar nog iets, waarom wil je speciaal een functie aanmaken voor een integer met één te verhogen? 
Daar kan je evengoed de operator '++' voor gebruiken:

  1. <?php
  2. $id = 0;
  3. function phphighlite($code)
  4. {
  5. //PHP 4+ only
  6.  
  7. if(floor(phpversion()) < 4)
  8. {
  9. $return = $code;
  10. }
  11. else
  12. {
  13. global $id
  14. $id++;
  15. $code = str_replace('<br>', '', $code);
  16. $code = str_replace('<br />', '', $code);
  17. $code = str_replace('&gt;', '>', $code);
  18. $code = str_replace('&lt;', '<', $code);
  19.  
  20. $code = str_replace('&amp;', '&', $code);
  21. $code = str_replace('$', '$', $code);
  22. $code = str_replace('\n', '\n', $code);
  23. $code = str_replace('\r', '\r', $code);
  24. $code = str_replace('\t', '\t', $code);
  25. $code = str_replace('&quot;', '"', $code);
  26.  
  27. $code = stripslashes($code);
  28.  
  29. if(!strpos($code, '<?') and substr($code, 0, 2) != '<?')
  30. {
  31. $code = '<?\n'.trim($code).'\n?>';
  32. $addedtags = 1;
  33. }
  34.  
  35. $oldlevel = error_reporting(0);
  36. error_reporting($oldlevel);
  37. $code = ob_get_contents();
  38.  
  39. $a = explode('<br />', $code);
  40. $b = explode('\n', $code);
  41.  
  42. $c = count($a);
  43. $d = count($b);
  44.  
  45. $data = $c + $d;
  46.  
  47.  
  48. $return .= '<br /><img src="PAGINAS/CSS/IMAGES/FORUM/SelectAll.png" onClick="fnSelect(\'testarea\')" onmouseover="this.style.cursor=\'pointer\'">';
  49.  
  50. $return .= '<div class="code">';
  51. $return .= '<div class="code-regelnr">';
  52. for($i = '1'; $i < $data; $i++)
  53. {
  54. $return .= $i.'<br />';
  55. }
  56. $return .= '</div>';
  57.  
  58. $return .= '<div class="code-tekst">';
  59. $return .= '<div id="'.$id.'">';
  60. $return .= $code;
  61. $return .= '</div>';
  62. $return .= '</div>';
  63. $return .= '</div>';
  64.  
  65. if($addedtags)
  66. {
  67. $openingpos = strpos($buffer, '<?');
  68. $closingpos = strrpos($buffer, '?');
  69. $return = substr($return, 0, $openingpos).substr($return, $openingpos + 5, $closingpos - ($openingpos + 5)).substr($return, $closingpos + 5);
  70. }
  71. }
  72.  
  73. return $return;
  74. }
  75. ?>

Let op regel 2, 13-14 en 62
Offline MiST - 23/12/2009 12:18 (laatste wijziging 23/12/2009 12:27)
Avatar van MiST Lid in OOP (Object Oriented Programming) betekent dit dat dit voor alle klassen geldt. in niet OOP context heeft dit geen betekenis, denk ik. Ik denk dat de poster in dat geval 'global' bedoelt?

Ik vermoed dat je niet OO werkt, dus zal ik even uitschrijven wat ik dacht te doen.

  1. <?php
  2. $divs = 0;
  3.  
  4. function generateDivId()
  5. {
  6. $divs++;
  7. return $divs;
  8. }


Ik weet wel niet exact meer hoe het met de scope zit in non-OO (ik werk enkel met OO PHP, Zend Framework), maar het zou kunnen dat je $divs global moet maken om dit te doen werken.

EDIT: waarom doe ik nog moeite als iemand me voor is? 

EDIT2: nota op NTS64's reactie.
De global oplossing is niet echt elegant. Ik veronderstel dat je die grote functie aanroept vanuit een lus. Beter is dus om $id mee te geven als argument in je functie. eventueel kan je die op 1 defaulten ($id=1 als tweede argument voor je methode, zo wordt id optioneel en is deze standaard 1 als hij niet meegegeven wordt). Op die manier is het imho beter, en zit je niet in de knoop met de variable scope. (kijk eens aan, een rijmpje! En dat in de hersendodende examenperiode )
Offline Richard - 23/12/2009 15:32
Avatar van Richard Crew algemeen Even offtopic: je maakt nu geen ubb-parser, eerder een ubb-replacer.
Offline Ultimatum - 23/12/2009 15:34
Avatar van Ultimatum PHP expert @NTS64, static niet niet de scope maar de variable word overal onthouden zonder steeds opnieuw declareerd te worden. Dus bijvoorbeeld, public static $id. Maar dit kan alleen met classes en dat gaat hier niet op dus bovenstaande oplossingen zijn beter.
Offline Milo - 23/12/2009 16:06
Avatar van Milo Nieuw lid Bedankt allemaal het werkt inmiddels!

Gr, Milo  
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.234s