Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

3 Stron V   1 2 3 >  
Reply to this topicStart new topic
> nauka - własny system szablonów
mgebala8
post 11.07.2014, 09:12:54
Post #1





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 9.07.2014

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


Korzystając z chwili wolnego czasu robię sobię odwozorwanie różnych funkcjonalności frameworków - obiektowo i w php, np. routing, połączenia bazodanowe singleton vs proxy itp.
Wszystko głównie w celach edukacyjnych ale kto wie może z tego wyjdzie mi kiedyś jakaś namiastka frameworka lub microframework.

Wśród wielu różnych modułów stanąłem jednak przed problemem odwzorowania systemu szablonów i tu pojawia się problem jak coś takiego napisać ? ogólnie wpadłem na pomysł że za pomocą wyrażeń regularnych zamienie sobię kod np.

  1.  
  2. treść strony
  3.  
  4. @include('menu')
  5.  
  6. @for($i=0;$i<10;$i++)
  7. bla bla bla
  8. @endforeach
  9.  
  10. tutaj moja zmienna przekazana do widoku: {$zmienna}
  11.  


domyślnie maszynka ma mi zamienić coś takiego na poniższy ciąg i przypisać to do zmiennej $widok;

  1. <?php include('menu') ?>
  2.  
  3. <?php for($i=0;$i<10;$i++):?>
  4. bla bla bla
  5. <?php endforeach; ?>
  6.  
  7. tutaj moja zmienna przekazana do widoku: <?php echo $zmienna ?>
  8.  


i tu pojawia się mały problem a w zasadzie 2, czy na podobnej zasadzie działają silniki twig czy blade ? oraz jak mogę sparsować i wyświetlić treść strony trzymaną w zmiennej $widok ?

Ten post edytował mgebala8 11.07.2014, 09:13:27
Go to the top of the page
+Quote Post
Pyton_000
post 11.07.2014, 09:21:55
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Pseudokod jest zamieniany na zwykły kod php i wykonywany (dodatkowo w cache zapisana wersja PHP). Czyli tak jak pokazałeś.
Go to the top of the page
+Quote Post
mgebala8
post 11.07.2014, 10:10:26
Post #3





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 9.07.2014

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


Pyton_000 dzięki za odpowiedź, wcześniej nie myślałem o cache-owaniu danych a teraz poddałeś mi całkiem dobry pomysł na poszerzenie swojej wiedzy w ta stronę, w związku z tym 3 pytania:

- Gdzie powinno się zapisywać cache ? sesje, pliki czy baza danych ? Jest jeszcze pamięć ram ale ona odpada ze względu na dodatkową konfigurację a mi zależy na uniwersalności i prostocie.
- Jak wygląda nadpisywanie takich danych ? korzystając z laravela wszelkie zmiany są wprowadzane na bieżąco więc skąd on wie kiedy ma je nadpisać a kiedy zostawić i pobrać ?
- ponawiam pytanie dotyczące wyświetlenia zawartości strony w zmiennej $widok - trzymam tam for include itp. więc zwykłe polecenie echo odpada


Pozdrawiam i dziękuję za wskazówki - są one bezcenne ! wink.gif
Go to the top of the page
+Quote Post
nospor
post 11.07.2014, 10:14:08
Post #4





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




Wydaje mi się, że bez sensu jest pisać własny system szablonow. Kilka powodow:
1) Jest to bezsensu wink.gif
2) Jak ktos kiedys bedzie chcial/musial pisac z tobą lub po tobie poprawiac, to zachlasta się na kolejnym systemie szablonow
3) Nie będzie to mialo pelnej porządnej funkcjonalnosci
4) Lepiej już zrobic system widoku, gdzie bedziesz mieszal kod php z html. Kazdy bez problemu bedzie mogl pisac w takim "szablonie" i bedzie mogl robic co bedzie chcial/potrzebowal i nie bedzie ograniczony to prostego systemu szablonow.
Przyklad jak cos takiego napisac w 10 minut masz mojej stopce


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mgebala8
post 11.07.2014, 10:32:53
Post #5





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 9.07.2014

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


^^ nospor, rozumiem Cię ale bardziej mi zależy na nauce i pobawieniu się kodem niż wymyślaniu koła na nowo…

w swojej zmiennej pobierasz content za pomocą constukcji:

  1.  
  2. $this->Run($params);
  3. $result = ob_get_contents();



a jest jakaś opcja żeby to odwrócić ? coś w stylu ob_set_contents() wink.gif
Go to the top of the page
+Quote Post
nospor
post 11.07.2014, 10:42:16
Post #6





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




Po co?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Crozin
post 11.07.2014, 10:51:37
Post #7





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Pisanie własnych narzędzi "dla nauki" ma jakiś tam sens, ale nie w Twoim przypadku. Po pytaniach jakie zadajesz widać, że masz niedużą wiedzę w wielu dziedzinach, których znajomość jest niezbędna do napisania czegoś co miałoby ręce i nogi (nawet w kontekście "dla nauki"). IMO powinieneś wykorzystać ten czas na zaznajomienie się z jakimś istniejącym rozwiązaniem (np. wspomniany Twig) i jego dogłębnym poznaniem. Nie dość, że nauczysz się "jak zrobić to dobrze", przy okazji poznasz narzędzie, które będziesz mógł wykorzystać w prawdzinym projekcie.

PS. Wyrażenia regularne nie nadają się do parsowania tego typu rzeczy.
Go to the top of the page
+Quote Post
mgebala8
post 11.07.2014, 10:57:38
Post #8





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 9.07.2014

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


Crozin - dzięki za opinie, właśnie dlatego ten temat i próba skoczenia na głęboką wodę wink.gif

Co do twiga myślę że znam go dobrze, blade z laravela z nam bardzo dobrze i często go wykorzystuje w komercyjnych projektach. Tu raczej chodzi o to żeby zobaczyć co jest pod maską i spróbować napisać coś swojego, nawet jeśli miałby to być maluch w porównaniu do mercedesa jakim jest blade to myślę że warto wink.gif

dlaczego wyrażenia regularne nie nadają się do parsowania tego typu rzeczy ? i co w takim razie to parsuje ?

Ten post edytował mgebala8 11.07.2014, 11:25:46
Go to the top of the page
+Quote Post
!*!
post 11.07.2014, 11:00:25
Post #9





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


@ w kodzie to chybiony pomysł, kojarzą się z czymś innym wink.gif Jeśli chcesz odpalać zmienne tylko w widoku, zainteresuj się extract, zakładając że używasz tego w klasach, inaczej nadpiszesz zmienne globalnie. Do zmiany pseudo kodu, możesz użyć preg_repalce i stworzyć coś na wzór tokenizacji.


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
mgebala8
post 11.07.2014, 11:06:06
Post #10





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 9.07.2014

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


po prostu wykorzystałbym funkcje:



a co do @ blade z laravela wykorzystuje ją z powodzeniem


Ten post edytował mgebala8 11.07.2014, 11:07:56
Go to the top of the page
+Quote Post
Crozin
post 11.07.2014, 11:29:52
Post #11





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


@mgebala8: @!*!: @mgebala8: HTML-a nie da się parsować przy pomocy wyrażeń regularnych, podobnie jest z szablonami (ten sam poziom złożoności języka). Taka niemal standardowa lektura: http://stackoverflow.com/a/1732454/252591

Ten post edytował Crozin 11.07.2014, 11:30:32
Go to the top of the page
+Quote Post
!*!
post 11.07.2014, 11:33:00
Post #12





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


@Crozin - w systemie szablonów nie chodzi o parsowanie HTML.

Ten post edytował !*! 11.07.2014, 11:33:51


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
Crozin
post 11.07.2014, 11:34:20
Post #13





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


@!*!: Napisałem, że podobnie jak przy próbie parsowania HTML-a, ponieważ "typowy system szablonów" (patrz wspomniany Twig) operuje na równie złożonym co HTML poziomie języka.
Go to the top of the page
+Quote Post
!*!
post 11.07.2014, 11:38:12
Post #14





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


Cytat(Crozin @ 11.07.2014, 12:34:20 ) *
@!*!: Napisałem, że podobnie jak przy próbie parsowania HTML-a, ponieważ "typowy system szablonów" (patrz wspomniany Twig) operuje na równie złożonym co HTML poziomie języka.


Bez przesady, to tylko zamiana X na Y. Jakkolwiek by tego nie napisać, zawsze znajdzie się w tym jakiś brak i nic nie zastąpi czystego PHP.


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
Crozin
post 11.07.2014, 11:41:54
Post #15





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Nie, to nie tylko zamiana X -> Y, bo przykładowo taki zapis jest niepoprawny:
Kod
<abc>

@if (...)

  dsadas

@endfor
Nie może wystąpić tag @endfor bez uprzedniego wywołania @for.

Ponownie polecam lekturę pytania i kilku pierwszych odpowiedzi, które zawierają już dużo więcej merytorycznych argumentów: http://stackoverflow.com/questions/1732348...-contained-tags - szczególnie, fragment dot. hierarchii Chomsky'ego.

Ten post edytował Crozin 11.07.2014, 11:42:34
Go to the top of the page
+Quote Post
!*!
post 11.07.2014, 11:47:30
Post #16





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


Jeśli ktoś czepia się takich "błędów" to równie dobrze możemy mieć pretensje dlaczego to nie działa w czystym PHP. Strata czasu na taki parser.


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
mgebala8
post 11.07.2014, 11:57:16
Post #17





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 9.07.2014

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


Crozin - wybacz ale za bardzo Cię nie rozumiem ? Jest gościu który chce się porwać z motyką na słońce i spróbować napisać coś swojego nawet niech będzie to gorsze i okrojone ale przecież nie oto chodzi by tworzyć następcę laravela, po prostu nauczę się czegoś nowego a ty za wszelką cenę chcesz mi uświadomić że nic nie wiem i nie powinienem się za to zabierać ehh już samo przygotowanie do napisania takiego systemu szablonów nauczyło mnie kilku nowych rzeczy a co dopiero pisanie go wink.gif

jeśli chodzi o :
Nie może wystąpić tag @endfor bez uprzedniego wywołania @for.

to kto powiedział że nie może ? powiem więcej może i wystąpi wtedy w kodzie będziemy mieli:

  1. <?php endfor; ?>


i parser php zwróci błąd ale przecież nie ma to związku z systemem szablonów

ogólnie zarys jest taki:

- zmiana zmiennych {zmienna} na <?php echo $zmienna; ?>
- możliwość odwzorowania kilku pętli ifów (if,for,foreach)
- dodanie opcji layout i wprowadzenie sekcji (w jednym pliku mamy kilka sekcji które parser zapisuje do tablicy i podmienia w drugim pliku template)
- odwzorowanie @include - i tu pojawia się mały problem bo inkludować pliki można by w nieskończoność a przecież każdy inkludowany plik musi być najpierw parsowany przez mój system szablonów

- wygenerowane szablony będziemy zapisywali do pamięci cache żeby odciążyć serwer php

Ten post edytował mgebala8 11.07.2014, 12:07:49
Go to the top of the page
+Quote Post
Pyton_000
post 11.07.2014, 12:09:06
Post #18





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Pisz i nie patrz co Oni piszą smile.gif Celowo chcą Cię zniechęcić, a jak się Im uda to wygrają, a jak nie to pokażesz że jesteś zdeterminowanych w celu smile.gif

Go to the top of the page
+Quote Post
by_ikar
post 11.07.2014, 12:53:11
Post #19





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


Moim zdaniem w php nie powinno się używać żadnych szablonów typu twig, blade, smarty etc bo to jest głupie. Uczysz się kolejnej składni, kolejnego szablonu, w tylko jednym języku tych składni jest kilka.. No a potem wyjdzie symfony 3, symfony 4 i znów będzie jakaś nowa "super duper" lepsza wersja, i wszyscy się tym będą jarać, bo to jest takie fajne.. PHP powstał jako język do szablonów i niech tym pozostanie, dorabianie do tego na siłę jakiejś dodatkowej logiki, bo tak jest "ładniej", jest bezsensu. A o syntaksie w edytorach nie wspomnę. Zaś musisz mieć edytor który ci to sensownie podświetla, ewentualnie monituje cię o literówkach, to trzeba jakieś wtyczki do edytorów ściągać.. To już przestaje być zabawne, a powody do używania jakiś systemów szablonów są kuriozalne. Np twig for designers (fuck yeah, bo w zwykłym php wygląda to brzydko). Albo jeszcze lepsze ze strony twiga:

  1. But even if PHP started its life as a template language, it did not evolve like one in the recent years. As a matter of fact, it doesn't support many features modern template engines should have nowadays


No tak, bo przecież twig jest napisany w innym języku, dlatego ma więcej możliwości..

Kiedyś też myślałem że tak się powinno robić, bo wszyscy tak robili, aż uświadomiłem sobie że to jest bezsensu. "Jedzmy gówno, milion much nie może się mylić".
Go to the top of the page
+Quote Post
mgebala8
post 11.07.2014, 12:53:30
Post #20





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 9.07.2014

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


Pyton_000 - dzięki za wsparcie, traktuję to jako zabawę więc nie tak łatwo mnie zniechęcić wink.gif

Cytat(nospor @ 11.07.2014, 11:42:16 ) *
Po co?


załóżmy że mam zmienną $widok = 'echo "test<hr>"; for($i=1;$i<10;$i++){echo "test<br>"}';

i teraz chciałbym ją wypisać i sparsować na ekranie a do tego potrzebuje czegoś w stylu ob_set_contents() bo echo mi tutaj nie zadziała...



Go to the top of the page
+Quote Post

3 Stron V   1 2 3 >
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 Wersja Lo-Fi Aktualny czas: 25.04.2024 - 05:57