MVC- praktyczna strona(nowicjusz pyta)

0

Witam
Tak na prawdę napisałem swój pierwszy twór, który wstępnie celował w MVC - niestety po drodze próbowałem upraszczać i kombinować co zakończyło się sporym bałaganem.
Wszystko to spotęgował mój brak rozumienia PRAKTYCZNEGO modelu MVC.

Jest to aplikacja WWW powiedzmy na wzór Webmina/cPanelu/LMS - zarządzanie ustawieniami sieciowymi serwera za pośrednictwem strony WWW.

Podam poniżej przykład jednej z zakładek:
http://img266.imageshack.us/i/mvce.gif/

Najbardziej mnie interesuje podział tego co widać na kontrolery...
Na początku założyłem, że każda zakładka (ta główna na górze) to będzie jeden kontroler ... z czasem się okazało, że muszę w głównych zakładkach robić pod zakładki ... i co teraz?
Stwierdziłem, że podzakładki bedą metodami w kontrolerze odpowiadającym za główną zakładkę .... itd itd

Myśle, że widać jak wygląda u mnie logika aplikacji (właściwie jej brak :| )

Jak powinienem to rozplanować na klasy, metody, if'y żeby miało sens (mowa o gł. zakładkach, pod-zakładkach,akcjach w pod-zakładkach)?

Z góry dziekuję za każdą wskazówkę i proszę nie wylewać wyszydzać mojej pracy bo zdaje sobie sprawe, że w takiej postaci żadnego wzorca nie przypomina.... :-|

Pozdrawiam ;-) </image>

0

ogólnie wg mnie nie ma do końca wyjaśnione co to jest mvc i jak dokładnie ma służyć, to po prostu są porady przydatne do pracy w większej ilości osób. Ja używam go tak :

mam 3 katalogi MODEL, VIEW, CONTROLLER oraz plik index.php

plik index.php składa się z :

require_once("head.html");
kod html od znacznika <HTML> do <BODY>

switch($_GET['akcja'])
{
case "firewall" :
        require_once("controller\\firewall.php");
        break;

case "filtrowanie_ruchu :
       require_once("controller\\filtrowanie_ruchu.php");
       break;

default:
        require_once("controller\\index.php");
        break;
}

require_once("footer.html");
Od znacznika </BODY> do znacznika </HTML>

Z funkcji widzenia php, wyświetlamy stronę gdzie brakuje nam zawartośći sekcji BODY -- tym zajmuje się switch.


zobaczmy jak przykładowo może wyglądać controller\\firewall.php

na starcie dajemy require_once("model\\firewall.php");
wiadomo klasy odpowiadzialen za połączenie z bazą.

następnie sprawdzamy przypłyneły do nas jakieś dane z POST gdyż masz 2 formularze (jak na zdjęciu)

robimy np. if(isset($_POST['fomularz1')) i sprawdzamy czy np. jest liczbą itd, robimy cała walidacje
a następnie korzystająć z klasy modelu wysyłamy zapytanie do MYSQL
$result = KLASA_MODEL->POKAZ_WSZYSTKIE_LOGINY;

$result obrabiamy w taki sposób, aby zostały nam tylko potrzebne informacje

teraz robimy require_once("view//firewall.php");
na starcie jako inny przycisk możemy dać link do
index.php?akcja=filtrowanie_ruchu

następnie tak jak wyżej funkcja zwraca nam wszystkie loginy

view\ firewall.php to ogólnie sam html ze wstawkami php bądź smarty
cały view\firewall to zawartość pomiędzy znacznikami BODY (patrz początek)

przykład view\firewall.php

jakiś kod html....

<?php for(int i=0; i< $result->num_rows; i++) ?>
<div id="login">
<?php echo($result[i]->nazwa_uzytkownika); ?>
</div>

jakiś kod html

Wiem, że opisane dość chaotycznie ale mam nadzieję, że chociaż w mały stopniu przybliżyłem Ci idee, ideą również jest, że grafik może robić widoki stron, a ty dopiero wstawkami z php będziesz go uzupełniał informacjami.

Ja aby oczyścić controllery z kodu stosuję pośrednictwo klasy (dość oczywiste)
wygląda to mniejwięcej tak, podam przykład na pliku do logowania usera

znaczynamy od index.php jest opisany wyżej
przekierowuje on do controllera\login.php
controller sprawdza tylko czy istnieje zmienna POST login i haslo i czy nie jest pusta, jeśli warunek przejdzie łączy się z klasą i wysyła jej informacje
zwrócone informacje są obrabiane na widok

index.php

jakiś switch : controller\\login.php;

login.php

require_once('class\\user.php');

if(isset($_POST['login]) && !empty($_POST['login']) && isset($_POST['haslo']) && !empty($_POST['haslo'))
{
$User = new User(); 
// z class\\user.php;
$result = $User->Zaloguj($_POST['login'],$_POST['haslo']); 
// przekazujemy zmienne do klasy
// $result ma 1 gdy zalogowano i -1 gdy błąd loginu
}

jeśli mamy mamy duża funkcję która zwraca różne wyniki możemy wczytać parę widoków np.
if($result = -1) require_once('<b>view\\logownie\\niepowodzenie_logowania.php</b>');
elseif ($result = 1) require_once('<b>view\\logowanie\\login_poprawny.php</b>');

class\user.php

require_once('model\\user.php');
// link do zapytań związanych z zapytaniami do bazy

class User {
public function Zaloguj($login,$haslo)
{
tutaj wykonuję całą walidację danych, sha1($haslo) i inne głupoty
wykonujemy zapytanie do bazy danych
dodajemy do $_SESSION['zalogowany'] = user_id; // przykład

na samym końcu zwracamy 1;
}
}

zakładamy że zalogowaliśmy się poprawnie
view\login\login_poprawny.php

jakiś kod html
<?php echo('Witaj użytkowniku o id :'.$_SESSION['zalogowany']); ?>
jakoś kod html
0

Zagmatwany nieco przykład - przynajmniej jak dla mnie.
Choć jestem bardzo wdzięczny za próbę pomocy.

Zadam prostsze pytanie czy poprawnym będzie zrobienie osobnych kontrolerów dla zakładek na podstronie ?

Dziękuję

0

Nie wchodzę w szczegóły waszych projektów, ale do nauki MVC polecam znane frameworki, a przede wszystkim Kohana ( najlepiej w wersji 2.x, ma świetny przykład dostępny tuż po rozpakowaniu ).
aaaaaaaaa: a co będzie, jak byś chciał uruchomić kanał rss? albo ściągajkę plików? Żądanie od klienta pójdzie przez index.php, dołączy <html> i inne takie? :)</quote>

0

Zgadzam się z przedmówcą. Radzę też przeczytać http://dev.kohanaframework.org/projects/1/wiki/Kohana101, wszystko jest dokładnie wytłumaczone ;)

0
ałłtour napisał(a)

Zadam prostsze pytanie czy poprawnym będzie zrobienie osobnych kontrolerów dla zakładek na podstronie ?

Tu oprócz pojęcia kontrolera, modelu i widoku wprowadził bym pojęcie modułu na zasadzie "moduł ma wiele kontrolerów", tak jak kontroler ma wiele akcji, czyli u ciebie wygladał by to na przykład tak:

Moduł Kontroler Akcja
FIREWALL -> Przekierowanie portu Dodaj port
FIREWALL -> Przekierowanie portu Usuń port
FIREWALL -> Filtrowanie ruchu Dodaj regułę
FIREWALL -> Filtrowanie ruchu Edytuj regułę

itd

Dobrym pomysłem jest też dodanie klas, które będą odpalane w akcjach kontrolera (chodzi o to, żeby kontroler nie stał sie smietnikiem w który wrzucam wszystko), nazywa się te klasy róznie, ja spotkałem sie z nazwą "serwis".

Przykład:
Masz moduł user, kontroler Auth, a w nim akcję (metodę klasy kontrolera) logout i wrzucasz do niej kod odpowiadajacy za wylogowanie usera, niby wszystko ok.

Niestety, zachodzi sytuacja, że trzeba stworzyć mechanizm logowania użytkownika w sposób asynchroniczny (AJAX), więc tworzysz kontroler AsyncAuth, a w nim akcję logout i wrzucasz do niej ten sam kod, co do akcji logout kontrolera Auth, czyli duplikujesz kod (ZŁO :)). Tu z pomocą przychodzi serwis UserAuthServiece i jego metoda logout, która odpalasz w kontrolerze, dzieki temu nie masz w swojej aplikacji tego samego kodu w kilku miejscach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1