Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [system] php 5, postgresql, ajax
Forum PHP.pl > Inne > Oceny
emp
System informatyczny w php

zrzuty z netbeansa 6.5 z projektu ( ma przegladarke klas javascript wykonanej w notacji singletonowej



zrzuty z ekranu z działania systemu:








prezentacja flash:
Flash 7MB !

plik swf z prezentacja:
PLIK 7MB !

opis:
- każdy moduł jest w 100% ajaxowy
- grafika gimp, paint

użyte biblioteki js:
prototype - ajax
scriptaculous - np rozwijane combo
tiny mce - edytor
draw2d - generowane diagramy

użyte biblioteki php:

fpdf - generowane pdfy
json - transport danych
phplot - generowane wykresy

moj wlasny szkielet:

- obsługa polaczen z baza, zapytań, wyjątków

moje wysokopoziomowe komponenty gui ( ajax ) :
- uploadprogressbar
- prezentacje, podgląd
- combo box z wyszukiwaniem w bazie
- podwójna lista z wyszukiwaniem w bazie
- tablica ze stronicowaniem, sortowaniem i wyszukiwaniem
- tab panel
- kalendarz
- drzewo
phpion
Wizualnie wygląda PRO i naprawdę ciekawie, natomiast od strony PHP (opierając się na dwóch pierwszych screenach) już nie bardzo:
- tablice superglobalne wewnątrz metod klas,
- zamiast unikać błędów po prostu je wyciszasz (@),
- brak optymalizacji pętli for.
Ogólnie robi jednak bardzo dobre wrażenie, gratulacje smile.gif

PS: dodatkowy plus za wybór PostgreSQL - mało kto się za niego bierze.
.radex
łał.

Wizualnie nieźle. Wygląd akurat nie zachwyca, ale nie o to chodzi. Chodzi ogólnie o interfejs - widgety, okna, taby etc. Nie rozumiem tylko, czemu nie użyłeś do tego jakiejś gotowej biblioteki.

Nie ma za bardzo czego oceniać, bo kodu widać tylko kawałek, a nie chce mi się oglądać prezentacji. Ale z tego co widać to nieźle

PS. na przyszłość dawaj screenshoty w png. jpg się do tego za bardzo nie nadaje.

Cytat
- brak optymalizacji pętli for.


Masz na myśli notację w stylu:

for($i = 0, $j = count($jakaśTablica); $i < $j; $i+);

?
emp
Tablica super globalna z wnętrza metody używana jest w konkretnym celu i ma to sens ( bynajmniej ja go widzę bo innego wyjścia nie znalazłem ) Jest to robione tylko w wypadku gdy chce mięć jakąś zmienna widzianą globalnie i tylko w paru specyficznych klasach tych zmiennych jest dosłownie kilka.

Jeśli chodzi o wyciszanie @ to też ma sens nie robię tego wszędzie tylko w paru konkretnych miejscach gdzie mogę np dostać argument w $_POST lub w $_GET nie wiem w którym więc je wyciszam bo jak dostane w poscie a sprawdzam zawsze i posta i geta do get mi rzuca błąd a to błąd nie jest

Dlaczego moje rozwiązania a nie cudze ? Mój własny system działa w taki sposób jak ja chce czyli np mam w klasie cRdzen metodę:

  1. <?php
  2. /**
  3.     * Metoda wykonująca zapytanie do bazy danych i zwracająca wynik tego zapytania.
  4.     * @param $tresc_zapytania string. Treść zapytania SQL
  5.     * @return $wynik
  6.     * @exception Exception
  7.     * @see #zapytanie_debug( $tresc_zapytania )
  8.     */
  9.    protected function zapytanie( $tresc_zapytania )
  10.    {
  11.        $db = self::podaj_polaczenie() ;
  12.          
  13.        @$wynik = pg_query( $db, $tresc_zapytania ) ;
  14.        
  15.        if( ! $wynik ) throw new Exception( $GLOBALS[ 'napisy' ][ 8 ].'<br><br><i>'. $tresc_zapytania.'</i><br><br>'.pg_last_error( $db ).'<br>'.pg_result_error( $db, $wynik ), 4 ) ;
  16.  
  17.        return $wynik ;
  18.    }
  19. ?>



Teraz w klasie cModulProjekty dziedziczącej po cRdzen i implementującej iModul wykorzystuje tą metode:

Ale najpierw z obiektu javascript musze zrobić zapytanie tak:
  1. <?php
  2. var ajax = new Ajax.Request( 'index.php' ,
  3.            {
  4.                method: 'post',
  5.                parameters:  {zapytanie: 'tak', zapytanie_jakie: 'podaj_zalaczniki_zadania', id : projekty.edytowany_projekt_id },
  6.                onComplete: projekty.zapisz_powiazane_zalaczniki_zadania,
  7.                encoding : 'UTF-8'
  8.            });
  9. ?>


Zapytanie jest obsługiwane przez system ( są sprawdzane uprawnienia )
  1. <?php
  2. /**
  3.     * Metoda podaje zalaczniki powiazane z zadaniem w formacie json
  4.     * param $_POST['id'] typu integer - id zadania
  5.     * param $_POST['index'] typu integer - index wierszu zadania zwracanu w pierwszym wierszu odpowiedzi
  6.     * return array[ object ] lub zwraca wyjątek
  7.     */
  8.    public function podaj_zalaczniki_zadania_wiersze()
  9.    {
  10.    $id = pg_escape_string( $_POST[ 'id' ] ) ;
  11.        $index = pg_escape_string( $_POST[ 'index' ] ) ;
  12.  
  13.    $zapytanie = "select zalaczniki_ogolne.id, zalaczniki_ogolne.plik_nazwa, zalaczniki_ogolne.plik_wielkosc , zalaczniki_ogolne.plik_typ  FROM zalaczniki_ogolne where zalaczniki_ogolne.status = 'połączony' AND zalaczniki_ogolne.polaczenie_typ = 'zadanie' AND zalaczniki_ogolne.polaczenie_id=".$id ;
  14.        $wynik = self::zapytanie( $zapytanie ) ;
  15.  
  16.        $ile = pg_num_rows( $wynik ) ;
  17.  
  18.        include_once( 'data/biblioteki_php/json.php' ) ;
  19.  
  20.        $jsonWynik = array() ;
  21.  
  22.        $wiersz[ 'index' ] = $index ;
  23.        array_push( $jsonWynik, $wiersz );
  24.  
  25.        for( $i = 0 ; $i < $ile ; $i++ )
  26.          {
  27.              $wiersz = pg_fetch_assoc( $wynik ) ;
  28.              array_push( $jsonWynik, $wiersz );
  29.         }
  30.         echo 'ok' ;
  31.         echo json::encode( $jsonWynik );
  32.    }
  33. ?>


odpowiedz trafia do javoscriptowej metody:
  1. <?php
  2. /**
  3. *  Metoda zapisuje pobrane zalaczniki powiazane z zadaniem uzytkownikow i wyswietla odpowiedni komponent
  4. */
  5.    zapisz_powiazane_zalaczniki_zadania: function( originalRequest )
  6.    {
  7.    var odp = sprawdz_odpowiedz_ajaxa( originalRequest.responseText  ) ;
  8.        var zalaczniki = new Array( 0 ) ;
  9.        projekty.zalacznikiEdycja = new String( "" ) ;
  10.        if( odp == 'dobra' )
  11.        {
  12.            var wynik = originalRequest.responseText;
  13.            var wynik1 = wynik.substr( 2 ) ;
  14.  
  15.            var json = wynik1.evalJSON();
  16.            for( var i = 0 ; i < json.length ; i++ )
  17.            {
  18.                zalaczniki[ i ] = new Array( 0 ) ;
  19.                zalaczniki[ i ][ 0 ] = json[ i ].plik_nazwa;
  20.                zalaczniki[ i ][ 1 ] = json[ i ].plik_wielkosc;
  21.                zalaczniki[ i ][ 2 ] = json[ i ].id;
  22.                zalaczniki[ i ][ 3 ] = json[ i ].plik_typ;
  23.                projekty.zalacznikiEdycja += json[ i ].id+',' ;
  24.            }
  25.         }
  26.  
  27.        projekty.uploadZadaniaEdycja.inicjalizuj_edycja( 'projekty', 'uploadZadaniaEdycja', 'edytuj_zadanie_zalaczniki', 'edytuj_zadanie_a', 680, 350, 70, zalaczniki ) ;
  28.  
  29.        $( 'edytuj_zadanie_load' ).style.display = "none" ;
  30.        $( 'edytuj_zadanie_okno' ).style.display = "block" ;
  31.    },
  32. ?>


metoda sprawdź odpowiedź ajaxa spowoduje że w wypadku gdy jest status ok to nic się nie dzieje jak jest inaczej to poleciał wyjątek i mi go odrysuje na ekranie w okienku np ( wszystko asynchronicznie ) :



To jest trochę bardziej rozbudowane i ma kilka dodatkowych opcji, ale to akurat mało ważne sens w tym że działa tak jak ja chce i ja doskonale wiem jak działa mam nad tym pełną kontrole i jakiekolwiek modyfikacje robię od zaraz.

Jeżeli chodzi o komponenty to sprawa jest już banalna rozważałem tylko jedną bibliotekę w której zrobiłem sobie stronę domową a mianowicie Qooxdoo strona w qooxdoo ale biblioteka jest za wolna jak się dowali kilka tabów i okienek naprawdę obciąża system przeglądarki wymiękają z bardziej rozbudowana aplikacją w qooxdoo nie ma sensu dopóki javascript nie będzie o wiele szybszy. Jest jeszcze jedna rzecz w qooxdoo która mi się niepodobana żadna przeglądarka klas nie wyświetli tych z qooxdoo bo oni mają swoją własna filozofie.

Takie komponenty jak zwykła lista , combo czy tabelka są marne. Marne dlatego bo mi w niczym nie pomogą ( powtarzam mi ) i tak muszę zrobić z jednej listy podwójna zrobić tak żeby mi się ajaxowo dane ładowały z bazy danych, zrobić wyszukiwanie i wiele innych rzeczy. Moja podwójna lista wygląda tak: ( pojedynczej nie używam )

lista.rysuj_okno_list( 'de_dane_elementy', 'Struktury elementu:', 'Wszystkie struktury : ' , 'rdzen_dodaj_element_elementy', 'typ elementu', 'element', 295, 330 ) ;


lista.rysuj_okno_list( 'de_uzytkownicy', 'Uprawnienia elementu:', 'Wszystkie uprawnienia ' , 'rdzen_dodaj_element_uzytkownicy', '', 'uprawnienie', 295, 330 ) ;


a tutaj upload progressbar
if( rdzen.uploadElementu == null ) rdzen.uploadElementu = new upload( 'okno_dodania_elementu_zalaczniki', 'element', 'zalaczniki_ogolne' ) ;
rdzen.uploadElementu.inicjalizuj( 'rdzen', 'uploadElementu', 'de_zalaczniki', 'dodaj_element_a', 640, 360, 50 ) ;



combobox z wyszukiwaniem kategoriami ajax ( automat ja robie jedna linijkę i takie mi są potrzebne komponentyi takie se robie )
combo.rysuj_okno_podelementow( 'dodaj_zadnie_rodzaj_podokno', 'Dział odpowiedzialny za fakture:', "dodaj_fakture_dzial", "", "dział", false )


a tutaj jeszcze tabelka i struktura z której korzystają moje komponenty można dodawać, edytować ponad 20 różnych typów elementów:


Jeden komponent robię jeden dzień rzadko kiedy więcej więc nakład pracy nie jest jakiś duży a efekt jest super. Najdłużej robiłem drzewo bo potrzeba wykorzystania rekurencji w javascript powodowała lawine bugów. Moje rozwiązania są najlepsze , ale tylko dla mnie nie ma tu jakiejś większej filiozofi chodzi tylko i wyłącznie o przyspieszenie mojej pracy i zwiększenie wydajności przy tworzeniu tego konkretnego systemu. Nie uważam się też za dobrego programistę raczej średniego więc finezji się tu nie doszukujcie.

Robię wszystko sam więc we wszystkim jakiś poziom muszę trzymać co za tym idzie w niczym nie jestem bardzo dobry. Jedyne co uważam że robię bardzo dobrze to znajduje rozwiązania. Mam bardzo dobre pomysły, ale jestem sam więc ich realizacja jest jaka jest winksmiley.jpg

Pzdro
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.