![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 201 Pomógł: 5 Dołączył: 15.07.2008 Skąd: Kłodzko Ostrzeżenie: (10%) ![]() ![]() |
Napisałem coś takiego:
Szablon: Wydaje mi się że jest to nieoptymalene, i nieprofesjonalnie napisane. Proszę o jakieś sugestje. Co powinienem w tym zmienić?? |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 640 Pomógł: 44 Dołączył: 8.02.2004 Ostrzeżenie: (0%) ![]() ![]() |
Napisz to w Javie to będzie bardzo profesjonalne (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) A tak na poważnie stworzyłeś prosty kod i nie ma co tu dramatyzować z pisaniem tego "profesjonalnie" - bo "profesjonalne" rozwiązanie polegałoby na stworzeniu systemu szablonów ogólnego przeznaczenia ze znacznie większą ilością możliwości (smarty, opt i inne).
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 387 Pomógł: 273 Dołączył: 18.02.2008 Ostrzeżenie: (0%) ![]() ![]() |
Istota działania jest zła. Systemy szablonów które tworzą swój nowy język (jak smarty) to przeszłość. Zrezygnuj z szablonów tego typu, a zastąp to czystym PHP, tylko odpowiednio oddzielonym:
index.php
views.php
szablony/szablon.php Jest to chyba najprostszy przykład, jak to można zrobić, aby pracowało się wygodnie (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Szablony można zagnieżdżać (jak jest w przykładzie - zagnieżdżone jest generowanie źródła strony z szablonu i wstawianie go w textarea). W ten sposób możesz stworzyć całe drzewko szablonów reprezentujące stronę. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Pamiętaj tylko, aby w szablonie zminimalizować ilość kodu PHP i zajmować się TYLKO wyświetlaniem danych podanych przez skrypt! Ten post edytował l0ud 21.12.2008, 18:54:58 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 640 Pomógł: 44 Dołączył: 8.02.2004 Ostrzeżenie: (0%) ![]() ![]() |
Istota działania jest zła. Systemy szablonów które tworzą swój nowy język (jak smarty) to przeszłość. To dlaczego nikt nie rezygnuje z takiej składni szablonów? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) IMHO obecność języka skryptowego w szablonach doprowadza do tego że nagle pojawia się w nich jakaś logika, co jest złe. Mając w pamięci "szablony" CodeIgnitera powiem że szablony z PHP to rozwiązanie dalekie od ideału (choć sprawdza się dla najprostszych skryptów). Dobry przykład to szablony Django - http://docs.djangoproject.com/en/dev/topic...opics-templates i klon dla PHP: http://www.beberlei.de/calypso/ - ogólny pomysł i większość składni jest jak najbardziej udana i warto na czymś takim się opierać. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 201 Pomógł: 5 Dołączył: 15.07.2008 Skąd: Kłodzko Ostrzeżenie: (10%) ![]() ![]() |
A co z optymalnością mojego skryptu??
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 640 Pomógł: 44 Dołączył: 8.02.2004 Ostrzeżenie: (0%) ![]() ![]() |
Duży ruch ci raczej nie grozi, więc i trudno mówić o wydajności danego rozwiązania. Operacje na długich łańcuchach mogą trochę zajmować, ale ogólnie większym "problemem" wydajnościowym będzie pobieranie danych - np. z bazy danych.
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 1 387 Pomógł: 273 Dołączył: 18.02.2008 Ostrzeżenie: (0%) ![]() ![]() |
Wg mnie, o ile logika ogranicza się do wyświetlania, nie ma żadnego problemu. Zawsze można np. do klasy view dopisać metody pomocnicze, np. cycle(), co umożliwi np. takie coś: Po pobieżnej analizie przykładów z dokumentacji szablonów Django nie widzę żadnych istotnych korzyści (prócz minimalnym uproszczeniem zapisu) z dołączania dodatkowego kodu typu Calypso. Ale jak kto woli (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ja tam polecam wg. mnie najprostsze rozwiązanie, czyli 'bezpośrednie' stosowanie PHP - bo przecież po to ono jest? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 201 Pomógł: 5 Dołączył: 15.07.2008 Skąd: Kłodzko Ostrzeżenie: (10%) ![]() ![]() |
Jeszcze jedno:
Załużmy że w szablonie mam: Kod <html> <head> <title>Newsy</title> </head> <body> {zalogowany} <h2>Jesteś zalogowany jako: {login}!</h2> {/zalogowany} {niezalogowany} <h2>Nie jesteś zalogowany!</h2> {/niezalogowany} </body> </html> W przypadku zalogowania, w skrypcie zamieniam niezalogowany na "nic", a zalogowany na zalogowany bez {zalogowany}{/zalogowany}. Jak wywalić te tagi {zalogowany}{/niezalogowany}, tak aby to co jest po między nimi zostąło nienaruszone?? |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 640 Pomógł: 44 Dołączył: 8.02.2004 Ostrzeżenie: (0%) ![]() ![]() |
Wg mnie, o ile logika ogranicza się do wyświetlania, nie ma żadnego problemu. Zawsze można np. do klasy view dopisać metody pomocnicze, np. cycle(), co umożliwi np. takie coś: Po pobieżnej analizie przykładów z dokumentacji szablonów Django nie widzę żadnych istotnych korzyści (prócz minimalnym uproszczeniem zapisu) z dołączania dodatkowego kodu typu Calypso. Ale jak kto woli (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ja tam polecam wg. mnie najprostsze rozwiązanie, czyli 'bezpośrednie' stosowanie PHP - bo przecież po to ono jest? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Kod <?php } ?> Ładnie to nie wygląda, front-end designer zapewne coś pokopie w tego typu znacznikach... plus jak tego trochę zagnieździsz to będzie jeszcze gorzej. Przydają się też takie funkcjonalności jak dziedziczenie szablonów, obsługa bloków itd. I nie należy zakładać że programista posłucha się ciebie żeby nie wrzucać do szablonu logiki. Jeżeli może - to to zrobi. Swego czasu używałem CI, teraz używam Django i nie mam najmniejszej ochoty ponownie stosować "szablony" zawierające w sobie język skryptowy plus z brakiem funkcjonalności typowych szablonów. W przypadku zalogowania, w skrypcie zamieniam niezalogowany na "nic", a zalogowany na zalogowany bez {zalogowany}{/zalogowany}. Jak wywalić te tagi {zalogowany}{/niezalogowany}, tak aby to co jest po między nimi zostąło nienaruszone?? Tworzenie statycznych bloków nie jest zbyt elastyczne ({zalogowany}{/zalogowany}, czy {wiadomości}{/wiadomości}), bo to trochę ogranicza elastyczność parsera. W Django wygląda to ogólnie tak: Kod {% if user %} Witaj {{ user }} {% else %} Witaj nieznajomy {% endif %} Gdzie za logikę szablonu odpowiada warunek IF wykonany na zmiennej przekazanej do szablonu z widoku. Ten post edytował Riklaunim 21.12.2008, 20:12:46 |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Też miałem pisać, żeby takiego czegoś za żadne skarby świata w szablon nie pakować (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) I analogicznie: for(): endfor, if(): elseif():, else:, endif;, while():, endwhile(), foreach(), endforeach() @autor: Naprawdę nie ma sensu bawić się w takie "systemy szablonów". Jest to wyjątkowo niewygodne (każdy będzie się musiał uczyć nowego zestawu znaczników), w Twoim przypadku kompletnie nieelastyczne - nie ma możliwości zrobienia tak prostej rzeczy jak chociażby wyświetlenie tekstu "AbcdEFg" jako "abcdefg" (małymi literami). Cytat To dlaczego nikt nie rezygnuje z takiej składni szablonów? Jak to nikt? Pomijam tutaj fakt, że PHP sam w sobie to jeden wielki system szablonów, ale spójrz na Symfony, ZF i inne FW.Cytat IMHO obecność języka skryptowego w szablonach doprowadza do tego że nagle pojawia się w nich jakaś logika, co jest złe. Bzdura. (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Jak ktoś nie potrafi korzystać z szablonu (nie ma znaczenia czy to Smarty czy czysty PHP) to i tak doporawdzi do jakiegoś Spaghetti Code
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 201 Pomógł: 5 Dołączył: 15.07.2008 Skąd: Kłodzko Ostrzeżenie: (10%) ![]() ![]() |
@Crozin: Fajne rozwiązanie, spróbuję.
Wrućmy do mojego parsera. Zrobiłem w nim dwie pętle i niemoge się już w tym kodzie połapać:)
Szablon: Kod <html> <head> <title>Newsy</title> </head> <body> {kategorie} <h2>{nazwa_kategorii}</h2> {fora} <h3><a href="forum.php?forum={identyfikator_forum}">{nazwa_forum}</a></h3> <p>{opis_forum}</p> {/fora} {/kategorie} </body> </html> Można to jakoś prościej?? |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 84 Pomógł: 6 Dołączył: 26.03.2008 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Jeślibyś używał czystego PHP w szablonach to byłoby dużo prościej...
Pobranie danych i wyświetlenie szablonu.
Szablon. Kod <?php foreach($aData AS $Data): ?> Foo: <?php echo $Data['Bar']; ?> <?php endforeach; ?> Pisane z palca, ale dużo prościej. Nie wiem kto teraz pisze własne systemy template ze sładnią z dupy, która wygląda troche inaczej niż czyste PHP, a działa wolniej. SMARTY = crap. Pozdrawiam. |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 640 Pomógł: 44 Dołączył: 8.02.2004 Ostrzeżenie: (0%) ![]() ![]() |
Można to jakoś prościej?? Prościej to nie znaczy czytelniej i łatwiej w rozbudowie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Chcesz robić forum? Użyj frameworka (Kohana, CI, inne) i oddziel zapytania od widoku i od szablonu odpowiedzialnego za wygląd - jeżeli chcesz stworzyć coś funkcjonalnego, co można pokazać (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Cytat Nie wiem kto teraz pisze własne systemy template ze sładnią z dupy, która wygląda troche inaczej niż czyste PHP, a działa wolniej. SMARTY = crap. to napisz serwis pokroju nasza klasa, grono, czy też fotka bez szablonów, stosując PHP, a później próbuj to rozbudowywać i poprawiać. Szablony i inne rozwiązania, wzorce projektowe nie są stosowane po to by kod był szybszy (bo będzie nieco wolniejszy niż napisany jednym ciurkiem), ale żeby ten kod dało się utrzymać, modyfikować i rozwijać. I taka mała notka - szablony smarty są kompilowane do kodu PHP (kesz) i przy kolejnych wywołaniach szablonu te gotowe postacie są stosowane niewidzialnie dla programisty/użytkownika. |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 84 Pomógł: 6 Dołączył: 26.03.2008 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
To co wyżej napisałem to był przykład, i chyba nie uważasz, że tak pisze aplikacje? (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
Tak wyglądaja u mnie template'y i jakoś nie mam problemu z ich przerabianiem. Wyświetlanie i operowanie na danych to już inna bajka i ten kod wyżej to tylko poglądowy. Pozdrawiam. |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 1 387 Pomógł: 273 Dołączył: 18.02.2008 Ostrzeżenie: (0%) ![]() ![]() |
Riklaunim, nikt nie miał na myśli całkowitego unikania idei szablonów, a dodatkowych parserów, które robią dodatkowy narzut i wprowadzają swoją składnię.
Podałem swój przykład, jak dość prosto zrobić to bez wyrażeń regularnych i kobył typu smarty. Uzupełniając przykład o instrukcję typu endif; zamiast } imho uzyskamy wystarczająco dobrą czytelność szablonu. Ok, piszesz że szablony są kompilowane do czystego kodu PHP. Ale dlaczego nie mogą być nim od początku? |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 640 Pomógł: 44 Dołączył: 8.02.2004 Ostrzeżenie: (0%) ![]() ![]() |
Cytat Ok, piszesz że szablony są kompilowane do czystego kodu PHP. Ale dlaczego nie mogą być nim od początku? Bo jak np. pisałem firmowego CRMa to osoba odpowiedzialna za interfejs użytkownika nie była programistą server side, a geekiem jQuery/CSS i prace szły bardzo szybko, a CRM wyszedł kompatybilny na poziomie krystyny z gazowni. Szablony mogą być "od razu" plikami *php, tyle że niekoniecznie musi to być najlepsze rozwiązanie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) |
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 201 Pomógł: 5 Dołączył: 15.07.2008 Skąd: Kłodzko Ostrzeżenie: (10%) ![]() ![]() |
Zroiłem tak jak mi radziliście. Fajnie to nawet wygląda, szablon tak bardzo się nie zmienie, a zato skrypt zyskał na czytelności i wydajnmości.
Skrypt:
Szablon: Kod <html> <head> <title>Forum</title> </head> <body> <?php foreach($tablica as $rekord): ?> <h2><?php echo $rekord["tytul"]; ?></h2> <?php foreach($tablica2 as $rekord2): ?> <h3><a href="forum.php?forum=<?php echo $rekord["identyfikator"]; ?>"><?php echo $rekord2["tytul"]; ?></a></h3> <p><?php echo $rekord2["opis"]; ?></p> <?php endforeach; ?> <?php endforeach; ?> </body> </html> Mam problem, więcej w drugim zapytaniu (dziesiąta linijka skryptu). Co mam zrobić?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) Ten post edytował akurczyk 22.12.2008, 10:49:39 |
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat Bo jak np. pisałem firmowego CRMa to osoba odpowiedzialna za interfejs użytkownika nie była programistą server side, a geekiem jQuery/CSS Czy jeżeli założę, ża taka osoba jest w wystarczającym stopniu inteligenta by zrozumieć, że to co jest pomiędzy <?php, a ?> to coś czego ma nie ruaszć? Zresztą wydaje mi się, że chociaż podsatawy podstaw języka PHP za już wcześniej - a jak nie to w dosłownie 5 min kolega z zespołu wytłumaczy bardzo ogólnikowo co to jest.Tylko... skoro dla frontend developera <?php ... ?> to coś z czym nie wie co robić to czemu inaczej by miało być z { ... }? Jeszcze w dodatku będzie musiał uważać przy pisaniu jakiegoś CSS, JS wewnątrz dok. HTML. |
|
|
![]()
Post
#19
|
|
Grupa: Zarejestrowani Postów: 201 Pomógł: 5 Dołączył: 15.07.2008 Skąd: Kłodzko Ostrzeżenie: (10%) ![]() ![]() |
POMOCY!!
|
|
|
![]()
Post
#20
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Cytat Mam problem, więcej w drugim zapytaniu (dziesiąta linijka skryptu). Co mam zrobić? A może byłbyś łaskaw podać treść błędu, a nie się drzeć? |
|
|
![]()
Post
#21
|
|
Grupa: Zarejestrowani Postów: 640 Pomógł: 44 Dołączył: 8.02.2004 Ostrzeżenie: (0%) ![]() ![]() |
Czy jeżeli założę, ża taka osoba jest w wystarczającym stopniu inteligenta by zrozumieć, że to co jest pomiędzy <?php, a ?> to coś czego ma nie ruaszć? Jak chcesz możesz stosować szablony z PHP, ja wolę mieć w szablonach prostą szablonową składnię "trzymającą" porządek i w ładny sposób oferującą dziedziczenie szablonów, czy obsługę bloków (i nie chodzi tu o to że front-end designer nie wie co to PHP/Python, po prostu server side jest wyraźnie oddzielony od client side). Cytat POMOCY!! A wiesz że są funkcje zwracające treść błędu zapytania? Użyj to się dowiesz co jest źle, inaczej to do wróżki można sobie pójść. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ten post edytował Riklaunim 21.12.2008, 23:36:48 |
|
|
![]()
Post
#22
|
|
Grupa: Zarejestrowani Postów: 201 Pomógł: 5 Dołączył: 15.07.2008 Skąd: Kłodzko Ostrzeżenie: (10%) ![]() ![]() |
Niema żadnego błądu, tylko niewiem co napisać zobacz co jest w drugim zapytaniu. Skąd wziąść identyfiaktor kategorii forum w skrypcie?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)
Wiem że są funkcje, ale zapytanie jest dobrze skonstruowane więc nie wywala żadnych błędów. Jednak zamiast POMOCY w zapytaniu wolał bym mieć identyfikator kategorii forum. Jeśli zamiast tego podstawię 1 to w pierwszej i drugiej kategorii będą fora z pierwszej kategorii, jeśli podstawię 2 to będą z drugiej, a ja chciałbym aby w pierwszej były z pierwszej a w drugiej z drugiej. POMOCY!!! |
|
|
![]()
Post
#23
|
|
Grupa: Zarejestrowani Postów: 640 Pomógł: 44 Dołączył: 8.02.2004 Ostrzeżenie: (0%) ![]() ![]() |
Coś jakby musisz umieścić zapytania o fora z danej kategorii w pętli pobierania kategorii. Coś w stylu:
Kod while($rekord = mysql_fetch_array($zapytanie)) {
$zapytanie2 = mysql_query("SELECT * FROM fora WHERE kategoria=".$rekord['id']." ORDER BY tytul"); while($rekord2 = mysql_fetch_array($zapytanie2)) { $tablica2[] = $rekord2; } $tablica[] = array($rekord, $tablica2); } |
|
|
![]()
Post
#24
|
|
Grupa: Zarejestrowani Postów: 201 Pomógł: 5 Dołączył: 15.07.2008 Skąd: Kłodzko Ostrzeżenie: (10%) ![]() ![]() |
http://www.codemaster2222.yoyo.pl/skrypt.php - niedziała: wyświetla wszystkie fora w każdej kategorii.
|
|
|
![]()
Post
#25
|
|
Grupa: Zarejestrowani Postów: 640 Pomógł: 44 Dołączył: 8.02.2004 Ostrzeżenie: (0%) ![]() ![]() |
Pomyśl trochę. Jeżeli pobiera wszystkie fora to znaczy że warunek WHERE jest błędny. Zakładając że masz relację jeden do wielu w tabeli for powinna być kolumna z numerem ID danej kategorii - i wstawiając w warunku where id obecnie przemiatanej kategorii musi zadziałać (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Dla przykładu fragment struktury mojego forum: Kod CREATE TABLE IF NOT EXISTS `rk_category1` ( `id` int(11) NOT NULL auto_increment, `name` varchar(255) NOT NULL, `order` smallint(5) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; CREATE TABLE IF NOT EXISTS `rk_forum1` ( `id` int(11) NOT NULL auto_increment, `category_id` int(11) NOT NULL, `name` varchar(255) NOT NULL, `description` varchar(255) NOT NULL, `topics` int(10) unsigned NOT NULL, `posts` int(10) unsigned NOT NULL, `lastposter` varchar(255) default NULL, `lasttopic` varchar(255) default NULL, `modification_date` datetime NOT NULL, `order` smallint(5) unsigned NOT NULL, `use_prefixes` tinyint(1) NOT NULL, `allow_anonymous` tinyint(1) NOT NULL, `use_moderators` tinyint(1) NOT NULL, PRIMARY KEY (`id`), KEY `rk_forum1_category_id` (`category_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; Tabela rk_forum1 ma kolumnę "category_id" przechowującą wartość "id" kategorii (rk_category1), do której jest przypisane (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
![]()
Post
#26
|
|
Grupa: Zarejestrowani Postów: 201 Pomógł: 5 Dołączył: 15.07.2008 Skąd: Kłodzko Ostrzeżenie: (10%) ![]() ![]() |
Jak to ma działeć to ja wie, przecież jak robiłem to samo tylko że w praserże to działało.
Skrytp:
Skrypt najpierw pobiera wszystkie fora z kategorii 1, dopisuje je do tablicy, a puźniej wszystkie z kategorii 2, i też dopisuje je do tablicy. Szablon: |
|
|
![]()
Post
#27
|
|
Grupa: Zarejestrowani Postów: 640 Pomógł: 44 Dołączył: 8.02.2004 Ostrzeżenie: (0%) ![]() ![]() |
Po wierszu z $zapytanie2 możesz dać $tablica2[] = array(); żeby wyczyścić tablicę przed zapełnieniem ją kolejnymi forami. Po zakończeniu pętli dla $zapytanie2 musisz tą $tablica2 dodać do głównej tablicy kategorii np:
Kod $tablica[] = array($rekord, $tablica2); Usuwając zarazem $tablica[] = $rekord;. Dzięki temu masz jedną tablicę do przekazania do szablonu. $tablica[ELEMENT][0] to dane kategorii, a $tablica[ELEMENT][1] to tablica z forami dla tej kategorii - czyli w szablonie dajesz foreach as $cośtam na $tablica i w nim kolejnego foreach na $cośtam[1] (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
![]() ![]() |
![]() |
Aktualny czas: 11.10.2025 - 05:39 |