Odoslanie InfoPath formulára e-mailom

Publikoval Michal Kočí dňa 5.5.2007 o 22:24 v kategórii InfoPath

Jeden zo spôsobov ako odoslať InfoPath formulár je, ako som spomenul v príspevku Možnosti odoslania InfoPath formulára a použitie Universal Data Connection, e-mailom. V tomto príspevku ukážem ako odoslať formulár e-mailom ako telo správy a upozorním na zopár drobností (ako inak nikde nedokumentovaných), ktoré je potrebné mať na pamäti ak Váš formulár chcete umožniť odoslať e-mailom. A toto odoslanie e-mailom vôbec nemusí byť primárny cieľ formulára ale druhotný.

Jeden z formulárov, na ktorých som v poslednej dobe pracoval mal byť publikovaný do knižnice dokumentov v MOSS servery. To sa dá spraviť veľmi jednoducho. Navyše však bola požiadavka, aby formulár obsahoval tlačidlo, ktoré pošle mail, HTML mail ktorého telo bude samotný formulár, na všetky adresy, ktoré budú zadávané užívateľom počas vypĺňania.

Úplný základ je, aby ste pripravili dizajn formulára a ak potrebujete odosielať e-mail viacerým užívateľom ktorých adresy vopred neviete, potom na formulár umiestnite Repeating Section a v nej majte textové pole pre zadanie emailovej adresy. Vyzerať by to mohlo napríklad takto (vrátane tlačidla na odoslanie):

Podľa toho sa Vám vygeneruje aj zopár elementov v hlavnom dátovom zdroji. Problém je, že keď chcete odoslať formulár e-mailom vstavanou funkcionalitou, potom táto Vám povolí použiť ako zdroj To poľa odoslania e-mailu iba jeden element dátového zdroja. Ak by ste aj ukázali na element ktorý je v opakujúcej sa skupine, potom by sa e-mail aj tak odoslal len na prvú adresu. Riešením je vytiahnuť si adresy zo všetkých položiek v opakujúcej sa sekcii kódom a naplniť ich iba do jedného neopakujúceho sa elementu. Časť Vášho dátového zdroja potom môže vyzerať nasledovne:

Všimnite si na dátovom zdroji AttendeeEmailAddress v opakujúcej sa skupine Attendee. A všimnite si tiež neopakujúci sa element EmailAddress, do tohto kódom naplníme všetky vyzbierané adresy oddelené bodkočiarkou. A to v obsluhe udalosti stlačenia tlačidla.

Pripravíme si vlasnosť EmailAddresses, ktorú budeme kontrolovať pred samotným odoslaním. Ak bude prázdna, tak dátové spojenie nespustíme aby zbytočne nevyhodilo chybu:

public string EmailAddresses
{
    get { return (string)FormState["EmailAddresses"]; }
    set { FormState["EmailAddresses"] = value; }
}

A metódu, ktorá nám adresy zlúči do jedného reťazca a naplní element EmailAddresses:

public void ProcessEmailAddresses()
{
    XPathNavigator doc = MainDataSource.CreateNavigator();
    XPathNavigator email;

    XPathNodeIterator iterator = doc.Select("/my:DataFields/my:Attendees/my:Attendee", NamespaceManager);

    List addresses = new List();
    while (iterator.MoveNext())
    {
        email = iterator.Current.SelectSingleNode("my:AttendeeEmailAddress", NamespaceManager);
        addresses.Add(email.Value);
    }

    if (addresses.Count > 0)
    {
        EmailAddresses = string.Join(";", addresses.ToArray());
    }

    email = doc.SelectSingleNode("/my:DataFields/my:EmailAddresses", NamespaceManager);
    email.SetValue(EmailAddresses);
}

V nej jednoducho iterujeme adresu po adrese a pridávame ich do zoznamu. Na konci potom položky zoznamu necháme spojiť oddelovačom - bodkočiarkou.

Následne si pridáme nové spojenie (Data connection). V menu Tools vyberieme Data Connections, a v dialógu zvolíme Add. Vyberieme si, že chceme vytvoriť nové spojenie a že toto bude typu Submit:

V ďaľšom kroku si vyberieme, že chceme odoslať ako e-mailovú správu:

V nasledujúcom kroku kliknite na tlačidlo fx vedľa poľa To. Zobrazí sa Vám dialóg na zadanie funkcie alebo výber dátového elementu:

Kliknite na Insert Field or Group a v nasledovnom dialógu si vyberte element, kde máte uloženú e-mailovú adresu / e-mailové adresy. V tomto prípade je to element EmailAddresses. Ešte raz zopakujem, že snaha o zadanie elementu v opakujúcej sa sekcii vyústi v to, že InfoPath si z opakujúcej sekcie vezme iba prvú položku.

Dialógy potvrďte a posuňte sa v spievodcovi na ďaľší krok, kde si vyberte, že chcete odoslať iba aktuálny pohľad:

V poslednom kroku si dátové spojenie pomenujte a sprievodcu ukončite. Meno dátového spojenia budete ešte potrebovať, aby ste ho mohli spustiť z kódu, takže si ho zapamätajte.

Keď ste späť vo formulári, musíte ešte pridať obsluhu stlačenia tlačidla. Kliknite pravým tlačidlom na tlačidlo a z kontextového menu vyberte položku Button Properties. V dialógovom okne vlastností tlačidla si tlačidlo nejak pomenujte (nastavte jeho ID) a kliknite na tlačidlo Edit Form Code:

Vygenerovanú metódu potom zmodifikujte napríklad nasledovne:

public void SendByEmail_Clicked(object sender, ClickedEventArgs e)
{
        ProcessEmailAddresses();
        if (EmailAddresses.Length > 0)
        {
            DataConnections["Email Submit"].Execute();
        }
}

Teda, ako prvé spustite metódu ProcessEmailAddresses a následne ak vlastnosť EmailAddresses nie je prázdna, teda ak bol zadaný aspoň jeden príjemca tak spustite dátové spojenie.

Na tomto mieste sa hodí poznámka, že InfoPath formulár ak beží ako webový, tak používa nastavenie odosielania e-mailu zo SharePointu, preto sa predvedčte že máte správne nakonfigurovaný SMTP server a že tento umožňuje odosielať e-maily na všetky adresy, ktoré do formulára môže užívateľ zadať. Ja som s týmto strávil pekných pár desiatok minút, než som došiel na to, že na vývojovom servery sa nikto nenamáhal v SharePointe nakonfigurovať SMTP funkcionalitu a tým pádom sa ani nenamáhal nakonfigurovať (lepšie povedané ani nainštalovať) SMTP server - tak to vyzerá keď sa k vývojovému týmu pridáte až v polovici projektu. Takže toto si istotne skontrolujte ak Vám odosielanie nebude fungovať.

A je to. Funkcionalitu máte, na čo si však istotne dajte pozor pri dizajnovaní formulára je: Pre určovanie šírky ovládacích prvkov na formulári sa snažte používať rozmery zadané v bodoch a nie v percentách. Ak použijete percentá (obľúbené je nastaviť textovému poľu v bunke tabuľky šírku 100%), potom sa nedivte, keď Vám formulár príde e-mailom "rozbitý".

Navyše, kód ošetrujúci udalosť stlačenia tlačidla by bolo vhodné obaliť try-catch blokom, pretože v prípade problémov by užívatelia dostali nepeknú a možno aj nepresnú chybovú hlášku. Je lepšie im namiesto nej zobraziť nejakú príjemnejšiu formu chybovej hlášky, ale o tom bude až ďaľší príspevok.

Pre užívateľa bude isto príjemné, ak e-mailová adresu bude pred odoslaním validovaná, aby neobsahovala chybnú adresu. Preto si kliknite pravým tlačidlom na Text Box ktorý slúži na zadávanie adresy a z kontextového menu vyberte položku Text Box Properties. V zobrazenom dialógu kliknite na tlačidlo Data Validation:

V zobrazenom dialógu si kliknite na Add a v ďaľšom dialógu zadajte validačnú podmienku, ktorá zobrazí správu, že e-mailová adresa je neplatná ak sa hodnota elementu do ktorého sa píše e-mailová adresa nerovná vzoru (pattern) - does not match pattern. Pattern je jednoducho regulárny výraz a na internete ich na overenie emailovej adresy nájdete veľmi veľa, mne sa osvedčil nasledovný, ktorý kontroluje či je hodnota platná emailová adresa ale za valídne považuje aj ak je pole nevyplnené (nie vždy v mojom formulári chcú užívateľia využiť odosielanie e-mailom):

(([\w\-\.]+)@((\[([0-9]{1,3}\.){3}[0-9]{1,3}\])|(([\w\-]+\.)+)([a-zA-Z]{2,4}))){0,1}

Takže, zostaňte naladený, nabudúce sa pozriem v skratke na jednu z možností ako užívateľovi zobraziť chybovú hlášku v user-friendly podobe.

Mohlo by ťa tiež zaujímať

Páčil sa ti príspevok?

Zdieľaj príspevok alebo si ho odlož na neskôr

Sleduj ma

Ak nechceš premeškať príspevky ako je tento, sleduj ma na Twitteri, alebo ak máš RSS čítačku, môžeš sledovať môj RSS kanál.