![]() |
![]() ![]() |
![]() |
![]()
Post
#81
|
|
![]() Grupa: Zarejestrowani Postów: 518 Pomógł: 6 Dołączył: 21.07.2008 Ostrzeżenie: (0%) ![]() ![]() |
Pamięć dobra, ale krótka o czym kiedyś pisałeś co zrobić gdy wyskakuje błąd. Takie podsumowanie, że już nie kumam.
Wolałbym się nad tym nie rozwodzić, but life is brutal and full of zasadzkas and sometimes kopas w dupas... tylko zgredzi nic nie kumają that there are beautiful moments in life, so let's enjoy life before old age hunt down you Funkcje w szablonach mogą być jeszcze z wersji pierwszej, sprzed tego o czym pisałeś. Potem zobaczę do tych funkcji, przy optymalizacji i spróbuje według nowych wytycznych poprawić powtórki. Na ten czas poprawiałem TODO w kodzie i wyszły te szablony do zrobienia. Problem nie jest w samym błędzie, to można poprawić, ale poprawianie tego błędu nie wiele daje, gdyż funkcją preg_replace() której dotyczy błąd nie rozwiąże problemu rozszerzenia szablonów o dodatkowe funkcje, funkcjonalność. Raczej przydałby się kolejny mechanizm dla takiego rozszerzenia. Chyba, że wystarczy poprawić preg_replace(),, dodać jakąś pętle itp. Wystarczy jedna sprytna metoda, nie potrzebnie tu kombinuje, bo nie wiem jak dopracować ten silnik szablonów? Z tego co poczytałem $this w templates to nie kłopot, więc decyduje się na takie rozwiązanie, gdzie this/y będą tak <?= $this->trans('lang') ?> https://github.com/artimman/dbmframework/bl...ates/base.phtml i powinno być Ok, lepsze niż kombinacje z preg_replace(), poza tym w znacznikach <?php ?> zawsze zadziała, natomiast kompilowane przez funkcje to już zależy na co trafi. Dzięki dodaniu klasy TemplateEngine rozwiązany został problem w pliku template.php use Dbm\Interfaces\DatabaseInterface oraz aplikacja rozbudowana została o takie mechanizmy jak kompilator szablonów i cache. Jeżeli teraz szablony są Ok pozostały drobne pytania (oznaczone TODO) 1. private static $blocks = array(); Zastanawiałem się nad static array, ale powinno być Ok? 2. w Necie wyczytałem, że nie powinno się używać PHP_EOL należy użyć "/n"? Przy formatowaniu kodu HTML zakładam, że lepiej jest użyć PHP_EOL, wówczas powinno wykonać to samo w każdym systemie. P.S. Usunąłem kilka powtórek else, które wyłapałem, że są do poprawienia. Już sobie przypominam kiedy wyskakuje błąd, to wrzucić kod i komunikat błędu. Ok, ale tak tylko sobie "głośno" myślałem co z tym zrobić i problem rozwiązany. Sorki, że dopytuje o takie szczegóły jak PHP_EOL, ale w Sieci jak taka ilość różnych informacji, że czasem trudno rozróżnić co jest dobre, a co nie. Ten post edytował Malinaa 28.02.2024, 19:20:09 -------------------- I welcome you on the Internet >>> Design by Malina
|
|
|
![]()
Post
#82
|
|
![]() Grupa: Moderatorzy Postów: 36 457 Pomógł: 6297 Dołączył: 27.12.2004 ![]() |
Cytat Sorki, że dopytuje o takie szczegóły jak PHP_EOL, ale w Sieci jak taka ilość różnych informacji, że czasem trudno rozróżnić co jest dobre, a co nie. A gdzie ty chcesz uzywac tego PHP_EOL? Bo ciezko mi sobie wyobrazic gdzie ci jest potrzebne INna sprawa ze nie zastanawiasz sie nad kodem ktory piszesz. W wielu miejscach masz <?= trans('charset') ?> czyli wywolujesz funkcje trans() petryliard razy. A co robi funkcja trans? za kazdym razem robi require($pathTranslation); no tak nie mozna.... Wczytaj plik raz, jego przerobine dane trzymaj w obiekcie i korzystaj z nich a nie za kazdym razem przerabiasz ten sam proces. A require to tylko jezna z nieicznych rzeczy ktore bez sensu powtarzac odpalajac trans() -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#83
|
|
![]() Grupa: Zarejestrowani Postów: 518 Pomógł: 6 Dołączył: 21.07.2008 Ostrzeżenie: (0%) ![]() ![]() |
Użycie PHP_EOL w TemplateEngine
Kod file_put_contents($cachedFile, '<?php class_exists(\'' . __CLASS__ . '\') or exit; ?>' . PHP_EOL . $code); Kolejny kod, w którym chcę używać zamiast "\n", metody w TemplateFeature, np. public function htmlUser( ... $html .= '<img class="dbm-img-profile rounded-circle" src="' . $this->path() . 'images/avatar/' . $avatar . '">' . "\n"; // PHP_EOL powinno być tu lepsze, ponieważ wykona to samo w każdym systemie ... ) i podobne metody z htmlem. Faktycznie <?= trans('charset') ?> nie powinno tak być. Najszybciej co przyszło mi na myśl: Kod class Translation implements TranslationInterface { private $translation; public function __construct() { $this->translation = json_encode($this->translation()); } /* Language translation */ public function trans(string $key, array $data = null, array $sprint = null): string { $trans = json_decode($this->translation, true); } } Czy ten kod rozwiązuje problem, czy można lepiej? Pewnie tak jest, że piszę trochę z "automatu", zwykle dopiero przy drugim i kolejnym podejściu do metody zastanawiam się nad nią pod względem optymalizacji. Tak z miejsca optymalizować kod to chyba jeszcze nie na tym poziomie, ale fajnie byłoby od razu to widzieć. Przy okazji będąc w class Translation poprawiłem else itp. o czym wcześniej pisałeś, chociaż czy klasa jest już optymalna? Pewnie można lepiej, ale niestety może przy trzecim podejściu zobaczę więcej i będzie super optymalnie. -------------------- I welcome you on the Internet >>> Design by Malina
|
|
|
![]()
Post
#84
|
|
![]() Grupa: Moderatorzy Postów: 36 457 Pomógł: 6297 Dołączył: 27.12.2004 ![]() |
Cytat $this->translation = json_encode($this->translation()); $trans = json_decode($this->translation, true); Czyli robisz json_encode raz, tylko po to, by potem za kazdym razem w metodzie trans petryliard razy robic json_decode. I teraz wytlumacz mi prosze, bo naprawde nie kumam, czemu nie mozesz tej tablicy przechowywac jako tablce, tylko musisz ja kodowac a potem dekodowac za kazdym razem. Jaka logika temu przyswiecala? Bo jakas na pewno musiala prawda? Cytat $html .= '<img class="dbm-img-profile rounded-circle" src="' . $this->path() . 'images/avatar/' . $avatar . '">' . "\n"; // PHP_EOL powinno być tu lepsze, ponieważ wykona to samo w każdym systemie Przeciez tu generujesz kod html... tu w ogole nie trzeba nowej linii od tego zacznijmy. A nawet jesli by byla to co z tego ze serwer ci wygeneruje nowa linie wg systemu serwera, skoro klient ktory dostanie kod html moze byc na milionie innych systemow. wal \n i sobie glowy nie zawracaj Cytat file_put_contents($cachedFile, '<?php class_exists(\'' . __CLASS__ . '\') or exit; ?>' . PHP_EOL . $code); To samo tutaj, to sa pliki cache, co ci zalezy czy bedzie tam \n czy PHP_EOL? TO nic nie zalatwia Cytat Przy okazji będąc w class Translation poprawiłem else itp. o czym wcześniej pisałeś, chociaż czy klasa jest już optymalna? Nie wiem gdzie to poprawiles, na githubie zmian nie widze -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#85
|
|
![]() Grupa: Zarejestrowani Postów: 518 Pomógł: 6 Dołączył: 21.07.2008 Ostrzeżenie: (0%) ![]() ![]() |
Chyba spanikowałem, na szybkości dodałem json_encode() kombinując z obiektem (kolejna kombinacja pod górkę, bo logiki w tym nie widzę).
Napisałeś "dane trzymaj w obiekcie". Z tą tablicą do obiektu, aby w funkcji używać tablicy - to json_encode() ![]() Chyba, że chcesz, aby przerobić całą metodę trans() na obiekcie, ale to nie wiem o co chodzi kiedy dane są w tablicy (w PHP 8 widzę coś chyba tematycznego enum{}) Czy nie może być po prostu: Kod public function __construct() { $this->translation = $this->translation(); } bo nie rozumiem o co chodzi z tym obiektem z reqiure array. Przy PHP_EOL chcę się tu zdecydować na jedno PHP_EOL lub "\n", wcześniej dadawałem "\n" bo prościej niż pisać PHP_EOL, ale to daje w każdym systemie ten sam efekt, więc czy nie lepiej użyć PHP_EOL. Załatwia to tyle, że przy wyświetleniu źródła strony jest czytelnie, a bez przejść do nowej linii mamy wszystko w jednej niekończącej się linii (za górami, za lasami... nie może tak być). Nie było jeszcze kiedy poprawiać szablony pod nowy silnik, ale kilka poprawek przy silniku wczoraj przesłałem TemplateFeauture i Translation https://github.com/artimman/dbmframework/tr...ication/classes -------------------- I welcome you on the Internet >>> Design by Malina
|
|
|
![]()
Post
#86
|
|
![]() Grupa: Moderatorzy Postów: 36 457 Pomógł: 6297 Dołączył: 27.12.2004 ![]() |
Cytat Napisałeś "dane trzymaj w obiekcie". Chodzilo mi o obiekt translation, ze w nim masz trzymac dane, a nie ze dane maja byc obiektem Cytat Przy PHP_EOL chcę się tu zdecydować na jedno PHP_EOL lub "\n", wcześniej dadawałem "\n" bo prościej niż pisać PHP_EOL, ale to daje w każdym systemie ten sam efekt, więc czy nie lepiej użyć PHP_EOL. Załatwia to tyle, że przy wyświetleniu źródła strony jest czytelnie, a bez przejść do nowej linii mamy wszystko w jednej niekończącej się linii (za górami, za lasami... nie może tak być). Uzywaj \n i nie kombinuj, Juz ci zdaje sie to napisalem. to nie 20 lat temu ze trzeba bylo sie takimi duperami przejmowac bo kazdy system wszystko inaczej interpretowal. Teraz nowa linia to uniwersalne \n -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#87
|
|
![]() Grupa: Zarejestrowani Postów: 518 Pomógł: 6 Dołączył: 21.07.2008 Ostrzeżenie: (0%) ![]() ![]() |
Przy sprzątaniu i optymalizacji natrafiłem na kod w public/index.php który był z wersji v1
isset($_GET['url']) ? $fileBasename = basename(str_replace('/', ',', $_GET['url']), '.html') : $fileBasename = 'index'; ... define('BASE_FILE', $fileBasename); W obecnej wersji nie ma już $_GET['url'] a BASE_FILE jest używane tylko w jednym miejscu, więc nie ma potrzeby definiować. W pliku start.php -> function reportingErrorHandler() dopisałem Kod $basename = 'index'; $uri = $_SERVER["REQUEST_URI"]; $dir = str_replace('public', '', dirname($_SERVER['PHP_SELF'])); if ($uri !== $dir) { $basename = str_replace('.html', '', basename($_SERVER["REQUEST_URI"])); if (strpos($uri, '.') !== false) { preg_match('/\.(.*?)\./', $uri, $match); if (array_key_exists(1, $match)) { $basename = $match[1]; } } } i powyższe posprzątane, ale wyszło sporo zagnieżdżeń. 1. Szukam pomysłu jak uprościć kod? System rozbudowany jest o rejestracje i logowanie, Admin po zalogowaniu może przejść do Panelu. 2. W panelu sporo jest w JS, ale pisałem w jQuery i AJAX, chyba należałoby zmienić na np. React? A jeżeli React to pewnie przydałby się Webpack. No i pytanie jak to zrobić z tym kodem JS i AJAX, aby było super dobrze ![]() System szablonów zrobiony i szablony przerobione pod nowy system, zaktualizowane na Gicie: https://github.com/artimman/dbmframework Ten post edytował Malinaa 16.03.2024, 23:13:31 -------------------- I welcome you on the Internet >>> Design by Malina
|
|
|
![]()
Post
#88
|
|
![]() Grupa: Moderatorzy Postów: 36 457 Pomógł: 6297 Dołączył: 27.12.2004 ![]() |
metoda trans nadal za kazdym razem gdy jest wywolywana odczytuje plik z tlumaczeniami.
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#89
|
|
![]() Grupa: Zarejestrowani Postów: 518 Pomógł: 6 Dołączył: 21.07.2008 Ostrzeżenie: (0%) ![]() ![]() |
Metoda trans() w którym pliku/klasie?
W class Translation został dopisany konstruktor i wygląda Ok public function __construct() { $this->translation = $this->translation(); } Patrzę do class TemplateFeature - tutaj jest nie zmienione, ale sytuacja się komplikuje, ponieważ tu wszystko jest public dla szablonów i nie wstrzyknę metod z class Translation -> private - będzie konflikt Co zrobić, aby metod z class Translation -> translation() móc używać też w class TemplateFeature w obu klasach i nie powtarzać kodu. Spróbowałem wstrzyknąć na różne sposoby, ale ciągle coś wyskakuje że musi być public? Dla przykładu daję kod z metody do konstruktora Kod class TemplateFeature { public $translation; public function __construct() { $cookieName = 'DbmLanguage'; $languageDefault = 'pl'; $arrayLanguages = explode('|', APP_LANGUAGES); !empty($arrayLanguages[0]) ? $language = $arrayLanguages[0] : $language = $languageDefault; if (!empty($_GET['lang'])) { $language = $_GET['lang']; if (strtolower($language) === 'off') { $language = $languageDefault; } } elseif (isset($_COOKIE[$cookieName])) { $language = $_COOKIE[$cookieName]; } $pathTranslation = BASE_DIRECTORY . "translations/language." . strtolower($language) . ".php"; if (file_exists($pathTranslation)) { $this->translation = include($pathTranslation); } } } ... public function trans(string $key, array $overwrite = [], array $sprint = null): string { if (!empty($this->translation)) { $translation = $this->translation; .... } } otrzymuję komunikat: Fatal error: Access level to App\Controller\IndexController::$translation must be public (as in class Dbm\Classes\BaseController) in IndexController.php on line 18 Nie chciałbym teraz dla tego $translation zmieniać wszystkie kontrolery private na public Zmieniam w klasie public $translation; na public $publicTranslation; komunikat znika, oki, ale nie wczytuje tablicy if (!empty($this->publicTranslation)) jest empty, ścieżka ok itp. coś blokuje odczytanie tablicy? - - - Zmieniłem jednak kontrolery i parę rzeczy: https://github.com/artimman/dbmframework/co...8979ae418856695 Metoda poprawiona - wygląda Ok? I mniej kodu w kontrolerach, czyli też Ok. Ten post edytował Malinaa 20.03.2024, 21:04:10 -------------------- I welcome you on the Internet >>> Design by Malina
|
|
|
![]()
Post
#90
|
|
![]() Grupa: Moderatorzy Postów: 36 457 Pomógł: 6297 Dołączył: 27.12.2004 ![]() |
Tak, wlasnie o cos takiego mi chodzilo
public function __construct() { $this->arrayTranslation = $this->translation(); } No ale czemu za kazdym razem tworzysz teraz znowu obiekt translation? Czemu nie stworzysz go raz na takiej samej zasadzie jak DataBase i nie przekazujesz gdzie trzeba? -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#91
|
|
![]() Grupa: Zarejestrowani Postów: 518 Pomógł: 6 Dołączył: 21.07.2008 Ostrzeżenie: (0%) ![]() ![]() |
Konstruktor, o który chodziło to już był.
Obiekt translation tworzę raz w class BaseController extends TemplateEngine Nie za bardzo chciałbym tworzyć $translation w index.php i przechodzić przez całość Router itd... Po co jechać, aż od index.php, bo chyba o tym mowa! Czy nie może zostać w BaseController? -------------------- I welcome you on the Internet >>> Design by Malina
|
|
|
![]()
Post
#92
|
|
![]() Grupa: Moderatorzy Postów: 36 457 Pomógł: 6297 Dołączył: 27.12.2004 ![]() |
Cytat Konstruktor, o który chodziło to już był. Mi nie chodzilo o bycie konstruktora, tylko o to co w nim mialo byc... Cytat Obiekt translation tworzę raz w class BaseController extends TemplateEngine Nie za bardzo chciałbym tworzyć $translation w index.php i przechodzić przez całość Router itd... Po co jechać, aż od index.php, bo chyba o tym mowa! Czy nie może zostać w BaseController Obiekt tranlation tworzysz w wielu miejscach, nie tylko w BaseController. Wiec nadal wielokrotnie powielasz te same akcje, ala czytanie tego samego pliku, I wracamy znowu dotego samego, niby chcesz porzadnie a potem i tak po lebkach robisz. Sie zdecyduj -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#93
|
|
![]() Grupa: Zarejestrowani Postów: 518 Pomógł: 6 Dołączył: 21.07.2008 Ostrzeżenie: (0%) ![]() ![]() |
Ok, rozumiem o czym mówisz, kilka tygodni temu zostało już zrobione tak jak miało być...
teraz tylko zmieniłem nazwę $this->translation = $this->translation(); na $this->arrayTranslation - to już było zrobione na to co w nim miało być. Cytat Obiekt tranlation tworzysz w wielu miejscach... Faktycznie był tworzony jeszcze w modelach LoginModel i RegisterModel, poprawiłem jest już tylko w BaseController. Czy teraz jest Ok, czy trzeba jechać od index.php? Jeśli tak to nie rozumiem, dlaczego aż od index.php . Co w przypadku np. new PHPMailer() obiekt jest tworzony wiele razy jeśli podstrona wymaga obsługi email, ale jak rozumiem optymalnie będzie $translation obiekt utworzyć jeden raz. Zmiana $transloation (obiekt utworzony tylko jeden raz w BaseController): https://github.com/artimman/dbmframework/co...b186fb927320b16 Zastanawia mnie jeszcze: Kod class TemplateFeature to "public", z którym był kłopot musiałem tutaj dodać
{ public $translation; ... } Ten post edytował Malinaa 21.03.2024, 13:43:27 -------------------- I welcome you on the Internet >>> Design by Malina
|
|
|
![]()
Post
#94
|
|
![]() Grupa: Moderatorzy Postów: 36 457 Pomógł: 6297 Dołączył: 27.12.2004 ![]() |
Cytat Jeśli tak to nie rozumiem, dlaczego aż od index.php . Ja nie sledze dokladnie twojego kodu. DataBase musialo byc od index, potem widziale mze translation tez tworzysz w kilku miejscach wiec tez wydalo sie ze ma byc od index. Generalnei chodzi o to by nie tworzyc tego samego obiektu milion razy co ci sie zdarzalo. Cytat Zastanawia mnie jeszcze: Kod class TemplateFeature { public $translation; ... } to "public", z którym był kłopot musiałem tutaj dodać czemu nie ustawisz tego translation w construktorze popprostu? -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#95
|
|
![]() Grupa: Zarejestrowani Postów: 518 Pomógł: 6 Dołączył: 21.07.2008 Ostrzeżenie: (0%) ![]() ![]() |
Cytat Generalnei chodzi o to by nie tworzyc tego samego obiektu milion razy co ci sie zdarzalo. Jasne. Dzięki, że zwróciłeś na to uwagę, bo gdzieś mi się "zapodziało". 1 Milion ![]() class TemplateFeature jest taką trochę inną klasą "zewnętrzną" (wszystko musi być public), wszystko stąd idzie tylko w szablonach i o dziwo ? nie ma potrzeby tworzenia konstruktora, ustawiam tylko public $translation; i w metodzie trans() o której pisałeś że ładuje tablice za każdym razem daje !empty($this->translation->arrayTranslation) ? $translation = $this->translation->arrayTranslation : $translation = null; i całe to wielokrotne ładowanie tej samej tablicy mogłem usunąć (trochę dziwne, no ale działa bez błędu) i jest zoptymalizowane. Była informacja, aby wykonać jeszcze testy w PHPUnit najlepiej TDD. Tworzę class DatabaseTest {} i chciałbym przetestować połączenie i metody klasy Database w application/classes/. szukam informacji w Necie, próbuję napisać test, ale nic sensownego nie wychodzi. Jak napisać testy jednostkowe TDD z PHPUnit? Ten post edytował Malinaa 21.03.2024, 19:21:05 -------------------- I welcome you on the Internet >>> Design by Malina
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 28.04.2024 - 00:25 |