Takaisin php-ohjelmoinnin etusivulle


PHP: SWF-tiedostojen generointi PHP-kielellä

Olen kahdessa edellisessä PHP-tutoriaalissani käynyt läpi thumbnails-kuvien sekä PDF-tiedostojen generoimisen omalle palvelimelle ja antanut ohjeita generaattorien käskyttämiseksi nettiselaimen kautta, joko XHTML-koodista tai nettisivuille sijoitettavasta Flash/AS3-komponentista käsin. Tässä kolmannessa osassa opastan hieman alkuun oman swf-generaattorin tekemisessä omille nettisivuille.

Tämän tutoriaalin tarkoituksena on opastaa kuinka tehdä yksinkertainen SWF-generaattori, joka pystyy käyttäjän antaman kuvan ja tekstin perusteella generoimaan yksinkertaisen SWF-komponentin.

Näytän aluksi tutoriaalin tuloksena tehtävän SWF-generaattorin. Sitten punnitsen eri vaihtoehtoja SWF-generaattorin toteuttamiseksi omalle palvelintilalle. Lopuksi käyn läpi generaattorin toteuttamisen SWFTOOLS-ohjelmien avulla.



"VALMIS" SWF-generaattori

Tässä alla on yksinkertainen SWF-generaattori joka palvelimelle lähettämäsi kuvan ja antamasi tekstin perusteella tekee SWFTOOLS:iin kuuluvan swfc-kääntäjän avulla SWF-tiedoston ja avaa lataus-dialogin, jolla kyseisen komponentin voi ladata kotikoneelle.

Valitettavasti jouduin tietoturvan varmistamiseksi poistamaan PHP-skriptejä käyttäviä demoja nettisivuiltani. Poistin samalla tämänkin demon.

Erilaisia SWF-generaattorivaihtoehtoja

Aivan kuten thumbnails-kuvien (GD-kirjasto) ja PDF-tiedostojen (FPDF-kirjasto) tapauksessa jälleen tarvitaan SWF-tiedoston generoimiseksi ulkopuolinen laajennus tavallisen PHP-kielen lisäksi.

Itse olen tehnyt Flash-toteutuksiani Adobe Professional CS4 kehitysohjelmalla, joka yhdistää tehokkaalla tavalla graafisen suunnittelun ja animaation työkaluja (layerit, aikajana) koodaamistyökaluihin.

Miettiessäni SWF-generaattorin tekemistä oli kuitenkin ilmeistä, ettei tuota työkalua voinut sellaisenaan käyttää kotikoneeni sijaan ulkoisella palvelimella, jolle generaattori siis olisi asennettava, jotta sitä voitaisiin käyttää netistä käsin. Lisäksi CS4 on aika kallis hankinta, joten se ei sellaisenaan sovellu tavallisen nettiharrastelijan kotisivuprojektien toteuttamiseen.

Päädyinkin miettimään erilaisia ratkaisuja SWF-generaattorin toteuttamiseksi:

RATKAISU 1 (FLEX-kääntäjä, vaatii JAVA-tuen palvelimelta):

Adobekin tarjoaa ilmaisen ratkaisun oman SWF-generaattorin tekemiseksi. Ja tuo ratkaisu on koodaajien enemmän suosima Adobe Flex.

Adobe Flex -ratkaisujen tekemiseksi Adobe tarjoaa maksullista Flex Builder 3 , josta löytyy Adoben sivuilta myös kokeiltaksi (60 päivää) Trial-versio , jolla voi halutessaan tutustua tuotteeseen ennen kuin ottaa sen varsinaisesti käyttöön.

Oman SWF-generaattorin tekemiseksi ei kuitenkaan välttämättä tarvitse ostaa Flex Builderia, vaan Adobe tarjoaa nettisivuillaan myös ilmaisesti ladattavaksi Adobe Flex 3.4 SDK :n, jonka avulla pystyy toteuttamaan kotisivuilleen SWF-generaattorin.

Oman SWF-generaattorin idea kaikessa yksinkertaisuusessaan on seuraava:

1) Asennetaan Adobe Flex 3.4 ja etenkin tuohon pakettiin kuuluva mxmlc-kääntäjä nettisivujen palvelimelle niin että kääntäjää voi käyttää normaaleilla systeemikomennoilla. Jos nettisivujen kehitys tapahtuu omalla kotikoneella niin tuon paketin voi myös asettaa omalle koneelle, jolloin kehitystyön voi suorittaa kotikoneella ennen sivujen siirtämistä palvelimelle.

2) Tehdään käyttäjän antamaa syötetettä (ladattavat kuvat ja tekstit) varten lomake joko XHTML:llä tai Flashillä.

3) Yhdistetään Lomakkeen käsittely PHP-skripteihin.

4) Generoidaan PHP-skripteillä, käyttäjän lomakkeella antaman syötteen perusteella, käyttäjän syötettä vastaava mxml-tiedosto, joka syötetään SWF-tiedoston generoimiseksi mxmlc-kääntäjälle.

5) Avataan lataus-dialogi SWF-tiedoston lataamiseksi kotikoneelle.

Etuna tässä ratkaisussa on, että mxmlc-kääntäjän tekijä on itse Adobe, joten tämän ratkaisun avulla pystyy maksimaalisesti hyödyntämään Flashin tarjoaman toiminnallisuuden ja koodaajille tarjotun tuen.

Huonoja puolia on JAVA-tuen tarpeellisuus ja SWF-tiedostojen generoinnissa tarvittavien MXML-tiedostojen monimutkaisuus.



RATKAISU 2 (php_ming-kirjaston käyttö, ei vaadi FLEX-komponentteja, mutta vaatii PHP-moduulin asentamisen admin-oikeuksin):



Tässä SWF-tiedostojen generointivaihtoehdossa rakennetaan SWF-generaattori Ming-kirjaston ja sen tarjoaman PHP-ohjelmointirajapinnan varaan.

1) Ensimmäinen tehtävä on asentaa ming-kirjasto palvelimelle. Ming kirjaston voi ladata projektin sourceforge-osoitteesta .

2) Ming-kirjaston asentamiseksi Linux/Unix-ympäristöön tarvitsee asentaa se itse joko rpm-tiedostosta tai kääntää so-tiedosto palvelimella itse.

Kokeilin testausmielessä kääntämistä omassa palvelintilassani komennoilla:


3) Tämä vaihe onkin sitten monille se vaikein (kuten itsellenikin). Vaikka saisikin itse käännettyä php_ming.so-kirjaston omassa palvelintilassaan, ei silti pysty ilman admin-oikeuksia asentamaan tuota kirjastotiedostoa PHP-tulkin käyttämään ja PHP-alustustiedoston php.ini rivillä annettavaa extension_dir-hakemistoon.

Alla ote php.ini tiedostosta Windows-ympäristössä:
Jos Asennusmahdollisuus on olemassa niin silloin voit itse kopioida tuo kääntämäsi php_ming.so-tiedoston tuohon extension_dir-hakemistoon. Lisäksi php.ini-tiedostoosi kannattaa lisätä rivi:
Jos et halua lisätä tuota extension-riviä php.ini-tiedostoon niin joudut kirjoittamaan jokaiseen php_ming-kirjastoa käyttävään PHP-tiedostoon dl-funktion kutsun:
dl-funktion käyttäminen ei kuitenkaan ole järkevää, sillä se on tulevaisuudessa jäämässä pois PHP-kielestä, joten on ehdottomasti suositeltavaa muokata mieluummin php.ini-tiedostoa.

Käytännössä php_ming-kirjaston käyttöönotto siis edellyttää, että saa nettitilanpalveluntarjoajan asentamaan tuon php_ming-kirjaston nettisivujen palvelimelle. Jos on oikein kiinnostunut kyseisestä ratkaisusta niin tuon luulisi monessa tapauksessa onnistuvan ainakin jos on valmis hieman maksamaan kyseisestä asennuksesta.



RATKAISU 3 (SWFTOOLS-ohjelmien asentaminen omaan palvelintilaan, onnistuu ilman admin-apua):



1) Ensin on syytä tutustua SWFTOOLS-ohjelmapakettiin nettisivuilla http://www.swftools.org/ .

Tarkoitukseni tässä tutoriaalissa on tehdä yksinkertainen Flash-komponenttigeneraattori, jossa käyttäjä lähettää jpg-kuvan ja kirjoittamansa tekstin joista palvelimella generoidaan käyttäjän ladattavaksi annettava SWF-tiedosto. SWFTOOLS-ohjelmista tähän tarkoitukseen soveltuu erinomaisesti swfc-kääntäjä, jonka käyttämien .sc-tiedostojen syntaksiin voi tutustua osoitteessa http://www.swftools.org/swfc/swfc.html . Kuten tuosta tutoriaalista voi havaita pystyy swfc-kääntäjän käyttämällä skriptikielellä tehdä pienellä vaivalla varsin monimutkaisiakin SWF-komponentteja.

Lisäksi swftools-ohjelmiin kuuluu Action Script 3 -kääntäjä as3compile , joka mainostaa olevansa Abode Flex -yhteensopiva.

2) Asennetaan seuraavaksi SWFTOOLS-paketti omaan palvelintilaamme. Paketin voi ladata osoitteesta http://www.swftools.org/download.html . Itse asensin tuon paketin swftools-0.9.0.tar.gz.

3) Ladatun paketin voi siirtää ja purkaa palvelimella johonkin tilapäishakemistoon esim. tmp.
Tärkeää tuossa komentosarjassa on antaa oikea asennushakemisto parametrilla --prefix. Yllä olevilla komennoilla olemme siis asentaneet palvelimellemme ajettavan SWFTOOLS-ohjelmapaketin hakemistoon /home/talaakso/shared/bin sekä tuon ohjelman ajamiseen tarvittavat kirjastotiedostot hakemistoon /home/talaakso/shared/lib. Lisäohjeita asenukseen voi tarvittaessa lukea pakettiin kuuluvasta tiedostosta INSTALL.

Swftools-pakettiin kuuluvan swfc-kääntäjän pitäisi nyt toimia Unixin/Linuxin komentoriviltä ajettuna komennolla:

Minulla tuo toimi heti, mutta jos swfc-kääntäjä ei löydä tarvitsemiaan kirjastoja niin saatat joutua lisäämään Linux/Unix-komentotulkkisi käynnistystiedostoon kirjastohakemiston osoitteen.

Esim. BASH-komentotulkille voi lisätä johonkin kotihakemistosi käynnistystiedostostoista (.bash_profile tai .bashrc) rivit:


Flash SWF-generaattori

Kun olemme vakuuttuneet siitä, että swfc-kääntäjä todella toimii omassa palvelinympäristössämme tehdään vielä esittely mielessä yksinkertainen Flash-komponentista toimiva SWF-generaattori, jolla käyttäjä voi ladata kuvan ja antaa tekstikenttään tekstin, jotka sitten käännetään toimivaksi SWF-tiedostoksi.

Tarkoitukseni ei ole tässä antaa mitään valmiiksi kehitettyä SWF-generaattoria, vaan opastaa alkuun SWF-generaattorien kehittelyssä, jokainen toteuttakoon omanlaisiansa ratkaisuja parhaaksi katsomillaan tekniikoilla.

Käydään SWF-generaattorin tekeminen nyt läpi vaihe vaiheelta:

1) SWF-komponenteissa käytetään hyväksi erikoisfontteja, joita ei välttämättä löydy käyttäjän koneelta. SWFTOOLS-ohjelmien avulla voi kuitenkin joko käyttää suoraan palvelimelleen tallentamiaan ttf-fontteja tai sitten kääntää ttf-fontit SWFTOOLS-pakettiin kuuluvan apuohjelman font2swf avulla swf-tiedostoiksi.

Käännetään malliksi arial-fontti SWF-tiedostoksi:

a) Normaalisti Windows XP-koneella fontit sijaitsevat hakemistossa C:\windows\fonts, joten siirretään aluksi sftp-ohjelmalla fonttitiedosto arial.ttf tuosta hakemistosta omaan palvelintilaamme hakemistoon /home/talaakso/shared/fonts/ttf

b) Käännetään TTF-tiedosto SWF-tiedostoksi:


2) Tehdään seuraavaksi Flash-komponintistamme ajettavat PHP-skriptit, jotka generoivat .sc-tiedoston palvelimellemme. Tässä yhteydessä kannattaa ensin käydä läpi tämä sc-tiedosto tutoriaali (huom! Tutoriaaliin kuuluu useita sivuja).

Kasataan sc-tiedoston rakentavat apufunktiot alla olevaan tiedostoon swftools_functions.php:
Tehdään sitten tiedostoon swftools_generate_swf.php SWF-tiedoston palvelimellemme generoiva toiminto:
Oleellisia asioita yllä olevassa PHP-skriptissä ovat

a) SWF-tiedoston generoimiseksi tarvittavan .sc-tiedoston sisältö lisätään string-muuttujaan $xml_string.

b) Muuttujan $xml_string sisältö tallennetaan palvelimelle XML-tiedostoon, joka sitten syötetään swfc-kääntäjälle SWF-tiedoston generoimiseksi.

c) swfc-kääntäjää kutsutaan PHP-funktiolla exec.

Tuolla yllä olevalla PHP-skriptillä (tallennettuna tiedostoon swftools_generate_swf.php) yhdessä funktiotiedoston swftools_functions.php kanssa pystyy siis generoimaan palvelimelleen SWF-tiedoston.



Tarvitsemme kuitenkin vielä toisen PHP-skriptin käyttäjän lähettämän kuvan tallentamiseksi palvelimellemme:
Oleellisia asioita yllä olevassa PHP-skriptissä ovat

a) Skriptissä käytetään apufunktiota createOneThumb käyttäjän antaman kuvan muuttamiseksi Flash-komponenttiin soveltuvaan kokoon. Tämä thumbnails-kuvien tekemistekniikka on selostettu tässä oppaassani .

b) Tiedostot välitetään PHP-skripteihin XHTML:stä tai Flash-komponentista $_FILES-taulukossa.

c) PHP-skripteissä kannattaa yleensä tehdä käyttäjän antamalle syötteelle moninaisia tarkastuksia.

Esim.
Tässä skriptissä on tarkeistettu lähetetyn tiedoston koko (vain alle 0.5 MB sallittu)
Lähetetyn kuvatiedoston tyyppi (vain JPG-kuvat sallittuja):
Käyttäjän antama syöte on siis hyvä tarkistaa ENNEN kuin skripti suorittaa toimintonsa. Jos käyttäjän antama syöte on viallista skriptin on syytä i) tulostaa virhekoodi ja ii) keskeyttää skriptin suoritus vaikkapa die-funktion kutsulla.

d) Palvelimelle lähetetyn tiedoston tallentaminen onnistuu PHP-skriptissä helposti funktiolla move_uploaded_file:
3) Yllä tekemiemme kolmen PHP-tiedoston käyttämiseksi minun tarvitsi koodata alle laittamani AS3-koodi pääaikajanan frameen 1. Lisäksi lisäsin tarvittavat napit, tekstikentät ja MovieClip-objektit oikeilla instance nameilla CS4:n graafisen käyttöliittymän kautta.
Oleellisia asioita yllä olevassa AS3-koodissa ovat

1) Todella kätevä tapa toteuttaa Tooltipsit AS3/Flashiin löytyy tästä .

2) FileReference-luokkaa voidaan käyttää sekä download että upload -dialogien avaamiseen. Tapahtumankäsittelijöidensä kautta FileReference-luokka huolehtii myös tarvittavien PHP-skriptien ajamisesta palvelimella. Tämä Flash Player 10:een liittyvä asia on aina syytä pitää mielessä FileReference-luokkaa käytettäessä.

3) Yksinkertaisten Flash-animaatioiden tekemiseen voi käyttää vaikkapa TweenLitea

4) Kommunikointi Flashin/AS3:n ja palvelimella sijaitsevien tiedostojen (JPG, XML, PHP) hoidetaan yleensä AS3:lla luokkien URLLoader, URLRequest ja URLVariables avulla. Samaa rajapintaa voi siis käyttää varsin erityyppisille tapauksille (kuvanlataaminen, PHP-skriptin suorittaminen).

5) Eräs tapa toteuttaa drag-and-drop -ominaisuus MovieClip-ikkunalle:


Olen yllä olevassa tutoriaalissani esitellyt kolme varteenotettavaa tapaa SWF-generaattorin toteuttamiseksi omalle palvelimelle. Näistä SWFTOOLS-ohjelmien asentaminen omaan palvelintilaan onnistuu myös ilman admin-oikeuksia. Tein myös esimerkin vuoksi oman yksinkertaisen Flash-pohjaisen SWF-generaattorin.

On kuitenkin syytä huomata, että SWFTOOLS:in avulla pystyy toteuttamaan oman SWF-generaattorin myös pelkästään XHTML/JavaScript/PHP -pohjalta täysin ilmaisohjelmienkin avulla. Eli ratkaisu sopii myös harrastelijoille. Lisäksi sc-tiedostojen oma skriptikieli on syntaksiltaan erittäin kompakti, joten se soveltuu myös pienempiin projekteihin.

Toisaalta sc-tiedostojen skriptikielen kompaktius ja erillinen Flex-yhteensopiva (sekä pakettiin kuuluvat muut työkaluohjelmat) as3compile-kääntäjä houkuttelevat käyttämään SWFTOOLS-pakettia myös ammattimaisissa projekteissa...

Takaisin PHP-ohjelmoinnin etusivulle