Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Joomla - content plugin, wyrażenia regularne
Forum PHP.pl > Forum > Przedszkole
Age1869
Cześć! Po raz kolejny problem. Muszę napisać niewielki content plugin do Joomli 2.5.

Mam praktycznie wszystko gotowe. Ale wróćmy do początku, założenia komponentu. W treści wybranych artykułów wstawiamy odpowiednie znaczniki, w tym wypadku: {zaplac_dotpay}coś tam coś tam{/zaplac_dotpay}. W miejsce tego tekstu ma się pojawić odpowiedni formularz (mikropłatności dotpay), po wpisaniu kodu otrzymanego np SMSem z pomocą metody GET następuje sprawdzenie poprawności kodu i jeżeli jest on poprawny, wyświetla się treść, która w oryginale była pomiędzy znacznikami. Wszystko można zobaczyć na stronie głónwej - aptekastatim.pl/portal

Plugin się pięknie instaluje, wszystko ładnie i w ogóle, poza faktem, że nie podmienia tekstu.

Kod:
  1. <?php
  2.  
  3. // no direct access
  4. defined('_JEXEC') or die;
  5.  
  6. function dotpay($artykul, $this_is) {
  7. // podpięcie parametrów pod ładne zmienne - premium SMS
  8. $numer = $this_is->params->get('numer');
  9. $tresc = $this_is->params->get('tresc');
  10. $koszt = $this_is->params->get('koszt');
  11. $siec = $this_is->params->get('siec');
  12. $reg = $this_is->params->get('reg');
  13. $kto = $this_is->params->get('kto');
  14. // podpięcie parametrów pod zmienne - przelew
  15. $koszt_przelew = $this_is->params->get('koszt_przelew');
  16. $reg_przelew = $this_is->params->get('reg_przelew');
  17. // tworzenie formularza
  18. $form = '<div id="dotpay-platnosci">
  19. <div id="premium-sms">
  20. <div class="co"><h3>Premium SMS</h3></div>
  21. <div class="instrukcja">Zyskaj dostęp jednorazowy do wybranego przez Ciebie wzoru. Poprzez wysłanie SMSa o treści ' . $tresc . ' na numer ' . $numer . '.</div>
  22. <div class="formularz"><form name="premium-sms" method="get">Wpisz kod z SMSa:<br /><input type="text" name="kod" /><input type="hidden" name="typ_dotpay" value="sms" /><br /><input type="submit" value="Dostęp" /></div>
  23. <div class="pouczenie">Premium SMS jest usługą dostępną dla sieci: ' . $siec . '<br />Koszt jednej wiadomości: ' . $koszt . '<br /><a href="' . $reg . '" class="a-regulamin">Regulamin usługi"><br />Usługę świadczy ' . $kto . '.<br />Właściciel serwisu: mail@mail.com<br /></div>
  24. </div>
  25. <div id="premium-przelew">
  26. <div class="co"><h3>Kod za przelew</h3></div>
  27. <div class="instrukcja">Zyskaj nieograniczony dostęp do wszystkich wzorów na tydzień.</div>
  28. <div class="formularz"><form name="premium-przelew" method="get">Wpisz kod z SMSa:<br /><input type="text" name="kod" /><input type="hidden" name="typ_dotpay" value="przelew" /><input type="hidden" name="timestamp" value="' . time() . '" /><br /><input type="submit" value="Dostęp" /></div>
  29. <div class="pouczenie">Koszt przelewu: ' . $koszt_przelew . '<br /><a href="' . $reg_przelew . '" class="a-regulamin">Regulamin usługi"><br />Usługę świadczy ' . $kto . '.<br />Właściciel serwisu: mail@mail.com<br /></div>
  30. </div>
  31. </div>';
  32. $row->text = preg_replace("^{zaplac_dotpay}.*{/zaplac_dotpay}^", $form, $artykul);
  33. }
  34.  
  35. class plgContentdotpay_platnosci extends JPlugin
  36. {
  37. public function onContentPrepare($context, &$row, &$params, $page = 0)
  38. {
  39. $artykul = $row->text;
  40. // sprawdzenie czy w treści artykułu zawiera się szukana fraza:
  41.  
  42. // sprawdzenie czy nie został podany kod
  43. if($_GET['kod']) {
  44. // sprawdzenie czy podany kod jest poprawny
  45. $db =& JFactory::getDBO();
  46. $kod = $_GET['kod'];
  47. // sprawdzanie typu kodu
  48. if ($_GET['typ_dotpay'] = 'sms') {
  49. $typ = 'sms';
  50. }
  51. elseif ($_GET['typ_dotpay'] = 'przelew') {
  52. $typ = 'przelew';
  53. }
  54. // sprawdzenie czy kod jest w bazie i jest aktywny
  55. $query = "SELECT * FROM `jos_dotpay_platnosci` WHERE `kod` = '$kod' and `typ` = '$typ'";
  56. $db->setQuery( $query );
  57. $ile = $db->loadObjectList();
  58. // sprawdzenie aktywności kodu
  59.  
  60. if ($typ == 'przelew') {
  61. if ($ile['czas'] > $_GET['timestamp']) {
  62. $row->text = preg_replace("^{zaplac_dotpay}^", "", $row->text);
  63. $row->text = preg_replace("^{/zaplac_dotpay}^", "", $row->text);
  64. }
  65. elseif ($ile['czas'] == '0') {
  66. $timestamp = $_GET['timestamp'] + 7*86400;
  67. $qr = "UPDATE `jos_dotpay_platnosci` SET `time` = '$timestamp' WHERE `kod` = '$kod' and `typ` = 'przelew'";
  68. $db->setQuery( $query );
  69. }
  70. else {
  71. if (!empty($ile['czas'])) {
  72. $qr = "DELETE FROM `jos_dotpay_platnosci` WHERE `kod` = '$kod'";
  73. $db->setQuery( $query );
  74. }
  75. dotpay($artykul, $this);
  76. }
  77. }
  78. elseif ($typ == 'sms') {
  79. if (count($ile) > 0) {
  80. $row->text = preg_replace("^{zaplac_dotpay}^", "", $row->text);
  81. $row->text = preg_replace("^{/zaplac_dotpay}^", "", $row->text);
  82. $qr = "DELETE FROM `jos_dotpay_platnosci` WHERE `kod` = '$kod'";
  83. $db->setQuery( $query );
  84. }
  85. else {
  86. // podmienienie frazy na prośbę o wpisanie kodu
  87. dotpay($artykul, $this);
  88. }
  89. }
  90. }
  91. else {
  92. // podmienienie frazy na prośbę o wpisanie kodu
  93. dotpay($artykul, $this);
  94. }
  95.  
  96. }
  97. }
  98.  
  99. ?>
abort
  1. $row->text = preg_replace("^{zaplac_dotpay}.*{/zaplac_dotpay}^", $form, $artykul);

Unikaj stosowania "^" jako ogranicznika wyrażenia przekazywanego do regexp. "^" jest dla regexpa początkiem wiersza, nie jestem do końca pewien, czy to nie wprowadza zamętu. Lepiej uzyć czegoś innego i bardziej neutralnego, choćby któregoś ze znaków: @ | * % _
Prawdopodobnie będziesz też musiał zamaskować (eskejpować - straszna kalka z angielskiego, sorry) wszystkie nawiasy klamrowe...

EDIT: Wystarczy preg_match - ciąg znaków masz w poniższym przykładzie w $matches[1]:
  1. preg_match ('|\{zaplac_dotpay\}(.*?)\{/zaplac_dotpay\}|', $txt, $matches);
  2. echo $matches[1];
Age1869
Niestety na razie rozwiązania nie znalazłem. Dziękuję koledze ABORT za pomoc, niestety to nie to sad.gif Ma ktoś może jakiś pomysł? Zawsze jest mi ciężko samemu znaleźć błędy sad.gif

Koleżanki i koledzy, macie może pomysł, co jest źle?sad.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.