Der er flere muligheder for at lave web-portaler med Linux, dvs. systemer som hjælper med at få en infrastruktur op omkring det indhold, man selv skal levere. phpNuke er en mulighed, Zope en anden og der er flere andre.
Zope er et Open Source Content Management System. Det bruges til - på en let og overskuelig måde - at opbygge en hierakisk organiseret hjemmeside.
Zope er bygget op over forskellige Products, som man kan importere i sin Zope, for derefter at lægge dem ind forskellige steder i hjemmesidens hieraki. Disse produkter varierer lige fra forskellige databaseforbindelser til nyhedslister, chats, gæstebøger og kalendere. Alt sammen nyttige ting til hjemmesiden.
I praksis kan man importere en pakke (et product) ved at placere dens filer under ~/zope/lib/python/Products og genstarte Zope. Herefter optræder dens elementer i listen med objekter, der kan anvendes i foldersystemet.
Zope giver mulighed for at kontrollere adgangen til de enkelte dele af hjemmesiden. Har man fået adgang i et niveau, gælder denne for alle niveauer herunder, indtil der evt. sættes et nyt adgangs object ind. Fremgangsmåden er enkel, man placerer blot et acl_users object i den folder, man vil lukke med en adgangskode, og opretter de brugere, der skal have adgang. Forskellige andre objecter i samme folder eller underfoldere, kan derefter forholde sig til de rettigheder, der er sat op.
Man kan i sin adgang for eksempel give alle (anonyme brugere) adgang til at læse, og en eller nogle få adgang til at redigere.
Zope er skrevet i Python. Internt bruges markup-sproget DTML som man kan bruge til at manipulere dynamiske data med på forskellige måder. Man kan også vælge at lave sine egne python scripts, hvis man hellere vil dette. De implementeres lige så let som DTML dokumenter.
Zope har en indbygget webserver (ZServer) som man kan nøjes med at bruge til en mindre trafikeret hjemmeside. Der skal i det tilfælde blot rettes i filen ~/zope/z2.py, idet standardværdien for HTTP_PORT er 8080 (rettes til 80), mens den for FTP_PORT er 8021 (rettes til 21). Har du et startscript under /etc/init.d/ skal du også kontrollere dette for portnumrene 8080 hhv. 8021. Skal Zope køre parallelt med Apache, skal der tilføjes lidt til httpd.conf, hvilket forholdsvis let kan lade sig gøre. Vil du vide mere om Zope, henvises til http://www.zope.org.
En af Zope's største styrker er produktet CMF (Content Management Framework). Dette kan bl.a. bruges til at bygge en portal. Med CMF er det nemt at styre brugere. CMF sørger for at holde indhold, data og kode adskilt. Har en indbygget skin-funktionalitet, som man kan bruge til at lave forskellige udseender til sin hjemmeside, lave den flersproget osv. Læs mere på http://cmf.zope.org
Her gives en beskrivelse af hvordan man kan få en fungerende (binær) Zope-2.6.1 til at anvende mysql-3.23-52 og mysql-4.0. Man skulle også kunne anvende rpm-pakker og debian-pakker, men hvis der opstår problemer, kan man falde tilbage på nedenstående og hente en binær pakke med zope fra http://www.zope.org:
Zope-mysql connections kræver to at man henter MySQL-python-0.9.2.tar.gz og ZMySQLDA-2.0.8.tar.gz (eller nyere stabile pakker) fra: http://sourceforge.net/project/showfiles.php?group_id=22307.
Læg de to tar pakker yderst i din zope-mappe (dér hvor du starter zope). Udpak pakkerne med: tar xvzf PAKKENAVN.
Nu lægger den udpakkede mappe MySQL-python-0.9.2 sig i zope-mappen, hvorimod ZMySQLDA lægger sig i lib/python/Products/ under ZOPE-mappen og er sådan set klar til at blive anvendt inde fra zope - idet man kan tilføje en MySQL-connection. Dog kræver det først at python kan kommunikere med MySQL.
Til det formål skal man gå ind i mappen MySQL-python-0.9.2 og køre følgende kommando: ../bin/python setup.py build.
Nu er der bygget de programmer som kræves. Det bemærkes at man anvender den python-udgave der følger med zopes binære programpakke. Dette er vist ikke mindst vigtigt, hvis ens python ikke er python2.1.3, men f.eks. python2.2, fordi zope bruger 2.1.3. Herudover er det afgørende at der med zopes python følger biblioteket distutils som skal bruges ved kompileringen. (Hvis man selv har kompileret zope, skal man angiveligt blot skrive: python setup.py build, men så må man have distutils-biblioteket i sin python.)
Man skal også sørge for at c-biblioteket mysql hvori mysql.h ligger, findes et sted hvor gcc-compileren kan finde den, f.eks. /usr/include/mysql. Biblioteket kommer med i mysql-4.0-standard-tgz-pakken som kan hentes fra http://www.mysql.com. Kopier det så til /usr/include.
Man skal også have en af mig ukendt delmængde af følgende biblioteker:
/usr/lib/libmysqlclient.a /usr/lib/libmysqlclient.la /usr/lib/libmysqlclient.so /usr/lib/libmysqlclient.so.10 /usr/lib/libmysqlclient.so.10.0.0 /usr/lib/libmysqlclient_r.so /usr/lib/libmysqlclient_r.so.10 /usr/lib/libmysqlclient_r.so.10.0.0
Mangler de relevante biblioteker, går oversættelsen i stå med beskeden:
/usr/bin/ld: cannot find mysqlclient_r
Det kan også være at oversættelsen går i stå med:
/usr/bin/ld: cannot find -lz
I så fald går du ind på: http://www.gzip.org/zlib/ og henter zlib som kildetekst. (Tager du f.eks. en rpm-pakke, risikerer du uendelige afhængighedsproblemer).
Du udpakker zlib med tar xvzf PAKKENAVN. (hvis du har hentet tar.gz-filen) og går ind i den resulterende zlib-mappe hvor du foretager:
./configure make test make install
Når du er færdig med at installere relevante biblioteker, bør du formentlig køre: /sbin/ldconfig så bibliotekerne bliver fundet under oversættelsen.
Læs iøvrigt README-filen.
Nu mangler man blot at installere MySQL-python. Det gøres med følgende kommando, inde fra mappen MySQL-python-0.9.2:
../bin/python setup.py install
Du skulle nu kunne starte zope som du plejer og adde en ZMySQL-Connection inde i zope.
Når du inde i zope har valgt en mysql connection (vi forudsætter at mysqld kører), skriver du i feltet "Database Connection String", f.eks.:
<databasenavn> <bruger> <password>
Så kommer zope sikkert ud og siger: "Can't connect to local MySQL server through socket ...." I så fald går du ud i en bash-terminal og skriver:
mysqladmin -u root -p variables | grep socket
har du ikke sti til mysqladmin, så tilføj fuld sti foran den kommando.
Nu kan du skrive den rigtige "Database Connection String":
<databasenavn> <bruger> <password> <sti til socket>
Derefter går du formentlig fuldstændig i ekstase over at din mysql-forbindelse virker. Du kan i stedet flytte de to tar-pakker fra zope-mappen - og sikkert også mappen MySQL-python-0.9.2 - væk fra zope-mappen.
Lad os nu se på hvordan Zope kobles til en database i MySQL.
Zope har sin egen indbyggede database (Z Gadfly), og er dit behov for datalagring ikke særlig stort, kan du sagtens klare dig med denne. Dels har den dog en øvre begrænsning på et par gigabyte (det kan de fleste nøjes med), og dels kan man ikke komme i kontakt med den fra andre programmer. Eftersom der gemmes en del i denne database i forvejen (bl.a. brugerdata) er dette nok ikke den optimale løsning hvis du skal lave et stort websted med mange brugere, eller med databaseindhold, som kommer fra helt andre kilder end Zope selv.
Der er lavet forskellige adaptorer til de mest brugte databaser.
Sådan henter du data fra f.eks. en MySQL database og viser dem. Dette gøres ret enkelt i Zope. Gå ned i din rodfolder og tilføj et "Z MySQL Database Connection"-objekt. Udfyld formen med de korrekte data og tilføj den. Tilføj nu en ZSQL Method. "Arguments"-feltet udfylder du med udvælgelseskriterier til query-strengen. Hvis du nu har en tabel i din database der hedder Medarbejdere. Den har følgende kolonner: Navn, Afdeling, Alder. Du vil gerne liste alle medarbejdere der er født i 1980. Fra det DTML-Document der kalder din ZSQL Method har du adgang til variablen alder. Derfor kan du i din "Argument"-liste skrive alder. Din query-streng skal så se ud som følger: SELECT * FROM Medarbejdere WHERE alder=<dtml-sqlvar alder type=string>.
Fra dit DTML Document kalder du din ZSQL Method på følgende måde:
<dtml-in expr="MinSQLMethod(alder=alder)"> Navn: <dtml-var Navn><BR> Afdeling: <dtml-var Afdeling><BR><BR> </dtml-in>
Forklaring: <dtml-in> er en nem måde at iterere gennem f.eks. SQL resultater. Den fungerer på samme måde som f.eks. en for-løkke i PHP. For at være sikker på at alder optræder i REQUEST-objektet, kalder man sin ZSQL-Method med alder-variablen. <dtml-var (navn)>-tag'erne indsætter de variabler, der returneres fra ZSQL-metoden.
Som tidligere nævnt findes der mange forskellige produkter til Zope, som er udviklet af andre Zope-brugere. Det smarte ved at bruge disse produkter er at i stedet for selv at lave f.eks. en chat, kan man hente en fra http://www.zope.org/Products.
Det er ret nemt at installere disse produkter. Der findes to måder de fleste produkter installeres på. (Andre måder kan forekomme - læs derfor altid installations vejledningen). Filer er som regel pakket som tar.gz, eller også har den en .zexp extension. I det første tilfælde skal filen udpakkes så det udpakkede dir ender med at ligge i /usr/local/Zope-xx/lib/python/Products/. Herefter genstartes Zope og dit nye produkt er klar til brug. Ender filen derimod på .zexp skal filen lægges i /usr/local/Zope-xx/import. Du skal så gå ind i Zope's administration interface i Control Panel - Products og klikke på "import/export"-knappen. En ny side kommer nu frem. I "import"-tekstfeltet skriver du navnet på den fil du netop har placeret i import-dir'et og klikker på "import"-knappen. Produktet vil nu være synligt i listen over produkter (Control Panel - Products).
Du bruger produkterne ved at tilføje dem i de relevante mapper i dit administrationsinterface.
CMF er et meget kraftfuldt værktøj som man kan udvide sin Zope med. CMF står for Content Mangement Framework og bruges til at opbygge - på en meget nem måde - portaler med. CMF benytter sig også af Zope's rolle hieraki. Derudover bliver man introduceret for "skins". Zope.org har dedikeret et helt site til deres portal-produkt. Adressen er http://cmf.zope.org. Det er her du how-to's, nye portal-produkter, nyheder og hvad der ellers er værd at vide om CMF.
Gå ind på Zope's CMF-site. På den første side er der et link til deres »download«-side. Hent den af versionerne der hedder 1.0 og ikke er alpha eller beta. Din tarball skal nu udpakkes i <Zopedir>/lib/python/Products. Du får lavet en folder der hedder CMF1.0. Gå ned i det og flyt de tre biblioteker der er dernede et niveau op. Der skulle nu i din Products folder ligge 3 nye foldere: CMFCore, CMDDecor, CMFDefault. Genstart din Zope og CMF er klar til brug !
For at kunne lave sin portal, skal man gå ind i Zope's administrationsinterface. I den folder du gerne vil placere din portal (som regel rod-folderen) vælger du at tilføje et CMF Site. Du kalder din portal noget passende og portalen er nu klar til brug. (Et passende navn vil være indec.html, idet de fleste browsere søger efter en fil med det navn som standard startsiden).
For at komme igang med at bruge din portal, skal du klikke på "View"-tabben. Der er et par ting der skal konfigures, før din portal er klar til offentligheden. Du kan enten vælge at bruge portalen egen opsætningsside, eller du kan konfigurere den via administrationssiden. Vælger du det sidste skal du gå tlbage til http://www.mitdomæme.dk:8080/manage og vælge din portal. (portnummeret :8080 er standarden, men har du ændret det til port 80, kan du helt udelade :8080 i foregående link). Du skal herefter klikke på "Properties"-tabben. Indtast eller udskift de eksisterende værdier og klik på "Save". Nu er portalen klar til at se dagens lys :-)
Der er masser af måder du kan ændre designet af din portal på. Men inden du begynder, er det måske en meget god idé at kigge lidt på hvordan portalen hænger sammen. Der findes som standard tre slags brugere; Anonymous, Member og Reviewer. Man er Anonymous indtil man bliver medlem. Når man så er medlem, kan man bidrage med forskellige ting til portalen. Prøv at opret en bruger ved at klikke på "Join" og log ind. Du vil nu få nogle flere valgmuligheder i den venstre menu. Hvis du klikker på "My Stuff" kommer indholdet af din folder frem i vinduet. Du kan nu vælge enten at editere filen "index_html" (som er den side andre kan se hvis din profil er listet) eller du kan vælge at tilføje mere til folderen. Klik på "Add" og prøv at tilføje en nyhed. Først udfylder du objektet's metadata og derefter vælger du at editere teksten. Når du har gjort dette, vil du selvfølgelig gerne have at andre skal kunne læse din nyhed, så du klikker på "Publish". Din nyhed er dog ikke helt publiceret endnu. For at den kan blive dette, er der en bruger med rollen "Reviewer" eller "Manager" der skal godkende din nyhed. Du kan nu vælge enten at oprette en anden bruger, du kan tildele rollen "Reviewer" eller du kan vælge at logge ind med din administrator bruger (som jo har rollen "Manager"). Vælger du det første skal du logge ud, klikke endnu engang på "Join", oprette brugeren og gå ind i administrationsinterfacet (http://www.mitdomæne.dk:8080/minportal/manage). Her skal du klikke på den folder dine medlemmer ligger i (acl_users) og klikke på den bruger du gerne vil tildele rollen "Reviewer". Marker "Reviewer" i select-boxen og klik på "Save". Gå nu tilbage til din portal og log ind som denne review-bruger. Du vil nu se nederst i den venstre menu at der står "Pending (1)". Klik her. Læs og godkend nyheden så vil denne blive publiceret. Gå tilbage til portalens forside og kig i højre side i nyheds-kassen. Nyheden optræder nu her. På samme måde som du lige tilføjede en nyhed, kan alle dine portal-brugere tilføje dokumenter, nyheder, billeder, links etc. etc. Den eneste der begrænser dette, er portal-administratoren.
Det er nu på tide at kigge på de lidt mere konfigurerbare ting af portalen, der ikke kræver den store programmør. Portalens udseende bliver styret fra den folder der hedder "portal_skins". Gå tilbage til administrations-interfacet og klik på "+" på skins-folderen så den folder sig ud. Der ligger en række foldere, hvoraf en er en "almindelig" folder. De andre er det der kaldes for "FileSystem" foldere. Indholdet i disse kan ikke ændres i skins-folderen, men kan kopieres til den folder der hedder "Custom" og ændres der. Hvis du klikker på folderens "Properties"-tab, kan du se hvordan de forskellige skins er defineret. Ud for hvert enkelt skin, står navnene på de foldere der bliver inkluderet i skin'et. Folderne bliver gennemsøgt fra venstre mod højre. D.v.s. at hvis man kopiere en fil fra f.eks. "generic"-folderen til "custom"-folderen, bliver den kopi af filen der ligger i "custom" brugt før den der ligger i "generic". Hvis man nu byttede om på rækkefølgen af "custom" og "generic" ville den tilrettede kopi af filen ikke blive brugt. På denne måde kan man definere forskellige former for skins (med forskellige stylesheets f.eks.) til sin portal og dine brugere har nu forskellige udseender at vælge imellem. Du kan også bruge skins til at definere forskellige sprog med. En anden god ting man kan lave er et "Printable" skin som gør det muligt at vise en print-venlig side af alle dine dokumenter. Du laver bare en folder der hedder "Printable" i "portal_skins" folderen, kopierer de mest nødvendige filer ned i (såsom "index_html" etc.). Herefter laver du på "portal_skin"-folderens properties side et nyt skin der hedder "Printable" og tilføjer de skin-foldere der er nødvendige (som oftes skal de samme foldere inkluderes som også er i de andre skins på nær dem der sætter farver ind, laver topbaren, sidebarerne etc.). At tilrette de eksisterende skins og lave nye er en hel videnskab for sig, men jo mere man arbejder med det, jo bedre forståelse får man for hvordan det hænger sammen.
Der er efterhånden blevet udviklet flere og flere portal-typer end dem din portal blev født med. Disse finder du på http://cmf.zope.org. Det er ikke helt let at tilføje nye portal-typer til portalen, da der er mange forskellige måder man kan gøre det på. Men som regel har udvikleren af portal-typen lavet en installationsvejledning og så er det bare med at følge den.
Løber du ind i problemer du ikke umiddelbart kan løse selv, er der hjælp at hente. Du kan tilmelde dig mailinglisten Zope-CMF. Klik ind på http://www.zope.org/Resources/MailingLists og tilmeld dig denne liste. Så er du i hvert fald godt på vej !