Empfehlungen: Erweiterte Suche

Favouriten-Funktion: Mehrere Parameter an Controller überg.

Daten auslesen, verarbeiten und den Views übergeben

Favouriten-Funktion: Mehrere Parameter an Controller überg.

Beitragvon enigmartin » Fr 1. Apr 2011, 15:02

Hallo, da issa wieder mit einem Problem.

Ich bastel momantan an einer Datenbank in der Lieder und Akkorde gespeichert werden sollen. Untergeordnet den Alben und Artisten der Lieder.

Folgende Tabellen in der Datenbank sind für dieses Thema relevant (vereinfacht):

  • artists
    • id
    • name
  • albums
    • id
    • name
  • lyrics
    • id
    • name
  • favorites
    • id
    • parent_id
    • user_id
    • artist_id
    • album_id
    • lyric_id
    • name
  • users
    • id
    • username
    • password

Nun soll ein Benutzer die Möglichkeit erhalten einen Artisten, ein Album oder aber auch ein Lied(Lyric) als Favourit abspeichern zu könne, jeweils in der gleichen Tabelle.

Nun wird mir eine Liste von Liedern (Lyrics) angezeigt in der hinter jedem Namen ein Link ist, der es ermöglichen soll das jeweilige Lied in den Favouriten zu speichern. Das ganze auch bei den Alben und auch bei den Artisten.

Ich bin jetzt so rangegangen das ich im FavoritesController eine Methode "add" habe, in der ich erstmal abfrage was gespeichert werden soll -> artist/album/lyric. Da ich der add-Methode die jeweilige id übergebe, wird diese dann jeweils gespeichert.

Ich dachte das die Links dann jeweils so aussehen könnten:

Code: Alles auswählen
<a title="Add Artist to Favorites" href="favorites/add/artist/123">+</a>
<a title="Add Albumto Favorites" href="favorites/add/album/123">+</a>
<a title="Add Lyric to Favorites" href="favorites/add/lyric/123">+</a>

oder
Code: Alles auswählen
<a title="Add Artist to Favorites" href="favorites/add/artist_id/123">+</a>
<a title="Add Albumto Favorites" href="favorites/add/album_id/123">+</a>
<a title="Add Lyric to Favorites" href="favorites/add/lyric_id/123">+</a>


Die user_id wird dann aus der Session des gerade angemeldeten Benutzers gelesen und mit abgespeichert.

Ich weiß nun aber nicht wie ich die Daten auslesen kann, bzw dann ans view übergebe. Ich hab auch schon überlegt das ganze einfach mittels $this->redirect( $this->referer ); in der add-Methode wieder an die vorherige Seite weiterzuleiten.

Da ich aber in der favorites-Tabelle eine parent_id gespeichert habe, will ich auch sozusagen Listen anlegen lassen, denen ich dann die jeweiligen Lieder zuordnen kann.

Beispielsweise so:

  • Rock
    • 1. Lied
    • 2. Lied
    • 3. Lied
  • Metal
    • 1. Lied
    • 2. Lied
    • 3. Lied

Mir fehlt da jetzt leider so der Leitgedanke, son kleiner Anschups. Vielleicht muss ich die Listen auch in eine eigene Tabelle abspeichern. Aber im Prinzip reicht mir erstmal wenn ich es irgendwie schaffe die Parameter in der URL übergeben kann und das ganze dann in der Datenbank speichern kann.

Kann mir da jemand einen kleinen Wink mit dem Zaunpfahl geben?

NACHTRAG: So in etwa sähen meine Überlegungen der add-Methode aus.
Code: Alles auswählen
function add( $id = null )
{
    if ( $id )
    {
        switch( /* 1. Parameter der URL */ )
        {
            case 'artist':
                $this->data['Favorite']['user_id'] = $this->Auth->user('id');
                $this->data['Favorite']['artist_id'] = /* 2. Parameter der URL */;
                $this->data['Favorite']['album_id'] = null;
                $this->data['Favorite']['lyric_id'] = null;
                break;
            case 'album':
                $this->data['Favorite']['user_id'] = $this->Auth->user('id');
                $this->data['Favorite']['artist_id'] = null;
                $this->data['Favorite']['album_id'] = /* 2. Parameter der URL */;
                $this->data['Favorite']['lyric_id'] = null;
                break;
            case 'lyric':
                $this->data['Favorite']['user_id'] = $this->Auth->user('id');
                $this->data['Favorite']['artist_id'] = null;
                $this->data['Favorite']['album_id'] = null;
                $this->data['Favorite']['lyric_id'] = /* 2. Parameter der URL */;
                break;
        }
       
        if( $this->Favorite->save($this->data) )
        {
            $this->Session->setFlash(__('The favorite has been saved', true));
            //$this->redirect( $this->referer() );
        }
        else
        {
            $this->Session->setFlash(__('The favorite could not be saved. Please, try again.', true));
        }
    }
    else
    {
        $this->Session->setFlash(__('Invalid favorite', true));
        $this->redirect( $this->referer() );
    }
}
Benutzeravatar
enigmartin
 
Beiträge: 40
Registriert: So 27. Mär 2011, 10:42
CakePHP-Version: 1.3.8
OS: Windows 7

Re: Favouriten-Funktion: Mehrere Parameter an Controller übe

Beitragvon urlaubsreif_now » Di 5. Apr 2011, 12:27

hey,
konntest du mittlerweile deine daten auslesen bzw. an die View übergeben.
Das würde mich schon interessieren. Wäre schön, wenn du es für die anderen Baker publizieren könntest

LG
urlaubsreif_now
 
Beiträge: 21
Registriert: Di 22. Mär 2011, 09:59
CakePHP-Version: 1.3.4
OS: Win7

Re: Favouriten-Funktion: Mehrere Parameter an Controller übe

Beitragvon enigmartin » Di 5. Apr 2011, 20:58

Ich bin nicht wirklich fertig geworden aber ich habe aufjedenfall Fortschritte gemacht. Da ich mich mit dieser Funktion aber ins Detail verloren habe habe ich mich entschlossen das ganze erstmal wieder auszubauen und weiter an dem wesentlichen weiterzuprogrammieren was ich vor habe.

Ich habe den Code leider nicht mehr, weil ich, wenn ich das nochmal aufnehme alles gerne anders programmieren werde und auch neu, in der Hoffnung in Übung zu kommen. ;-)

Meine Ansätze will ich aber dennoch nicht vorenthalten. Die URL-Parameter stecken in einem array in $this->params. Zum testen einfach in der layouts/default.ctp oder einer anderen view-Datei einfügen und schauen was darüber noch alles verfügbar ist.

Code: Alles auswählen
<?php pr( $this->params ); ?>


Code: Alles auswählen
function add( $id = null )
{
    if ( $id )
    {
        switch( $this->params['pass'][0] ) // 1. Parameter in der URL
        {
            case 'artist':
                $this->data['Favorite']['user_id'] = $this->Auth->user('id');
                $this->data['Favorite']['artist_id'] = $this->params['pass'][1]; // 2. Parameter der URL
                $this->data['Favorite']['album_id'] = 0;
                $this->data['Favorite']['lyric_id'] = 0;
                break;
            case 'album':
                $this->data['Favorite']['user_id'] = $this->Auth->user('id');
                $this->data['Favorite']['artist_id'] = 0;
                $this->data['Favorite']['album_id'] = $this->params['pass'][1]; // 2. Parameter der URL
                $this->data['Favorite']['lyric_id'] = 0;
                break;
            case 'lyric':
                $this->data['Favorite']['user_id'] = $this->Auth->user('id');
                $this->data['Favorite']['artist_id'] = 0;
                $this->data['Favorite']['album_id'] = 0;
                $this->data['Favorite']['lyric_id'] = $this->params['pass'][1]; // 2. Parameter der URL
                break;
        }
       
        if( $this->Favorite->save($this->data) )
        {
            $this->Session->setFlash(__('The favorite has been saved', true));
            $this->redirect( $this->referer() );
        }
        else
        {
            $this->Session->setFlash(__('The favorite could not be saved. Please, try again.', true));
            $this->redirect( $this->referer() );
        }
    }
    else
    {
        $this->Session->setFlash(__('Invalid favorite', true));
        $this->redirect( $this->referer() );
    }
}


Die Abfragen haben nicht ganz hingehauen aber grundsätzlich hat es nach einigen Anpassungen funktioniert. Nur das mit der übergeordneten Kategorie/Liste habe ich nicht hinbekommen, dahingehend bin ich dann doch zu dem Entschluss gekommen die Listen in eine eigene Datenbank-Tabelle auszulagern und entsprechend der ID die Favouriten zuzuordnen. Ich schweife auch von dem Gedanken ab für jede Rubrik einen Favouriten-Link anzubieten, es sollte reichen wenn man nur die Lieder als Favouriten speichert und dann entsprechend die Artisten und Alben dazu ausliest und unterordnet.

Die URLs sahen dann jeweils wie folgt aus:

Code: Alles auswählen
<a title="Add to Favorites" href="favorites/add/artist/123">+</a>
<a title="Add to Favorites" href="favorites/add/album/123">+</a>
<a title="Add to Favorites" href="favorites/add/lyric/123">+</a>



Code: Alles auswählen
<?php
    echo $html->link( __('Add to Favorites', true), array(
            'controller' => 'favorites',
            'action' => 'add',
            'artist',
            $artist['id']
        )
    );
    echo $html->link( __('Add to Favorites', true), array(
            'controller' => 'favorites',
            'action' => 'add',
            'album',
            $album['id']
        )
    );
    echo $html->link( __('Add to Favorites', true), array(
            'controller' => 'favorites',
            'action' => 'add',
            'lyric',
            $lyric['id']
        )
    );
?>


Die URLs wurden dann in der jeweiligen Tabellen-Liste in der der action-Spalte eingefügt.

Kurze Erkärung zum Code im Controller: Als erstes frage ich ab ob eine id vorhanden ist. Wie die automatisch erkannt wird und geprüft wird habe ich noch nicht ganz verstanden. Dann kommt eine Switch-Abfrage die abfragt welche Art von Favourit gespeichert werden soll. Dementsprechend wird dann anhand des zweiten Parameters die ID des artisten/albums/lyrics und für die jeweiligen anderen eine 0 eingetragen. Da die user_id, _artist_id, album_id und lyric_id foregn_keys sind können diese nicht "null" sein, daher habe ich nun die Zahl 0 verwendet. Da in eine mysql-Datenbank auto increment immer bei 1 einfängt.

Wenn noch fragen sind, versuche ich diese gerne zu beantworten.

Achtung: Der oben angebene Code wurde nicht getestet und erklärt nur das Prinzip was ich im Kopf hatte. So oder so ähnlich hat es aber schon funktioniert. Sobald ich wieder bei dem Thema bin und mich wieder erinnere werde ich meine Lösung hier veröffentlichen.

Viel Glück
Benutzeravatar
enigmartin
 
Beiträge: 40
Registriert: So 27. Mär 2011, 10:42
CakePHP-Version: 1.3.8
OS: Windows 7


Zurück zu Controller

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron