geschrieben von Micha am 04. Mai 2007 | 16 Kommentare
Im zweiten Teil dieses Tutorials haben wir verschieden Methoden kennengelernt, das Borderlayout mit Inhalten zu füllen und haben eine Toolbar hinzugefügt. In diesem Teil wollen wir uns die Nested Layouts anschauen.
Solltest du den ersten und zweiten Teil noch nicht gelesen haben, hole dies bitte schnell nach.
Voraussetzungen: Grundkenntnisse in HTML, CSS und Javascript.
Dieses Tutorial basiert auf der Version Ext-1.0, welche hier heruntergeladen werden kann.
Nested Layouts
Wie der Name Nested Layouts schon sagt, werden die Nested Layouts einfach in das normale Borderlayout eingebettet. Jedes Panel kann ein Nested Layout haben, welches ebenfalls Nested Layouts haben kann. Somit sind selbst komplexe Verschachtelungen realisierbar. Wir werden ein Nested Layout mit einer Center und einer South Region in unser West Panel einbauen. Dazu müssen wir zuerst aus der layout.js die Zeile
westPanel.setContent('Hallo, ich bin das West Panel');
löschen, da das West Panel der Container für unser Nested Layout wird und daher keinen Inhalt haben darf (Das Nested Layout ist dann der Inhalt). Dann brauchen wir noch 2 Platzhalter für die beiden neuen Panels und legen in der layout.html 2 Div’s an:
<div id="inhalt1"></div>
<div id="inhalt2"></div>
Das Layout wird wieder genau so definiert, wie wir es von dem Borderlayout her kennen, nur das wir es in einer eigenen Variable anlegen:
...
myLayout.add('center', centerPanel = new CP('mitte', {
fitToFrame: true, closable: false, toolbar: tb, resizeEl:'inhalt'
}));
/***** ab hier gehts los *****/
var innerLayout = new Ext.BorderLayout('links', {
center: {
split:true,
initialSize: 100,
minSize: 100,
maxSize: 400,
autoScroll:true,
titlebar: true
},
south: {
split:true,
initialSize: 300,
minSize: 100,
maxSize: 500,
autoScroll:true,
collapsible:true,
titlebar: true
}
});
Nun müssen wir dem innerLayout die ContentPanels zuweisen:
var nCenter = innerLayout.add('center', new CP('inner1', {
title:'Inner Layout 1',
fitToFrame:true,
autoScroll:true
}));
var nSouth = innerLayout.add('south', new CP('inner2', {
title:'Inner Layout 2',
fitToFrame:true,
autoScroll:true
}));
Hier noch einmal zur Erklärung: Wir haben das innerLayout in unserem ‘links’ Div angelegt. Das innerLayout besitzt 2 Regionen, ‘center’ und ‘south’. ‘center’ bekommt das ‘inner1′ Div als ContentPanel zugewiesen und ‘south’ das ‘inner2′ Div. Also nicht verwirren lassen. Die Namen north, south, east, west und center dürfen nicht geändert werden, daran erkennt der LayoutManager die Regionen. Wir haben die beiden ContentPanels gleich als Variablen angelegt, damit haben wir auch sofort Zugriff darauf.
Jetzt müssen wir nur noch das innerLayout zu unserem Layout hinzufügen:
myLayout.add('west', new Ext.NestedLayoutPanel(innerLayout,{title: 'Mein Nested Layout'}));
Nun noch ein bischen Inhalt:
nCenter.setContent('<p class="test">Nested Panel Center</p>');
nSouth.setContent('<p class="test">Nested Panel South</p>');
Wie wir gesehen haben, kann man ganz normalen HTML Code einfügen und mit Stylesheets beeinflussen. In unserem borderlayout.css fehlt jetzt noch die Klasse ‘test’.
.test{
margin:10px;
font-size:12px;
color: red;
}
Eine Bemerkung noch: Wenn man ein Panel zugeklappt hat, ist nur der blaue Balken und das Aufklapp-Icon zu sehen. Das liegt daran, daß es in HTML keine Möglichkeit gibt, Buchstaben zu drehen und somit bei horizontaler Teilung der Panels eh nichts zu sehen wäre. Wir können uns aber mit Bildern behelfen. Wir brauchen nur den Namen der jeweiligen Klasse herausfinden und können dann dieser Klasse das dementsprechende Bild zuweisen. Dazu einfach im Firebug auf ‘Inspect’ drücken und auf das entsprechene Element fahren. Dann legen wir die beiden Klassen im borderlayout.css an und definieren unsere Bilder als Hintergrund. Ich habe einfach die Bilder aus meinem Blogarchiv genommen.
.x-layout-collapsed-south{
background:url(../PfadzuDeinemBild/south.png) center no-repeat;
}
.x-layout-collapsed-west{
background:url(../PfadzuDeinemBild/west.png) center no-repeat;
}
Damit sind wir fertig. Das Resultat so aussehen: Hier ist das fertige Layout.
Hi,
vielen Dank für die guten Tuts ! Das macht richtig Spass mit extjs.
Hast Du vielleicht einen Tip zur Strukturierung, wenn man wie auf der API-Seite jetzt auch noch einen Tree, Tabs etc. in ein frame einfügen will ? Wie behält man da den Überblick ?
vg Steffen
@Steffen: Danke! Schau dir mal das Script von meinem Blogarchiv (oben in der Menüleiste auf Blogarchiv klicken) im Firebug an, müßte so ziemlich das sein, was Du meinst.
Hi Micha,
ja, genau das meinte ich
Sieht für die Fülle an Funktionen ja recht übersichtlich aus, ich werde mich mal nach und nach daran versuchen. Ich denke wie immer ist kommentieren wichtig.
Kurze Frage – da ich das auch auf Servern mit php
oha – da hat er mir alles nach dem < abgeschnitten …
du mußt den block mit Code umschließen und vorher alle HTML Sonderzeichen maskieren.
naja, war ja nur das kleiner-Zeichen …
also hier der Rest:
Kurze Frage – da ich das auch auf Servern mit php < 5.2 einsetzen möchte und json-Funktionen da noch nicht implementiert sind – gibts dafür eine Lösung?
http://mike.teczno.com/JSON/JSON.phps
Es gibt noch andere, mußt mal gooooooglen
ich nochmal
ich habe das mal nachgebaut.
Sehr seltsam ist das Scrollverhalten – hast Du ne Idee was da schiefläuft ?
Dieser Effekt ist bei mir schon ein paarmal bei der Ext Dokumantation aufgetreten. Ich denke, das hat irgendwas mit dem iframe zu tun. Aber keine Ahnung was. Ausser bei diesem Tutorial hab ich noch keine iframes benutzt. Wenn du nicht unbedingt externe Seiten da einfügen willst, nimm lieber ein Template mit JSON View, so wie ich in meinem Blogarchiv.
ich wunder mich nur, das der Effekt bei Deinem Demo nicht auftaucht trotz iframe und sonst identischem Aufbau.
Was ich bei Dir auch seh ist ein refresh-Problem im Statusbar, dort bleiben Teile mit Hintergrund der vorherigen Seite, zu sehen im FF wenn man Dein Demo in einem neuen Tab öffnet.
nun weiss ich die Ursache, und bei Dir ist das gleiche problem im fertigen Layout:
Der Toolbar und das iframe passen nicht in das centerPanel. Man kann das gut erkennen, da der Scrollbar unten nicht abschliesst. Kommentiert man den Toolbar aus, stimmt die Höhe.
Irgendeine Idee für eine Lösung ?
Ich stecke mitten in einem Projekt und hab im Moment keine Zeit, sorry. In ca. 2 Monaten kommt die Ext 2.0, da ist eh wieder alles anders.
Hallo,
ein Fehler im Beispiel:
muss man mit
ersetzen.
ups… sorry
habe vergessen den Code-tag einzugeben, also
<div id="inhalt1"></div>
<div id="inhalt2"></div>
ändern in
<div id="inner1"></div>
<div id="inner2"></div>
auch nicht funktioniert…
also “inhalt1″ mit “inner1″ ersetzen !
Yuri, schick mir den Code per Mail an info at diese domain.
Dann bau ich ihn ein.
edit: die Html Tags wurden nicht dargestellt im Code, du mußt die vorher umwandeln in Sonderzeichen.
Danke Yuri.