Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

8 Stron V   1 2 3 > » 

Pilsener
Napisane: 12.07.2018, 08:20:16





Grupa: Zarejestrowani
Postów: 1 590
Dołączył: 19.04.2006
Skąd: Gdańsk

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

Jak dla mnie bardzo słabo, podstawowy problem jak tu widzę, to brak celu.
Pisać takie coś, ale po co? By się nauczyć, jak się pisało skrypty PHP 20 lat temu, bez OOP, frameworków i bibliotek?
Nie ma sensu pisać takich rzeczy, bo nie dość, że się niczego nie nauczysz to jeszcze nabierzesz złych nawyków i potem trzeba Ciebie będzie oduczyć.
I nie chodzi tu o szczegóły typu:
  1. else if($user_email == "")
  2. {
  3. $info[] = "Provide e-mail!";
  4. }
  5. else if(!filter_var($user_email, FILTER_VALIDATE_EMAIL))
  6. {
  7. $info[] = "Enter a valid e-mail!";
  8. }
  9. else if($user_pass == "")
  10. {
  11. $info[] = "Provide password!";
  12. }

  1. if($user->login($user_name, $user_email, $user_pass))
  2. {
  3. echo '<meta http-equiv="refresh" content="0; url=home.php">';
  4. }
  5. else
  6. {
  7. $error[] = "Wrong login or password. Try again!";
  8. }


Tylko o podejście do projektowania aplikacji. Nawet 20 lat temu sposób myślenia był często taki:
1. Odbiorę i sprawdzę request
2. Pobiorę i przygotuje odpowiednie dane z bazy
3. Przygotuje odpowiedź - dokument HTML, 404 etc.
4. Wyślę to do przeglądarki

Tworząc apkę internetową trzeba najpierw się zastanowić, jakich użyć technologii i dlaczego a jeśli nie PHP 7.2 OOP to trzeba mieć dobry argument dlaczego.
Potem trzeba sobie zaprojektować szkielet aplikacji i przemyśleć takie rzeczy jak:
- error handler i narzędzia deweloperskie
- konfiguracja + środowiska (deweloperskie, produkcyjne etc.)
- obsługa bazy danych (ORM, gołe PDO, inny?)
- dołączanie bibliotek zewnętrznych (composer, yarn etc)
- i wiele innych

Jak chcesz się czegoś nauczyć praktycznego to dołącz do jakiegoś zespołu programistów. W pół roku nauczysz się więcej niż robiąc samemu latami.
  Forum: Oceny · Podgląd postu: #1235295 · Odpowiedzi: 10 · Wyświetleń: 9 111

Pilsener
Napisane: 2.07.2018, 09:16:43





Grupa: Zarejestrowani
Postów: 1 590
Dołączył: 19.04.2006
Skąd: Gdańsk

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

Nie działa Ci, bo nigdzie nie ustawiasz setLocale. Jak już zdefiniowałeś w routingu ten parametr, to trzeba go odebrać i użyć.
  Forum: Frameworki · Podgląd postu: #1234983 · Odpowiedzi: 8 · Wyświetleń: 1 280

Pilsener
Napisane: 17.04.2018, 07:07:34





Grupa: Zarejestrowani
Postów: 1 590
Dołączył: 19.04.2006
Skąd: Gdańsk

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

To zobacz jeszcze to:
https://symfony.com/doc/current/form/form_collections.html

Ciebie powinien szczególnie interesować fragment Doctrine:
Cytat
Cascading Relations and saving the "Inverse" side


I trzeba starać się samemu sobie radzić, jest debug tool, można tam zobaczyć request, co jest w formularz, czy encje są dobrze zmapowane i tak dalej.
ProductDocumentForm powinien zwracać encję ProductDocument, to też trzeba sprawdzić. Debugger wszystko powie.
  Forum: Frameworki · Podgląd postu: #1232085 · Odpowiedzi: 6 · Wyświetleń: 757

Pilsener
Napisane: 28.03.2018, 22:26:24





Grupa: Zarejestrowani
Postów: 1 590
Dołączył: 19.04.2006
Skąd: Gdańsk

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

Da się, ale tylko teoretycznie.
Nie widzę praktycznego zastosowania.
Prosty przykład:
  1. if($php == 7){
  2. echo 'Part only for PHP 7';
  3. }else{
  4. exec('bash-file-set-php-ver-on7');
  5.  
  6. echo 'Part only for PHP 5';
  7. }

Po wykryciu innej wersji PHP możemy odpalić sobie na serwerze skrypt, który zmieni wersję PHP i zresetuje serwer, my natomiast musimy ponownie wysłać request.
Zatem zmieniając wersję PHP w jednym miejscu skryptu, zmieniamy ją jednocześnie dla całej aplikacji - nie da się dynamicznie zmieniać wersji PHP w trakcie parsowania skryptu.

Jeśli mamy takie problemy to najlepiej rozbić aplikację na dwie części - niech każda działa pod inną wersją PHP a komunikacje między nimi łatwo dziś ogarnąć.
  Forum: PHP · Podgląd postu: #1231336 · Odpowiedzi: 3 · Wyświetleń: 692

Pilsener
Napisane: 20.03.2018, 07:59:26





Grupa: Zarejestrowani
Postów: 1 590
Dołączył: 19.04.2006
Skąd: Gdańsk

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

No to musisz sprawdzić:
- czy klasa fizycznie jest w AppBundle\Entity
- wszystkie miejsca, gdzie używasz tej klasy, gdzieś musi brakować bundla, namespace, literówka w relacji etc.

Pewnie używasz GITa, wystarczy sprawdzić od którego miejsca przestało działać i przejrzeć zmiany.
  Forum: Frameworki · Podgląd postu: #1230836 · Odpowiedzi: 10 · Wyświetleń: 1 441

Pilsener
Napisane: 9.03.2018, 19:37:29





Grupa: Zarejestrowani
Postów: 1 590
Dołączył: 19.04.2006
Skąd: Gdańsk

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

A jaki efekt chcesz uzyskać?
Jeśli chcesz ustawić productId, to usuń właściwość property_path (masz ustawione na name, więc logiczne, że ustawia name dla rabat)
Jeśli chcesz mieć możliwość ustawienia null, to trzeba dodać placeholder (np. "please choose", "no selection" " -- " czy coś w tym stylu).

Wszystko jest w dokumentacji opisane. I tak w ogóle, Rabat to stolica Maroka Lkingsmiley.png
  Forum: Frameworki · Podgląd postu: #1230400 · Odpowiedzi: 3 · Wyświetleń: 668

Pilsener
Napisane: 10.03.2018, 18:37:00





Grupa: Zarejestrowani
Postów: 1 590
Dołączył: 19.04.2006
Skąd: Gdańsk

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

Problemem wydajności przy pracach z bazami danych najczęściej nie są narzędzia, lecz programiści, którzy tworzą implementacje nieprzemyślane na żadnym etapie. Pracowałem przy wielu aplikacjach i przy wielu był problem z wydajnością niezależnie od stosowanych narzędzi.
Oczywiście każde narzędzie daje pewien narzut, ale najczęściej na akceptowalnym poziomie - co więcej, bardzo często okazuje się, że kiedy robimy własne rozwiązanie (np. hydrowanie bazy w czystym PHP) to wychodzi wolniej niż we frameworkach. Jeszcze nie spotkałem się z sytuacją, że wynajdywanie koła od nowa się firmie opłaciło a jak znowu słyszę coś w stylu "nie użyjemy doctrine, napiszemy własny ORM, będzie szybciej i lepiej" to facepalmxd.gif
I jest tak, bo dużo łatwiej powiedzieć "aplikacja musi być wolna bo użyliśmy symfony i doctrine" niż to, że po prostu spieprzyliśmy bo potrzebujemy 15 requestów i 100 zapytań by coś zmienić na stronie, albo nie umiemy skonfigurować ORMa, żeby na produkcji włączyć cache meta danych bazy, kompilacji DQLi do raw SQLi czy adnotacji.
I jeśli faktycznie potrzebujemy tej wydajności to nie łączymy bezpośrednio aplikacji z bazą danych tylko tworzymy warstwę pośrednią (np. Lucene).

Doctrine to potężne narzędzie, które znakomicie przyśpiesza programowanie aplikacji i nie widzę żadnych sensownych powodów, żeby z niego rezygnować.
  Forum: Bazy danych · Podgląd postu: #1230463 · Odpowiedzi: 3 · Wyświetleń: 1 680

Pilsener
Napisane: 11.12.2017, 12:37:26





Grupa: Zarejestrowani
Postów: 1 590
Dołączył: 19.04.2006
Skąd: Gdańsk

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

Trzeba sprawdzić:
  1. dump(item.form);


Z jakiś powodów jest null, a ma być FormView, który tworzymy z form poprzez proste wywołanie metody ->createView()
  Forum: Frameworki · Podgląd postu: #1226143 · Odpowiedzi: 11 · Wyświetleń: 4 453

Pilsener
Napisane: 5.12.2017, 09:06:01





Grupa: Zarejestrowani
Postów: 1 590
Dołączył: 19.04.2006
Skąd: Gdańsk

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

W takim razie problemem raczej jest sposób hydrowania danych, można to rozwiązać na dwa sposoby:

1. Użyć odpowiedniej adnotacji (LAZY, EAGER lub EXTRA LAZY), więcej np. tutaj: http://docs.doctrine-project.org/projects/...sociations.html i to się sprawdzi jeśli wiemy, że np. wraz z obiektem User zawsze będziemy potrzebowali kolekcji emaili (wtedy ustawiamy na EAGER)

2. Jeśli sposób hydrowania jest zależny od kontekstu, to nie ma innego (wygodnego) wyjścia jak użyć query buildera. Jednak nie wystarczy:
  1. $qb->join('u.emails', 'e');
- trzeba jeszcze wymusić pobieranie poprzez dodanie select:

  1. $qb->select('u', 'e');

W ten sposób emaile zawsze będą w user niezależnie od tego, czy są potrzebne czy nie.

Więcej nie da się powiedzieć bo nie znam Twojego kodu, równie dobrze problemem mogą być źle zaprojektowane encje.
  Forum: Frameworki · Podgląd postu: #1225784 · Odpowiedzi: 5 · Wyświetleń: 1 449

Pilsener
Napisane: 22.11.2017, 11:22:43





Grupa: Zarejestrowani
Postów: 1 590
Dołączył: 19.04.2006
Skąd: Gdańsk

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

  1. $qb = $this->createQueryBuilder('a');
  2. $qb2 = $this->createQueryBuilder('aa');
  3. $qb->orWhere($qb->expr()->in('a.id', $qb2->getDQL()));


Zapytanie wygląda mniej więcej:
  1. WHERE c0_.id IN (SELECT c4_.id FROM competition c4_)


Najpierw musisz mieć dwa dobre query buildery, jeden do głównej tabeli a drugi do filtrowania, potem już nie powinno sprawić żadnego problemu połączenie tego.
  Forum: Frameworki · Podgląd postu: #1225129 · Odpowiedzi: 5 · Wyświetleń: 1 002

Pilsener
Napisane: 19.10.2017, 12:48:25





Grupa: Zarejestrowani
Postów: 1 590
Dołączył: 19.04.2006
Skąd: Gdańsk

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

A z jakich to powodów nie może być $GLOBALS? Skoro potrzebujesz globalnego dostępu to zawsze to będzie złe, więc co za różnica jak to zrobisz? Jak trzeba robić po wuju to się robi jak najprościej a nie robi wuja do kwadratu z jakiegoś archaicznego skryptu.
  Forum: PHP · Podgląd postu: #1223331 · Odpowiedzi: 18 · Wyświetleń: 1 689

Pilsener
Napisane: 17.08.2017, 07:38:35





Grupa: Zarejestrowani
Postów: 1 590
Dołączył: 19.04.2006
Skąd: Gdańsk

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

Wrzucanie plików projektu przez ftp to XIX wiek, jak deployowac aplikację symfony:
https://symfony.com/doc/current/deployment.html

Robisz repozytorium, potem git pull (chyba, że używasz SVN czy czegoś innego), potem composer update lub install, czyszczenie cache, montowanie zasobów, instalacja/migracja bazy danych itp.

Dzisiaj to wszystko robi się automatycznie przy pomocy Jenkinsa, merdżujesz do odpowiedniego brancha i Jenkins wykonuje deploy.

Jeśli hosting ma tylko FTP to najlepiej jak najszybciej się z nim pożegnać.
  Forum: Frameworki · Podgląd postu: #1220524 · Odpowiedzi: 5 · Wyświetleń: 1 597

Pilsener
Napisane: 21.02.2017, 10:26:12





Grupa: Zarejestrowani
Postów: 1 590
Dołączył: 19.04.2006
Skąd: Gdańsk

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

MYSQL nie wspiera full outer join. Moźna to jednak obejść za pomocą "UNION":

select ... left join ... UNION ALL select .. right join ...
  Forum: MySQL · Podgląd postu: #1211266 · Odpowiedzi: 10 · Wyświetleń: 1 427

Pilsener
Napisane: 22.11.2016, 08:24:34





Grupa: Zarejestrowani
Postów: 1 590
Dołączył: 19.04.2006
Skąd: Gdańsk

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

1. Do wszystkiego najlepiej tworzyć serwisy, gdyż klasy takie jak encje czy repozytoria są z reguły mocno wyspecjalizowane. I co rozumiesz przez "model"?
2. Sterowanie workflowem aplikacji przy pomocy wyjątków to kiepski pomysł. Wyjątki są po to, żeby wygodnie i w jednym miejscu obsłużyć wszystko to, czego nie chcemy obsługiwać lub nie przewidzieliśmy. Czemu nie standardowy walidator, który zwraca tablicę błędów?
3. Nie ma to większego znaczenia, ważne, żeby kod był dobrze zorganizowany, udokumentowany, łatwy do zrozumienia itp. itd. etc.
  Forum: Frameworki · Podgląd postu: #1204821 · Odpowiedzi: 1 · Wyświetleń: 606

Pilsener
Napisane: 1.12.2016, 08:44:28





Grupa: Zarejestrowani
Postów: 1 590
Dołączył: 19.04.2006
Skąd: Gdańsk

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

Dość standardowe podejście to użycie adnotacji:
Kod
* @Security("has_role('ROLE_ADMIN')")


I masz potem wyjątek AccessDeniedException, z którym możesz:
- nic nie robić (użytkownik zobaczy np. error 401)
- coś zrobić, np. wstawić jedną, uniwersalną stronę błędu typu "no content" dla wszystkich wyjątków (żeby nikt nie wiedział, czy to brak dostępu czy strona nie istnieje) lub też obsłużyć to inaczej wg potrzeb klienta (czasem klient chce wiedzieć, czy brak dostępu czy brak zasobu, wtedy już muszą być obsługiwane minimum dwa przypadki)

Przekierowania nie są dobre (z bardzo wielu powodów) i należy ich unikać.
  Forum: Frameworki · Podgląd postu: #1205578 · Odpowiedzi: 10 · Wyświetleń: 1 927

Pilsener
Napisane: 10.11.2016, 09:06:59





Grupa: Zarejestrowani
Postów: 1 590
Dołączył: 19.04.2006
Skąd: Gdańsk

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

Formularze to słaba strona symfony, jak trzeba zrobić coś niestandardowego to szkoda czasu na kombinowanie.
1. Nie powinny to być pola typu choice, tylko entity - chyba, że lista miast jest nie w bazie, tylko "z palca" w jakimś .csv etc. - ale tu znów pytanie, po co używac ORMa i formularzy, skoro wszystko robimy ręcznie?
2. Jeśli województwo nie ma być zapisywane, to nie ma sensu dodawać go do formularza (z tego co zrozumiałem tylko wybrane miasta mają być zapisane)
3. Listę czekboksów polecam wyrenderować ręcznie, pobrać dane z formularza lub encji i mniej lub bardziej używać widżetów (w zależności od potrzeb w zakresie HTML)

Renderować dane z forma można na wiele stron i sposobów, pierwszy lepszy:

Kod
{% for item in form.items %}
{{ form_row(item) }}
//...


Można też już w kontrolerze "obrobić" dane z forma i połączyć je z listą województw.

Czyli reasumując:
1. Najpierw spróbuj zrobić sam formularz, wyświetlić go w najprostszej postaci i sprawdzić, czy się wszystko zapisuje.
2. Potem customowo wyrenderować czekboksy, grupując je wg miast.
  Forum: Frameworki · Podgląd postu: #1203922 · Odpowiedzi: 1 · Wyświetleń: 502

Pilsener
Napisane: 7.10.2016, 08:17:50





Grupa: Zarejestrowani
Postów: 1 590
Dołączył: 19.04.2006
Skąd: Gdańsk

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

Pozwolę sobie dodać parę wskazówek:
1. Polecam narzędzie do debugowania dostarczane wraz z frameworkiem - profiler. Każdy request (także via ajax) jest szczegółowo rozpisany
2.
  1. $tag = $request->request->get('tag');
- nie poleca się używania parametrów wprost z requesta, powinna być walidacja, formularz, param converter etc.
3.
  1. $repository = $this->getDoctrine()->getRepository('SklepBundle:Ksiazka');
- pomijając kwestie nazewnictwa, repozytoria powinny być rejestrowane jako serwisy i wstrzykiwane jako zależność, powinno się unikać korzystania z kontenera
4.
  1. $qb = $repository->createQueryBuilder('k');

- do tak prostego zapytania raczej nie jest potrzebny query builder, wystarczy użyć gotowych, frameworkowych metod do wyszukiwania
- po co korzystać z ORM jak i tak piszemy zapytania "z palca" a wynik zrzucamy do tablicy? Lepiej wtedy używać czystego PDO - odpada nauka doctrine + DQL + narzut wydajności
- kontroler nie jest odpowiednim miejscem do obróbki danych
5.
  1. $s=json_encode($tab);
  2. return new Response($s);
- framework powinien już zawierać metodę JsonResponse
  Forum: Frameworki · Podgląd postu: #1201664 · Odpowiedzi: 11 · Wyświetleń: 735

Pilsener
Napisane: 16.04.2013, 21:00:25





Grupa: Zarejestrowani
Postów: 1 590
Dołączył: 19.04.2006
Skąd: Gdańsk

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

1. Jeśli ma to być singleton brakuje prywatnej/chronionej metody __clone
2. Przemyślałbym obsługę wielu baz, bo nawet jeśli tego nie przewidujemy to może taka potrzeba się pojawić. I pytanie, czy musi to być singleton bo przecież nie piszemy skryptu, gdzie w każdym pliku na samym początku DB::getInstance()
3. Współpracę klas oceniam fatalnie - poczytaj o wzorcach współpracy klas, na początek dependency injection, "wstrzykiwanie zależności" - tak to chyba po polsku się nazywa wink.gif
4. Podobnie klasę _DSN - zobacz, jak tego używasz, najpierw tworzysz obiekt by wywołać konstruktor a potem dobierasz się do pól statycznych? smile.gif Podstawą są gettery i settery a nie kombinowanie metodami statycznymi czy magicznymi. A jeśli już to powinieneś pobrać sobie ten cfg jedną metodą statyczną gdzie przekazujesz ten plik jako parametr, bez konieczności tworzenia obiektu.
  Forum: Object-oriented programming · Podgląd postu: #1039602 · Odpowiedzi: 8 · Wyświetleń: 902

Pilsener
Napisane: 12.03.2013, 22:21:35





Grupa: Zarejestrowani
Postów: 1 590
Dołączył: 19.04.2006
Skąd: Gdańsk

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

Cytat
Gdzie jest błąd?
- nie zaszkodzi sprawdzić: raz, czy plik/katalog można usunąć a dwa, czy faktycznie operacja się udała. Bo ja bym powiedział, że skoro wyświetla się:

  1. exit("Kanal #$msg[1] został pomyślnie usunięty.");
- to wszystko działa closedeyes.gif

Inaczej ciągle będziesz miał problemy tego typu i nie wiedział, gdzie jest przyczyna.
  Forum: PHP · Podgląd postu: #1032012 · Odpowiedzi: 9 · Wyświetleń: 364

Pilsener
Napisane: 21.02.2013, 00:13:04





Grupa: Zarejestrowani
Postów: 1 590
Dołączył: 19.04.2006
Skąd: Gdańsk

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

Jakieś tam ASO bierze za godzinę pracy mechanika 180 smile.gif Bo w tym jest wynagrodzenie, koszt stanowiska, amortyzacja maszyn, biura, papierologia, obsługa klienta, haracz dla marki i jeszcze coś trzeba zarobić dla siebie.

Ale da się zrobić w godzinę? Da, rejestrujesz się, zakładasz stronę, wpisujesz "to jest moja strona" i masz smile.gif

Załóżmy, że znajdzie się ktoś, kto za "grubą" kasę machnie portalik, powiedzmy peronik bis.
Załóżmy, że włoży w to 40 pełnych godzin, całą tygodniówkę trudu i znoju, uczciwie i z zapałem.

Pytanie 1 - co to będzie? Co można zmajstrować przez tydzień samemu? Przez tyle, to się jakąś prostą funkcjonalność wdraża smile.gif

Pytanie 2 - kto to będzie dalej utrzymywał, rozwijał? W większości projektów koszty utrzymanie już dawno przekroczyły 90% wszystkich kosztów, te wydane na powstanie niekiedy liczą się w promilach. Byle babol i programista plus ktoś z redakcji mają cały dzień pracy.


Ja bym radził nie pisać samemu, nie płacić po taniości bo tylko roztrwonisz pieniądze. Korzystaj z gotowych rozwiązań.

Nawet, jeśli Twój pomysł jest rewolucyjny, to z takim kapitałem tylko podasz go na tacy konkurencji. Twój pomysł zostanie natychmiast skopiowany, ulepszony, wdrożony i wypromowany - bo tak robią zawodowcy Lkingsmiley.png
  Forum: Hydepark · Podgląd postu: #1027217 · Odpowiedzi: 80 · Wyświetleń: 4 082

Pilsener
Napisane: 14.01.2013, 23:09:36





Grupa: Zarejestrowani
Postów: 1 590
Dołączył: 19.04.2006
Skąd: Gdańsk

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

Najgorsze są dla mnie błędy związane z wydajnością i bezpieczeństwem, typu:
  • niczym nie zabezpieczona rekurencja (tym gorsza, że uzależniona od parametrów z zewnątrz)
  • echowanie czego popadnie prosto z requesta lub tablicy $_SERVER, konstrukcje typu ... where id = $_GET['id'] i tak dalej
  • pobieranie wszystkiego z bazy jak leci albo wrzucanie do sesji jak leci - no bo wygodnie mieć wszystko w sesji, najlepiej całą bazę danych od razu wrzucić sobie do sesji, "by mieć taki kesz"
  • "dziś miejsce na dysku nie jest już problemem" - słyszałem to już x razy po czym po chwili dysk pada bo logujemy do plików pierdów bez liku


A jedne z najbardziej irytujących:
  • jednolita konfiguracja dla każdego środowiska, przez co regularnie commituje ustawienia lokalne albo po update wściekam się, że coś nie działa
  • brak jakichkolwiek komentarzy czy dokumentacji, najczęściej im paskudniejszy kod tym komentarzy jak na złość mniej
  • brak sprawdzania, czy coś się wykonało, założenie, że jak funkcja coś zwraca to z pewnością jest to spam, potem coś po prostu nie działa i sobie możesz szukać kilka dni no bo przecież "funkcja powinna wygenerować warninga chociaż jak jej kiepawo idzie"
  • używanie gdzie popadnie różnych fantastycznych wynalazków cudownego dziecka skryptu typu eval, goto, dynamiczne generowanie zmiennych - ekstrakcja to mały pikuś przy tym
  • obiektowość rozumiana tak, że np. co każde 100 linijek walniemy klasę a co 20 metodę, tworzenie jakiś dziwnych fabryk czy raczej młockarni obiektów które tworzą takie plewy, że człowiek tęskni za dynamicznym generowaniem zmiennych smile.gif
  Forum: Hydepark · Podgląd postu: #1018357 · Odpowiedzi: 68 · Wyświetleń: 3 625

Pilsener
Napisane: 28.11.2012, 21:01:06





Grupa: Zarejestrowani
Postów: 1 590
Dołączył: 19.04.2006
Skąd: Gdańsk

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

ZF to nie jest czysty MVC ale mniejsza o większość - chodzi o podział aplikacji na 3 warstwy:

1. Danych
2. Logiki
3. Prezentacji

Kontroler to warstwa logiki więc nie może zajmować się obsługą bazy czy przygotowywaniem danych. To zadanie dla modelu, który jest klasą w tym celu wyspecjalizowaną. Kontroler jedynie przekazuje dane z modelu do widoku (który jednak w ZF jest bardziej templatem).

W kontrolerze robisz coś w stylu:
  1. $model = new Model_Articles();
  2. $this->view->articles = $model->getAllArticles();


A w modelu:
  1. class Model_Articles extends Zend_Db_Table_Abstract {
  2. /**
  3. * The default table name
  4. */
  5. protected $_name = 'articles';
  6.  
  7. public function getAllArticles(){
  8. $select = $this->select();
  9. return $this->fetchAll($select);
  10. }
  11.  
  12. }
  Forum: Frameworki · Podgląd postu: #1009095 · Odpowiedzi: 5 · Wyświetleń: 328

Pilsener
Napisane: 23.09.2012, 19:29:58





Grupa: Zarejestrowani
Postów: 1 590
Dołączył: 19.04.2006
Skąd: Gdańsk

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

Najbardziej interesowało mnie to:
Cytat
Sposób z zadeklarowaniem zmiennej w kontrolerze, przypisaniem jej wartości w jednej akcji a następnie odczytaniem w drugiej nie działał.

Sam kod formularza nie ma tu aż takiego znaczenia smile.gif

I czemu chcesz przekazywać dane z formularza pomiędzy akcjami? Jak ja robiłem jakieś "testy on line" itp. to robiłem wszystko w jednej akcji - a gdy kod się rozrastał to po prostu wydzielałem z tej akcji metody.

I jakie to miałyby być dane? Bo rozumiem, że może być problem gdy mamy np. wyszukiwarkę ale chodzi bardziej o kod HTML tego formularza, labele elementów czy też wartości które wpisał użytkownik?
  Forum: Frameworki · Podgląd postu: #994548 · Odpowiedzi: 4 · Wyświetleń: 334

Pilsener
Napisane: 21.09.2012, 00:31:53





Grupa: Zarejestrowani
Postów: 1 590
Dołączył: 19.04.2006
Skąd: Gdańsk

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

Podejrzewam, że jest podobnie jak tu:
http://php.net/manual/en/function.mysql-query.php
Dla delete pewnie będzie tak samo:
Cytat
For other type of SQL statements, INSERT, UPDATE, DELETE, DROP, etc, mysql_query() returns TRUE on success or FALSE on error.


I czemu nie korzystasz z ORMa? Tak jest dużo prościej:
  1. $model = new Model_Galleries();
  2. $model->delete($where);
- możesz wykorzystać metodę delete i jej możliwości, przeciążyć ją w modelu "galleries" lub napisać własną metodę która będzie kasowała wg Twojego widzimisię i zwracała co chcesz.

  Forum: Frameworki · Podgląd postu: #994015 · Odpowiedzi: 2 · Wyświetleń: 321

Pilsener
Napisane: 26.09.2012, 22:40:51





Grupa: Zarejestrowani
Postów: 1 590
Dołączył: 19.04.2006
Skąd: Gdańsk

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

Tam gdzie używasz .html wygląda ok, ale ja zalecam dokleić do adresu także ID - jest szybciej i mniej kłopotliwie, dla SEO to żadna różnica jeśli doklejasz ID na końcu adresu a i na potrzeby developerskie sprawdza się dużo lepiej, nie muszę się zastanawiać, jaki jest ID artykułu w którym coś nie bangla.

Kod
    resources.router.routes.news.route = "newsletter"
    resources.router.routes.news.defaults.controller = "index"
    resources.router.routes.news.defaults.action = "newsletter"
- ten też wygląda ok, ale jeśli mamy dużo "sztywnych" adresów to warto je obsłużyć jednym routingiem żeby nie mnożyć sztywnych deklaracji routingów bez potrzeby, można też wrzucić listę stron "stałych" do modelu a routing tego typu definiować w bootstrapie - łatwiejsza jest wtedy modyfikacja i implementacja, możesz sobie sprawdzać, czy do obsłużenia np. reguły "newsletter" istnieje specjalna akcja i ją wywołać a jeśli nie, to renderować tylko widok o takiej nazwie a jeśli i jego nie ma, to wyjątek -> strona błędu.


Kod
resources.router.routes.homepage.route = "/"
resources.router.routes.homepage.controller = "index"
resources.router.routes.homepage.action = "index"

resources.router.routes.domowa.route = "/"
resources.router.routes.domowa.defaults.controller = "index"
resources.router.routes.domowa.defaults.action = "index"
- te routingi nie wiem za bardzo co mają robić, przecież strona główna to kontroler index i akcja index, jest to także domyślny routing (czyli jak nie znajdzie żadnego dopasowania to żądanie zostanie obsłużone właśnie przez tą akcję) a by wygenerować adres strony głównej nie potrzebujemy chyba routingu ani tym bardziej kilku?


Powiem tak, jeśli używasz routingów na modłę Zendową, to używaj jakiegoś klucza, np:

Kod
resources.router.routes.artykuly.route = ":title/:id"
- źle

Kod
resources.router.routes.artykuly.route = "artykuly/:title/:id"
- dobrze

Inaczej są problemy, istotna staje się kolejność routingów i tak dalej a przede wszystkim ktoś kto siądzie potem do tego kodu będzie miał problem.

I pamiętaj, że jak używasz this->url to korzysta on nie tylko z przekazywanych parametrów, ale także tych w GET - można to którymś parametrem wyłączyć (chyba trzecim, bo drugi to nazwa routingu)
  Forum: Frameworki · Podgląd postu: #995414 · Odpowiedzi: 15 · Wyświetleń: 576

8 Stron V   1 2 3 > » 

New Posts  Nowe odpowiedzi
No New Posts  Brak nowych odpowiedzi
Hot topic  Popularny temat (Nowe)
No new  Popularny temat (Brak nowych)
Poll  Sonda (Nowe)
No new votes  Sonda (Brak nowych)
Closed  Zamknięty temat
Moved  Przeniesiony temat
 

RSS Wersja Lo-Fi Aktualny czas: 28.03.2024 - 20:07