| 1 | == Python == |
| 2 | - Langsamer Einstieg |
| 3 | - http://openbookproject.net/thinkcs/python/english2e/ |
| 4 | - Schneller Einstieg |
| 5 | - http://diveintopython.org/ |
| 6 | - Sehr schneller Einstieg! |
| 7 | - Auf die Einrückung kommt es an (benutze 4 Leerzeichen statt Tabs) |
| 8 | - OOP (Objektorientierte Programmierung) - alles ist ein Objekt |
| 9 | |
| 10 | == Web2Py == |
| 11 | * http://mdp.cti.depaul.edu/examples/static/cookbook.pdf |
| 12 | * http://mdp.cti.depaul.edu/examples/static/web2py_cheatsheet.pdf |
| 13 | |
| 14 | Dies ist eine MVC (Model-View-Controler = Modell-Sicht-Steuerung) Umgebung (wie Rails). |
| 15 | |
| 16 | === Modell (Model) === |
| 17 | Definiert Datenbanken in: {{{/models/module.py}}} (equivalent zu {{{inst/mysql-dbcreate.sql}}}) |
| 18 | |
| 19 | Die Modelle werden in der web2py Verarbeitung zuerst geladen, vor der Steuerung. |
| 20 | Also kann man hier globale Module importieren/globale Variablen setzen. |
| 21 | 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: {{{_db.py}}}, {{{_gis.py}}} |
| 22 | |
| 23 | === Steuerung (Controller) === |
| 24 | Python Funktionen in {{{/controllers/module.py}}} |
| 25 | |
| 26 | z.B. |
| 27 | {{{ |
| 28 | def list_records(): |
| 29 | list=t2.itemize(table) |
| 30 | return dict (list=list) |
| 31 | }}} |
| 32 | |
| 33 | === Sicht (View) === |
| 34 | HTML/Javascript Vorlagen in {{{/views/module/function.html}}} |
| 35 | * das sind normale HTML/JS Dateien mit der Fähigkeit Python Code einzubinden (z.B. Variablen), der in geschweiften Klammern steht: {{ interpreted python here }} |
| 36 | * Für jede Funktion im Modul sollte es eine .html Datei geben (Name normalerweise der selbe wie die Funktion) |
| 37 | * diese erben normalerweise von {{{views/layout.html}}} was auch Javascript von {{{views/web2py_ajax_t2.html}}} einschließt |
| 38 | * Wenn keine Sicht definiert wurde, wird eine Standardsicht angezeigt, die alle sichtbaren Daten anzeigt, allerdings nicht besonders schön formatiert |
| 39 | |
| 40 | CSS/Javascript Dateien befinden sich in {{{/static}}} (equivalent zu {{{www/res}}}) |
| 41 | |
| 42 | == T2 == |
| 43 | Dieses Plugin wird verwendet für [wiki:DeveloperGuidelinesAuthenticationAccess AAA] und vereinfachtes [wiki:DeveloperGuidelinesCreateReadUpdateDelete CRUD] (einschließlich Konflikterkennung) |
| 44 | * http://mdp.cti.depaul.edu/examples/static/t2.pdf |
| 45 | Wir erweitern die T2 Klasse in {{{modules/sahana.py}}} |
| 46 | |
| 47 | === Konflikterkennung === |
| 48 | Sahana ist ein Mehrbenutzer-System, deshalb besteht die Möglichkeit, dass mehrere Benutzer gleichzeitig denselben Datensatz bearbeiten. |
| 49 | |
| 50 | Füge dieses Feld in jede zu schützende Tabelle ein (in {{{models/db.py}}}): |
| 51 | {{{ |
| 52 | SQLField('modified_on','datetime'), # Used by T2 to do edit conflict-detection |
| 53 | }}} |
| 54 | |
| 55 | Dieses Feld wird auch verwendet bei der [wiki:DeveloperGuidelinesDatabaseSynchronization Datenbanksynchronisation] |
| 56 | |
| 57 | == Sahana3 Framework == |
| 58 | Dies sind die Dinge die wir zusätzlich zu Web2Py verwenden, um das Sahana Look & Feel zu erreichen: |
| 59 | |
| 60 | Seitliche Navigationsleiste anordnen, indem folgendes in jeden Controller eingefügt wird: |
| 61 | {{{ |
| 62 | module='module' |
| 63 | # Aktuelles Modul (für Seitenleisten-Titel) |
| 64 | module_name=db(db.module.name==module).select()[0].name_nice |
| 65 | # Modulliste (aus der das Hauptmenü aufgebaut wird) |
| 66 | modules=db(db.module.enabled=='Yes').select(db.module.ALL,orderby=db.module.menu_priority) |
| 67 | # Optionsliste (aus der das Modulmenü aufgebaut wird) |
| 68 | options=db(db['%s_menu_option' % module].enabled=='Yes').select(db['%s_menu_option' % module].ALL,orderby=db['%s_menu_option' % module].priority) |
| 69 | }}} |
| 70 | |
| 71 | Jede Funktion muß folgende Werte an die Sicht zurückgeben: |
| 72 | return dict(module_name=module_name,modules=modules,options=options) |
| 73 | |
| 74 | |
| 75 | List output can be made more functional by adding this to your table definitions in models/db.py: |
| 76 | {{{db.table.represent=lambda table: A(table.display_field,_href=t2.action('display_table',table.id))}}} |
| 77 | |
| 78 | Form labels can be set in a translatable manner using: |
| 79 | {{{db.table.field.label=T("label")}}} |
| 80 | |
| 81 | Form field can be made to use a TEXTAREA by marking the field as being type 'text': |
| 82 | {{{SQLField('field','text'),}}} |
| 83 | |
| 84 | 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'): |
| 85 | {{{ |
| 86 | SQLField('field',length=64), |
| 87 | |
| 88 | db.table.field.requires=IS_NULL_OR(IS_IN_DB(db,'othertable.uuid','othertable.name')) |
| 89 | }}} |
| 90 | |
| 91 | Form field being required can be marked using: |
| 92 | {{{db.table.field.comment=SPAN("*",_class="req")}}} |
| 93 | |
| 94 | Help for a form field can be set using: |
| 95 | {{{A(SPAN("[Help]"),_class="popupLink",_id="tooltip",_title=T("Help Title|This is what this field is for."))}}} |
| 96 | |
| 97 | === Feldoptionen === |
| 98 | Sahana2 verwendet eine allgemeine 'field_options' Tabelle for Feldoptionen. |
| 99 | |
| 100 | Sahana3 verwendet separate Tabellen für jede Nachschlageliste. |
| 101 | |
| 102 | |
| 103 | == Ein neues Modul hinzufügen == |
| 104 | DeveloperGuidelinesNewModule |
| 105 | |
| 106 | ---- |
| 107 | |
| 108 | DeveloperGuidelinesTips |
| 109 | |
| 110 | ---- |
| 111 | |
| 112 | === Translations of this page === |
| 113 | |
| 114 | * [wiki:DeveloperGuidelines English] |