Ergebnis 1 bis 9 von 9

Thema: PageTree deserialize für execute?

  1. #1
    Alter Contao-Hase Avatar von Messa
    Registriert seit
    19.01.2011.
    Ort
    Vorarlberg, Österreich
    Beiträge
    1.423

    Standard PageTree deserialize für execute?

    Hallo ich würde gerne die Daten aus meinem PageTree Feld für die Database verwenden.

    Code:
    $rs = Database::getInstance()
                ->prepare('SELECT * FROM tl_test')
                ->execute();
    Würde gerne so etwas machen.

    Code:
    global $objPage;
    
    $rs = Database::getInstance()
                ->prepare('SELECT * FROM tl_test WHERE page=?')
                ->execute($objPage->id);
    Doch im Feld Page stehen die Seiten so.
    Code:
    a:4:{i:0;i:2;i:1;i:23;i:2;i:9;i:3;i:24;}
    Ich kann Sie schon deserialize, dann bekomme ich ein Array mit allen Seiten ID's

    Würde es aber gerne bei der Abfrage schon Filtern, dass ich nur den Inhalt bekomme bei dem page=? und $objPage->Id übereinstimmen,
    auch wenn mehrere Ids in page stehen.

    lg Matthias
    Full Service Agentur - Grafikdesign, Screendesign, Webdesign, Webentwicklung, SEO, Weiterbildung, persönliches Coaching
    http://www.matthiasgmeiner.com

  2. #2
    Contao-Fan Avatar von Arno
    Registriert seit
    11.12.2009.
    Ort
    Potsdam-Babelsberg
    Beiträge
    290

    Standard

    Hm, da kommst du wahrscheinlich in der Tat nicht weit.
    Ich habe sowas ähnliches mal gemacht in dem ich per Callback jedesmal beim speichern der PageTree-Auswahl die IDs deserialisiert und dann in einen kommaseparierten String geschrieben habe. Diesen String habe ich dann im gleichen Callback direkt in ein eigenes Tabellenfeld (z.B. "pageIDstring" wie im Beispiel unten) geschrieben.
    Im MySQL-Statement kannst du dann mit dem IN-Operanden arbeiten. Ungefähr so:
    Code:
    $rs = Database::getInstance()
                ->prepare('SELECT * FROM tl_test WHERE pageIDstring IN (?)')
                ->execute($objPage->id);
    Mein Callback sah so aus:
    Code:
    public function pageIDsTostring($dc){
    	if (!empty($dc)){
    		$string = implode(',',deserialize($dc));
    		$id = Input::get('id');
    		$this->Database->prepare('UPDATE tl_news SET pageIDstring = ? WHERE id = ?')->execute($string,$id);
    	}
    	return $dc;
    }
    Hilft das irgendwie als Inspiration? Mir ist schon klar, dass das etwas von hinten durch den Kopf ist und wahrscheinlich auch nicht besonders ökonomisch, aber was besserers ist mir damals auch nicht eingefallen.

  3. #3
    Contao-Urgestein Avatar von Toflar
    Registriert seit
    15.06.2009.
    Beiträge
    4.467
    Partner-ID
    8667
    User beschenken
    Wunschliste

    Standard

    Sauberes Datenbankdesign nutzen. Also weg mit den serialisierten Daten und eine Zwischentabelle bauen
    Contao Core-Entwickler @terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Individuallösungen kannst du uns gerne kontaktieren.
    PS: Heute schon getrakked?

  4. #4
    Alter Contao-Hase Avatar von Messa
    Registriert seit
    19.01.2011.
    Ort
    Vorarlberg, Österreich
    Beiträge
    1.423

    Standard

    Tja die Daten bekomme ich so von Contao. Das war nicht mein Wunsch.

    In meiner DCA steht das so drinnen.

    PHP-Code:
    'page' => array
            (
                
    'label'                   => &$GLOBALS['TL_LANG']['tl_erweiterungsname']['page'],
                
    'inputType'               => 'pageTree',
                
    'exclude'                 => true,
                
    'sorting'                 => true,
                
    'flag'                    => 1,
                
    'search'                  => true,
                
    'eval'                    => array('multiple'=>true'fieldType'=>'checkbox''mandatory'=>true),
                
    'sql'                     => "text NULL",
            ) 
    Wie soll ich es sonst lösen, wenn ich PageTree benötige?
    Gibt es eine Möglichkeit bei eval deserialize=>true zu machen?

    lg Matthias
    Full Service Agentur - Grafikdesign, Screendesign, Webdesign, Webentwicklung, SEO, Weiterbildung, persönliches Coaching
    http://www.matthiasgmeiner.com

  5. #5
    Contao-Urgestein Avatar von Toflar
    Registriert seit
    15.06.2009.
    Beiträge
    4.467
    Partner-ID
    8667
    User beschenken
    Wunschliste

    Standard

    Du hast Contao gesagt, es soll es so machen Du musst einen load_callback und einen save_callback registrieren und die Daten da jeweils von der Zwischentabelle holen und sie wieder da rein speichern. Im eigentlichen Feld "page" musst du nichts speichern.

    In der Zwischentabelle (z.B. tl_test_pages) werden dann die ID's zugeordnet. Jetzt kannst du das alles selbst machen, wie wir es zig mal gemacht haben oder du installierst dir "haste" und geniesst die Arbeit, die wir für dich bereits gemacht haben.
    Die Dokumentation dazu findest du hier: https://github.com/codefog/contao-ha...Model/index.md

    Du musst also bei deinem Feld bloss "relation" definieren und auch da nur "type" und die Zieltabelle (bei dir also "tl_page"). Haste macht den Rest für dich (sobald du definiert hast, wird beim Datenbankupdate automatisch eine Zwischentabelle zum Generieren angeboten ). Du kannst ausserdem dann ein Contao-Model auf deiner "tl_test" registrieren und wenn du statt "extends \Model" das Haste-Model verwendest ("extends \Haste\Model\Model") funktioniert "getRelated('page')" automatisch für dich, ohne dass du auch nur einen Join selber schreiben musst.

    Viel Spass
    Contao Core-Entwickler @terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Individuallösungen kannst du uns gerne kontaktieren.
    PS: Heute schon getrakked?

  6. #6
    Alter Contao-Hase Avatar von Messa
    Registriert seit
    19.01.2011.
    Ort
    Vorarlberg, Österreich
    Beiträge
    1.423

    Standard

    Ok.

    Schaue ich mir morgen gleich an
    Geändert von Messa (16.04.2014 um 18:09 Uhr)
    Full Service Agentur - Grafikdesign, Screendesign, Webdesign, Webentwicklung, SEO, Weiterbildung, persönliches Coaching
    http://www.matthiasgmeiner.com

  7. #7
    Contao-Urgestein Avatar von Toflar
    Registriert seit
    15.06.2009.
    Beiträge
    4.467
    Partner-ID
    8667
    User beschenken
    Wunschliste

    Standard

    Also für dich und Nachkommen, welche n:m-Beziehungen benötigen und "haste" noch nicht kennen:

    dca/tl_test.php
    PHP-Code:
    'pages' => array 

        
    'label'                   => &$GLOBALS['TL_LANG']['tl_test']['pages'], 
        
    'inputType'               => 'pageTree',
        
    // Gibt's gratis dazu, funktioniert automatisch ;-)
        
    'filter'                  => true,
        
    'eval'                    => array('multiple'=>true'fieldType'=>'checkbox''mandatory'=>true), 
        
    'relation'                => array(
           
    'type'     => 'haste-ManyToMany',
           
    'table'    => 'tl_page'
        
    )

    Datenbank-Update machen und sich über die automatische Zwischentabelle freuen


    models/TestModel.php
    PHP-Code:
    class TestModel extends \Haste\Model\Model
    {

        
    /**
         * Table name
         * @var string
         */
        
    protected static $strTable 'tl_test';

    modules/MeinFrontendModul.php
    PHP-Code:
    // In der compile()

    // Gib mir alle Seiten welche ich in tl_test zugeordnet habe
    $objTest TestModel::findByPk($intTestId);
    $objPages $objTest->getRelated('pages');

    // $objPages ist jetzt eine Collection von "PageModel" und wir können bequem darüber iterieren
    foreach ($objPages as $objPage) {
        echo 
    $objPage->id;

    Viel einfacher geht's kaum mehr
    Geändert von Toflar (16.04.2014 um 17:49 Uhr)
    Contao Core-Entwickler @terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Individuallösungen kannst du uns gerne kontaktieren.
    PS: Heute schon getrakked?

  8. #8
    Alter Contao-Hase Avatar von Messa
    Registriert seit
    19.01.2011.
    Ort
    Vorarlberg, Österreich
    Beiträge
    1.423

    Standard

    Hi.

    Irgendwie klappt das bei mir nicht.
    Die zusätzliche Tabelle wird erstellt.
    Doch bekomme ich einen Fehler
    Code:
    Call to a member function getRelated() on a non-object
    Sieht bei mir so aus.
    PHP-Code:
    $objPages $objTest->getRelated('pages'); 
    Das einzige was ich anders habe ist, das meine tabele nicht tl_test heißt.

    Wo wird das denn genau definiert?
    PHP-Code:
    $intTestId 
    Wenn ich manuell die ID des Modules eintrage dann geht es
    PHP-Code:
    $intTestId 6
    lg Matthias
    Geändert von Messa (18.04.2014 um 12:33 Uhr)
    Full Service Agentur - Grafikdesign, Screendesign, Webdesign, Webentwicklung, SEO, Weiterbildung, persönliches Coaching
    http://www.matthiasgmeiner.com

  9. #9
    Contao-Nutzer
    Registriert seit
    25.01.2013.
    Beiträge
    42

    Standard

    Nur der Vollständigkeit halber würde ich gern ergänzen das man durchaus auf eine bestimmte ID in einem serialisierten Feld per SQL Query losgehen kann. Das wäre eine Query auf die page ID 5:

    Code:
    SELECT * FROM table WHERE page REGEXP '.*;s:[0-9]+:"5".*'
    Natürlich kann man diskutieren ob das 'sauber' ist und ich würd so eine Query jetzt nicht unbedingt auf eine Tabelle mit 2 Millionen Datensätzen und riesigen Arrays in dem Feld loslassen. Aber wenn man gute Gründe hat das so zu machen, dann tut das seinen Dienst recht gut.
    Geändert von betatester (23.04.2014 um 12:51 Uhr)
    Lieben Gruß,
    Michael

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •