php.de

Zurück   php.de > Webentwicklung > Software-Design

Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 1,00 durchschnittlich.
Alt 28.01.2012, 15:45  
archer42
Gast
 
Beiträge: n/a
Standard Tabellen sortieren

Hallo,

ich arbeitet gerade an einem Tabellen Frontend mit Symfony2.

Nun möchte ich die Tabelle sortieren, dass heisst, wenn ich bsw, auf die Spalte Nachnamen klicke, so sollte die Tabelle alle Nachnamen aufsteigend darstellen.
Sollte ich dannach nochmal auf die Spalte klicken, so sollten die Nachnamen absteigend präsentiert werden.

Soviel zum "Feature".

Nun zur Umsetzung....
Das umschalten sollte per $_GET realisiert werden, deswegen wollte ich folgendes Routing verwenden:
Code:
_customers:
    pattern:    /contacts/{column}/{orderBy}
    defaults:   { _controller: TableAppBundle:Contact:index, column: 'lastName', orderBy: 'asc' }
Der Controller wertet die Parameter dann aus und fetched die Tabelle je nach angefordertet Sortierung in ein array, welches dann in einem Template ausgegeben werden kann:

PHP-Code:
    public function indexAction($column$orderBy) {
        
$em $this->getDoctrine()->getEntityManager();
        switch (
$column) {
            case 
'lastName':
                
$customers $em->getRepository('TableAppBundle:Contact')
                    ->
findAllOrderedByLastNameAsc();
                break;
            case 
'firstName':
                
$customers $em->getRepository('TableAppBundle:Contact')
                    ->
findAllOrderedByFirstNameAsc();
                break;
            case 
'birth':
                
$customers $em->getRepository('TableAppBundle:Contact')
                    ->
findAllOrderedByBirthAsc();
                break;
            case 
'street':
                
$customers $em->getRepository('TableAppBundle:Contact')
                    ->
findAllOrderedByStreetAsc();
                break;
            case 
'nr':
                
$customers $em->getRepository('TableAppBundle:Contact')
                    ->
findAllOrderedByNrAsc();
                break;
            case 
'zipCode':
                
$customers $em->getRepository('TableAppBundle:Contact')
                    ->
findAllOrderedByZipCodeAsc();
                break;
            case 
'email':
                
$customers $em->getRepository('TableAppBundle:Contact')
                    ->
findAllOrderedByEmailAsc();
                break;
            case 
'phone':
                
$customers $em->getRepository('TableAppBundle:Contact')
                    ->
findAllOrderedByPhoneAsc();
                break;
            case 
'mobile':
                
$customers $em->getRepository('TableAppBundle:Contact')
                    ->
findAllOrderedByMobileAsc();
                break;
            default:
                
$customers $em->getRepository('TableAppBundle:Contact')
                    ->
findAll();
                break;
        }

        return 
$this->render('TableAppBundle:Contact:index.html.twig', array(
            
'contactss'                 => $contacts,
        )); 
Hier ist die Repository:
PHP-Code:
class CustomerRepository extends EntityRepository
{
    public function 
findAllOrderedByLastNameAsc() {
        return 
$this->getEntityManager()
            ->
createQuery('SELECT p FROM TableAppBundle:Contact ORDER BY p.last_name ASC')
            ->
getResult();
    }

    public function 
findAllOrderedByLastNameDesc() {
        return 
$this->getEntityManager()
            ->
createQuery('SELECT p FROM TableAppBundle:Contact ORDER BY p.last_name DESC')
            ->
getResult();
    }

    public function 
findAllOrderedByFirstNameAsc() {
        return 
$this->getEntityManager()
            ->
createQuery('SELECT p FROM TableAppBundle:Contact ORDER BY p.firstName ASC')
            ->
getResult();
    }

    public function 
findAllOrderedByFirstNameDesc() {
        return 
$this->getEntityManager()
            ->
createQuery('SELECT p FROM TableAppBundle:Contact ORDER BY p.firstName DESC')
            ->
getResult();
    }

    public function 
findAllOrderedByBirthAsc() {
        return 
$this->getEntityManager()
            ->
createQuery('SELECT p FROM TableAppBundle:Contact ORDER BY p.birth ASC')
            ->
getResult();
    }

    public function 
findAllOrderedByBirthDesc() {
        return 
$this->getEntityManager()
            ->
createQuery('SELECT p FROM TableAppBundle:Contact ORDER BY p.birth DESC')
            ->
getResult();
    }

    public function 
findAllOrderedByStreetAsc() {
        return 
$this->getEntityManager()
            ->
createQuery('SELECT p FROM TableAppBundle:Contact ORDER BY p.street ASC')
            ->
getResult();
    }

    public function 
findAllOrderedByStreetDesc() {
        return 
$this->getEntityManager()
            ->
createQuery('SELECT p FROM TableAppBundle:Contact ORDER BY p.street DESC')
            ->
getResult();
    }

    public function 
findAllOrderedByNrAsc() {
        return 
$this->getEntityManager()
            ->
createQuery('SELECT p FROM TableAppBundle:Contact ORDER BY p.nr ASC')
            ->
getResult();
    }

    public function 
findAllOrderedByNrDesc() {
        return 
$this->getEntityManager()
            ->
createQuery('SELECT p FROM TableAppBundle:Contact ORDER BY p.nr DESC')
            ->
getResult();
    }

    public function 
findAllOrderedByZipCodeAsc() {
        return 
$this->getEntityManager()
            ->
createQuery('SELECT p FROM TableAppBundle:Contact ORDER BY p.zipCode ASC')
            ->
getResult();
    }

    public function 
findAllOrderedByZipCodeDesc() {
        return 
$this->getEntityManager()
            ->
createQuery('SELECT p FROM TableAppBundle:Contact ORDER BY p.zipCode DESC')
            ->
getResult();
    }

    public function 
findAllOrderedByEmailAsc() {
        return 
$this->getEntityManager()
            ->
createQuery('SELECT p FROM TableAppBundle:Contact ORDER BY p.email ASC')
            ->
getResult();
    }

    public function 
findAllOrderedByEmailDesc() {
        return 
$this->getEntityManager()
            ->
createQuery('SELECT p FROM TableAppBundle:Contact ORDER BY p.email DESC')
            ->
getResult();
    }

    public function 
findAllOrderedByPhoneAsc() {
        return 
$this->getEntityManager()
            ->
createQuery('SELECT p FROM TableAppBundle:Contact ORDER BY p.phone ASC')
            ->
getResult();
    }

    public function 
findAllOrderedByPhoneDesc() {
        return 
$this->getEntityManager()
            ->
createQuery('SELECT p FROM TableAppBundle:Contact ORDER BY p.phone DESC')
            ->
getResult();
    }

    public function 
findAllOrderedByMobileAsc() {
        return 
$this->getEntityManager()
            ->
createQuery('SELECT p FROM TableAppBundle:Contact ORDER BY p.mobile ASC')
            ->
getResult();
    }

    public function 
findAllOrderedByMobileDesc() {
        return 
$this->getEntityManager()
            ->
createQuery('SELECT p FROM TableAppBundle:Contact ORDER BY p.mobile DESC')
            ->
getResult();
    }




Wie jeder sehen kann verursacht eine "einfache" Funktion so einen großen Aufwund... einen eigentlich zu großen.
Meine Frage ist nun, ob sowas auch schöner gehen kann?

Gruß
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 28.01.2012, 15:58  
Erfahrener Benutzer
 
Registriert seit: 25.05.2010
Beiträge: 852
PHP-Kenntnisse:
Anfänger
Trainmaster wird schon bald berühmt werden
Standard

Funktionsparameter und die Abfrage entsprechend zusammenbauen.

Edit: Ich frag mich erneut, ob du überhaupt die Symfony2/Doctrine Dokumentation gelesen hast. Das wird alles beschrieben: http://symfony.com/doc/current/book/doctrine.html

Geändert von Trainmaster (28.01.2012 um 16:02 Uhr).
Trainmaster ist offline   Mit Zitat antworten
Alt 28.01.2012, 15:59  
Erfahrener Benutzer
 
Benutzerbild von Wolfsblut
 
Registriert seit: 30.12.2011
Beiträge: 208
PHP-Kenntnisse:
Fortgeschritten
Wolfsblut wird schon bald berühmt werden
Standard

So, in etwa?

PHP-Code:
public function indexAction($column$orderBy) {
        
$em $this->getDoctrine()->getEntityManager();
        
         
$customers $em->getRepository('TableAppBundle:Contact')
                    ->
findAllOrderedBy($column$orderBy);
                

        return 
$this->render('TableAppBundle:Contact:index.html.twig', array(
            
'contactss'                 => $contacts,
        
));

class 
CustomerRepository extends EntityRepository
{
    public function 
findAllOrderedBy($column$orderBy) {
        return 
$this->getEntityManager()
            ->
createQuery('SELECT p FROM TableAppBundle:Contact ORDER BY p.'.$column.' '.$orderBy)
            ->
getResult();
    }

Wolfsblut ist offline   Mit Zitat antworten
Alt 28.01.2012, 16:06  
archer42
Gast
 
Beiträge: n/a
Standard

Das war mein erster Gedanke, allerdings wird kein SQL escaped und man könnte ohne Probleme eine Code injection starten.

Deswegen müsste man vermutlich $column und $orderBy aufjedenfall immer erst durch kontrollieren so:
PHP-Code:
public function indexAction($column$orderBy) { 
        
$em $this->getDoctrine()->getEntityManager(); 
        if (
$orderBy !== 'DESC') {
             
$orderBy 'ASC';
        }
        case (
$column) { //.... alle Möglichen Spalten }
         
         
$customers $em->getRepository('TableAppBundle:Contact'
                    ->
findAllOrderedBy($column$orderBy); 
                 

        return 
$this->render('TableAppBundle:Contact:index.html.twig', array( 
            
'contacts'                 => $contacts
         
)); 

class 
CustomerRepository extends EntityRepository 

    public function 
findAllOrderedBy($column$orderBy) { 
        return 
$this->getEntityManager() 
            ->
createQuery('SELECT p FROM TableAppBundle:Contact ORDER BY p.'.$column.' '.$orderBy
            ->
getResult(); 
    } 

Und das führt dann mehr oder weniger zu dem was ich zuerst habe bis auf, dass das Repository sauberer ist..
  Mit Zitat antworten
Alt 28.01.2012, 17:59  
Erfahrener Benutzer
 
Registriert seit: 25.05.2010
Beiträge: 852
PHP-Kenntnisse:
Anfänger
Trainmaster wird schon bald berühmt werden
Standard

Der QueryBuilder hilft dir weiter.
Trainmaster ist offline   Mit Zitat antworten
Alt 28.01.2012, 18:08  
archer42
Gast
 
Beiträge: n/a
Standard

PHP-Code:
    public function indexAction($column$orderBy) {
        
$em $this->getDoctrine()->getEntityManager();

        if (
$orderBy !== 'DESC') {
            
$orderBy 'ASC';
        }

        
$columns = array('lastName''firstName''birth''street''nr''zipCode','email''phone''mobile');
        if (!
in_array($column$columns)) {
            
$column 'lastName';
        }

        
$customers $em->getRepository('TableAppBundle:Contact')
            ->
findAllOrderedBy($column$orderBy);

        return 
$this->render('TableAppBundle:Contact:index.html.twig', array(
            
'contacts'                 => $contacts,
        ));

    } 
Ist zwar auch nicht "schön" was die "Validierung" angeht, aber naja....
  Mit Zitat antworten
Alt 28.01.2012, 20:12  
Erfahrener Benutzer
 
Benutzerbild von Wolfsblut
 
Registriert seit: 30.12.2011
Beiträge: 208
PHP-Kenntnisse:
Fortgeschritten
Wolfsblut wird schon bald berühmt werden
Standard

Zitat:
Zitat von archer42 Beitrag anzeigen
Das war mein erster Gedanke, allerdings wird kein SQL escaped und man könnte ohne Probleme eine Code injection starten.
Haben wir schon den 1. April?
Wolfsblut ist offline   Mit Zitat antworten
Alt 29.01.2012, 08:50  
archer42
Gast
 
Beiträge: n/a
Standard

Was willst du mir damit sagen?...
  Mit Zitat antworten
Alt 29.01.2012, 16:27  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.269
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

vermutlich dass es dir frei steht die Werte selbst zu quoten
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 29.01.2012, 17:59  
archer42
Gast
 
Beiträge: n/a
Standard

Ich überlege gerade hin-und-her wie es möglich wäre die Tabellenverwaltung zu kapseln.

Das heisst Erzeugung der Tabelle ähnlich des Formbuilders bei Symfony.
Das an sich ist noch nicht das schwierige, was mir nun Kopfzerbrechen bereitet ist der Sortierungsvorgang.

Eine Möglichkeit wäre den Sortiervorgang in den "TableBuilder" zu verlagern, aber das ist denk ich mal auch nicht die Lösung.

Gibt es noch eine andere Möglichkeit, wie man die Tabellensortierung ohne das $_GET-Gepfusche hinkriegt.
Vielleicht Clientseitig über Javascript?

EDIT:
jquery mit plugins

Geändert von archer42 (29.01.2012 um 20:18 Uhr).
  Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Daten aus 2 Tabellen ausgeben und sortieren moprhoyz Datenbanken 1 06.03.2011 22:29
[Erledigt] 2 Tabellen abgleichen und Inhalte übernehmen... Abweichler PHP Tipps 2010 3 29.07.2010 20:23
[Erledigt] Textdatenbank zeilenweise alphabetisch sortieren - Drop Down Menü alphabet UdoDirk PHP Tipps 2010 1 24.07.2010 10:45
leere Tabellen löschen TobiasH Datenbanken 12 14.06.2010 16:08
Mehrer Tabellen aus Datenbank auslesen? Blade JavaScript, Ajax und mehr 5 17.11.2009 16:08
[Erledigt] Daten aus 2 tabellen sortieren Yanko PHP Tipps 2009 5 13.10.2009 18:09
Verschiedene Tabellen abfragen und Ausgabe sortieren efrasch Datenbanken 4 12.10.2009 04:04
Tabellen miteinander verknüpfen Suzi Datenbanken 12 27.05.2009 11:40
2 Tabellen richtig zuordnen und sortieren? BartTheDevil89 Datenbanken 6 04.04.2009 22:32
Tabellen für Vokabeltrainer anlegen... anonym01 PHP Tipps 2008 9 03.03.2008 21:18
[Problem selbst gelöst] Sortieren über 2 Tabellen Alpha Centauri Datenbanken 1 04.04.2006 16:37
Tabellen sortieren: PHP Tipps 2006 3 21.01.2006 18:20
einträge aus 2 tabellen sortieren Tschuu Datenbanken 11 20.12.2005 08:21
Daten Sortieren aus meherern mySQL tabellen PHP Tipps 2004-2 1 12.12.2004 18:22
Tabellen nach Zahlen sortieren Datenbanken 2 29.11.2004 00:03

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
symfony2 findallorderedby, doctrine findall order by, tabelle sortieren index, php tabelle array sortieren mit $_get, google docs script tabelle nach spalte sortieren, getrepository symfony2, tabelle sortieren je nach auswahl php, ->getrepository ->createquery(\'i\'), symfony2 sort asc desc, phpcode tabellen sortieren, symfony tabellenspalten sortieren, symfony2 findall, doctrine find order findall desc, doctrine createquery order by, symfony2 sortiere table, findallorderedby doctrine, tabellen mit php sortieren

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:41 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum