Ergebnis 1 bis 13 von 13

Thema: Problem mit findBy, contao vermisst eine Klasse die es gar nicht gibt

  1. #1
    Contao-Nutzer
    Registriert seit
    06.08.2010.
    Beiträge
    72

    Standard Problem mit findBy, contao vermisst eine Klasse die es gar nicht gibt

    Hallo, ich super per findBy Werte aus der Datenbank. Das Model aussenrum sieht so aus:

    PHP-Code:
    class VideoModel extends \Model
    {

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

        
    /**
         * Count published videos items by their parent ID
         *
         * @param array   $arrPids     An array of videos archive IDs
         * @param boolean $blnFeatured If true, return only featured videos, if false, return only unfeatured videos
         * @param array   $arrOptions  An optional options array
         *
         * @return integer The number of videos items
         */
        
    public static function countPublishedByPageId($pageId$blnFeatured=null, array $arrOptions=array())
        {
            if (empty(
    $pageId))    return 0;


            
    $t = static::$strTable;
            
    $arrColumns = array("$t.jumpTo = ?");

            if (
    $blnFeatured === true)
            {
                
    $arrColumns[] = "$t.featured='1'";
            }
            elseif (
    $blnFeatured === false)
            {
                
    $arrColumns[] = "$t.featured=''";
            }

            if (!
    BE_USER_LOGGED_IN)
            {
                
    $time = \Date::floorToMinute();
                
    $arrColumns[] = "($t.start='' OR $t.start<='$time') AND ($t.stop='' OR $t.stop>'" . ($time 60) . "') AND $t.published='1'";
            }

            return static::
    countBy($arrColumns$pageId$arrOptions);
        }

        
    /**
         * Find published videos items by page ID
         *
         * @param integer $intId      The videos archive ID
         * @param integer $intLimit   An optional limit
         * @param array   $arrOptions An optional options array
         *
         * @return \Model\Collection|\videoModel|null A collection of models or null if there are no videos
         */
        
    public static function findPublishedByPageId($pageId$blnFeatured=null$intLimit=0$intOffset=0, array $arrOptions=array())
        {
            
    $t = static::$strTable;
            if(empty(
    $pageId)) return false;

            
    $arrColumns = array("$t.jumpTo = ?");
            if (!
    BE_USER_LOGGED_IN)
            {
                
    $time = \Date::floorToMinute();
                
    $arrColumns[] = "($t.start='' OR $t.start<='$time') AND ($t.stop='' OR $t.stop>'" . ($time 60) . "') AND $t.published='1'";
            }

            if (
    $intLimit 0)
            {
                
    $arrOptions['limit'] = $intLimit;
            }
            if(
    $intOffset 0)
            {
                
    $arrOptions['offset'] = $intOffset;
            }

            return static::
    findBy($arrColumns$pageId$arrOptions);
        }

    Das countBy in der countPublishedByPageId() funktioniert. Das findBy gibt die Fehlermeldung, genauso findAll
    HTML-Code:
    Fatal error: Class 'VideosModel' not found in ***system/modules/core/library/Contao/Model/Collection.php on line 141
    Das seltsame ist: Die Klasse VideosModel gibt es gar nicht! Die kommt auch nirgendwo vor, die Klasse heisst VideoModel (ohne s). Ich hab schon per SSH nach grep 'VideosModel' * -R gesucht, aber nur das Error Log gefunden.

    Contao 3.5.4

    Hat jemand eine Idee wo ich noch suchen kann?? DANKE

  2. #2
    Contao-Urgestein Avatar von the_scrat
    Registriert seit
    24.02.2010.
    Ort
    Augsburg
    Beiträge
    2.051
    User beschenken
    Wunschliste

    Standard

    Schau mal in der autoload.php ob dort evtl. das "s" zuviel drin steht.
    Ansonsten wirst du wohl irgendwo VideosModel angegeben haben
    Programmers don't comment their code. It was hard to write, it should be hard to understand...

  3. #3
    Contao-Nutzer
    Registriert seit
    06.08.2010.
    Beiträge
    72

    Standard

    Nein, in der autoload.php steht es richtig...
    Mit grep sollte ich das dann aber doch finden - aber Nein, leider nicht
    Legt PHP von sowas einen cache an? Die klasse war mal so benannt, jetzt aber nicht mehr...

  4. #4
    Contao-Urgestein Avatar von the_scrat
    Registriert seit
    24.02.2010.
    Ort
    Augsburg
    Beiträge
    2.051
    User beschenken
    Wunschliste

    Standard

    Ja, Cache gibt es auch. Geh über die Systemwartung und lösche dort den Cache. Danach sollte das Problem nicht mehr auftauchen.
    Programmers don't comment their code. It was hard to write, it should be hard to understand...

  5. #5
    Contao-Nutzer
    Registriert seit
    06.08.2010.
    Beiträge
    72

    Standard

    Nein, das war es auch nicht.. ich hab jetzt einfach meine Klasse umbenannt in VideosModel .. keine Lust auf suchen.
    Trotzdem Danke!

  6. #6
    Contao-Urgestein Avatar von cliffparnitzky
    Registriert seit
    08.10.2010.
    Ort
    Lüneburg
    Beiträge
    2.452
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Moin,
    das ist meines Wissen nach eine Art Konvention in Contao:

    Das Model heißt immer wie die zugehörige Tabelle ohne "tl_" und mit erstem Buchstaben Uppercase.

    Also: tl_videos -> VideosModel .... oder .... tl_video -> VideoModel

    Gruß, Cliff

  7. #7
    Contao-Nutzer
    Registriert seit
    06.08.2010.
    Beiträge
    72

    Standard

    Hallo Cliff,

    ok, wieder was gelernt ... Und ich hab schon gedacht es geht zu ende mit mir
    Danke für die Erleuchtung!

  8. #8
    Contao-Urgestein Avatar von the_scrat
    Registriert seit
    24.02.2010.
    Ort
    Augsburg
    Beiträge
    2.051
    User beschenken
    Wunschliste

    Standard

    @cliffen bist du dir da sicher? Ich hab zwar jetzt nichts gegenteiliges gefunden, aber demnach müsste ja für jedes DCA für die es garkein Model gibt, auch eine Fehlermeldung erscheinen, da ja dann auch diese Klasse nicht gefunden wurde.

    Wäre mal wirklich interessant.
    Programmers don't comment their code. It was hard to write, it should be hard to understand...

  9. #9
    Contao-Nutzer
    Registriert seit
    06.08.2010.
    Beiträge
    72

    Standard

    @the_scrat: Wenn es kein Model gibt passiert vermutlich einfach nichts...

  10. #10
    Contao-Urgestein Avatar von the_scrat
    Registriert seit
    24.02.2010.
    Ort
    Augsburg
    Beiträge
    2.051
    User beschenken
    Wunschliste

    Standard

    Aber das macht überhaupt keinen Sinn, dann bräuchte ich Models ja auch nicht im autoloader "registrieren" da ja per konversion nach ihnen gesucht wird..... bin mir da selbst nicht sicher. Ich habs glücklicherweise immer richtig gemacht bei meinen Models die ich im Einsatz habe.
    Programmers don't comment their code. It was hard to write, it should be hard to understand...

  11. #11
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.947

    Standard

    Zitat Zitat von the_scrat Beitrag anzeigen
    Aber das macht überhaupt keinen Sinn, dann bräuchte ich Models ja auch nicht im autoloader "registrieren" da ja per konversion nach ihnen gesucht wird.
    Wieso? Per Konvention weiß ich, wie die Klasse heißen muss und in der autoload steht ich, wie ich sie finden kann.

    In system/modules/core/library/Contao/Model.php findest Du

    PHP-Code:
    public static function getClassFromTable($strTable) { ... } 

  12. #12
    Contao-Urgestein Avatar von the_scrat
    Registriert seit
    24.02.2010.
    Ort
    Augsburg
    Beiträge
    2.051
    User beschenken
    Wunschliste

    Standard

    Ok, das scheint wohl tatsächlich häufiger im Einsatz zu sein als ich vermutet habe.

    Ich bin davon ausgegangen, dass wie bei einer Klasse alle Informationen bereits in der autoload stehen und damit "Gesetz" sind.

    Das bedeutet also, dass bei regulären Klasse sowas funktioniert
    PHP-Code:
    'Klassenname'              => 'system/modules/pfad/classes/Dateiname.php',

    // 
    class Klassenname extends .. 
    Und sowas nicht:

    PHP-Code:
    'MeinModel'              => 'system/modules/pfad/model/Modelname.php',

    // 
    $strTable 'tl_tabelle_name' 
    Weil hier, obwohl MeinModel definiert wurde, Contao auf jeden Fall tabelleNameModel suchen wird? weil $strTable so heißt. Ich werd das bei Zeiten mal testen. Trotzdem gut zu wissen :-)
    Finde es übrigens gut, wenn alles sauber benannt ist, mir gehts mehr um "was muss man machen" und "was kann man machen" :-)
    Programmers don't comment their code. It was hard to write, it should be hard to understand...

  13. #13
    Contao-Urgestein
    Registriert seit
    29.10.2009.
    Ort
    Magdeburg
    Beiträge
    2.020
    Partner-ID
    626
    User beschenken
    Wunschliste

    Standard

    Das Autoloading und der Modelname sind ja zwei unterschiedliche Dinge. Das erste teilt dem System mit, wo eine Klasse gespeichert ist. Letzteres weißt einen Tabellennamen eine Klasse zu. Dabei geht Contao folgendermaßen vor:

    1. Überprüfen ob Model-Klasse unter $GLOBALS['TL_MODELS']['tl_table_name'] = 'My\TableModelClass'; existiert. Hier gibt es Keine Namenskonventionen.
    2. Ist ersteres nicht der Fall, wird ein Standardname wie hier bereits im Thread beschrieben aus den Tabellennamen generiert.


    Ach ja, Contao hat eigentlich eine sehr brauchbare Doku dank vielen großartigen freiwilligen Helfern, wo dies auch beschrieben ist:
    https://docs.contao.org/books/cookbook/de/Models.html

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
  •