W)

Webclients

Dieser Abschnitt ist wirklich veraltet. Er wird irgendwann aktualisiert werden, aber in der Zwischenzeit wird es wahrscheinlich frustrierend sein, diesem Tutorial zu folgen, da es vor langer Zeit geschrieben wurde. Dieser Leitfaden befasst sich mit der Erstellung von Modulen für den Web-Client von Odoo. Um Websites mit Odoo zu erstellen, siehe Erstellen einer Website; um Geschäftsfunktionen hinzuzufügen oder bestehende Geschäftssysteme von Odoo zu erweitern, siehe Erstellen eines Moduls. Dieser Leitfaden setzt Kenntnisse in folgenden Bereichen voraus:Javascript-Grundlagen und gute Praktiken jQuery Underscore.js. Es erfordert außerdem ein installiertes Odoo und Git.

Webseiten erstellen

Erstellen eines Basismoduls

In Odoo werden Aufgaben durch die Erstellung von Modulen ausgeführt.

Module passen das Verhalten einer Odoo-Installation an, indem sie entweder neue Verhaltensweisen hinzufügen oder bestehende ändern (einschließlich der Verhaltensweisen, die von anderen Modulen hinzugefügt wurden).

Das Gerüst von Odoo kann ein Basismodul einrichten. Für einen schnellen Start genügt ein einfacher Aufruf:

$ ./odoo-bin Gerüst Academy my-modules

Dadurch wird automatisch ein my-modules-Modulverzeichnis mit einem darin enthaltenen Akademie-Modul erstellt. Das Verzeichnis kann ein bestehendes Modulverzeichnis sein, wenn Sie möchten, aber der Modulname muss innerhalb des Verzeichnisses eindeutig sein.

Ein Demonstrationsmodul

Wir haben ein "komplettes" Modul zur Installation bereit.

Obwohl es absolut nichts tut, können wir es installieren:

- den Odoo-Server starten

$ ./odoo-bin --addons-pfad-addons-addons,my-modules

- gehen Sie zu http://localhost:8069

- eine neue Datenbank mit Demonstrationsdaten erstellen

- zu den Einstellungen ‣ Module ‣ Module

- in der rechten oberen Ecke entfernen Sie den installierten Filter und suchen Sie nach academy

- Klicken Sie auf die Schaltfläche Installieren für das Akademie-Modul

Vorlagen

Das Generieren von HTML in Python ist nicht sehr angenehm.

Die übliche Lösung sind Templates, Pseudo-Dokumente mit Platzhaltern und Anzeigelogik. Odoo erlaubt jedes Python-Templating-System, stellt aber ein eigenes QWeb-Templating-System zur Verfügung, das sich mit anderen Funktionen integrieren lässt. Erstellen Sie eine Vorlage und stellen Sie sicher, dass die Vorlagendatei im Manifest __manifest__.py registriert ist, und ändern Sie den Controller so, dass er unsere Vorlage verwendet.

Speichern von Daten in Odoo

Odoo-Modelle werden auf Datenbanktabellen abgebildet.

Im vorigen Abschnitt haben wir gerade eine Liste von Zeichenketten angezeigt, die statisch in den Python-Code eingegeben wurden. Dies erlaubt keine Änderungen oder persistente Speicherung, so dass wir unsere Daten nun in die Datenbank verschieben.

Warnung

der Administrator-Benutzer die Zugriffskontrolle umgeht, hat er Zugriff auf alle Modelle, auch wenn ihm kein Zugriff gewährt wird.

Daten zur Demonstration

Der zweite Schritt besteht darin, dem System einige Demonstrationsdaten hinzuzufügen, damit es leicht getestet werden kann. Dies geschieht durch Hinzufügen einer Demo-Datendatei, die vom Manifest aus verlinkt werden muss:

Datendateien können für Demo- und Nicht-Demodemodaten verwendet werden. Demo-Daten werden nur im "Demonstrationsmodus" geladen und können für Flusstests und Demonstrationen verwendet werden, Nicht-Demo-Daten werden immer geladen und als anfängliche Systemeinrichtung verwendet.

In diesem Fall verwenden wir Demonstrationsdaten, weil ein tatsächlicher Benutzer des Systems seine eigene Lehrerliste eingeben oder importieren möchte; diese Liste ist nur zum Testen nützlich.

Zugriff auf die Daten

Der letzte Schritt besteht darin, Modell und Vorlage so zu ändern, dass unsere Demonstrationsdaten verwendet werden können:

1. Holen Sie die Datensätze aus der Datenbank, anstatt eine statische Liste zu haben

2. Da search() einen Satz von Datensätzen zurückgibt, die dem Filter entsprechen ("alle Datensätze" hier), ändern Sie die Vorlage so, dass der Name jedes Lehrers gedruckt wird

Starten Sie den Server neu und aktualisieren Sie das Modul (um das Manifest und die Vorlagen zu aktualisieren und die Demo-Datei zu laden) und navigieren Sie dann zu http://localhost:8069/academy/academy/. Die Seite sollte etwas anders aussehen: den Namen sollte einfach eine Nummer vorangestellt werden (die Datenbank-Kennung für den Lehrer).

Unterstützung der Website

Odoo bündelt ein Modul, das der Erstellung von Websites gewidmet ist.

Bisher haben wir Controller ziemlich direkt verwendet, aber Odoo 8 hat eine tiefere Integration und einige andere Dienste (z.B. Standard-Styling, Themes) über das Website-Modul hinzugefügt.

1. erstens, Website als Abhängigkeit zur Akademie hinzufügen

2. fügen Sie dann das Flag website=True auf dem Controller hinzu, dies richtet einige neue Variablen auf dem Anfrageobjekt ein und ermöglicht die Verwendung des Website-Layouts in unserer Vorlage

3. das Website-Layout in der Vorlage verwenden

Das Website-Layout bietet auch Unterstützung für Bearbeitungstools: Klicken Sie auf Anmelden (oben rechts), geben Sie die Anmeldedaten ein (standardmäßig admin / admin) und klicken Sie dann auf Anmelden.

Sie befinden sich nun in Odoo "richtig": die administrative Schnittstelle. Klicken Sie vorerst auf den Menüpunkt Website (oben links).

Wir sind wieder auf der Website, aber als Administrator, mit Zugriff auf erweiterte Bearbeitungsfunktionen, die vom Website-Support zur Verfügung gestellt werden:

- einen Vorlagencode-Editor (HTML-Editor ‣ anpassen), in dem Sie alle für die aktuelle Seite verwendeten Vorlagen sehen und bearbeiten können

- die Schaltfläche "Bearbeiten" oben links wechselt in den "Bearbeitungsmodus", in dem Blöcke (Snippets) und Rich-Text-Bearbeitung verfügbar sind

- eine Reihe anderer Funktionen wie mobile Vorschau oder SEO

URLs und Weiterleitung

Controller-Methoden sind mit Routen über den route()-Dekorator verbunden, der einen Routing-String und eine Reihe von Attributen benötigt, um sein Verhalten oder seine Sicherheit anzupassen.

Wir haben einen "wörtlichen" Routing-String gesehen, der exakt einem URL-Abschnitt entspricht, aber Routing-Strings können auch Konverter-Muster verwenden, die Bits von URLs entsprechen und diese als lokale Variablen verfügbar machen. Wir können zum Beispiel eine neue Controller-Methode erstellen, die ein Bit einer URL nimmt und ausgibt:

Starten Sie Odoo neu und aktualisieren Sie das Modul, dann können Sie die Seite jedes Lehrers besuchen. Versuchen Sie als Übung, Blöcke zu einer Lehrerseite hinzuzufügen, um eine Biographie zu schreiben, dann gehen Sie zu einer anderen Lehrerseite und so weiter. Sie werden feststellen, dass Ihre Biographie von allen LehrerInnen gemeinsam genutzt wird, da Blöcke zur Vorlage hinzugefügt werden, und die Biographie-Vorlage von allen LehrerInnen gemeinsam genutzt wird, wenn eine Seite bearbeitet wird, werden sie alle gleichzeitig bearbeitet.

Feldbearbeitung

Daten, die spezifisch für einen Datensatz sind, sollten in diesem Datensatz gespeichert werden, also lassen Sie uns unseren Lehrern ein neues Biographie-Feld hinzufügen:

Für Datensatzfelder können Vorlagen eine spezielle T-Feld-Richtlinie verwenden, die es erlaubt, den Feldinhalt von der Website aus über feldspezifische Schnittstellen zu bearbeiten. Ändern Sie die Personenvorlage, um t-field zu verwenden:

Webseite support

Odoo bündelt ein Modul für die Erstellung von Websites. Bisher haben wir Controller ziemlich direkt verwendet, aber Odoo 8 hat eine tiefere Integration und einige andere Dienste (z.B. Standard-Styling, Themes) über das Website-Modul hinzugefügt. Zuerst fügen Sie die Website als Abhängigkeit zu academy hinzu, dann fügen Sie das Flag website=True auf dem Controller hinzu. Dadurch werden einige neue Variablen auf dem Anfrage-Objekt eingerichtet und die Verwendung des Website-Layouts in unserer Vorlage ermöglicht - verwenden Sie das Website-Layout in der VorlageDas Website-Layout bietet auch Unterstützung für Bearbeitungstools: Klicken Sie auf Anmelden (oben rechts), geben Sie die Anmeldedaten ein (admin / admin standardmäßig) und klicken Sie dann auf Anmelden. Wir sind zurück auf der Website, aber als Administrator, mit Zugriff auf erweiterte Bearbeitungsfunktionen, die von der Website-Unterstützung zur Verfügung gestellt werden:ein Vorlagencode-Editor (HTML-Editor ‣ anpassen), in dem Sie alle für die aktuelle Seite verwendeten Vorlagen sehen und bearbeiten können,die Schaltfläche Bearbeiten oben links wechselt in den "Bearbeitungsmodus", in dem Blöcke (Snippets) und Rich-Text-Bearbeitung verfügbar sind,eine Reihe anderer Funktionen wie mobile Vorschau oder SEO.

Starten Sie Odoo neu und aktualisieren Sie das Modul, es gibt jetzt einen Platzhalter unter dem Namen des Lehrers und eine neue Zone für Blöcke im Bearbeitungsmodus. Inhalte, die dort abgelegt werden, werden im entsprechenden Feld für die Biografie des Lehrers gespeichert und sind somit spezifisch für diesen Lehrer.

Der Name des Lehrers ist ebenfalls editierbar, und beim Speichern ist die Änderung auf der Indexseite sichtbar. Das t-Feld kann auch Formatierungsoptionen aufnehmen, die vom genauen Feld abhängen. Wenn wir zum Beispiel das Änderungsdatum für den Datensatz eines Lehrers anzeigen.

WebServices

Das Web-Service-Modul bietet eine gemeinsame Schnittstelle für alle Web-Services: XML-RPC, JSON-RPC. Business-Objekte können auch über den Mechanismus für verteilte Objekte angesprochen werden. Auf Odoo kann über XML-RPC/JSON-RPC-Schnittstellen zugegriffen werden, für die es Bibliotheken in vielen Sprachen gibt.

Widgets-Grundlagen

Der Odoo-Webclient bündelt jQuery zur einfachen DOM-Manipulation. Er ist nützlich und bietet eine bessere API als das Standard W3C DOM2, reicht aber nicht aus, um komplexe Anwendungen zu strukturieren, die zu schwieriger Wartung führen.Ähnlich wie objektorientierte Desktop-UI-Toolkits (z.B. Qt, Cocoa oder GTK) macht Odoo Web bestimmte Komponenten für Abschnitte einer Seite verantwortlich. In Odoo Web ist die Basis für solche Komponenten die Widget()-Klasse, eine Komponente, die auf die Handhabung eines Seitenabschnitts und die Anzeige von Informationen für den Benutzer spezialisiert ist.

Widgets

Das erste Demonstrationsmodul stellt bereits ein Basis-Widget zur Verfügung. Es erweitert Widget() und setzt die Standardmethode start() außer Kraft, die - ähnlich wie die vorherige MyClass - vorerst wenig bewirkt.registriert unser Basis-Widget als Client-Aktion. Die Client-Aktionen werden später erläutert, denn im Moment ist dies genau das, was es ermöglicht, unser Widget aufzurufen und anzuzeigen, wenn wir das Menü Pet Store ‣ Pet Store ‣ Home Page auswählen.Da das Widget von außerhalb unseres Moduls aufgerufen wird, benötigt der Web-Client seinen "voll qualifizierten" Namen, nicht die lokale Version.display ContentWidgets haben eine Reihe von Methoden und Funktionen, aber die Grundlagen sind einfach:

- ein Widget einrichten

- die Daten des Widgets formatieren

- das Widget anzeigen.

Das Home-Page-Widget hat bereits eine start()-Methode. Diese Methode ist Teil des normalen Widget-Lebenszyklus und wird automatisch aufgerufen, sobald das Widget in die Seite eingefügt wird. Alle Widgets haben einen $el, der den Abschnitt der Seite darstellt, für den sie zuständig sind (als jQuery-Objekt). Der Inhalt des Widgets sollte dort eingefügt werden. Standardmäßig ist $el ein leeres <div>-Element. Ein <div>-Element ist normalerweise für den Benutzer unsichtbar, wenn es keinen Inhalt hat (oder ohne spezifische Stile, die ihm eine Größe geben), weshalb beim Start von HomePage nichts auf der Seite angezeigt wird. Diese Meldung erscheint nun, wenn Sie Pet Store ‣ Pet Store ‣ Home Page öffnen, um den in Odoo Web geladenen Javascript-Code zu aktualisieren, müssen Sie die Seite neu laden. Ein Neustart des Odoo-Servers ist nicht erforderlich. Das HomePage-Widget wird von Odoo Web verwendet und automatisch verwaltet. Um zu lernen, wie man ein Widget "von Grund auf" benutzt, erstellen wir ein neues Widget: HomePage fügt zuerst seinen eigenen Inhalt zum DOM-Stamm hinzu - HomePage instanziiert dann das GreetingsWidget - Schließlich teilt es dem GreetingsWidget mit, wo es sich einfügen soll, und delegiert einen Teil seines $el an das GreetingsWidget.Wenn die appendTo()-Methode aufgerufen wird, bittet es das Widget, sich an der angegebenen Position einzufügen und seinen Inhalt anzuzeigen. Die start()-Methode wird während des Aufrufs von appendTo() aufgerufen. Um zu sehen, was unter der angezeigten Schnittstelle geschieht, verwenden wir den DOM-Explorer des Browsers. Aber zuerst wollen wir unsere Widgets etwas verändern, damit wir leichter herausfinden können, wo sie sich befinden, indem wir eine Klasse zu ihren Wurzelelementen hinzufügen: Was deutlich die beiden <div>-Elemente zeigt, die automatisch von Widget() erzeugt werden, da wir einige Klassen auf ihnen hinzugefügt haben. Wir können auch die beiden Message-holding divs sehen, die wir selbst hinzugefügt haben.

Widget Eltern und Kinder

Im vorherigen Teil haben wir ein Widget mit folgender Syntax instanziiert: new local.greetingsWidget(this); Das erste Argument ist dieses, das in diesem Fall eine HomePage-Instanz war. Wie wir gesehen haben, werden Widgets normalerweise von einem anderen Widget in das DOM und in das Wurzelelement dieses anderen Widgets eingefügt. Das bedeutet, dass die meisten Widgets "Teil" eines anderen Widgets sind und im Namen dieses anderen Widgets existieren. Aus mehreren technischen und konzeptionellen Gründen ist es notwendig, dass ein Widget weiß, wer sein Elternteil und wer seine Kinder sind.Wenn ein Widget schließlich kein Elternteil hat (z.B. weil es das Root-Widget der Anwendung ist), kann null als parent:new local.GreetingsWidget(null); Destroying Widgets bereitgestellt werdenWenn Sie Ihren Benutzern Inhalte anzeigen können, sollten Sie auch in der Lage sein, diese zu löschen. Dies geschieht über die destroy()-Methode: greeting.destroy(); Wenn ein Widget zerstört wird, ruft es zuerst destroy() für alle seine Kinder auf. Dann löscht es sich selbst aus dem DOM. Wenn Sie permanente Strukturen in init() oder start() eingerichtet haben, die explizit bereinigt werden müssen (weil der Garbage Collector sie nicht behandeln wird), können Sie destroy() außer Kraft setzen.

Widget HelpersWidget's jQuery Selector

SelectorSelecting DOM-Elemente innerhalb eines Widgets kann durch Aufruf der find()-Methode an der DOM-Root des Widgets durchgeführt werden: Die globale jQuery-Funktion $() sollte nie verwendet werden, es sei denn, es ist absolut notwendig: Auswahlen an der Root eines Widgets sind auf das Widget beschränkt und lokal auf das Widget, aber Auswahlen mit $() sind global für die Seite/Anwendung und können mit Teilen anderer Widgets und Views übereinstimmen, was zu seltsamen oder gefährlichen Nebenwirkungen führen kann. Da ein Widget im Allgemeinen nur auf den DOM-Abschnitt wirken sollte, der ihm gehört, gibt es keinen Grund für eine globale Auswahl.

Widget-Ereignisse und Eigenschaften

Ereignis-Widgets bieten ein Ereignissystem (getrennt vom oben beschriebenen DOM/jQuery-Ereignissystem): Ein Widget kann Ereignisse auf sich selbst abfeuern, und andere Widgets (oder sich selbst) können sich selbst binden und auf diese Ereignisse warten:Dieses Widget fungiert als Fassade, die Benutzereingaben (durch DOM-Ereignisse) in ein dokumentierbares internes Ereignis umwandelt, an das sich übergeordnete Widgets binden können. trigger() nimmt den Namen des auszulösenden Ereignisses als erstes (obligatorisches) Argument, alle weiteren Argumente werden als Ereignisdaten behandelt und direkt an die Zuhörer weitergegeben. Wir können dann ein übergeordnetes Ereignis einrichten, indem wir unser generisches Widget instanziieren und mit on():on() eine Funktion binden, die aufgerufen wird, wenn das durch event_name identifizierte Ereignis ist. Das func-Argument ist die aufzurufende Funktion, und object ist das Objekt, auf das sich diese Funktion bezieht, wenn es sich um eine Methode handelt. Die gebundene Funktion wird mit den zusätzlichen Argumenten von trigger() aufgerufen, falls sie welche hat. Beispiel: Das Auslösen von Ereignissen auf einem anderen Widget ist im Allgemeinen eine schlechte Idee. Die wichtigste Ausnahme von dieser Regel ist odoo.web.bus, das speziell für die Übertragung von Ereignissen existiert, an denen jedes Widget in der gesamten Odoo-Webanwendung interessiert sein könnte.

Widget-Ereignisse und –Eigenschaften

EreignisseWidgets bieten ein Ereignissystem (getrennt vom oben beschriebenen DOM/jQuery-Ereignissystem):

Wizards

Wizards beschreiben interaktive Sitzungen mit dem Benutzer (oder Dialogfeldern) durch dynamische Formulare. Ein Assistent ist einfach ein Modell, das die Klasse TransientModel anstelle von Model erweitert. Die Klasse TransientModel erweitert die Klasse Model and reuse all ihre bestehenden Mechanismen mit folgenden Besonderheiten:

- Wizard-Datensätze sind nicht als persistent gedacht; sie werden nach einer bestimmten Zeit automatisch aus der Datenbank gelöscht. Aus diesem Grund werden sie transient genannt.

- Assistentenmodelle erfordern keine expliziten Zugriffsrechte: Benutzer haben alle Berechtigungen auf Assistentenaufzeichnungen.

- Assistentenaufzeichnungen können sich über many2one-Felder auf reguläre Aufzeichnungen oder Assistentenaufzeichnungen beziehen, aber reguläre Aufzeichnungen können sich nicht über ein many2one-Feld auf Assistentenaufzeichnungen beziehen.

Wir wollen einen Assistenten erstellen, der es Benutzern ermöglicht, Teilnehmer für eine bestimmte Sitzung oder für eine Liste von Sitzungen auf einmal zu erstellen

Wizards starten

Wizards werden durch ir.actions.act_window-Datensätze gestartet, wobei das Feld-Ziel auf den Wert neu gesetzt wird. Letzteres öffnet die Ansicht des Assistenten in einem Popup-Fenster. Es gibt eine andere Möglichkeit, den Assistenten zu starten: mit einem ir.actions.act_window-Datensatz wie oben, aber mit einem zusätzlichen Feld binding_model_id, das angibt, in welchem Kontext die Aktion verfügbar ist. Der Assistent erscheint in den kontextabhängigen Aktionen des Modells über der Hauptansicht. Wegen einiger interner Hooks im ORM wird eine solche Aktion in XML mit dem Tag act_window deklariert. Assistenten verwenden reguläre Ansichten und ihre Schaltflächen verwenden möglicherweise das Attribut special="cancel", um das Assistentenfenster ohne Speichern zu schließen.

Ein Widget kann Ereignisse auf sich selbst auslösen, und andere Widgets (oder sich selbst) können sich binden und auf diese Ereignisse hören.

Dieses Widget fungiert als Fassade und wandelt Benutzereingaben (durch DOM-Ereignisse) in ein dokumentierbares internes Ereignis um, an das sich übergeordnete Widgets binden können. trigger() nimmt den Namen des auszulösenden Ereignisses als erstes (obligatorisches) Argument, alle weiteren Argumente werden als Ereignisdaten behandelt und direkt an Listener übergeben.Wir können dann ein übergeordnetes Ereignis einrichten, das unser generisches Widget instanziiert und mit on() auf das Ereignis user_chose hört:

on() bindet eine Funktion, die aufgerufen wird, wenn das durch event_name identifizierte Ereignis eintritt. Das Argument func ist die aufzurufende Funktion und object ist das Objekt, auf das sich diese Funktion bezieht, wenn es sich um eine Methode handelt. Die gebundene Funktion wird mit den zusätzlichen Argumenten von trigger() aufgerufen, falls sie welche hat. Beispiel: Das Auslösen von Ereignissen auf einem anderen Widget ist im Allgemeinen eine schlechte Idee. Die wichtigste Ausnahme von dieser Regel ist odoo.web.bus, das speziell dafür existiert, um Ereignisse zu übertragen, an denen jedes beliebige Widget in der gesamten Odoo-Webanwendung interessiert sein könnte.

 

odoo und Webdesig

 

Wenn Sie als Webdesigner Odoo zum ersten Mal verwenden, sind Sie hier richtig. In dieser Einführung werden die Grundlagen der Erstellung von Odoo-Themen umrissen. Das Odoo-Team hat ein Framework geschaffen, das leistungsstark und einfach zu bedienen ist. Es ist nicht notwendig, spezielle Syntaxen zu kennen, um diesen Satz von Werkzeugen zu verwenden.An introduction for web designers

 

Wenn Sie als Webdesigner Odoo zum ersten Mal verwenden, sind Sie hier richtig. In dieser Einführung werden die Grundlagen der Erstellung von Odoo-Themen umrissen. Das Team von Odoo hat ein Framework geschaffen, das leistungsstark und einfach zu bedienen ist. Sie brauchen keine speziellen Syntaxen zu kennen, um diesen Werkzeugsatz zu verwenden. Von gewöhnlichen CMS bis OdooWenn Sie immer auf die gleiche Weise denken und arbeiten, werden Sie wahrscheinlich die gleichen Ergebnisse erzielen. Wenn Sie etwas völlig Neues wollen, dann probieren Sie etwas anderes aus. Wo ist meine header.php-Datei? Das ist normalerweise die erste Frage eines Webdesigners, der es gewohnt ist, mit Wordpress oder Joomla zu arbeiten und zum ersten Mal auf Odoo zu kommen.

 

In der Tat müssen Sie bei der Verwendung gängiger CMS mehrere Dateien (wie header.php, page.php, post.php usw.) codieren, um eine Grundstruktur für Ihre Website zu erstellen. Bei diesen Systemen dient diese Grundstruktur als Designgrundlage, die Sie im Laufe der Zeit aktualisieren müssen, um die Kompatibilität innerhalb Ihres CMS zu gewährleisten. Selbst nach stundenlangem Kodieren der Dateien haben Sie also noch nicht einmal mit dem Design begonnen. Dies gilt nicht für die Erstellung von Odoo-Themen. Wir sind der Meinung, dass das Design der Themen einfach (und leistungsstark) sein sollte. Als wir unseren Website-Builder erstellt haben, haben wir uns entschieden, bei Null anzufangen, anstatt uns auf das zu verlassen, was bereits vorhanden war. Dieser Ansatz gab uns die Freiheit, uns auf die Dinge zu konzentrieren, die für Designer wirklich wichtig sind: Stile, Inhalt und die Logik dahinter. Wir mussten uns nicht mehr mit technischen Dingen herumschlagen.