== Python == - Langsamer Einstieg - http://openbookproject.net/thinkcs/python/english2e/ - Schneller Einstieg - http://diveintopython.org/ - Sehr schneller Einstieg! - Auf die Einrückung kommt es an (benutze 4 Leerzeichen statt Tabs) - OOP (Objektorientierte Programmierung) - alles ist ein Objekt == Web2Py == * http://mdp.cti.depaul.edu/examples/static/cookbook.pdf * http://mdp.cti.depaul.edu/examples/static/web2py_cheatsheet.pdf Dies ist eine [http://en.wikipedia.org/wiki/Model-view-controller MVC] (Model-View-Controler = Modell-Sicht-Steuerung) Umgebung (wie Rails). === Modell (Model) === Definiert Datenbanken in: {{{/models/module.py}}} (equivalent zu {{{inst/mysql-dbcreate.sql}}}) Die Modelle werden in der web2py Verarbeitung zuerst geladen, vor der Steuerung. Also kann man hier globale Module importieren/globale Variablen setzen. Die Modelle werden in alphabetischer Reihenfolge importiert, also müssen die Dateien, von denen andere Module abhängen, zuerst geladen werden. Deshalb werden sie mit Unterstrich beginnend benannt: {{{00_db.py}}}, {{{01_RESTlike_controller.py}}}, {{{02_pr.py}}}, {{{03_gis.py}}} === Steuerung (Controller) === Python Funktionen in {{{/controllers/module.py}}} z.B. {{{ def list_records(): list=t2.itemize(table) return dict (list=list) }}} === Sicht (View) === HTML/Javascript Vorlagen in {{{/views/module/function.html}}} * das sind normale HTML/JS Dateien mit der Fähigkeit Python Code einzubinden (z.B. Variablen), der in geschweiften Klammern steht: {{ interpreted python here }} * Für jede Funktion im Modul sollte es eine .html Datei geben (Name normalerweise der selbe wie die Funktion) * diese erben normalerweise von {{{views/layout.html}}} was auch Javascript von {{{views/web2py_ajax_t2.html}}} einschließt * Wenn keine Sicht definiert wurde, wird eine Standardsicht angezeigt, die alle sichtbaren Daten anzeigt, allerdings nicht besonders schön formatiert CSS/Javascript Dateien befinden sich in {{{/static}}} (equivalent zu {{{www/res}}}) == T2 == Dieses Plugin wird verwendet für [wiki:DeveloperGuidelinesAuthenticationAccess AAA] und vereinfachtes [wiki:DeveloperGuidelinesCreateReadUpdateDelete CRUD] (einschließlich Konflikterkennung) * http://mdp.cti.depaul.edu/examples/static/t2.pdf Wir erweitern die T2 Klasse in {{{modules/sahana.py}}} === Konflikterkennung === Sahana ist ein Mehrbenutzer-System, deshalb besteht die Möglichkeit, dass mehrere Benutzer gleichzeitig denselben Datensatz bearbeiten. Füge dieses Feld in jede zu schützende Tabelle ein (in {{{models/db.py}}}): {{{ SQLField('modified_on','datetime'), # Used by T2 to do edit conflict-detection }}} Dieses Feld wird auch verwendet bei der [wiki:DeveloperGuidelinesDatabaseSynchronization Datenbanksynchronisation] == Sahana3 Framework == Dies sind die Dinge die wir zusätzlich zu Web2Py verwenden, um das Sahana Look & Feel zu erreichen: Seitliche Navigationsleiste anordnen, indem folgendes in jeden Controller eingefügt wird: {{{ module='module' # Aktuelles Modul (für Seitenleisten-Titel) module_name=db(db.module.name==module).select()[0].name_nice # Modulliste (aus der das Hauptmenü aufgebaut wird) modules=db(db.module.enabled=='Yes').select(db.module.ALL,orderby=db.module.menu_priority) # Optionsliste (aus der das Modulmenü aufgebaut wird) options=db(db['%s_menu_option' % module].enabled=='Yes').select(db['%s_menu_option' % module].ALL,orderby=db['%s_menu_option' % module].priority) }}} Jede Funktion muß folgende Werte an die Sicht zurückgeben: return dict(module_name=module_name,modules=modules,options=options) List output can be made more functional by adding this to your table definitions in models/db.py: {{{db.table.represent=lambda table: A(table.display_field,_href=t2.action('display_table',table.id))}}} Form labels can be set in a translatable manner using: {{{db.table.field.label=T("label")}}} Form field can be made to use a TEXTAREA by marking the field as being type 'text': {{{SQLField('field','text'),}}} Form field can be made to use a SELECT dropdown by setting the field as a lookup to another table...linked to the 'uuid' field to allow [wiki:DeveloperGuidelinesDatabaseSynchronization Database Synchronization], but displaying a more user-friendly field (such as 'name'): {{{ SQLField('field',length=64), db.table.field.requires=IS_NULL_OR(IS_IN_DB(db,'othertable.uuid','othertable.name')) }}} Form field being required can be marked using: {{{db.table.field.comment=SPAN("*",_class="req")}}} Help for a form field can be set using: {{{A(SPAN("[Help]"),_class="popupLink",_id="tooltip",_title=T("Help Title|This is what this field is for."))}}} === Feldoptionen === Sahana2 verwendet eine allgemeine 'field_options' Tabelle for Feldoptionen. Sahana3 verwendet separate Tabellen für jede Nachschlageliste. == Ein neues Modul hinzufügen == DeveloperGuidelinesNewModule ---- DeveloperGuidelines/Tips ---- === Translations of this page === * [wiki:DeveloperGuidelines English]