Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]OOP Klient poczty
Forum PHP.pl > Forum > Przedszkole
Wolfie
Witam

Szukam obiektowych skryptow napisanych najlepiej w php5 dotyczacych webowego klienta poczty.

Przegladalem wiele skryptow ale tam wszystko jest strukturalnie, lub mieszanina funkcji z logika prezentacji. A ze chce napisac wlasnego klienta poczty napisanego obiektowo potrzebne mi sa jakies przyklady i pomoce. Poniewaz moja nauka jezyka obiektowego dopiero sie rozpoczyna i nie potrafie przerobic od tak skryptu strukturalnego na obiektowy.

Jak narazie mam takie cos :

  1. <?
  2.  
  3. class Mailbox
  4.    {
  5.        protected $_connection = null;
  6.        
  7.        public function connect($server, $user, $pass, $port = 993, $protocol = 'imap')
  8.            {
  9.                if(!($this->_connection = imap_open('{imap.'.$server.':'.$port.'/'.$protocol.'/ssl}INBOX', $user, $pass)))
  10.                    throw new Exception ('Connection failure');
  11.            }
  12.            
  13.        public function inbox()
  14.            {
  15.                return $this->_sort = imap_sort($this->_connection, SORTARRIVAL, true);
  16.            }
  17.            
  18.        public function delete($mId);
  19.            {
  20.                return imap_delete($this->_connection, $mId);
  21.            }
  22.            
  23.        public function disconnect()
  24.            {
  25.                imap_expunge($this->_connection);
  26.                imap_close($this->_connection);
  27.            }
  28.        
  29.        public function show_headers()
  30.            {
  31.                return $this->_headers = imap_headers($this->_connection);
  32.            }
  33.            
  34.        public function body($mId)
  35.            {
  36.                return imap_fetchbody($this->_connection, $mId, 1);
  37.            }
  38.            
  39.        public function header($mID, $param = '' )
  40.            {
  41.                $eHeader = imap_header($this->_connection, $mId);
  42.            if($param)
  43.                return $eHeader->$param;
  44.                
  45.            return $eHeader;
  46.            }
  47.            
  48.        public function to($mId)
  49.            {
  50.                return $this->header($mId, 'toaddress');
  51.            }
  52.        
  53.        public function subject($mId)
  54.            {
  55.                return $this->header($mId, 'subject');
  56.            }
  57.        
  58.        public function from($mId)
  59.            {
  60.                return $this->header($mId, 'senderaddress');
  61.            }
  62.    
  63.    }
  64.    
  65.  
  66.    
  67. $mailbox = new Mailbox;
  68. $mailbox->connect('gmail.com','jakismail@gmail.com','jakieshaslo','993','imap');
  69. $tab = $mailbox->inbox();
  70. foreach($tab as $wart)
  71.    echo $wart.'<br />';
  72.    
  73. $header = $mailbox->show_headers();
  74.  
  75.                echo "<h1>Headers in INBOX</h1>\n";
  76.                //$this->_headers = imap_headers($this->_connection);
  77.                
  78.                if ($header == false)
  79.                    {
  80.                    echo "Call failed<br />\n";
  81.                    }
  82.                else
  83.                    {
  84.                    foreach ($header as $val)
  85.                        {
  86.                        echo $val . "<br />\n";
  87.                        }
  88.                    }
  89. mailbox->show_headers();    
  90. ?>


Ale nie mam zielonego pojecia jak np teraz dodac do tego logowanie uzytkownika lub zaznaczac maile np do wyrzucenia....
wookieb
Tobie bardziej chodzi o to jak zaprojektować aplikację a nie klasę smile.gif
Po pierwsze. Dobrze zaczynasz. Klasa do obsługi klienta poczty nie ma mieć nic wspólnego z interfejsem. Ma swój cel (wyrzuć to , dodaj to) i powiedz mi czy się udało (true,false, badz kod błędu). I na podstawie odpowiedzi metody klasy ( w twoim przypadku do obslugi klienta poczty) operujesz interfejsem (czy operacja sie udala, czy uzytkownik wypelnil dobrze formularz itd).
Wolfie
Fakt, raczej chodzi o zaprojektowanie aplikacji.
Tylko teraz nie wiem jak polaczyc te funkcje z interfejsem uzytkownika.
Powiedzmy ze napisze sobie formularz logowania ale nie wiem teraz jak to polaczyc z ta klasa ktora mam.
Powiedzmy ze napisze formularz logowania ktory przesyla uzytkownika i haslo , tylko teraz pytanie gdzie on ma to wysylac ?

Tzn chodzi o to czy mam napisac w osobnym pliku skrypt ktory bedzie odbieral dane od uzytkownika i inicjalizowal obiekty z mojej funkcji ?
No i jak juz zainicializuje te obikety to jak mam wyswietlac dane ?
wookieb
Przykład krok po kroku. Zalozmy mamy na celu napisanie nowej wiadomosci nasz plik do obsługi tego to napisz.php
Ogólny zarys kodu:
Kod
// sesje, includy itd
// czesto dodaje hiddena w formularzu ktory mi jasno mowi czy formularz został wysłany
if(isset($_POST['send']))
{
//sprawdzenie poprawnosci danych, ochrona przed atakami xss itd

// jezeli uzytkownik zrobil wszystko dobrze to wykonujemy operacje wyslania maila
// wyswietlamy uzytkownikowi info czy sie udalo, czy nie, czy wystapily jakies bledy bla bla badz w przypadku udanej operacji pokazujesz cos lub przekierowujesz na inna strone


// w przypadku jak nie przekierowujesz to ustawiasz
$showForm=0;

// gdy uzytkownik zle wypelnil dane ustawiasz
$showForm=1;
}

if($showForm)
{
// pokaz formularz
}

Oczywiscie jest to tylko zarys i przykladowa najprostsza koncepcja.
Wolfie
Wolalbym przyklad logowania sie uzytkownika z danym haslem i wyswietlenie wiadomosci ze skrzynki pocztowej , to by mi wyjasnilo wiele kwestii.
Chociazbyt to jak laczyc formularz i wywolywac odpowiednia funkcje z klasy, i po wywolaniu jak wyswietlac wiadomosci ktore znajduja sie w skrzynce.....
wookieb
No stary nie przeginaj. Podałem ci tak ogólny schemat, że każdy bez problemu w każdym punkcie komentarzaj mojego kodu wstawi bez problemu to co chcesz uzyskać. Pomyśl bo to naprawdę nie jest trudne tym bardziej po otrzymanym schemacie.
Wolfie
No niby tak , ale to mi wyglada na kod strukturalny a nie obiektowy.....
wookieb
... Obiektowo to mozesz sprawdzac poprawnosc danych (jakas klasa do kontroli danych uzytkownika), pokazywac szablon, przekierowywac na inna. Ogolny zarys obslugi tych metod robi się wlascie skrukturalnie... Wyobrazasz sobie jedna uniwersalna metody? Która by obsłużyla kazdy widok strony a owa metoda i tak musi byc wywolana programowaniem strukturalnym.
Zresztą zobacz sobie kod profesjonalnych cmsów i wszystko będzie jasne.
Wolfie
Przekazywac szablon - swietnie

A moglbys mi podac przyklad jak wywolywac szablon obiektowo ?

Powiedzmy ze mam jakis kod html i szablon tpl. Jak teraz np wywolac widok tego szablonu uzywajac funkcji ? (oczywiscie nie piszac kodu html w funkcji)
wookieb
A smarty widział? Masz tam przepiękny przykład JAK W OGÓLE odpalić smarty...
W open power template jest nawet przykład z singletonem. (nie wiem czy w manualu smarty tez jest bo uzywam wlasnie opt)
Wolfie
Oczywiscie ze widzialem smarty , wiem jak robic templatki w tym , ale chodzi mi o to jak wywolac widok a nie jak utworzyc szablon....
wookieb
To już zależy od tego jakiej architektury się trzymasz. Na php.pl masz kurs o mvc. Poczytaj.

Mój przykład był czysto strukturalny dla ułatwienia rozumowania. Osobiście trzymam się takiego schematu który nie dla każdego może być słuszny ale dla mnie jest jak najbardziej wystarczający i ma swoje zalety.
Kod
$module; // moduł klasy obsługi wszystkich mechanizmow zwiazanych z zarzadzaniem kontem itd

$content=$module->executeView('login'); // logowanie usera


gdzie w executeView jest cos takiego
Kod
switch($view)
{
case 'login':
// tutaj dalszy kod
break;

case ...
}
Wolfie
No wlasnie po to chce to napisac obiektowo zebym mial wszystko od siebie oddzielone i latwo modyfikowalne. No i oczywiscie po to zeby sie nauczyc poprawnie programowac obiektowo.

Cytat
case 'login':
// tutaj dalszy kod
break


A co kryje sie pod pojeciem "tutaj dalszy kod" ?
wookieb
Np schemat który ci podałem wcześniej.

Do listowania elementow mam co innego.
np
Kod
$lista=klasa_obslugi_meczy->getList();
$tpl->assign('list', $lista);
return $tpl->view('szablon.tpl');

Twój problem polega na tym, że nie wiesz jak do tego się zabrać dlatego naprawdę poczytaj o mvc.
Wolfie
Napisalem cos takiego :

  1. //index.php
  2. <?
  3. include('c:/smarty/libs/Smarty.class.php');
  4.  
  5. $smarty = new Smarty;
  6.  
  7. $smarty->template_dir = 'c:/Program Files/WebServ/httpd/MailClient/templates';
  8. $smarty->config_dir = 'c:/Program Files/WebServ/httpd/smarty/config';
  9. $smarty->cache_dir = 'c:/smarty/cache';
  10. $smarty->compile_dir = 'c:/smarty/templates_c';
  11.  
  12. $smarty->assign('email','Podaj e-mail');
  13. $smarty->assign('password','Haslo');
  14.  
  15. $smarty->display('index.tpl');
  16. ?>


i do tego index.tpl

Kod
<html>
<head>
<title>Login Form</title>
<head>
<body>
<form action="post">
<div>
<label>{$email}</label>
<input type="text" name="email">
</div>
<div>
<label>{$password}</label>
<input type="text" name="password">
</div>
<div>
<input type="submit" value="Zaloguj">
</div>
</form>
</body>
</html>


Jak teraz przekazac to do funkcji odpowiedzialnej za polaczenie ze skrzynka ?

Czytalem juz o MVC sporo , ale nic do mnie z tego nie dociera.....model , kontroler , widok.....powiazanie tego , wszystko o tym czytalem , dlatego postanowilem zaczac cos programowac , moze wyjasni sie po drodze , bo juz nie nie wytrzymuje czytajac kolejny post o mvc, od tej teorii juz mi sie zle robi a i tak nie potrafie sobie tego wyobrazic w prkatyce , dlatego zaczalem pisac tego klienta......
wookieb
A czy w ogóle dobrze przeanalizowałes sobie mój schemat? Jak nie to ci napisze jeszcze raz duzymi literami ale teraz juz w odniesieniu do mojej metody

Kod
if(isset($_POST['send']))
{
// sprawdzasz tresc danych z formularza, ochrona xss badz sql injection
// jezeli wszystkie dane wypelnione i jest ok jedziesz dalej. Bledy uzytkownik (nie podal loginu, wrzucaj np do tablicy $errors);
if($twoja_klasa->czy_poprawne_dane_logowania($_POST['login'], $_POST['password']))
{
// przeniesc na inna strone albo co innego
redirect('strona z profilem usera');
//badz
return $szablon->view('inny_szablon');
}
}

// pokazujesz formularz wraz z ewentualnymi bledami ($errors);
return $szablon->view('formularz');
Wolfie
Ok. A ten ostatni schemat to kontroler czy widok ?

Podejrzewam ze widok , a jak w takim razie wygladalby kontroler ?

Zrobilem tak :

Z pliku ktory napisalem w pierwszym poscie wyrzucilem wyswietlanie widoku, zostala tylko klasa i funkcje.
Nastepnie stworzylem formularz logowania z szablonem w smarty.Formularz ten przesyla dane do pliku:

  1. <?
  2.  
  3. include('../classes/Mailbox.php');
  4.  
  5. if(isset($_POST['send']))
  6.    {
  7.    $email = $_POST['email'];
  8.    $pass = $_POST['pass'];
  9.    
  10.    $mailbox = new Mailbox;
  11.    $mailbox->connect('gmail.com',$email,$pass,'993','imap');
  12.    $tab = $mailbox->inbox();
  13.    foreach($tab as $wart)
  14.    echo $wart.'<br />';
  15.    }
  16. else
  17. echo 'ERROR !!!';    
  18. ?>


Pytanie moje brzmi:
Czy to tutaj (tzn w pliku powyzej) powinienem inicjalizowac obiekt klasy Mailbox? Czy powinno sie to odbywac w konstruktorze klasy Mailbox ? A moze stworzyc jakas funkcje w tej klasie ktora bedzie go wywolywac ?

No a druga sprawa to taka czy w tym pliku powinno wogole byc wyswietlanie czy powinienem stworzyc osobna klase ktora bede wywolywal w tego typu plikach i ja wywolywac?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.