Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MVC] kontrola danych w kontrolerze, czy modelu
MarcinGDA21
post 30.04.2011, 20:16:38
Post #1





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

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


witam,

wysylam formularzem dane do kontrolera i tam mam dwie mozliwosci 1 przeslac cala tablice POST do modelu i zalaczyc widok, albo 2 w kontrolerze odczytac dane z POST, zrobic np stripslashes itp i wtedy juz gotowe wyslac do modelu i zalaczyc widok.
ktora opcja jest poprawna w modelu MVC?


a drugie pytanie przy okazji wiazace sie z tym. jesli bym to robil w kontrolerze i chcialbym wczytac jakas funkcje z zewnetrznego pliku to w ktorym miejscu ja includowac?
  1. class Controller {
  2.  
  3. function index(){
  4.  
  5. }
  6.  
  7. function form(){
  8. include '/test/funkcja.php';
  9.  
  10. $dane = funkcja($dane);
  11. }
  12.  
  13. }

tak jest poprawnie czy moze musze to zrobic w kontruktorze? co jesli bym chcial ja uzyc w dwoch metodach?

pozdrawiam
Go to the top of the page
+Quote Post
Inscure
post 30.04.2011, 20:24:41
Post #2





Grupa: Zarejestrowani
Postów: 61
Pomógł: 4
Dołączył: 18.09.2010

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


Moim zdaniem jak sama nazwa mówi, od kontroli danych jest kontroler, model obrabia już gotowe dane, zamieszczone np. w bazie czy też otrzymane od użytkownika.

Chociaż z drugiej strony, to przejechanie tablicy POST funckją stripslashes to nie jest już kontrola tylko obróbka.

Ten post edytował Inscure 30.04.2011, 20:25:49


--------------------
eXtreme-Fusion CMS - polski, darmowy system zarządzania treścią z rozbudowanym wsparciem technicznym.
Go to the top of the page
+Quote Post
blooregard
post 30.04.2011, 20:33:15
Post #3


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




Cytat(Inscure @ 30.04.2011, 21:24:41 ) *
Moim zdaniem jak sama nazwa mówi, od kontroli danych jest kontroler, model obrabia już gotowe dane, zamieszczone np. w bazie czy też otrzymane od użytkownika.

Chociaż z drugiej strony, to przejechanie tablicy POST funckją stripslashes to nie jest już kontrola tylko obróbka.


Do walidacji danych i obróbki wspomnianą przykładową f-cją stripslashes() przesłanych z formularza do kontrolera można użyć np. specjalnego helpera, stworzonego w tym celu. Potem dane "przelecone" przez helper przekazać modelowi do zapisu w bazie danych.
W ten sposób kontroler pełni tylko swoją podstawową rolę.


--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
Inscure
post 30.04.2011, 20:36:40
Post #4





Grupa: Zarejestrowani
Postów: 61
Pomógł: 4
Dołączył: 18.09.2010

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


W tym wypadku helper posiadałby cechy modelu jak dobrze rozumiem? Tylko że modelu innego obiektu.


--------------------
eXtreme-Fusion CMS - polski, darmowy system zarządzania treścią z rozbudowanym wsparciem technicznym.
Go to the top of the page
+Quote Post
blooregard
post 30.04.2011, 20:46:10
Post #5


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




Cytat(Inscure @ 30.04.2011, 21:36:40 ) *
W tym wypadku helper posiadałby cechy modelu jak dobrze rozumiem? Tylko że modelu innego obiektu.

Można tak do tego też podejść. W gruncie rzeczy formularz też może być obiektem jakiejś klasy i cała operacja walidacji sprowadza się wtedy do wywoływania odpowiednich metod na przekazanych jako parametry obiektach, przykładowo:

$Form ( formularz, obiekt klasy Form ) -> przekazujemy jako argument do klasy Helper, ona sobie tam nad nim pracuje, waliduje i zwraca już obrobiony formularz do kontrolera.
Ten z kolei zwalidowany obiekt $Form przesyła do modelu, który przyjmuje go jako argument i po "rozłożeniu" na czynniki pierwsze (pola w bazie danych odpowiadające wypełnionym polom formularza) zapisują do bazy i zwracają rezultat operacji.

Czyli w uproszczeniu kontroler wyglądałby tak:

  1. ...
  2. $Form->bind( [dane_z_posta] );
  3. if ( $Helper->isValid( $Form) ) {
  4. $result = $Model->save( $Form );
  5. if ( $result ) {
  6. $View->message( 'Zapisano poprawnie');
  7. } else {
  8. $View->message('Oj, błąd :( ');
  9.  
  10. } else {
  11. $View->message('Popraw błędy w formularzu:');
  12. $View->errors = $Helper->getErrors();
  13. $View->form = $Form ( [dane_z_posta] );
  14. }
  15. .....


Tak w uproszczeniu wink.gif


BTW, dokładnie na takiej zasadzie działają typowe MVC, jak Symfony czy Zend.
Powód edycji: [blooregard]:


--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
MarcinGDA21
post 30.04.2011, 20:53:34
Post #6





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

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


czyli ten Helper bylby osobna klasa, tak jak np formularz?

no i wtedy jak tego Helpera includowac? w ktorym miejscu kontrolera?
Go to the top of the page
+Quote Post
blooregard
post 30.04.2011, 21:04:56
Post #7


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




Cytat(MarcinGDA21 @ 30.04.2011, 21:53:34 ) *
czyli ten Helper bylby osobna klasa, tak jak np formularz?


Tak, dokładnie.
Postaraj się o każdym elemencie aplikacji myśleć jak o obiekcie, wyobraź sobie, w jaki sposób te obiekty ze sobą wchodzą w interakcję (np. jak w przykładzie powyżej: obiekt klasy Helper sprawdza obiekt kasy Form).

Cytat
no i wtedy jak tego Helpera includowac? w ktorym miejscu kontrolera?

Najlepszym rozwiązaniem jest autoload, możesz też inkludować odpowiednie klasy wtedy, gdy będą Ci potrzebne i wtedy możesz to robić w konkretnej metodzie (akcji) kontrolera.



--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
MarcinGDA21
post 30.04.2011, 21:12:59
Post #8





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

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


dzieki za pomoc smile.gif
Go to the top of the page
+Quote Post
blooregard
post 30.04.2011, 21:23:01
Post #9


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




Cytat(MarcinGDA21 @ 30.04.2011, 22:12:59 ) *
dzieki za pomoc smile.gif

Nie ma za co wink.gif

Od tego jest to forum tongue.gif


--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
MarcinGDA21
post 1.05.2011, 01:10:22
Post #10





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

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


jeszcze jedno pytanie mam podobne.
jak w kontrolerze ladowac widoki?

chodzi np top, body i footer. top i footer beda zawsze takie same, wiec dla kazdego widoku ich sie nie oplaca robic i jak to lepiej rozwiazac?
ladowac w kontrolerze dla kazdej akcji

include top.php
include body.php
include footer.php

czy moze w samym pliku body.php zrobic include top i footer, albo jeszcze zrobienie jednego glownego widoku, w ktorym zmienia sie tylko wlasnie body, a top i footer sa na stale i ladowanie przez kontroler samego body?

3 opcje i ktora jest najlepsza dla mvc?
Go to the top of the page
+Quote Post
pejott
post 1.05.2011, 11:34:23
Post #11





Grupa: Zarejestrowani
Postów: 81
Pomógł: 4
Dołączył: 15.02.2009

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


Najlepiej będzie jeśli skorzystasz z jakiegoś systemu szablonów.
Na przykład http://twig-project.org. Tam szablony są dekorowane i dziedziczą od siebie.
Albo http://www.invenzzia.org/en/projects/open-...-power-template.

Pozdrawiam.
Go to the top of the page
+Quote Post
MarcinGDA21
post 1.05.2011, 12:48:57
Post #12





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

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


dzieki, ale poki co wolalbym sie sam tego nauczyc od podstaw:)
Go to the top of the page
+Quote Post
blooregard
post 1.05.2011, 12:53:24
Post #13


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




Robisz jeden główny layout, w nim inkludujesz sekcje head, footer i inne, które będą stałe, na każdej podstronie.
A treść podstron inkludujesz w konkretnym kontrolerze i przekazujesz do layoutu.



--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
Inscure
post 1.05.2011, 12:57:39
Post #14





Grupa: Zarejestrowani
Postów: 61
Pomógł: 4
Dołączył: 18.09.2010

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


Cytat(pejott @ 1.05.2011, 12:34:23 ) *
Najlepiej będzie jeśli skorzystasz z jakiegoś systemu szablonów.


Jemu nie chodzi o sposób wyświetlania użytkownikowi kodu HTML, tylko o strukturę kodu budującą odpowiednie środowisko do prezentacji treści.

W swoim systemie zrobiłem to w taki sposób, że z poziomu pliku strony (np. news.php) mam pełne zarządzanie:
- ułożeniem paneli bocznych
- czy mają być wczytane domyślne, czy domyślne + mój własny, albo tylko mój własny
- gdzie ma znaleźć się treść, dla jakich podstron itd.

Działa to na zasadzie, że (zakładając że nie korzystasz z routera przekierowującego):

- wpisuję ustawienia zmiennych dla systemu budującego szablon (układ paneli, panele do wyświetlenia itd), jak pominę to zostaną użyte domyślne
- wczytuję nagłówek head
- wczytuję sekcję środkową strony (miedzy head a footer)
- następnie panele boczne
- treść główną do wyświetlenia (mogę zamienić kolejność z panelami)
- zamykam sekcję środkową strony
- zamykam stopką


Jeżeli korzystasz z routera z przekierowaniem wszystkiego na index.php, to masz sprawę ułatwioną, bo w jednym pliku wywołujesz te funkcje i tylko wczytujesz treść na podstawie parametrów w określonym miejscu. [edit:] Czyli tak jak napisał mój przedmówca.

Przykład sposobu pierwszego dla pliku-strony, który ma wyświetlić statyczną treść:

Kod
<?php

/*
*  Clear-PHP v1.0
*  Author: Inscure
*  Released under GPL v3
*/

require_once 'system.php';

App::head('open');

    side_left();


            $result = $_sql -> queryArray("SELECT * FROM ".SQL_PFX."mod_page_node");

            if ($result)
            {
                foreach ($result as $val)
                {
                    App::node($val);
                }
            }
            else
            {
                echo $_comm->run('Materiał niedostępny', 'error');
            }
    

    side_right();

App::head('close');


Ten post edytował Inscure 1.05.2011, 14:21:30


--------------------
eXtreme-Fusion CMS - polski, darmowy system zarządzania treścią z rozbudowanym wsparciem technicznym.
Go to the top of the page
+Quote Post
MarcinGDA21
post 1.05.2011, 13:58:17
Post #15





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

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


dzieki wielkie
Go to the top of the page
+Quote Post
pejott
post 1.05.2011, 17:53:26
Post #16





Grupa: Zarejestrowani
Postów: 81
Pomógł: 4
Dołączył: 15.02.2009

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


Twój kod wiele mi nie mówi, ale strzelam że mieszasz kontroler, widok i model.
Jakkolwiek to sobie nazwiemy warstwa logiki powinna być zupełnie oddzielona od warstwy prezentacji.

Pozdrawiam.
Go to the top of the page
+Quote Post

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: 28.03.2024 - 17:39