| | 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] |