Truncate von Feldern schon im Model

Datenbankobjekte strukturieren und validieren

Truncate von Feldern schon im Model

Beitragvon wandschrank am Do 29. Jan 2009, 14:51

Hallo Gruppe,
ich bin neu hier und habe schon ein Problem mit cakePHP. Ich arbeite seit ca. 4 Wochen mit cakePHP und lerne noch viel, da ich noch nie mit einem Framework gearbeitet habe. Bisher klappt aber alles gut und ich konnte alle Probleme selbst oder mit Hilfe des Netzes lösen. Nun geht es aber nicht weiter.

Folgendes Problem stellt sich mir: Ich habe ein model "items" welches ein Feld namens "content" besitzt, dass ich gerne auf ca. 200 Zeichen kürzen möchte. Der TextHelper mit truncate macht das auch zuverlässig nur kann ich mir vostellen, dass es günstiger wäre direkt im model solche Änderungen durchzuführen. Aber wie schaffe ich das? Mit den Modeln stehe ich noch immer ein wenig auf Kriegsfuss. Ich frage nach, weil ich die Daten über den View als Json an ExtJS weiterleite und mir das im View selbst zu frickelig wird. Ausserdem spare ich mir dadurch die Übergabe von grossen Datenpaketen vom Controller zum View.

Hat da jemand eine Idee?
Viele Grüße
wandschrank
wandschrank
 
Beiträge: 4
Registriert: Do 29. Jan 2009, 14:34

Re: Truncate von Feldern schon im Model

Beitragvon Mathias am Do 29. Jan 2009, 17:27

Versuch es doch mal mit einer rule im Model item.

Beispiel:
Code: Alles auswählen
<?php
class Item extends AppModel {
    var $name = 'Item';
    var $validate = array(
        'content' => array(
            VALID_NOT_EMPTY,
            array(
                'rule' => array('maxLength', 200)
            )
        )
    );
}
?>


Somit wird der Eintrag nur erstellt, wenn content nicht leer und nicht mehr als 200 Zeichen hat.

Dieser Artikel ist ganz gut: Bakery
cheers
Benutzeravatar
Mathias
 
Beiträge: 184
Registriert: Mi 4. Jun 2008, 22:30
Wohnort: Berlin
CakePHP-Version: 1.3.3
OS: OS X 10.6.x

Re: Truncate von Feldern schon im Model

Beitragvon wandschrank am Do 29. Jan 2009, 20:14

Danke Mathias für die schnelle Antwort. Nur ist es nicht ganz was ich suche. Ich möchte durchaus alle Einträge selektieren und auch die über 200 Zeichen, nur möchte ich diese nicht an das View schicken. Sagen wir mal, "content" hat 1000 Zeichen dann möchte ich das im View nur 200 + ein "..." ankommen. Ich habe auch schon verusucht das im Controller mit dem TextHelper (vergewaltigt diesen) zu vollbringen, aber das scheint mir alles von hinten durchs Auge zu sein. Gibts nicht auch einen SQL Befehl die Ausgabe zu beschränken? Hmmm.. Ich suche mal - gute Idee.

Gruss
wandschrank
 
Beiträge: 4
Registriert: Do 29. Jan 2009, 14:34

Re: Truncate von Feldern schon im Model

Beitragvon wandschrank am Fr 30. Jan 2009, 08:46

Ich habe mir schon gedacht, dass es vielleicht reicht auf SQL ebene den Datensatz zu kürzen. Das geht auch im Controller mit z.B.:

Code: Alles auswählen
$itemA = $this->Item->find('all',array('fields' => array('Item.id','Item.title','LEFT(Item.content, 200) excerpt','Item.md5'),'limit' => $limit, 'page' => $page));


Nur packt mir cake das Feld "excerpt" in ein extra Array. Das sieht dann so aus:

Code: Alles auswählen
Array ( [0] => Array (
                [Item] => Array (
                                    [id] => 1
                                    [title] => Titel des Eintrages
                                    [md5] => D98AFCB004DB36BD084019243080F9B3
                                )
                [0] => Array (
                                    [excerpt] => Lorem ipsum Dolor ...
                             )
                    )


Ich schätze, das liegt am model. Da fehlt wohl ein vordefiniertes Feld.
Meine Frage jetzt: Kann ich vielleicht das Feld im model schon vorsehen? Wie geht das? Damit wäre mein Problemchen durch.

Gruss
wandschrank
wandschrank
 
Beiträge: 4
Registriert: Do 29. Jan 2009, 14:34

Re: Truncate von Feldern schon im Model

Beitragvon wandschrank am Fr 30. Jan 2009, 13:20

Ok, ich habe die Lösung.
Folgendes ins Model geschrieben und ich kann die beiden Array-Zweige zusammenfügen:

Code: Alles auswählen
    function afterFind($results, $primary=false) {
            if($primary == true) {
               if(Set::check($results, '0.0')) {
                  $fieldName = key($results[0][0]);
                   foreach($results as $key=>$value) {
                      $results[$key][$this->alias][$fieldName] = $value[0][$fieldName];
                      unset($results[$key][0]);
                   }
                }
            }
   
            return $results;  
    }


Hab ich aus: teknoid.wordpress.com

Viele Grüße
wandschrank
wandschrank
 
Beiträge: 4
Registriert: Do 29. Jan 2009, 14:34


Zurück zu Models

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron