Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [wolontariat]Kalendarz liturgiczny - błędy po instalacji
Forum PHP.pl > Inne > Giełda ofert > Poszukuję
czarkowsky
Witam wszystkich!
Prowadzę małą stronkę katolicką www.miserere.pl opartą na cms-ie php-fusion. Po php poruszam się intuicyjnie, czyli po omacku;-). Na stronie tutaj znalazłem skrypt kalendarza liturgicznego. Kalendarz składa się z pliku kalendarz.php z kodem:
  1. <?
  2. echo Kalendarz('<div id="kalendarz-tlo" class="margin-0">&nbsp;</div><div id="kalendarz-lewy" class="margin-0">%n</div><div id="kalendarz-prawy" class="margin-0">%d %m %rr.</div>');
  3.  
  4. function Kalendarz($format, $d='', $m='', $r='')
  5. {
  6. global $dni, $tabela_waznosci, $liczby_rzymskie, $dni_tygodnia, $lista_miesiecy, $miesiace, $tydzien;
  7.  
  8. //klasa Dzien
  9. class Dzien
  10. {
  11. var $nazwa;
  12. var $opis;
  13. var $typ;
  14. var $kiedy;
  15.  
  16. function Dzien($nazwa, $kiedy, $typ, $opis='')
  17. {
  18. global $dni, $tabela_waznosci, $liczby_rzymskie, $dni_tygodnia, $lista_miesiecy, $miesiace, $tydzien;
  19. if($opis)
  20. $this->opis=$opis;
  21. else
  22. $this->opis=$typ.' '.$nazwa;
  23. $this->typ=$typ;
  24. $this->kiedy=explode(' ', $kiedy);
  25. }
  26. function oblicz($rok) //zmienia datę z formatu kalendarza ($this->kiedy) na datę normalnę (d.m)
  27. {
  28. global $dni, $tabela_waznosci, $liczby_rzymskie, $dni_tygodnia, $lista_miesiecy, $miesiace, $tydzien;
  29. $c=count($this->kiedy);
  30. if($c==2) //data, np.: 3 grudnia
  31. return array($this->kiedy[0],$miesiace[$this->kiedy[1]]);
  32.  
  33. if(is_numeric($this->kiedy[0])) //ileś dni/tygodni przed/po jakiejś dacie
  34. {
  35. $ilosc=$this->kiedy[0];
  36. if($this->kiedy[1]=='tygodnie' || $this->kiedy[1]=='tygodni')
  37. $ilosc*=7;
  38. if($this->kiedy[2]=='przed')
  39. $ilosc*=-1;
  40. if(is_numeric($this->kiedy[3]))
  41. return dodaj($ilosc, $this->kiedy[3], $miesiace[$this->kiedy[4]], $rok);
  42. $nazwa='';
  43. for($x=3;$x<$c;$x++)
  44. $nazwa.=$this->kiedy[$x].' ';
  45. $nazwa=trim($nazwa);
  46. list($d, $m)=obliczObchod($nazwa, $rok);
  47. return dodaj($ilosc, $d, $m, $rok);
  48. }
  49.  
  50. if($this->kiedy[0]=='ostatni' || $this->kiedy[0]=='ostatnia' || $this->kiedy[0]=='pierwszy' || $this->kiedy[0]=='pierwsza')
  51. {
  52. if(is_numeric($this->kiedy[3]))
  53. {
  54. $d=$this->kiedy[3];
  55. $m=$miesiace[$this->kiedy[4]];
  56. }
  57. else
  58. {
  59. $nazwa='';
  60. for($x=3;$x<$c;$x++)
  61. $nazwa.=$this->kiedy[$x].' ';
  62. $nazwa=trim($nazwa);
  63. list($d, $m)=obliczObchod($nazwa, $rok);
  64. }
  65. $dt=date('w', mktime(0,0,0,$m,$d,$rok));
  66. $_dt=$tydzien[$this->kiedy[1]];
  67. }
  68. if($this->kiedy[0]=='ostatni' || $this->kiedy[0]=='ostatnia')
  69. {
  70. if($dt<=$_dt)
  71. return dodaj($dt-$_dt+7, $d, $m, $rok);
  72. else
  73. return dodaj($dt-$_dt, $d, $m, $rok);
  74. }
  75. elseif($this->kiedy[0]=='pierwszy' || $this->kiedy[0]=='pierwsza')
  76. {
  77. if($_dt<=$dt)
  78. return dodaj($_dt-$dt+7, $d, $m, $rok);
  79. else
  80. return dodaj($_dt-$dt, $d, $m, $rok);
  81. }
  82. }
  83. }
  84. //Funkcja wczytuje zawartość pliku do tablicy $dni
  85. function wczytaj($rok)
  86. {
  87. global $dni, $tabela_waznosci, $liczby_rzymskie, $dni_tygodnia, $lista_miesiecy, $miesiace, $tydzien;
  88. $fp=fopen('dane.txt', 'r');
  89. while(!feof($fp))
  90. {
  91. $a=array();
  92. while(!feof($fp) && ($w=trim(fgets($fp),"\n"))!='')
  93. {
  94. if(substr($w, 0, 1)=='[')
  95. {
  96. $w=trim($w, '[]');
  97. $nazwa=$w;
  98. }
  99. else
  100. {
  101. $tab=explode('=',$w);
  102. $a[$tab[0]]=$tab[1];
  103. }
  104. }
  105. $dni[$nazwa]['o']=new Dzien($nazwa, $a['kiedy'], $a['typ'], $a['opis']);
  106. $dni[$nazwa]['u']['wyświetl_okres']=$a['wyświetl_okres'];
  107. }
  108. fclose($fp);
  109. foreach($dni as $nazwa=>$wartosc)
  110. obliczObchod($nazwa, $rok);
  111.  
  112. $s=create_function('$a,$b', 'if($b["m"]>$a["m"]) return -1; if($b["m"]<$a["m"]) return 1; if($b["d"]>$a["d"]) return -1; if($b["d"]<$a["d"]) return 1; return 0;');
  113. uasort($dni, $s);
  114. }
  115. //dodaje do podanej daty $x dni
  116. function dodaj($x, $d, $m, $r)
  117. {
  118. $t=mktime(0,0,0,$m,$d,$r)+$x*24*60*60;
  119. return explode(' ', date('j n', $t));
  120. }
  121. //wylicza różnicę dni między podanymi datami
  122. function odejmij($d1, $m1, $r1, $d2, $m2, $r2)
  123. {
  124. $t=(mktime(0,0,0,$m1,$d1,$r1)-mktime(0,0,0,$m2,$d2,$r2));
  125. return $t/(24*60*60);
  126. }
  127. //oblicza obchód $nazwa w roku $rok
  128. function obliczObchod($nazwa, $rok)
  129. {
  130. global $dni, $tabela_waznosci, $liczby_rzymskie, $dni_tygodnia, $lista_miesiecy, $miesiace, $tydzien;
  131. if($dni[$nazwa]['r']==$rok && $dni[$nazwa]['d'] && $dni[$nazwa]['m'])
  132. return array($dni[$nazwa]['d'], $dni[$nazwa]['m']);
  133.  
  134. switch($nazwa) //daty "sztywne"
  135. {
  136. case 'Wielkanoc':
  137. $a=explode(' ', date('j n', easter_date($rok)));
  138. $dni[$nazwa]['d']=$a[0];
  139. $dni[$nazwa]['m']=$a[1];
  140. $dni[$nazwa]['r']=$rok;
  141. return $a;
  142.  
  143. case 'Świętej Rodziny':
  144. $o=new Dzien($nazwa, 'pierwsza niedziela po 25 grudnia', 'Święto');
  145. $a=$o->oblicz($rok);
  146. if($a[1]==1)
  147. $a=array(30, 12);
  148. $dni[$nazwa]['d']=$a[0];
  149. $dni[$nazwa]['m']=$a[1];
  150. $dni[$nazwa]['r']=$rok;
  151. return $a;
  152. }
  153.  
  154. $a=$dni[$nazwa]['o']->oblicz($rok);
  155. $dni[$nazwa]['d']=$a[0];
  156. $dni[$nazwa]['m']=$a[1];
  157. $dni[$nazwa]['r']=$rok;
  158. return $a;
  159. }
  160. //tablice pomocnicze
  161. $tabela_waznosci=array
  162. (
  163. 'Uroczystość',
  164. 'Święto',
  165. 'Niedziela',
  166. 'Wspomnienie obowiązkowe',
  167. 'Wspomnienie dowolne'
  168. );
  169. $liczby_rzymskie=array
  170. (
  171. 'I','II','III','IV','V','VI','VII','VIII','IX','X',
  172. 'XI','XII','XIII','XIV','XV','XVI','XVII','XVIII','XIX','XX',
  173. 'XXI','XXII','XXIII','XXIV','XXV','XXVI','XXVII','XXVIII','XXIX','XXX',
  174. 'XXXI','XXXII','XXXIII','XXXIV'
  175. );
  176. $dni_tygodnia=array
  177. (
  178. 'Niedziela', 'Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota'
  179. );
  180. $lista_miesiecy=array
  181. (
  182. 'stycznia','lutego','marca','kwietnia','maja','czerwca','lipca','sierpnia','września','października','listopada','grudnia'
  183. );
  184. $miesiace=array
  185. (
  186. 'stycznia'=>1, 'styczeń'=>1, 'lutego'=>2, 'luty'=>2, 'marca'=>3, 'marzec'=>3, 'kwietnia'=>4, 'kwiecień'=>4, 'maja'=>5, 'maj'=>5, 'czerwca'=>6, 'czerwiec'=>6, 'lipca'=>7, 'lipiec'=>7, 'sierpnia'=>8, 'sierpień'=>8, 'września'=>9, 'wrzesień'=>9, 'października'=>10, 'październik'=>10, 'listopada'=>11, 'listopad'=>11, 'grudnia'=>12, 'grudzień'=>12
  187. );
  188. $tydzien=array
  189. (
  190. 'niedziela'=>0, 'poniedziałek'=>1, 'wtorek'=>2, 'środa'=>3, 'czwartek'=>4, 'piątek'=>5, 'sobota'=>6
  191. );
  192.  
  193. //właściwa funkcja
  194. if(!$d)
  195. $d=date('j');
  196. if(!$m)
  197. $m=date('n');
  198. if(!$r)
  199. $r=date('Y');
  200. $dt=mktime(0,0,0,$m,$d,$r);
  201. $dt=date('w', $dt);
  202.  
  203. wczytaj($r);
  204. foreach($dni as $nazwa=>$dzien)
  205. {
  206. if($dzien['d']>$d && $dzien['m']==$m)
  207. break;
  208. if($dzien['m']>$m)
  209. break;
  210.  
  211. if($dzien['o']->typ=='Okres')
  212. {
  213. $okr=$nazwa;
  214. continue;
  215. }
  216. if($dzien['d']==$d && $dzien['m']==$m)
  217. $a[]=array('opis'=>$dzien['o']->opis, 'typ'=>$dzien['o']->typ, 'u'=>$dzien['u']);
  218. }
  219.  
  220. function znajdzWazneSwieto($a, $b)
  221. {
  222. global $tabela_waznosci;
  223. return (array_search($a["typ"], $tabela_waznosci)-array_search($b["typ"], $tabela_waznosci));
  224. }
  225. if($a)
  226. uasort($a, 'znajdzWazneSwieto');
  227.  
  228. $x=odejmij($d, $m, $r, $dni[$okr]['d'], $dni[$okr]['m'], $r);
  229. $x=floor($x/7)+1;
  230.  
  231. switch($okr)
  232. {
  233. case 'Okres zwykły 2':
  234. $chrz=obliczObchod('Chrzest Pański', $r);
  235. $popi=obliczObchod('Środa popielcowa', $r);
  236. $y=odejmij($popi[0], $popi[1], $r, $chrz[0], $chrz[1], $r);
  237. $x=$x+floor($y/7)+2;
  238. break;
  239. }
  240.  
  241. if($dt==0)
  242. $okres=sprintf($dni[$okr]['o']->opis, $liczby_rzymskie[$x-1].' Niedziela');
  243. else
  244. $okres=sprintf($dni[$okr]['o']->opis, $dni_tygodnia[$dt].' '.$liczby_rzymskie[$x-1].' tydzień');
  245.  
  246. if($a[0]['u']['wyświetl_okres']=='nie' || $dni[$okr]['u']['wyświetl_okres']=='nie')
  247. $n=$a[0]['opis'];
  248. elseif(!$a[0]['opis'])
  249. $n=$okres;
  250. else
  251. $n=$okres.', '.$a[0]['opis'];
  252. return strtr($format, array(
  253. '%n'=>$n,
  254. '%d'=>$d,
  255. '%m'=>$lista_miesiecy[$m-1],
  256. '%r'=>$r
  257. ));
  258. }
  259. ?>
, oraz pliku tekstowego z danymi dane.txt.
Zainstalowałem go sobie na próbę na lokalhoście. Wywołałem go kodem:
  1. include('kalendarz.php');
Kalendarz wyświetlił się prawidłowo, ale nad nim pojawiły się 3 rodzaje komunikatów o błędach powtórzone kilkadziesiąt razy:
Kod
Notice: Undefined index: wyświetl_okres in C:\xampplite\htdocs\miserere\kalendarz.php on line 199

Kod
Notice: Undefined index: opis in C:\xampplite\htdocs\miserere\kalendarz.php on line 198

Kod
Notice: Undefined index: r in C:\xampplite\htdocs\miserere\kalendarz.php on line 224

Nie potrafię rozwiązać tego problemu. Może ktoś z Was mógłby mi pomóc?
Cysiaczek
To są pospolite błędy. Ich komunikat jasno wskazuje co jest nie tak. Brakuje indeksów o tych nazwach w tablicy $a.

Podpowiedź: Sprawdź plik dane.txt, czy na jego podstawie poprawnie da się wygenerować te klucze:
  1. $a[$tab[0]]=$tab[1];
czarkowsky
Przede wszystkim dziękuję za zainteresowanie się tematem i chęć pomocy.
Chyba źle się wyraziłem opisując swoją znajomość PHP - nazwę to nieudolnym raczkowaniem.
Sorry, niestety nie potrafię tego sprawdzić. Chyba w tym przypadku trzeba mi wskazać błędy palcem.
Załączyłbym plik txt, ale nie widzę tu opcji załączania plików do postów.

Wstawiam tu tylko część pliku dane.txt - całość się nie mieści, ale reszta pliku jest dokładnie na tej samej zasadzie.
Kod
[Adwent]
kiedy=pierwsza niedziela po 26 listopada
typ=Okres
opis=%s adwentu

[Oktawa Narodzenia Pańskiego]
kiedy=25 grudnia
typ=Okres
opis=Oktawa Narodzenia Pańskiego

[Okres Narodzenia Pańskiego]
kiedy=2 stycznia
typ=Okres
opis=Okres Narodzenia Pańskiego

[Pi±ty Dzień Oktawy Narodzenia Pańskiego]
kiedy=29 grudnia
typ=¦więto
opis=Pi±ty Dzień Oktawy Narodzenia Pańskiego
wy¶wietl_okres=nie

[Szósty Dzień Oktawy Narodzenia Pańskiego]
kiedy=30 grudnia
typ=¦więto
opis=Szósty Dzień Oktawy Narodzenia Pańskiego
wy¶wietl_okres=nie

[¦więtej Rodziny]
kiedy=0 dni po ¦więtej Rodziny
typ=¦więto
opis=¦więtej Rodziny: Jezusa, Maryi i Józefa

[Siódmy Dzień Oktawy Narodzenia Pańskiego]
kiedy=31 grudnia
typ=¦więto
opis=Siódmy Dzień Oktawy Narodzenia Pańskiego
wy¶wietl_okres=nie

[Okres zwykły]
kiedy=0 dni po Chrzest Pański
typ=Okres
opis=%s okresu zwykłego

[Po Popielcu]
kiedy=0 dni po ¦roda popielcowa
typ=Okres
wy¶wietl_okres=nie

[¦roda popielcowa]
kiedy=45 dni przed Wielkanoc
typ=Uroczysto¶ć
opis=¦roda popielcowa

[Czwartek po Popielcu]
kiedy=1 dni po ¦roda popielcowa
typ=Wspomnienie obowi±zkowe
opis=Czwartek po Popielcu

[Pi±tek po Popielcu]
kiedy=2 dni po ¦roda popielcowa
typ=Wspomnienie obowi±zkowe
opis=Pi±tek po Popielcu

[Sobota po Popielcu]
kiedy=3 dni po ¦roda popielcowa
typ=Wspomnienie obowi±zkowe
opis=Sobota po Popielcu

[Wielki Post]
kiedy=3 dni po ¦roda popielcowa
typ=Okres
opis=%s Wielkiego Postu

[Niedziela Męki Pańskiej]
kiedy=7 dni przed Wielkanoc
typ=Uroczysto¶ć
opis=Niedziela Męki Pańskiej
wy¶wietl_okres=nie

[Poniedziałek Wielkiego Tygodnia]
kiedy=1 dni po Niedziela Męki Pańskiej
typ=Wspomnienie obowi±zkowe
opis=Poniedziałek Wielkiego Tygodnia
wy¶wietl_okres=nie

[Wtorek Wielkiego Tygodnia]
kiedy=2 dni po Niedziela Męki Pańskiej
typ=Wspomnienie obowi±zkowe
opis=Wtorek Wielkiego Tygodnia
wy¶wietl_okres=nie

[¦roda Wielkiego Tygodnia]
kiedy=3 dni po Niedziela Męki Pańskiej
typ=Wspomnienie obowi±zkowe
opis=¦roda Wielkiego Tygodnia
wy¶wietl_okres=nie

[Wielki Czwartek]
kiedy=4 dni po Niedziela Męki Pańskiej
typ=Wspomnienie obowi±zkowe
opis=Triduum Paschalne, Wielki Czwartek
wy¶wietl_okres=nie

[Wielki Pi±tek]
kiedy=5 dni po Niedziela Męki Pańskiej
typ=Wspomnienie obowi±zkowe
opis=Triduum Paschalne, Wielki Pi±tek
wy¶wietl_okres=nie

[Wielka Sobota]
kiedy=6 dni po Niedziela Męki Pańskiej
typ=Wspomnienie obowi±zkowe
opis=Triduum Paschalne, Wielka Sobota
wy¶wietl_okres=nie

[Wielkanoc]
kiedy=0 dni po Wielkanoc
typ=Uroczysto¶ć
opis=Wielkanoc

[Okres Wielkanocny]
kiedy=0 dni po Wielkanoc
typ=Okres
opis=%s okresu wielkanocnego

[Poniedziałek Wielkanocny]
kiedy=1 dni po Wielkanoc
typ=Uroczysto¶ć
opis=Poniedziałek Wielkanocny
wy¶wietl_okres=nie
nospor
Z racji, że na php się nie znasz i raczej wiedza tajemna o co z tym błędem chodzi ci nie będzie potrzebna, to poprostu na początku tego skryptu daj:
error_reporting(0);

Błędy "znikną".
czarkowsky
Nospor dziękuję za podpowiedź!
Wiem, że mogę też wstawić
Kod
ini_set('display_errors',0);
.
Jest to jednak wyjście tymczasowe, tym bardziej, że skrypt był napisany kilka lat temu i obawiam się, że niedługo mogą pojawić się większe problemy.
Cysiaczek napisał, że są to pospolite błędy. Pomyślałem, że wprawny php-owiec łatwo je zlokalizuje i naprawi? Oczywiście zdaję sobie sprawę, że działamy tu tylko na zasadach koleżeńskich, a jest trochę kodu do przejrzenia. Gdyby jednak ktoś podjął się trudu, będę bardzo wdzięczny.
Cysiaczek
Przenoszę do Poszukuję i otagowuję.
sabat24
Zamień:
  1. $dni[$nazwa]['o']=new Dzien($nazwa, $a['kiedy'], $a['typ'], $a['opis']);
  2. $dni[$nazwa]['u']['wyświetl_okres']=$a['wyświetl_okres'];

Na:
  1. $a['opis']=isset($a['opis'])?$a['opis']:'';
  2. $dni[$nazwa]['o']=new Dzien($nazwa, $a['kiedy'], $a['typ'], $a['opis']);
  3. $dni[$nazwa]['u']['wyświetl_okres']=isset($a['wyświetl_okres'])?$a['wyświetl_okres']:'tak';


W przypadku braku odpowiednich danych w pliku txt skrypt przydzieli sobie wartości domyślne. Trzeciego błędu na szybko nie mogę zlokalizować.
czarkowsky
Skoro mój post trafił do działu poszukuję, to w zamian za pomoc mogę zaproponować umieszczenie na mojej stronie miserere.pl linku do strony osoby, która mi pomoże (no chyba, że strona nie będzie zgodna z naszym regulaminem).

Sabat24 jest tak: te dwa pierwsze komunikaty zginęły, a ten o "r" w linii 227 pozostał. Niestety pojawiły się dwa nowe, chociaż już nie są tak wielokrotnie powtarzane:
Kod
Notice: Undefined index: kiedy in C:\xampplite\htdocs\miserere\kalendarz.php on line 201
Kod
Notice: Undefined index: typ in C:\xampplite\htdocs\miserere\kalendarz.php on line 201
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.