[Copyright in footer] Rozbudowa rozszerzenia

Pomoc w przypadku kłopotów z rozszerzeniami: instalacją, konfiguracją, błędami. Zakładając nowy temat pamiętaj o odpowiednim prefiksie!
Regulamin forum
Na tym forum wymagane jest stosowanie prefiksów w tytułach tematów. Prefiks tematu musi składać się nazwy rozszerzenia, której dotyczy problem. Dla rozszerzenia phpBB Gallery poprawna nazwa tematu to przykładowo [phpBB Gallery] Problem z wgrywaniem zdjęć. Tematy niespełniające wymogu będą przenoszone do kosza.
Awatar użytkownika
Zyleta
Moderator
Posty: 196
Rejestracja: 03 marca 2014, 15:39

[Copyright in footer] Rozbudowa rozszerzenia

Post autor: Zyleta » 16 maja 2016, 19:44

Cześć!
Mam pewien problem, mianowicie, wróciłem sobie do zabawy :D Tym razem zacząłem od tyłu (w porównaniu do tego co poprzednio robiłem)... albo inaczej mówiąc, od strony której do tej pory nie ruszałem. Otóż, chcąc zmieniać wygląd, pomyślałem sobie, że zacznę od rozszerzeń, tak aby w samym kodzie strony mniej namieszać.

Zacząłem od tego rozszerzenia
https://www.phpbb.com/community/viewtop ... #p14242471
Jako że wydaje mi się, że w przypadku wprowadzania zmian na forum i treści, istotne jest żeby podać takie podstawowe informacje - kto jest tego wszystkiego autorem.

Jednak w tym rozszerzeniu, nie podoba mi się fakt, że w stopce wyświetla się nazwa forum, natomiast nie ma żadnej wzmianki o autorach stylu. Tak, wiem, jak ktoś modyfikuje styl, to sam sobie może umieścić o tym informację w odpowiednim pliku. Jednak aby nie zmieniać tego w plikach stylu, można przecież pobrać dane o stylu z pliku style.cfg i wrzucić do stopki - tak aby ten plik, poza informacjami w panelu administratora i bazie danych, gdzie umożliwia identyfikację, miał jakieś dodatkowe zastosowanie.

Z tego też powodu, zacząłem sobie siedzieć i przeglądać, w jaki sposób to rozszerzenie zostało zrobione, co odpowiada za jaki element. Po rozeznaniu w tym temacie, zacząłem pisać (na podstawie tego co znalazłem w innych plikach) jakiś kod, który umożliwiłby mi przeczytanie pliku style.cfg i wyrzucenie z niego istotnych dla mnie informacji. Nie dałem z tym rady. Potem pomyślałem, że mogę te informacje wyciągnąć z bazy danych. Największym problemem pierwszej metody, jak i drugiej, jest moja nieznajomość języka php i języka sql (dlatego metodą prób i błędów starałem się coś wykombinować). Starałem się, ale niestety utknąłem.

Co potrafiłem zrobić? Taki kodzik (na pewno nie w 100% poprawny):

Kod: Zaznacz cały

public function get_copyright_from_sql()
	{
		$sql = 'SELECT user_style, user_id 
				FROM ' . USER_TABLE;
		$result = $this->db->sql_query($sql);
		
		$sql = 'SELECT style_copyright
				FROM ' . STYLES_TABLE . '
				WHERE style_id = 1';
		$copyright = $this->db->sql_query($sql);
		return $copyright;
	}
oraz dodałem

Kod: Zaznacz cały

'L_STYLE_COPYRIGHT'			=> $copyright,
po tym

Kod: Zaznacz cały

'L_COPYRIGHT_YEAR'			=> $start_date,
(w evencie, póki co, zamieniłem {SITENAME} na {LA_STYLE_COPYRIGHT} i wyświetla mi się w stopce STYLE_COPYRIGHT).

Co do kodu z sql, ustawiłem "style_id = 1", ponieważ w tej chwili nie wiem w jaki sposób zrobić odczyt na podstawie tego, z jakiego stylu korzysta użytkownik (i w jaki sposób zapisać tę jedynkę, w przyszłości odpowiednią komendę), ale tak czy inaczej, coś nie działa (zapewne to, że źle coś napisałem :D).

Jakieś porady, jak to w najprostszy możliwy sposób rozwiązać? Czy idę dobrym tropem, a może jest już jakaś komenda, gdzie wystarczy parę linijek już gdzieś wcześniej stworzonego kodu do tego?

Awatar użytkownika
Zyleta
Moderator
Posty: 196
Rejestracja: 03 marca 2014, 15:39

Re: [Copyright in footer] Rozbudowa rozszerzenia

Post autor: Zyleta » 31 maja 2016, 11:07

Odświeżę sobie :)
Dodam, że poszukałem jakiegoś rozszerzenia, które w jakimś stopniu wykorzystywało style. Znalazłem rozszerzenie quickstyle, z którego nieco zgapiłem, a mianowicie (wydaje mi się) czytanie z jakiego stylu korzysta użytkownik:

Kod: Zaznacz cały

$current_style = ($this->user->data['is_registered']) ? $this->user->data['user_style'] : $this->request_cookie('style', $this->user->data['user_style']);
Co przerobiłem na prostsze (mam nadzieję że wystarczy takie coś):

Kod: Zaznacz cały

$current_style = $this->user->data['user_style'];
Zauważyłem, że to mi pokazuje ID stylu (po paru nieudanych próbach wyciągnięcia pliku konfiguracyjnego zwróciłem uwagę, że pokazuje mi błąd w ścieżce - zamiast ścieżki do stylu, pokazywało mi cyfrę 2 (po zmianie stylu na inny - 1), więc chcąc to wykorzystać (że jednak jest dobrze), zrobiłem zapytanie sql, którym miałem nadzieję wyciągnąć z tego konkretnego stylu prawa autorskie (copyright):

Kod: Zaznacz cały

$sql = 'SELECT style_copyright
			FROM ' . STYLES_TABLE . '
			WHERE style_id = ' . (int) $current_style;
"na czysto" nie pokazało mi już nic, ale patrząc jak to było robione w innych plikach, była tam komenda, która wydaje mi się, nakierowuje co ma robić ta zmienna $sql (czyli po prostu wywołanie tego jako zapytania do bazy danych):

Kod: Zaznacz cały

$result = $this->db->sql_query($sql);
Jednak, po wstawieniu tego, pokazuje mi komunikat:

Kod: Zaznacz cały

Fatal error: Call to a member function sql_query() on null in D:\Programy\XAMPP\htdocs\phpbb3\ext\dpns\copyright\event\listener.php on line 71
I się zaciąłem w tym momencie.. niby już jestem blisko (w bazie wywołałem to pytanie i mi ładnie pokazało to o co mi chodzi, a tu coś nie działa i nie wiem dlaczego).

Jakby był tu ktoś, kto mógłby nakierować, podpowiedzieć co jest nie tak, czego brakuje, to chętnie wysłucham :)

Jeszcze dodam, że jak zmienię w tym zapytaniu (int) $current_style; po prostu na cyfrę 2, to pokazuje mi ten sam błąd, więc chyba coś w tym zapytaniu mam nie tak.

Awatar użytkownika
Zyleta
Moderator
Posty: 196
Rejestracja: 03 marca 2014, 15:39

Re: [Copyright in footer] Rozbudowa rozszerzenia

Post autor: Zyleta » 03 czerwca 2016, 00:54

Okej, poradziłem sobie :)
Może był prostszy sposób (zostawię otwarty temat, gdyby ktoś kiedyś miał jakieś zastrzeżenia co do metody jaką zastosowałem), ale zrobiłem to w ten sposób, że po zapytaniu dałem takie cudo:

Kod: Zaznacz cały

		$result = $this->db->sql_query($sql);
		$row = $this->db->sql_fetchrow($result);
		$this->db->sql_freeresult($result);
		return $row['style_copyright'];
Czyli, z tego co wyczytałem u mnie $row "trzymało" wynik zapytania, $this->db->sql_freeresult($result); z tego co wyczytałem, powinno to być zamieszczone, by "uwolnić" bazę z tego zapytania, no i najważniejsze $row['style_copyright']; - wskazanie jaka kolumna mnie interesowała (rozumiem że jako wynik została zwrócona tablica zawierająca nazwę kolumny oraz wartość tej kolumny, stąd to odwołanie. Pytanie tylko, czy w takim wypadku niepotrzebnie w zapytaniu [kto zapomniał, zapytanie w poście wyżej] dałem by wybierało mi z właśnie tej kolumny wyniki?).

Teraz tylko dopracować szczegóły (ale to później) odnośnie tekstu i mogę śmiało powiedzieć, że moje pierwsze rozszerzenie (na bazie cudzego, ale od czegoś trzeba zacząć :D) będzie zrobione :D

wicy
Posty: 168
Rejestracja: 22 października 2010, 10:28

Re: [Copyright in footer] Rozbudowa rozszerzenia

Post autor: wicy » 04 czerwca 2016, 11:31

Generalnie proces myślowy prawidłowy od początku do końca.
W zapytaniu możesz podawać które kolumny mają zostać wybrane do wyniku ($result), choć nie musisz (SELECT *). Nie wiem czy filtr (wybranie kolumny) przyspieszy samą operację wyszukiwania, ale na pewno ograniczy zużycie zasobów na zmienną $result. Zwolnienie zmiennej (prawidłowo zastosowane) to tylko zwolnienie pamięci jej przydzielonej i nie odnosi się do bazy.
Nie wiem czemu nie działa $result = $this->db->sql_query($sql); (mi śmiga), ale spróbuj zamiast tego $result = mysql_query($sql);
_________
forgen.pl

Awatar użytkownika
Zyleta
Moderator
Posty: 196
Rejestracja: 03 marca 2014, 15:39

Re: [Copyright in footer] Rozbudowa rozszerzenia

Post autor: Zyleta » 05 czerwca 2016, 07:34

O kurczę, nawet nie zwróciłem uwagi na ten komentarz że tu wstawiłem razem z nim :D Teraz już działa, bo dodałem to co poniżej jest :P
A komentarz się odnosił do wcześniejszej próby wywołania tego, gdzie nie było jeszcze nic za tym i chciałem wywołać po prostu z tego $result ($result['style_copyright']) - co mi wyrzucało błąd. Mogę się mylić, ale możliwe że powodem tego był zły format danych, gdyż na wyjściu (wyświetleniu wyniku) potrzebny był string.. a w sumie nie wiem jakiego typu jest w takim przypadku $result... w każdym razie nie jest to tablica, ani string, bo mi nic nie wyświetlało (albo wyświetlał błąd, że nie można użyć tego jako tablicy) :P
To może będzie dobre pytanie, jakiego typu jest w moim przypadku zmienna $result :D I co z taką zmienną można zrobić bezpośrednio (chodzi mi tu o np. wyświetlenie jej, albo jej części i w jaki sposób).

Ogólnie, to wiem (zrozumiałem jak zrobiłem to, albo przynajmniej tak mi się wydaje że to w ten sposób działa) że fetchrow przekształca (w tym przypadku zmienną $result) na swego rodzaju tablicę wierszy (coś typu:

Kod: Zaznacz cały

style_copyright = TUTAJ_WARTOŚĆ;
style_name = TUTAJ_WARTOŚĆ;
style_id = TUTAJ WARTOŚĆ;
...
nazwa_kolumny_w_bazie = wartość_kolumny_w_bazie
- taka moja interpretacja :D nie wiem czy słuszna). Ale nie wiem co to jest to $result i jak inaczej mogę to wykorzystać :P

W każdym razie, swoje pierwsze rozszerzenie zrobiłem :D (co tam że zgapiając 85% kodu z innego rozszerzenia i tylko modyfikując resztę :D od czegoś trzeba zaczynać)

wicy
Posty: 168
Rejestracja: 22 października 2010, 10:28

Re: [Copyright in footer] Rozbudowa rozszerzenia

Post autor: wicy » 05 czerwca 2016, 09:23

Sql_query, jak i mysql_query, zwraca wynik i przypisuje go do zmiennej specjalnego typu "zasób" (resource). Więc zmienna $result jest tylko odwołaniem do źródła zewnątrznego jakim jest wynik operacji (SELECT) na bazie danych. Jak podaje instrukcja php - nie ma sensu przetwarzać bezpośrednio tej zmiennej, gdyż są do tego narzędzia (np. sql_fetchrow) dające w wyniku łatwą do obróbki tablicę wartości różnych typów.
_________
forgen.pl

Awatar użytkownika
Zyleta
Moderator
Posty: 196
Rejestracja: 03 marca 2014, 15:39

Re: [Copyright in footer] Rozbudowa rozszerzenia

Post autor: Zyleta » 05 czerwca 2016, 13:39

Okej, dzięki wielkie :)
To też wiele wyjaśnia, dlaczego przy pierwszej próbie sczytania $result nie szło nic :D

ODPOWIEDZ

Wróć do „Pomoc”