Ergebnis 1 bis 9 von 9

Thema: Das nutzen von Namespaces

  1. #1
    Contao-Nutzer
    Registriert seit
    23.01.2011.
    Beiträge
    35

    Standard Das nutzen von Namespaces

    Ich habe versucht mit namespaces zu arbeiten weil ich verstehen wollte wie ich die Core Functionalität anpassen kan. Ich hatte gedacht meine eigene Erweiterung zu erstellen innerhalb sein eigene Namespace. Alles aus diese Namespace wurde die geänderten Klassen verwenden ohne das restlige von Contao zu ändern.

    Um dies zu testen habe ich eine kurze Erweiterung geschrieben, die ich unten hinzugefügt habe. Das Ergebnis ist nicht wie erwartet, das ganse Contao verwendet jetzt meine Änderungen an der Controller Klasse, auch die Module im Contao-Namespace. Vielleicht ist es genau so wie es funktionieren soll, aber so weit ich verstehe muss der Code nur in sein eigenen Namespace gucken (wenn nicht angegeben, wo er sonst gucken soll. http://php.net/manual/en/language.namespaces.basics.php).

    Kann jemand sich meinem Code anschauen und mir sagen, was ich falsch gemacht habe?

    I have been trying to get the namespaces to work in order to understand how I can alter core functionality. I had thought I would create my extension within its own namespace. Everything within that namespace would use the altered classes, leaving the rest of Contao unaltered (using the original core classes).

    To test this I wrote a short extension which I included the code of below. The result is not as expected; all Contao code now uses my alterations to the Controller class, even the Modules in the Contao namespace. Perhaps this is exactly the way it is supposed to work, but for as far as I understand namespacing the code is supposed to look only within it's own namespace if not specified where else to look (http://php.net/manual/en/language.namespaces.basics.php).

    Can someone look at my code and tell me where I might have gone wrong here?

    mymodule/classes/Controller.php
    Code:
    namespace MyModule;
    
    abstract class Controller extends \Contao\Controller
    {
    	// ... custom changes ...
    }
    mymodule/config/autoload.ini
    mymodule/config/autoload.php
    >> both generated

    mymodule/config/config.php
    Code:
    $GLOBALS['FE_MOD']['navigationMenu']['navigationroot'] = 'ModuleNavigationRoot';
    mymodule/dca/tl_module.php
    Code:
    $GLOBALS['TL_DCA']['tl_module']['palettes']['navigationroot'] = $GLOBALS['TL_DCA']['tl_module']['palettes']['navigation'];
    mymodule/modules/ModuleNavigationRoot.php
    Code:
    namespace MyModule;
    
    class ModuleNavigationRoot extends \Contao\ModuleNavigation 
    {
    }

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

    Standard

    Kannst du die generierte autoload.php/.ini bitte posten.

    Please post the contents of the generated autoload.php and .ini files.

  3. #3
    Contao-Nutzer
    Registriert seit
    23.01.2011.
    Beiträge
    35

    Standard

    Aber natürlich (Ich habe die Kommentare entfernt);

    mymodule/config/autoload.ini
    Code:
    register_namespaces = true
    register_classes    = true
    register_templates  = true
    mymodule/config/autoload.php
    Code:
    ClassLoader::addNamespaces(array
    (
    	'MyModule',
    ));
    
    ClassLoader::addClasses(array
    (
    	'MyModule\Controller'           => 'system/modules/mymodule/classes/Controller.php',
    	'MyModule\ModuleNavigationRoot' => 'system/modules/mymodule/modules/ModuleNavigationRoot.php',
    ));

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

    Standard

    Ach Moment, jetzt weiß ich glaube ich was dein Problem ist.
    Dein Problem ist nicht, dass das "Überschreiben" nicht funktioniert, sondern dass es so ist.

    In Contao 3 ist es so, dass du die Core Klassen überschreiben kannst, was bei dir passiert ist.
    Um es kurz zu machen, verwende keine Klassennamen die gleich den Core Klassen sind (also Controller oder ModuleNavigationRoot)
    oder verwende einen Namespace mit mehreren Komponenten, z.B. Ruud\MyModule.

    Zum Thema Contao 3 Autoloader habe ich bereits mehrere Screencasts und Vorträge gemacht.
    http://www.youtube.com/watch?v=WeN5a...pPxOnt&index=1
    http://www.youtube.com/watch?v=sgiFn...pPxOnt&index=2
    http://www.youtube.com/watch?v=qElrI...6388F4&index=1

  5. #5
    Contao-Nutzer
    Registriert seit
    03.05.2012.
    Beiträge
    12

    Standard

    Ja tril hat absolut recht. Contao ermöglicht es dem Entwickler durch die Namespaces Corefunktionalitäten ohne großen Aufwand zu ersetzen. Ein fantastisches Feature. Letztlich passiert ja genau das was Du wolltest Ruud: Contao läd anstatt der abstrakten eigenen Controller Klasse - die Klasse aus Deinem Namespace. Was hättest Du Dir denn sonst als Ergebnis erwartet?

    Yes, tril is absolutely right. Contao gives an developer the opportunity to replace core functionality via namespaces with no huge effort. A fantastic feature. Finally everything happens as you desired it Ruud: contao loads your abstract class from your namespace instead of the core class. What result would you have expected?

    Liebe Grüße
    Daniel

  6. #6
    Contao-Nutzer
    Registriert seit
    23.01.2011.
    Beiträge
    35

    Standard

    Ich verstehe nicht, warum ich eine Contao core Klasse innerhalb meiner eigenen Namespace außer Kraft setzen kann, der dann gilt für das gesamte System. Wäre das nicht, dass zwei Erweiterungen widersprüchliche Änderungen an den Kern Verhalten machen können?

    Was ich erwartet hatte war, dass meine veränderte Controller Klasse (\MyModule\Controller.php) nur gilt innerhalb der \MyModule\ Namespace Code.

    Kann ich Änderungen machen die nur für meine Namespace gelten?

    I don't understand why I can override a Contao core class within my own namespace that then applies to the entire system. Wouldn't this mean that two extensions can make conflicting changes to the core behavior?

    What I had expected is that my changed controller class (\MyModule\Controller.php) only applies to code within \MyModule\.

    Can I make changes that only apply to my namespace?

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

    Standard

    Zitat Zitat von Ruud Beitrag anzeigen
    Was ich erwartet hatte war, dass meine veränderte Controller Klasse (\MyModule\Controller.php) nur gilt innerhalb der \MyModule\ Namespace Code.
    Kann ich Änderungen machen die nur für meine Namespace gelten?
    Ja, wie schon geschrieben:
    oder verwende einen Namespace mit mehreren Komponenten, z.B. Ruud\MyModule.
    Schau dir das erste Video an, da ist das erklärt wenn ich mich recht erinnere.
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

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

    Standard

    Zitat Zitat von Ruud Beitrag anzeigen
    Ich verstehe nicht, warum ich eine Contao core Klasse innerhalb meiner eigenen Namespace außer Kraft setzen kann
    It's not a bug, it's a feature (really!)


    Du kannst auch das registrieren der Namespaces in Contao deaktivieren, dafür änderst du in der autoload.ini den Eintrag register_namespaces = true entsprechend auf false ab und generierst die autoload Datei neu.

    It is also possible to disable namespace registration in Contao. Change the setting register_namespaces = true to register_namespaces = false and regenerate the autoload files.

  9. #9
    Contao-Nutzer
    Registriert seit
    23.01.2011.
    Beiträge
    35

    Standard

    Ich werde die Videos mahl ansehen. Aber sie sind in Deutsch, so dann muss ich wach sein. Deswegen hab ich die noch nicht geguckt.

    I'm going to watch the videos. But they are in German, so I have to be awake while watching.

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
  •