Word dokumentum generálása adatkötéssel – 3. rész: Kontroll

Bár a Word 2007 preferált fájlformátuma a DOCX teljes mértékben nyitott és XML alapú, elmondhatjuk, hogy a tartalom programozott közvetlen előállítása mégsem igazán egyszerű, mert az adat és a megjelenítés erősen keveredik a WordML nyelvben. Már a Word 2003-ban megjelent az a lehetőség, hogy a dokumentumhoz XSD sémát rendelhetünk, amely alapján a szöveg egyes részeit nyers XML-ben exportálhatjuk, de sajnos ez nem teszi lehetővé a tartalom generálását, ahogyan azt korábban láttuk.

Szerencsére ezen kívül van egy harmadik XML alapú lehetőség is, amely a Word 2007-tel vált elérhetővé.

2. Structured document tags

A Word 2007 vezette be az ún. content control vezérlőket vagy más néven a structured document tag-eket, azaz SDT-ket (ez borzasztóan magyartalanul hangzik, de sajnos nem tudom, hogy mi lett a magyar terminológia 😦 ). A módszer lényege, hogy a dokumentum egyes részeibe nem csak passzív helyőrzőket, hanem aktív vezérlőket teszünk, melyek tartalma a dokumentumban tárolt (ugyebár ZIP fájlról van szó) XML fájlhoz kapcsolódik.

Ha bekapcsoljuk a Developer fület, a Controls csoportban találjuk ezeket a vezérlőket:

Vezérlők a Developer fülön

Összesen 7 féle létezik:

  • Rich Text
  • Text
  • Picture
  • Combo Box
  • Drop-Down List
  • Date Picker
  • Building Block Gallery

A nevek magukért beszélnek. Ha ugyanebben a csoportban átkapcsolunk Design Mode-ba, beszúrhatjuk ezeket a vezérlőket a dokumentumunk szövegébe. Például ha szükséges, hogy a felhasználók megadjanak egy dátumot, amely mondjuk egy szerződés keltét jelzi, beszúrhatunk egy Date Picker vezérlőt, amely így fog megjelenni:

Date Picker

Fontos tehát, hogy aktív vezérlőről van szó, amely nem csak a fejlesztők, hanem a felhasználók számára is megkönnyíti a munkát. A szalagon a Properties gombra kattintva még egy beállító ablakot is kapunk:

Date Picker Properties

Két fontos opció elérhető minden vezérlőnél:

  • A Title mezőben megadott érték megjelenik a felhasználóknak, közvetlenül a vezérlő felett, ezt tehát érdemes barátságosan kitölteni:

Title értéke

  • A Tag mezőben megadott érték a felhasználói felületen nem jelenik meg, ez nekünk fejlesztőknek lehet hasznos.

Az így beállított vezérlő egy w:sdt elem formájában mentődik el a document.xml fájlba:

    <w:sdt>
        <w:sdtPr>
            <w:rPr>
                <w:lang w:val="en-US"/>
            </w:rPr>
            <w:alias w:val="Szerződés dátuma"/>
            <w:tag w:val="SzerzodesDatum"/>
            <w:id w:val="107276272"/>
            <w:placeholder>
                <w:docPart w:val="DefaultPlaceholder_22675705"/>
            </w:placeholder>
            <w:showingPlcHdr/>
            <w:date>
                <w:dateFormat w:val="yyyy.MM.dd."/>
                <w:lid w:val="hu-HU"/>
                <w:storeMappedDataAs w:val="dateTime"/>
                <w:calendar w:val="gregorian"/>
            </w:date>
        </w:sdtPr>
        <w:sdtContent>
            <w:r w:rsidRPr="005B7BC2">
                <w:rPr>
                    <w:rStyle w:val="PlaceholderText"/>
                    <w:lang w:val="en-US"/>
                </w:rPr>
                <w:t>Click</w:t>
            </w:r>
            <w:proofErr w:type="gramEnd"/>
            <w:r w:rsidRPr="005B7BC2">
                <w:rPr>
                    <w:rStyle w:val="PlaceholderText"/>
                    <w:lang w:val="en-US"/>
                </w:rPr>
                <w:t xml:space="preserve"> here to enter a date.</w:t>
            </w:r>
        </w:sdtContent>
    </w:sdt>

A w:sdtPr a properties, azaz a tulajdonságokra vonatkozó rész, a w:sdtContent pedig a felhasználó által megadott tartalom. A tulajdonságok között megtaláljuk a korábban megadott alias és tag értékeket. Itt található még a w:showingPlcHdr elem is, amely megmutatja, hogy a w:sdtContent részben nem a felhasználó által megadott érték, hanem még az alap helyőrző, placeholder szerepel. A w:date elembe a Date Picker vezérlőre vonatkozó egyedi beállításokat menti a Word.

Az w:sdtContent elem most elég bonyolultnak tűnik, de már értjük, hogy miért: run elemeket tartalmaz, mert arra lehet formázási beállításokat megadni. Ha a felhasználó kiválaszt egy dátumot, mindez sokkal átláthatóbb lesz, marad a nyers text:

    <w:sdtContent>
        <w:r w:rsidR="001B1478">
            <w:t>2008.04.15.</w:t>
        </w:r>
    </w:sdtContent>

Mi az, amit tehát ezzel elértünk? Definiáltuk, hogy a dokumentum fontos részein milyen formátumú tartalomnak kell megjelennie és a felhasználó által megadott adatot úgy perzisztáltuk WordML-ben, hogy az a megjelenítéstől teljesen független, ráadásul a korábbiaknál egyszerűbben található meg programozottan a dokumentumban.

A jó hír az, hogy még arra sincs szükség, hogy a Word által generált XML-ben w:sdt elemeket keresgéljünk, ugyanis ezeknek a vezérlőknek a tartalmát adatkötésen keresztül is elérhetjük.

(folytatjuk)

Leave a comment