Ergebnis 1 bis 13 von 13

Thema: Contao 3, namespace und Models

  1. #1
    Contao-Nutzer Avatar von Nils Heinold
    Registriert seit
    04.09.2010.
    Ort
    Uckermark
    Beiträge
    155
    User beschenken
    Wunschliste

    Standard Contao 3, namespace und Models

    Hallo,

    hat schon mal jemend etwas Erfahrung mit namespace und den Models gemacht?

    Wenn ich für die Model- Klassen den namespace "nameAutor\nameExtension" nehme, den Autoload-Creator drüberjage und die Klasse mit "nameKlasse" (ohne "\" davor) aufrufe bekomme ich folgenden Fehler

    HTML-Code:
    Fatal error: Class 'NlshGartenConfigModel' not found in C:\Contao2goEntwicklungen\htdocs\vhosts\nlsh_Kleingartenverwaltung\system\modules\core\library\Contao\Model\Collection.php on line 380
    Nehme ich aber "nameAutor\" weg, nehme wieder den Autoload-Creator und setze "\" for dem Klassennamen, funktioniert es wieder.

    Ist das so korrekt? Oder rufe ich die Klasse falsch auf?

    Vielen Dank im voraus. Nils

    PS: Contaoversion: contao-core-3.0.RC1-144-g086c725 vom 15.09.2012

  2. #2
    Contao-Fan
    Registriert seit
    22.11.2009.
    Ort
    14943 Luckenwalde
    Beiträge
    373

    Standard

    kann ich bestätigen habe das gleiche problem das meine model-klasse nicht da ist ...
    Freundliche Grüße
    Jens


  3. #3
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.514
    User beschenken
    Wunschliste

    Standard

    Sollte es nicht \nameExtension\nameKlasse sein beim Aufruf? So ist es doch allgemein bei nameAutor\nameExtension\nameKlassse als Definition.
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  4. #4
    Contao-Fan
    Registriert seit
    22.11.2009.
    Ort
    14943 Luckenwalde
    Beiträge
    373

    Standard

    ich glaub ich habs gefunden ...


    und zwar muss deine Modelklasse genau so heißen, wie deine Tabelle .... Ohne "tl_" und jegliche "_"

    also wenn die tabelle tl_komme_schon_her heist ensteht die model klasse

    "KommSchonHerModel"

    PHP-Code:
            $strClass $this->getModelClassFromTable($this->strTable);
            
    $this->arrModels[$this->intIndex 1] = new $strClass($this->objResult); 
    am besten zu sehen an der FAQ erweiterung und der tabelle tl_faq_categorie
    Geändert von Merlin (19.09.2012 um 18:34 Uhr)
    Freundliche Grüße
    Jens


  5. #5
    Contao-Nutzer Avatar von Nils Heinold
    Registriert seit
    04.09.2010.
    Ort
    Uckermark
    Beiträge
    155
    User beschenken
    Wunschliste

    Standard

    Merlin

    ich glaub ich habs gefunden ...


    und zwar muss deine Modelklasse genau so heißen, wie deine Tabelle .... Ohne "tl_" und jegliche "_"

    also wenn die tabelle tl_komme_schon_her heist ensteht die model klasse
    Meine Tabelle heißt "tl_nlsh_garten_config" und meine Modelklasse "NlshGartenConfigModel", also wie in deinen Beispielen, funktioniert trotzdem nicht. Schade

    Nochmal zu meinem Code:

    in meiner Modelklasse steht:
    PHP-Code:
    /**
     * Namespace
     */
    namespace nlsh\nlsh_Kleingartenverwaltung;

    /**
     * Class NlshGartenConfigModel
     *
     * @copyright  Nils Heinold
     * @author     Nils Heinold
     * @package    nlsh_Kleingartenverwaltung
     */
    class NlshGartenConfigModel extends \Model 
    in meinem Modul steht:

    PHP-Code:
    /**
     * Namespace
     */
    namespace nlsh\nlsh_Kleingartenverwaltung;

    /**
     * Class ModuleNlshGartenGesamtausgabe

    ...

            // jetzt sind die Einstellungen dran
            $GartenConfig = NlshGartenConfigModel::findByJahr($garten_gesamt_abrechnung['ausgabejahr']); 
    in der autoload.php steht

    PHP-Code:
     Register the namespaces
     
    */
    ClassLoader::addNamespaces(array
    (
        
    'nlsh',
        
    'nlsh_Kleingartenverwaltung',
    ));


    /**
     * Register the classes
     */
    ClassLoader::addClasses(array
    (
        
    // Models
        
    'nlsh\nlsh_Kleingartenverwaltung\NlshGartenConfigModel'         => 'system/modules/nlsh_Kleingartenverwaltung/models/NlshGartenConfigModel.php',
        
    'nlsh_Kleingartenverwaltung\NlshGartenGartenDataModel'          => 'system/modules/nlsh_Kleingartenverwaltung/models/NlshGartenGartenDataModel.php',
        
    'nlsh_Kleingartenverwaltung\NlshGartenVereinStammdatenModel'    => 'system/modules/nlsh_Kleingartenverwaltung/models/NlshGartenVereinStammdatenModel.php',

        
    // Modules
        
    'nlsh\nlsh_Kleingartenverwaltung\ModuleNlshGartenGesamtausgabe' => 'system/modules/nlsh_Kleingartenverwaltung/modules/ModuleNlshGartenGesamtausgabe.php',
    )); 
    bitte nur die NlshGartenConfigModel ansehen, da ich für den Test nur diese geändert habe, darum auch unter ::addNamespaces jetzt nlsh, was sein sollte und der zweite Eintrag aus den anderen Models

    ergibt Fehler

    PHP-Code:
    Fatal error: Class 'NlshGartenConfigModel' not found in C:\Contao2goEntwicklungen\htdocs\vhosts\nlsh_Kleingartenverwaltung\system\modules\core\library\Contao\Model\Collection.php on line 380 
    Änderung im Modul nach

    Sollte es nicht \nameExtension\nameKlasse sein beim Aufruf? So ist es doch allgemein bei nameAutor\nameExtension\nameKlassse als Definition.
    PHP-Code:
    Fatal error: Class 'nlsh\nlsh_Kleingartenverwaltung\Kleingartenverwaltung\NlshGartenConfigModel' not found in C:\Contao2goEntwicklungen\htdocs\vhosts\nlsh_Kleingartenverwaltung\system\modules\nlsh_Kleingartenverwaltung\modules\ModuleNlshGartenGesamtausgabe.php on line 611 
    Setze ich ein \ davor, ergibt sich

    PHP-Code:
    Fatal error: Class 'Kleingartenverwaltung\NlshGartenConfigModel' not found in C:\Contao2goEntwicklungen\htdocs\vhosts\nlsh_Kleingartenverwaltung\system\modules\nlsh_Kleingartenverwaltung\modules\ModuleNlshGartenGesamtausgabe.php on line 611 
    Das Einzigste, was funktioniert ist

    Modelklasse:

    PHP-Code:
    /**
     * Namespace
     */
    namespace nlsh_Kleingartenverwaltung;

    /**
     * Class NlshGartenConfigModel
     *
     * @copyright  Nils Heinold
     * @author     Nils Heinold
     * @package    nlsh_Kleingartenverwaltung
     */
    class NlshGartenConfigModel extends \Model 
    Autoload.php

    PHP-Code:
    ClassLoader::addNamespaces(array
    (
        
    'nlsh_Kleingartenverwaltung',
        
    'nlsh',
    ));


    /**
     * Register the classes
     */
    ClassLoader::addClasses(array
    (
        
    // Models
        
    'nlsh_Kleingartenverwaltung\NlshGartenConfigModel'              => 'system/modules/nlsh_Kleingartenverwaltung/models/NlshGartenConfigModel.php',
        
    'nlsh_Kleingartenverwaltung\NlshGartenGartenDataModel'          => 'system/modules/nlsh_Kleingartenverwaltung/models/NlshGartenGartenDataModel.php',
        
    'nlsh_Kleingartenverwaltung\NlshGartenVereinStammdatenModel'    => 'system/modules/nlsh_Kleingartenverwaltung/models/NlshGartenVereinStammdatenModel.php',

        
    // Modules
        
    'nlsh\nlsh_Kleingartenverwaltung\ModuleNlshGartenGesamtausgabe' => 'system/modules/nlsh_Kleingartenverwaltung/modules/ModuleNlshGartenGesamtausgabe.php',
    )); 
    Modul

    PHP-Code:
            $GartenConfig = \NlshGartenConfigModel::findByJahr($garten_gesamt_abrechnung[
    Naja

    hoffe bei paste $ copy nicht gezittert zu haben.

    Gruß Nils

  6. #6
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.514
    User beschenken
    Wunschliste

    Standard

    Also bei mir geht das genau so wie ich oben angedeutet habe.
    autoload.php: so wie Contao generiert:
    PHP-Code:
    ClassLoader::addNamespaces(array
    (
        
    'BugBuster',
    ));
    ClassLoader::addClasses(array
    (
        
    // Modules
        
    'BugBuster\IntegrityCheck\Integrity_Check'          => 'system/modules/integrity_check/modules/Integrity_Check.php',
        
    // Models
        
    'BugBuster\IntegrityCheck\IntegrityTimestampsModel' => 'system/modules/integrity_check/models/IntegrityTimestampsModel.php',
    )); 
    Modul:
    PHP-Code:
    namespace BugBuster\IntegrityCheck

    class 
    Integrity_Check extends \Frontend 
    {
        protected function 
    checkFileTimestamp($cp_file$cp_action)
        {
                 
    $objTimestamps = \IntegrityCheck\IntegrityTimestampsModel::findByPk(1);
                 ....
        }

    Model
    PHP-Code:
    namespace BugBuster\IntegrityCheck;

    class 
    IntegrityCheckModel extends \Model
    {
        protected static 
    $strTable 'tl_integrity_check';

    Ich habe hier zwar keine findByPk, aber mein Model wird gefunden und die findByPk darüber aus \Model genommen.
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  7. #7
    Contao-Nutzer Avatar von Nils Heinold
    Registriert seit
    04.09.2010.
    Ort
    Uckermark
    Beiträge
    155
    User beschenken
    Wunschliste

    Standard keine Chance

    @BugBuster

    Welche Version von Contao nutzt du?

    Ich hab jetzt die Neueste von Github. Es funktioniert nicht.

    Leider hast du auf Github nicht die Model- Version deines integrity_check Modules.

    Ich würde gern mal ein Modul sehen, welches den namesspace so benutzt ( nameAutor\nameModul) und bei dem es funktioniert, über seine Models zuzugreifen.

    Vielen, vielen Dank im voraus.

    Nils

  8. #8
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.514
    User beschenken
    Wunschliste

    Standard

    Ja, das war eigentlich auch nur zum Test, da die Tabelle die ich dafür nehme normalerweise kein DCA hat, ohne gehts aber nicht mit den Model Klassen.
    Musste nun extra ne Mini DCA anlegen. Aber vielleicht lasse ich das auch so, mal sehen, dann kommt das auch auf GitHub.

    Meine Contao Version müsste ca. ne Woche alt sein. Werd ich nochmal aktualisieren.
    Geändert von BugBuster (20.09.2012 um 09:16 Uhr)
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  9. #9
    Contao-Fan
    Registriert seit
    22.11.2009.
    Ort
    14943 Luckenwalde
    Beiträge
    373

    Standard

    ich möchte mich nicht soweit herauslesen, aber ich glaub mal gelesen zu haben in den commits von C3 das die Möglichkeit eines Backslashs im namenspace nicht gegeben ist ...

    ich finde aber leider diesen commit nicht ...
    Freundliche Grüße
    Jens


  10. #10
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.514
    User beschenken
    Wunschliste

    Standard

    Du meinst das hier ginge nicht?
    PHP-Code:
    namespace BugBuster\IntegrityCheck
    Doch, alle meine Erweiterungen funktionieren so. Von anderen Entwicklern auch.
    Der erste Teil davon wird als Namespace registriert, das sieht man ja in der autoload.php
    Den Rest davon muss man dann angeben. Man kann auch nur die Klasse angeben und den Namen der Erweiterung ( in meinem Beispiel) weglassen,
    dann heißt es aber Glück haben, dass der autoloader auch die richtige nimmt, die können ja mehrfach vergeben sein.
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  11. #11
    Contao-Nutzer Avatar von Nils Heinold
    Registriert seit
    04.09.2010.
    Ort
    Uckermark
    Beiträge
    155
    User beschenken
    Wunschliste

    Standard Komisch

    Ich hab es gefunden.

    Der Fehler tritt gar nicht beim holen der Daten durch das Model auf, sondern erst bei der Nutzung des Ergebnisses

    Folgender Code bewirkt
    PHP-Code:
        $objYears NlshGartenVereinStammdatenModel::findAll(array('order' => '`jahr` DESC'));

        
    print_r($objYears);

        echo 
    "<br>davor<br>";

        echo 
    $objYears->jahr;

        echo 
    "<br>danach"
    bewirkt nachfolgende Ausgabe

    HTML-Code:
    Contao\Model\Collection Object ( [strTable:protected] => tl_nlsh_garten_verein_stammdaten [objResult:protected] => Contao\Database\Mysql\Result Object ( [resResult:protected] => Resource id #278 [strQuery:protected] => SELECT * FROM tl_nlsh_garten_verein_stammdaten ORDER BY `jahr` DESC [intIndex:Contao\Database\Result:private] => -1 [intRowIndex:Contao\Database\Result:private] => -1 [blnDone:Contao\Database\Result:private] => [blnModified:Contao\Database\Result:private] => [arrCache:protected] => Array ( ) ) [intIndex:protected] => -1 [blnDone:protected] => [arrModels:protected] => Array ( ) [arrCache:protected] => Array ( ) [arrObjects:protected] => Array ( [Config] => Contao\Config Object ( [Files:protected] => [strTop:protected] => [blnIsModified:protected] => [blnHasLcf:protected] => 1 [arrData:protected] => Array ( [$GLOBALS['TL_CONFIG']['licenseAccepted']] => true; [$GLOBALS['TL_CONFIG']['websitePath']] => '/vhosts/contao-3-0'; [$GLOBALS['TL_CONFIG']['installPassword']] => '$6$c7dc189236b739a8$Fo/St85deK1aisS2fjU6blcrDtAbnDsWOrDCIvkK6gwLTITbQZty9Ir4/BwJV/ZTMfqRmQ/XDPV4ij6OMlToB0'; [$GLOBALS['TL_CONFIG']['encryptionKey']] => '98d5ec500688162b55e275ab4ed06f89'; [$GLOBALS['TL_CONFIG']['dbDriver']] => 'MySQL'; [$GLOBALS['TL_CONFIG']['dbHost']] => 'localhost'; [$GLOBALS['TL_CONFIG']['dbUser']] => 'root'; [$GLOBALS['TL_CONFIG']['dbPass']] => ''; [$GLOBALS['TL_CONFIG']['dbDatabase']] => '3_0_0'; [$GLOBALS['TL_CONFIG']['dbPconnect']] => false; [$GLOBALS['TL_CONFIG']['dbCharset']] => 'UTF8'; [$GLOBALS['TL_CONFIG']['dbPort']] => ''; [$GLOBALS['TL_CONFIG']['checkFileTree']] => false; [$GLOBALS['TL_CONFIG']['installCount']] => 0; [$GLOBALS['TL_CONFIG']['bypassCache']] => true; [$GLOBALS['TL_CONFIG']['displayErrors']] => true; [$GLOBALS['TL_CONFIG']['adminEmail']] => 'nils@web.de'; [$GLOBALS['TL_CONFIG']['repository_unsafe_catalog']] => true; [$GLOBALS['TL_CONFIG']['latestVersion']] => '2.11.5'; ) [arrCache:protected] => Array ( [activeModules] => Array ( [0] => core [1] => calendar [2] => comments [3] => devtools [4] => faq [5] => listing [6] => news [7] => newsletter [8] => repository [9] => integrity_check [10] => multicolumnwizard [11] => nlsh_Kleingartenverwaltung ) ) ) [Session] => Contao\Session Object ( [arrSession:protected] => Array ( [referer] => Array ( [last] => /informationen.html [current] => /vhosts/contao-3-0/ ) ) ) ) )
    davor
    
    Fatal error: Class 'NlshGartenVereinStammdatenModel' not found in C:\Contao2Go\htdocs\vhosts\contao-3-0\system\modules\core\library\Contao\Model\Collection.php on line 379
    es fehlt das "danach", d.h. $objYears->jahr erzeugt die Fehlerausgabe.

    den Slash benötigt man nicht und nach tril seinem Video ist man dann immer in seinem namespace.

    Ist denn der Aufruf $objYears->jahr falsch??

    Danke Nils


    Nachtrag:

    bei namesspace nlsh\nlsh_Kleingartenverwaltung -> Fehler

    bei namespace nlsh_Kleingartenverwaltung tritt der Fehler nicht auf
    Geändert von Nils Heinold (21.09.2012 um 08:36 Uhr)

  12. #12
    Contao-Urgestein Avatar von tril
    Registriert seit
    07.01.2010.
    Ort
    Bad Marienberg
    Beiträge
    2.939
    User beschenken
    Wunschliste

    Standard

    Um ein bisschen zur Klärung des ganzen beizutragen ein paar Infos:

    1. Es wird immer nur der 1. Teil des Namespaces registriert.

    Hat man eine Klasse wie folgt:
    PHP-Code:
    namespace Foo\Bar;

    class 
    Zap {

    Dann ist der absolute Klassenname Foo\Bar\Zap.
    Der Autoload-Creator registriert nur den 1. Teil des Namespaces, in dem Fall also Foo und die Klasse Foo\Bar\Zap.
    PHP-Code:
    ClassLoader::addNamespaces(array 

        
    'Foo'
    )); 
    ClassLoader::addClasses(array 

        
    'Foo\Bar\Zap'          => 'system/modules/foo/classes/Zap.php'
    )); 
    2. Der ClassLoader durchsucht alle Namespaces nach einer angeforderten Klasse.

    Ich kann die Klasse Foo\Bar\Zap direkt verwenden. Diese ist ja registriert (s.o.) und kann unter ihrem absoluten Namen verwendet werden:
    PHP-Code:
    $zap = new \Foo\Bar\Zap(); 
    Wenn allerdings eine nicht vorhandene/registrierte Klasse verwendet wird, durchsucht der ClassLoader alle Namespaces in dem er jeden als "Prefix" davor setzt:

    Ein
    PHP-Code:
    $zap = new \Bar\Zap(); 
    bewirkt im Class Loader also folgendes verhalten:
    Code:
    ClassLoader::load($class = 'Bar\Zap');
    - Prüfe ob $class in der Klassenliste zu finden ist -> Nein
    - Gehe über jeden registrierten Namespaces [MyClassName, Foo, Contao]:
      - Suche nach der Klasse 'MyClassName\\' . $class (= 'MyClassName\Bar\Zap')
        -> ClassLoader::loadClassWithoutSearch('MyClassName\\' . $class) -> nicht gefunden
      - Suche nach der Klasse 'Foo\\' . $class (= 'Foo\Bar\Zap')
        -> ClassLoader::loadClassWithoutSearch('Foo\\' . $class) -> gefunden
          -> Lade Klasse 'Foo\\' . $class und erstelle einen Alias von $class => 'Foo\\' . $class
    D.h. es ist völlig normal, dass bei einem >=2 stufigen Namespace die Klasse unter ihrem Namen nicht zu finden ist, sondern nur unter A) ihrem absoluten Namen (vollständiger Namespace) oder B) ihrem gekürztem Namen (Namespace ohne 1. Komponente).
    Eine Klasse mit einem 1 stufigen Namespace ist demnach direkt unter ihrem Namen zu finden, z.B. Contao\Input ist als Input verfügbar.

    3. Model-Klassen müssen im Root-NS verfügbar sein

    Model's sind aktuell noch ein bisschen Problematisch, denn C3 versucht den Namen der Klasse zu erraten, das funktioniert aber nur ohne Namespaces. Dazu gibt es auch ein Ticket von mir: https://github.com/contao/core/pull/4796
    Aktuell wird, wie bereits erwähnt, der Klassenname von der Tabelle abgeleitet. Dabei wird das tl_ abgeschnitten und der Tabellenname im PascalCase (CamelCase mit großem Anfangsbuchstaben) neu zusammen gesetzt. Zum Schluss wird noch Model angehängt.

    Dabei wird aus tl_ich_bin_eine_tabelle die Klasse IchBinEineTabelleModel.
    Das Problem ist, dass dabei der Namespace "verloren" geht. Es können also nur Klassen, ohne Namespace oder mit einem 1-elementigen registrierten Namespace (s.o.) verwendet werden.

    Dieses Problem tritt übrigens nur beim Abfragen von Datensätzen auf. Wenn man ein Model zum erstellen verwendet, erzeugt man es ja selbst. Fragt man allerdings Datensätze ab, versucht der QueryBuilder bzw. die Collection den Klassennamen zu erraten und das führt dann zu oben genannten Problem.


    Ich hoffe ich konnte soweit aufklären.

    MfG Tristan

  13. #13
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.514
    User beschenken
    Wunschliste

    Standard

    Danke Dir für die Erklärung.
    Zum Teil scheint es aber doch zu gehen bei den Models, mein Beispiel oben funktioniert bei mir, wobei ich wie gesagt das nur durchreiche (findByPK)

    Hab mich mit Models noch nicht so intensiv beschäftigt, erst diese Woche in Planung :-)
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

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
  •