Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Joomla - content plugin, wyrażenia regularne
Age1869
post
Post #1





Grupa: Zarejestrowani
Postów: 118
Pomógł: 6
Dołączył: 25.10.2010
Skąd: Radzyn Podlaski

Ostrzeżenie: (0%)
-----


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. ?>


--------------------
Michal Zarobkiewicz Photographic Gallery
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
abort
post
Post #2





Grupa: Zarejestrowani
Postów: 590
Pomógł: 107
Dołączył: 25.10.2011

Ostrzeżenie: (0%)
-----


  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];


Ten post edytował abort 3.09.2012, 19:07:03
Go to the top of the page
+Quote Post
Age1869
post
Post #3





Grupa: Zarejestrowani
Postów: 118
Pomógł: 6
Dołączył: 25.10.2010
Skąd: Radzyn Podlaski

Ostrzeżenie: (0%)
-----


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


--------------------
Michal Zarobkiewicz Photographic Gallery
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 04:06