{"id":234000,"date":"2023-02-26T17:28:00","date_gmt":"2023-02-26T14:28:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=234000"},"modified":"2022-11-11T13:43:54","modified_gmt":"2022-11-11T10:43:54","slug":"luo-ohjelmallisesti-sisaeltoeae-gravity-forms-merkinnoeistae","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/luo-ohjelmallisesti-sisaeltoeae-gravity-forms-merkinnoeistae\/","title":{"rendered":"Luo ohjelmallisesti sis\u00e4lt\u00f6\u00e4 Gravity Forms -merkinn\u00f6ist\u00e4"},"content":{"rendered":"\n<p>T\u00e4m\u00e4 viesti opastaa sinua luomaan kaikenlaista sis\u00e4lt\u00f6\u00e4 (k\u00e4ytt\u00e4ji\u00e4, viestej\u00e4 tai jotain muuta mukautettua) Gravity Forms -lomakkeen merkint\u00f6jen perusteella. Lis\u00e4\u00e4mme j\u00e4rjestelm\u00e4nvalvojan sy\u00f6tt\u00f6tieton\u00e4ytt\u00f6\u00f6n alueen sis\u00e4ll\u00f6n luomiseksi l\u00e4hetettyjen tietojen perusteella.<\/p>\n<h2>Mit\u00e4 teemme<\/h2>\n<p>Luomme uuden metalaatikon Gravity Formin sy\u00f6tt\u00f6tieton\u00e4yt\u00f6lle. T\u00e4h\u00e4n metalaatikkoon lis\u00e4\u00e4mme painikkeen. Ajatuksena on, ett\u00e4 loppuk\u00e4ytt\u00e4j\u00e4 voi tarkistaa merkinn\u00e4n ja jos h\u00e4n hyv\u00e4ksyy merkinn\u00e4n tiedot, h\u00e4n voi painaa painiketta k\u00e4ynnist\u00e4\u00e4kseen sis\u00e4ll\u00f6n luomisen.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151470-61e4cba9a24f2.png\" data-rel=\"lightbox\" ><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151470-61e4cba9a24f2.png\" alt=\"Luo ohjelmallisesti sis\u00e4lt\u00f6\u00e4 Gravity Forms -merkinn\u00f6ist\u00e4\" ><\/a><\/p>\n<p>Koodimme k\u00e4ynnistyy, kun napsautat t\u00e4t\u00e4 painiketta, teemme tarvittavat toiminnot ja valinnaisesti n\u00e4yt\u00e4mme loppuk\u00e4ytt\u00e4j\u00e4lle viestin tuloksesta. Lis\u00e4\u00e4mme my\u00f6s (valinnaisesti) metatiedot merkint\u00e4\u00e4n, jotta voimme helposti tarkistaa, onko t\u00e4st\u00e4 merkinn\u00e4st\u00e4 luotu sis\u00e4lt\u00f6\u00e4 aiemmin vai ei.<\/p>\n<p>Pid\u00e4n koodin melko yksinkertaisena ja yleisen\u00e4, jotta voit helposti korvata ja muokata sit\u00e4 projektisi tarpeiden mukaan. Alla olevassa esimerkiss\u00e4 oletetaan, ett\u00e4 haluamme luoda k\u00e4ytt\u00e4j\u00e4n ohjelmallisesti. Mutta se, mit\u00e4 teet merkint\u00e4tiedoilla, on t\u00e4ysin sinun p\u00e4\u00e4tett\u00e4viss\u00e4si. voit luoda viestin, p\u00e4ivitt\u00e4\u00e4 muuta sis\u00e4lt\u00f6\u00e4 tai l\u00e4hett\u00e4\u00e4 mukautetun s\u00e4hk\u00f6postin, jos haluat.<\/p>\n<h2>Kenttien tunnistaminen<\/h2>\n<p>Ensimm\u00e4inen huomio, joka meid\u00e4n on teht\u00e4v\u00e4, on kent\u00e4t tunnistaminen. Toisin sanoen meid\u00e4n on tiedett\u00e4v\u00e4, mik\u00e4 ala on mit\u00e4. Muista, ett\u00e4 merkinn\u00e4n arvot Gravity Formsissa viittaavat niiden lomakekenttien tunnuksiin. Ja jopa jokaisen lomakekent\u00e4n tietoihin p\u00e4\u00e4syll\u00e4 \u2013 tarvitsemme varman tavan tiet\u00e4\u00e4, mitk\u00e4 kent\u00e4t ovat mit\u00e4kin tietoja. Lomake voi koostua nelj\u00e4st\u00e4 tekstinsy\u00f6t\u00f6st\u00e4 \u2013 meid\u00e4n on tiedett\u00e4v\u00e4, mitk\u00e4 nelj\u00e4st\u00e4 tekstinsy\u00f6t\u00f6st\u00e4 ovat etunime\u00e4 varten.<\/p>\n<p>Sinulla on t\u00e4ss\u00e4 muutamia vaihtoehtoja. Voit koodata kenttien tunnukset (esim. m\u00e4\u00e4ritt\u00e4\u00e4, ett\u00e4 kentt\u00e4tunnus 2 on sukunimi), mutta t\u00e4m\u00e4 on eritt\u00e4in altis virheille, eik\u00e4 sit\u00e4 suositella. Yksinkertainen tapa on k\u00e4ytt\u00e4\u00e4 jotakin Gravity Formsissa olevista kentt\u00e4tietosy\u00f6tteist\u00e4, esimerkiksi CSS-luokan nimi. Muista kuitenkin, ett\u00e4 loppuk\u00e4ytt\u00e4j\u00e4 voi antaa useita luokkien nimi\u00e4 saadakseen haluamansa tyylin, ja koodisi voi helposti katketa, jos et j\u00e4senn\u00e4 t\u00e4t\u00e4 merkkijonoa oikein. Suosittelen ehdottomasti omien mukautettujen sy\u00f6tteiden lis\u00e4\u00e4mist\u00e4 kenttiin:<\/p>\n<p>Jos haluat vankan tavan tunnistaa koodisi kent\u00e4t, tarkista ehdottomasti, miten yll\u00e4 olevasta viestist\u00e4. Mutta pit\u00e4\u00e4kseni asian yksinkertaisena t\u00e4ss\u00e4 viestiss\u00e4, k\u00e4yt\u00e4n CSS-luokkaa ja oletan, ett\u00e4 k\u00e4ytt\u00e4j\u00e4 ei sy\u00f6t\u00e4 mit\u00e4\u00e4n muuta kuin tarvitsemme t\u00e4ll\u00e4 alueella.<\/p>\n<h2>Lomakkeen asettaminen<\/h2>\n<p>Ensimm\u00e4inen vaihe on luonnollisesti lomakkeen m\u00e4\u00e4ritt\u00e4minen tarvitsemillasi kentill\u00e4 ja kentt\u00e4tyypeill\u00e4. Ja sitten lis\u00e4\u00e4t kentt\u00e4tunnisteet niiden oikeisiin paikkoihin. Esimerkkin\u00e4 minulla on t\u00e4m\u00e4 lomake:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151470-61e4cbaa8ac83.png\" data-rel=\"lightbox\" ><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151470-61e4cbaa8ac83.png\" alt=\"Luo ohjelmallisesti sis\u00e4lt\u00f6\u00e4 Gravity Forms -merkinn\u00f6ist\u00e4\" ><\/a><\/p>\n<p>Jokaiselle kentt\u00e4\u00e4n, jonka haluan sis\u00e4llytt\u00e4\u00e4, tarjoan mukautetun CSS-luokan, johon voin kohdistaa koodissani. Esimerkiksi etunimi;<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151470-61e4cbab8f543.png\" data-rel=\"lightbox\" ><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151470-61e4cbab8f543.png\" alt=\"Luo ohjelmallisesti sis\u00e4lt\u00f6\u00e4 Gravity Forms -merkinn\u00f6ist\u00e4\" ><\/a><\/p>\n<p>Siirryt\u00e4\u00e4n nyt koodiin ja toiminnon luomiseen, joka muuntaa l\u00e4hetykset mukautetuksi sis\u00e4ll\u00f6ksi.<\/p>\n<h2>Metalaatikon lis\u00e4\u00e4minen tiedoissa<\/h2>\n<p>Ensimm\u00e4inen askel on jonkinlaisen toimintok\u00e4ynnistimen lis\u00e4\u00e4minen mukautetun sis\u00e4ll\u00f6n luomiseksi. Luonnollinen paikka on sy\u00f6tt\u00f6tieton\u00e4yt\u00f6ss\u00e4. T\u00e4m\u00e4n avulla loppuk\u00e4ytt\u00e4j\u00e4 voi tarkistaa l\u00e4hetetyt arvot ja p\u00e4\u00e4tt\u00e4\u00e4 sitten, luodaanko niist\u00e4 sis\u00e4lt\u00f6\u00e4 vai ei. Gravity Formsin avulla kehitt\u00e4j\u00e4t voivat helposti luoda mukautettuja metalaatikoita n\u00e4ille n\u00e4yt\u00f6ille.<\/p>\n<p>Voimme k\u00e4ytt\u00e4\u00e4 suodatinta luodaksesi mukautetun metalaatikon sy\u00f6tteiden tiedoille <code>gform_entry_detail_meta_boxes<\/code>. Se on suodatin, joka palauttaa joukon kaikkia metalaatikoita n\u00e4ytett\u00e4v\u00e4ksi merkinn\u00e4n tiedoissa. Lis\u00e4\u00e4mme vain uuden taulukkoelementin luodaksemme uuden metalaatikon ja m\u00e4\u00e4rit\u00e4mme takaisinsoittotoiminnon sis\u00e4ll\u00f6n render\u00f6imiseksi. Asetamme kauniin kuvaavan otsikon kohtaan &quot; <code>title<\/code>&quot; ja m\u00e4\u00e4rit\u00e4mme sen sijainnin n\u00e4kyv\u00e4ksi &quot; <code>side<\/code>&quot;.<\/p>\n<pre><code>add_filter('gform_entry_detail_meta_boxes', function($meta_boxes, $entry, $form) {\n    $meta_boxes['awp-create-user-metabox'] = [\n        'title' =&gt; __('Create user from entry', 'awp'),\n        'callback' =&gt; 'awp_gf_create_user_metabox_render',\n        'context' =&gt; 'side'\n    ];\n    return $meta_boxes;\n}, 10, 3);<\/code><\/pre>\n<p>Ja sitten meid\u00e4n on m\u00e4\u00e4ritett\u00e4v\u00e4 takaisinsoittotoiminto: <code>awp_gf_create_user_metabox_render()<\/code>koodissamme. T\u00e4m\u00e4 toiminto vastaa metalaatikon sis\u00e4ll\u00f6n render\u00f6imisest\u00e4. T\u00e4m\u00e4n funktion parametrina saamme joukon argumentteja, joista voimme hakea lomake- ja merkint\u00e4objektin;<\/p>\n<pre><code>function awp_gf_create_user_metabox_render($args) {\n    $form = $args['form'];  \/\/ Form array. Here we find all the fields in $form['fields']\n    $entry = $args['entry'];  \/\/ Entry array. Here we find all values in this current submission\n    $render = '';\n    echo $render;\n}<\/code><\/pre>\n<p>T\u00e4ss\u00e4 toiminnossa meid\u00e4n tarvitsee vain rakentaa HTML-koodia ja toistaa se.<\/p>\n<p>Mit\u00e4 tulee painikkeen lis\u00e4\u00e4miseen toiminnon k\u00e4ynnist\u00e4miseksi, noudatamme samaa menetelm\u00e4\u00e4 kuin Gravity Forms itse tekee sen. Lomake-elementti ymp\u00e4r\u00f6i koko merkint\u00e4tieton\u00e4yt\u00f6n, ja meid\u00e4n tarvitsee vain lis\u00e4t\u00e4 onclick-tapahtuma l\u00e4hetyspainikkeeseen, joka muuttaa <code>action<\/code>ominaisuuden &quot; &quot;. M\u00e4\u00e4rittelemme oman mukautetun toimintonimemme, jotta tied\u00e4mme, milloin se on k\u00e4ynnistetty \u2013 eik\u00e4 se ole ristiriidassa Gravity Formsin toimien kanssa.<\/p>\n<p>Kutsutaan mukautettua toimintoamme <code>awp_gf_create_user<\/code>ja luodaan l\u00e4hetyspainike, jossa on onclick-tapahtuma, kuten n\u00e4in:<\/p>\n<pre><code>function awp_gf_create_user_metabox_render($args) {\n    $form = $args['form'];  \/\/ Form array. Here we find all the fields in $form['fields']\n    $entry = $args['entry'];  \/\/ Entry array. Here we find all values in this current submission\n    $render = '';\n    $action = 'awp_gf_create_user';\n    $render .= sprintf('&lt;input type=\"submit\" value=\"%s\" class=\"button\" onclick=\"jQuery('#action').val('%s');\" \/&gt;', \n        __('Create user', 'awp'), \n        $action\n    );\n    echo $render;\n}<\/code><\/pre>\n<p>Yll\u00e4 olevalla koodilla saamme uuden metalaatikon sy\u00f6tt\u00f6tieton\u00e4yt\u00f6n sivulle, joka n\u00e4ytt\u00e4\u00e4 t\u00e4lt\u00e4:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151470-61e4cba9a24f2.png\" data-rel=\"lightbox\" ><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151470-61e4cba9a24f2.png\" alt=\"Luo ohjelmallisesti sis\u00e4lt\u00f6\u00e4 Gravity Forms -merkinn\u00f6ist\u00e4\" ><\/a><\/p>\n<p>T\u00e4ll\u00e4 hetkell\u00e4 mit\u00e4\u00e4n ei tapahdu, kun nappia painetaan. T\u00e4m\u00e4 johtuu vain siit\u00e4, ett\u00e4 emme ole viel\u00e4 kirjoittaneet koodia sen kuuntelemiseksi.<\/p>\n<h2>Poimitaan arvot merkinn\u00e4st\u00e4<\/h2>\n<p>Kuten aiemmin mainittiin, kaikki sy\u00f6tetaulukossa l\u00e4hetetyt arvot tunnistetaan niiden kentt\u00e4tunnuksilla.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151470-61e4cbad6bcf2.png\" data-rel=\"lightbox\" ><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151470-61e4cbad6bcf2.png\" alt=\"Luo ohjelmallisesti sis\u00e4lt\u00f6\u00e4 Gravity Forms -merkinn\u00f6ist\u00e4\" ><\/a><\/p>\n<p>Yll\u00e4 olevassa kuvassa kent\u00e4n ID 1 on etunimi, ID 2 on sukunimi ja niin edelleen. Mutta odota \u2013 mit\u00e4 tapahtuu versioille 5.1, 5.3 ja niin edelleen? Gravity Formsissa saamme &quot;alatunnukset&quot; erikoiskentt\u00e4\u00e4n, joka hyv\u00e4ksyy useita arvoja. Lis\u00e4sin lomakkeelle osoitekent\u00e4n, joka on yksi kentt\u00e4, mutta useita sy\u00f6tteit\u00e4. Jokainen t\u00e4m\u00e4n kent\u00e4n sy\u00f6te saa omat tunnuksensa, jotka liitet\u00e4\u00e4n p\u00e4\u00e4tunnukseen ja piste. Jos et k\u00e4yt\u00e4 mit\u00e4\u00e4n n\u00e4ist\u00e4 useista sy\u00f6tteist\u00e4 varustetuista kentist\u00e4, hienoa! Koodista tulee todella yksinkertainen. Mutta olen lis\u00e4nnyt t\u00e4m\u00e4n erikoiskent\u00e4n, jotta voimme n\u00e4hd\u00e4, kuinka siihen p\u00e4\u00e4see k\u00e4siksi.<\/p>\n<p>T\u00e4ll\u00e4 hetkell\u00e4 ongelmamme on, ett\u00e4 koodi ei tied\u00e4, mit\u00e4 varten kentt\u00e4tunnus 1, 2 tai 3 on tarkoitettu. N\u00e4m\u00e4 tiedot ovat lomaketaulukossa, tarkemmin sanottuna <code>$form['fields']<\/code>elementiss\u00e4. T\u00e4m\u00e4 elementti sis\u00e4lt\u00e4\u00e4 kaikki lomakkeen kent\u00e4t, ja meill\u00e4 on t\u00e4ysi p\u00e4\u00e4sy jokaiseen kentt\u00e4objektiin. T\u00e4\u00e4lt\u00e4 l\u00f6yd\u00e4mme valitsemamme tunnistusmenetelm\u00e4n; minun esimerkiss\u00e4ni <code>cssClass<\/code>.<\/p>\n<p>Voimme yksinkertaisesti selata n\u00e4it\u00e4 kentti\u00e4 ja etsi\u00e4 tunnisteita, jotka haluamme poimia. Laitan kaikki tunnisteeni taulukkoon ja voimme yksinkertaisesti tarkistaa, onko silmukan kentt\u00e4 yksi n\u00e4ist\u00e4.<\/p>\n<p>Mutta ensin meid\u00e4n on tiedett\u00e4v\u00e4, ett\u00e4 painiketta napsautettiin. T\u00e4m\u00e4 on melko yksinkertainen; voimme yksinkertaisesti tarkistaa, onko mukautettu toimintomme <code>$_POST<\/code>taulukossa. Mutta koska ty\u00f6skentelemme Gravity Formsin kanssa, voimme k\u00e4ytt\u00e4\u00e4 <code>[rgpost](https:\/\/docs.gravityforms.com\/rgpost\/)()<\/code>. Gravity Forms -funktio <code>rgpost()<\/code>yksinkertaisesti palauttaa POST-pyynn\u00f6n arvon. Tarkistetaan <code>rgpost('awp_gf_create_user')<\/code>ja <code>$_POST['awp_gf_create_user']<\/code>on t\u00e4sm\u00e4lleen sama. Mutta k\u00e4yt\u00e4mme Gravity Formsin funktiota.<\/p>\n<pre><code>    ...\n    $render = '';\n    $action = 'awp_gf_create_user';\n\u00a0\n    if (rgpost('action') == $action) {  \/\/ Button was clicked\n        $values = [];\n        \/\/ All identificators\n        $css_classes = ['awp_first_name', 'awp_last_name', 'awp_email', 'awp_address'];\n        foreach ($form['fields'] as $field) {\n            if (in_array($field-&gt;cssClass, $css_classes)) {\n                $values[$field-&gt;cssClass] = $entry[$field-&gt;id];\n            }\n        }\n    }\n    $render .= sprintf('&lt;input type=\"submit\" value=\"%s\" class=\"button\" onclick=\"jQuery('#action').val('%s');\" \/&gt;', \n    ...<\/code><\/pre>\n<p>Rivill\u00e4 <code>#8<\/code>m\u00e4\u00e4rittelemme taulukon, jossa on kaikki mukautetut tunnisteet, joita haluamme etsi\u00e4. N\u00e4m\u00e4 ovat kaikki arvot, jotka olen sy\u00f6tt\u00e4nyt lomakkeelleni CSS-luokkana. Sitten kunkin kent\u00e4n silmukassa tarkistamme, onko kentt\u00e4 jokin n\u00e4ist\u00e4 tunnisteista. Esimerkiss\u00e4ni k\u00e4yt\u00e4n CSS-luokkaa kenttien tunnistamiseen, mutta suosittelen mukautettujen sy\u00f6tteiden k\u00e4ytt\u00f6\u00e4. T\u00e4m\u00e4 koodi ei my\u00f6sk\u00e4\u00e4n toimi, jos useita CSS-luokkia on annettu.<\/p>\n<p>Sitten riville <code>#12<\/code>lis\u00e4\u00e4mme uuden elementin lopullisten arvojen taulukkoomme tunnisteella avaimena. K\u00e4yt\u00e4mme sitten kent\u00e4n tunnusta ja viittaamme sy\u00f6tt\u00f6taulukkoon. T\u00e4m\u00e4n silmukan lopussa <code>$values<\/code>tulee t\u00e4ytt\u00e4\u00e4 kaikki asiaankuuluvat l\u00e4hetetyt arvot. Kaikki kent\u00e4t, jotka j\u00e4tettiin tyhjiksi tai jotka eiv\u00e4t sis\u00e4lly tunnistetaulukkoon, suljetaan pois.<\/p>\n<p>Jos olet lis\u00e4nnyt erityisen usean sy\u00f6tt\u00f6kent\u00e4n, sinun on lis\u00e4tt\u00e4v\u00e4 ylim\u00e4\u00e4r\u00e4inen koodi viittataksesi alatunnuksiin oikein. Tied\u00e4n, ett\u00e4 <code>awp_address<\/code>se on osoitekentt\u00e4tyyppi. Gravity Formsin osoitekentt\u00e4tyypit noudattavat kiinte\u00e4\u00e4 alatunnusten mallia, ja olen ottanut k\u00e4ytt\u00f6\u00f6n vain kolme mahdollista sy\u00f6tett\u00e4 (katuosoitteella 1 on alatunnus 1, postinumerolla alitunnus 3 ja kaupungilla alitunnus 5). T\u00e4llaisten kenttien k\u00e4sittelemiseksi meid\u00e4n on teht\u00e4v\u00e4 jotain t\u00e4m\u00e4n kaltaista:<\/p>\n<pre><code>        ...\n        foreach ($form['fields'] as $field) {\n            if (in_array($field-&gt;cssClass, $css_classes)) {\n                if ($field-&gt;cssClass == 'awp_address') {\n                    $address = $entry[$field-&gt;id.'.1']. ', '. $entry[$field-&gt;id.'.5']. ' '. $entry[$field-&gt;id.'.3'];\n                    $values[$field-&gt;cssClass] = $address;\n                } else {\n                    $values[$field-&gt;cssClass] = $entry[$field-&gt;id];\n                }\n            }\n        }\n        ...<\/code><\/pre>\n<p>Rivill\u00e4 <code>#4<\/code>ketjutan kaikki arvot niin, ett\u00e4 lopullinen merkkijono on standardoitu yksirivinen osoitemuoto (&#8221;, &#8221;).<\/p>\n<p>Meill\u00e4 on nyt kaikki tarvittavat arvot hienosti lajiteltuina tunnisteavainten mukaan taulukossa <code>$values<\/code>. Se, mit\u00e4 teet t\u00e4m\u00e4n kanssa, riippuu t\u00e4ysin sinusta ja projektisi tarpeista. Mutta lis\u00e4\u00e4n esimerkin k\u00e4ytt\u00e4j\u00e4n luomisesta WordPressiss\u00e4.<\/p>\n<h2>Uuden k\u00e4ytt\u00e4j\u00e4n luominen osallistumisen l\u00e4hett\u00e4misest\u00e4<\/h2>\n<p>Pit\u00e4\u00e4kseni koodini puhtaana kutsun erillisen toiminnon, joka vastaa uuden k\u00e4ytt\u00e4j\u00e4n luomisesta. Tarvitsen vain v\u00e4litt\u00e4\u00e4 arvot. Haluan t\u00e4m\u00e4n funktion palauttavan jonkinlaisen osoituksen t\u00e4m\u00e4n toiminnon tuloksesta. T\u00e4ll\u00e4 tavalla voin luoda viestin riippumatta siit\u00e4, onko k\u00e4ytt\u00e4j\u00e4n luominen onnistunut tai onko k\u00e4ytt\u00e4j\u00e4, jolla on annettu s\u00e4hk\u00f6postiosoite, jo olemassa.<\/p>\n<pre><code>        ...\n        foreach ($form['fields'] as $field) {\n            if (in_array($field-&gt;cssClass, $css_classes)) {\n                $address = $entry[$field-&gt;id.'.1']. ', '. $entry[$field-&gt;id.'.5']. ' '. $entry[$field-&gt;id.'.3'];\n                    $values[$field-&gt;cssClass] = $address;\n                } else {\n                    $values[$field-&gt;cssClass] = $entry[$field-&gt;id];\n                }\n            }\n        }\n        $result = awp_gf_create_user($values);\n    }\n    ...<\/code><\/pre>\n<p>Sitten yksinkertaisesti m\u00e4\u00e4rittelemme <code>awp_gf_create_user()<\/code>funktion. Lis\u00e4\u00e4n yksinkertaisen esimerkin k\u00e4ytt\u00e4j\u00e4n luomisesta ohjelmallisesti WordPressiss\u00e4. T\u00e4m\u00e4 on yksinkertaisesti tarkoitettu esimerkkin\u00e4 osoittamaan, kuinka poimittuja arvoja k\u00e4ytet\u00e4\u00e4n.<\/p>\n<p>Tarkistamme ensin, onko k\u00e4ytt\u00e4j\u00e4 jolla on annettu s\u00e4hk\u00f6postiosoite olemassa <code>[get_user_by](https:\/\/developer.wordpress.org\/reference\/functions\/get_user_by\/)()<\/code>. Jos ei, k\u00e4yt\u00e4mme <code>[wp_insert_user](https:\/\/developer.wordpress.org\/reference\/functions\/wp_insert_user\/)()<\/code>k\u00e4ytt\u00e4j\u00e4n lis\u00e4\u00e4miseen. Olen my\u00f6s lis\u00e4nnyt esimerkin mukautetun k\u00e4ytt\u00e4j\u00e4n metatietojen (osoitekentt\u00e4mme) tallentamisesta. Lopuksi menetelm\u00e4mme pit\u00e4isi palauttaa k\u00e4ytt\u00e4j\u00e4n luomisen tulos. Jos k\u00e4ytt\u00e4j\u00e4 oli jo olemassa, palautetaan -1. Muussa tapauksessa palautamme k\u00e4ytt\u00e4j\u00e4tunnuksen.<\/p>\n<pre><code>function awp_gf_create_user($values) {\n    \/\/ Check if user exists\n    $exists = get_user_by('email', $values['awp_email']);\n    if ($exists) {\n        return -1;\n    }\n\u00a0\n    \/\/ Create user\n    $random_password = wp_generate_password(12, false);\n    $user_id = wp_insert_user([\n        'user_email' =&gt; $values['awp_email'],\n        'user_login' =&gt; $values['awp_email'],\n        'user_pass' =&gt; $random_password,\n        'first_name' =&gt; $values['awp_first_name'],\n        'last_name' =&gt; $values['awp_last_name'],\n        'role' =&gt; 'author'\n    ]);\n    \/\/ Optional: custom user meta\n    if ($user_id) {\n        update_user_meta($user_id, 'address', $values['awp_address']);\n    }\n\u00a0\n    \/\/ Return user ID (or WP_Error) back to metabox render function so we can display an appropriate message\n    return $user_id;\n}<\/code><\/pre>\n<p>Takaisin metabox-render\u00f6intiimme voimme nyt ehdollisesti lis\u00e4t\u00e4 viestin loppuk\u00e4ytt\u00e4j\u00e4lle t\u00e4m\u00e4n tuloksen perusteella. T\u00e4m\u00e4 on yksinkertainen esimerkki; jos palautettu arvo oli -1, k\u00e4ytt\u00e4j\u00e4, jolla on annettu s\u00e4hk\u00f6postiosoite, on jo olemassa. Ja jos palautettu arvo oli suurempi kuin 0, tied\u00e4mme, ett\u00e4 se loi k\u00e4ytt\u00e4j\u00e4n onnistuneesti. N\u00e4in ollen kehotamme sanomaan, ett\u00e4 k\u00e4ytt\u00e4j\u00e4n luominen onnistui.<\/p>\n<pre><code>    ...\n    $message = '';\n    if (rgpost('action') == $action) {  \/\/ Button was clicked\n        ...\n        $result = awp_gf_create_user($values);\n        if ($result &gt; 0) {\n            $message = __('User successfully created!', 'awp');\n        } else if ($result == -1) {\n            $message = __('An user by that email already exists!', 'awp');\n        }\n    }\n\u00a0\n    if (!empty($message)) {\n        $render .= '&lt;p&gt;'. $message. '&lt;\/p&gt;';\n    }\n    $render .= sprintf('&lt;input type=\"submit\" value=\"%s\" class=\"button\" onclick=\"jQuery('#action').val('%s');\" \/&gt;', \n    ...<\/code><\/pre>\n<h2>P\u00e4\u00e4llekk\u00e4isen sis\u00e4ll\u00f6n v\u00e4ltt\u00e4minen<\/h2>\n<p>Yll\u00e4 oleva yksinkertainen esimerkki est\u00e4\u00e4 useiden k\u00e4ytt\u00e4jien luomisen samasta merkinn\u00e4st\u00e4, koska se tarkistaa, onko k\u00e4ytt\u00e4j\u00e4 jo olemassa, jolla on annettu s\u00e4hk\u00f6postiosoite. Mutta muissa tapauksissa sinulla ei ehk\u00e4 ole t\u00e4t\u00e4 mahdollisuutta. Toinen strategia, jolla estet\u00e4\u00e4n loppuk\u00e4ytt\u00e4jien luomasta p\u00e4\u00e4llekk\u00e4ist\u00e4 sis\u00e4lt\u00f6\u00e4 samasta merkinn\u00e4st\u00e4, on lis\u00e4t\u00e4 mukautetun merkinn\u00e4n meta. Toisin sanoen; Jos toiminto onnistui, lis\u00e4\u00e4mme t\u00e4h\u00e4n merkint\u00e4\u00e4n mukautetun metan. Ja sitten yksinkertaisesti tarkistamme, onko t\u00e4m\u00e4 mukautettu meta olemassa, ennen kuin aloitamme toiminnon.<\/p>\n<p>Gravity Forms tarjoaa menetelmi\u00e4 mukautetun metan lis\u00e4\u00e4miseksi merkint\u00f6ihin; <code>[gform_add_meta](https:\/\/docs.gravityforms.com\/gform_add_meta\/)()<\/code>sek\u00e4 arvojen hakeminen: <code>[gform_get_meta](https:\/\/docs.gravityforms.com\/gform_get_meta\/)()<\/code>.<\/p>\n<pre><code>    ...\n    $message = '';\n    if (rgpost('action') == $action) {  \/\/ Button was clicked\n        $already_created = gform_get_meta($entry['id'], 'awp_created_user');\n        if ($already_created) {\n            $message = __('You have already created an user from this entry!', 'awp');\n        } else {\n            ...\n            $result = awp_gf_create_user($values);\n            if ($result &gt; 0) {\n                gform_add_meta($entry['id'], 'awp_created_user', $user_id, $form['id']);\n                $message = __('User successfully created!', 'awp');\n            } else if ($result == -1) {\n                $message = __('An user by that email already exists!', 'awp');\n            }\n        }\n    }\n    ...<\/code><\/pre>\n<p>Linjalta <code>#4<\/code>haemme mukautetun merkinn\u00e4n metamme. Jos se oli olemassa (ei tyhj\u00e4), asetamme loppuk\u00e4ytt\u00e4j\u00e4lle viestin, joka ilmoittaa, ett\u00e4 h\u00e4n on jo yritt\u00e4nyt luoda sis\u00e4lt\u00f6\u00e4 t\u00e4st\u00e4 merkinn\u00e4st\u00e4 aiemmin. Jos mukautettua metaa ei ollut olemassa, jatkamme sis\u00e4lt\u00f6mme luomista. Kun sis\u00e4lt\u00f6 on luotu onnistuneesti, meid\u00e4n on lis\u00e4tt\u00e4v\u00e4 mukautettu metatieto merkint\u00e4\u00e4n (rivi <code>#10<\/code>).<\/p>\n<h2>Johtop\u00e4\u00e4t\u00f6s ja lopullinen koodi<\/h2>\n<p>T\u00e4ss\u00e4 viestiss\u00e4 olen yritt\u00e4nyt antaa esimerkin siit\u00e4, kuinka luoda sis\u00e4lt\u00f6\u00e4 Gravity Formsin merkinn\u00e4st\u00e4. Koodiesimerkit on tarkoitettu antamaan sinulle k\u00e4sitys siit\u00e4, miten voit muokata ja muuttaa sit\u00e4 projektisi tarpeiden mukaan. Suosittelen ehdottomasti t\u00e4m\u00e4n toiminnon laajentamista virheilmoitusten k\u00e4sittelemiseksi paremmin. Haluat ehk\u00e4 my\u00f6s lis\u00e4t\u00e4 t\u00e4m\u00e4n metalaatikon vain tietyille lomakkeille. Mutta t\u00e4m\u00e4n pit\u00e4isi olla hyv\u00e4 perusta, jolle rakentaa.<\/p>\n<p>Ja t\u00e4ss\u00e4 lopullinen koodi:<\/p>\n<pre><code>add_filter('gform_entry_detail_meta_boxes', function($meta_boxes, $entry, $form) {\n    $meta_boxes['awp-create-user-metabox'] = [\n        'title' =&gt; __('Create user from entry', 'awp'),\n        'callback' =&gt; 'awp_gf_create_user_metabox_render',\n        'context' =&gt; 'side'\n    ];\n    return $meta_boxes;\n}, 10, 3);\n\u00a0\nfunction awp_gf_create_user_metabox_render($args) {\n    $form = $args['form'];  \/\/ Form array. Here we find all the fields in $form['fields']\n    $entry = $args['entry'];  \/\/ Entry array. Here we find all values in this current submission\n    $render = '';\n    $action = 'awp_gf_create_user';\n\u00a0\n    $message = '';\n    if (rgpost('action') == $action) {  \/\/ Button was clicked\n        $already_created = gform_get_meta($entry['id'], 'awp_created_user');\n        if ($already_created) {\n            $message = __('You have already created an user from this entry!', 'awp');\n        } else {\n            $values = [];\n            \/\/ All identificators\n            $css_classes = ['awp_first_name', 'awp_last_name', 'awp_email', 'awp_address'];\n            foreach ($form['fields'] as $field) {\n                if (in_array($field-&gt;cssClass, $css_classes)) {\n                    if ($field-&gt;cssClass == 'awp_address') {\n                        $address = $entry[$field-&gt;id.'.1']. ', '. $entry[$field-&gt;id.'.5']. ' '. $entry[$field-&gt;id.'.3'];\n                        $values[$field-&gt;cssClass] = $address;\n                    } else {\n                        $values[$field-&gt;cssClass] = $entry[$field-&gt;id];\n                    }\n                }\n            }\n\u00a0\n            $result = awp_gf_create_user($values);\n\u00a0\n            if ($result &gt; 0) {\n                gform_add_meta($entry['id'], 'awp_created_user', $user_id, $form['id']);\n                $message = __('User successfully created!', 'awp');\n            } else if ($result == -1) {\n                $message = __('An user by that email already exists!', 'awp');\n            }\n        }\n    }\n\u00a0\n    if (!empty($message)) {\n        $render .= '&lt;p&gt;'. $message. '&lt;\/p&gt;';\n    }\n    $render .= sprintf('&lt;input type=\"submit\" value=\"%s\" class=\"button\" onclick=\"jQuery('#action').val('%s');\" \/&gt;', \n        __('Create user', 'awp'), \n        $action\n    );\n    echo $render;\n}\n\u00a0\nfunction awp_gf_create_user($values) {\n    \/\/ Check if user exists\n    $exists = get_user_by('email', $values['awp_email']);\n    if ($exists) {\n        return -1;\n    }\n    \/\/ Create user\n    $random_password = wp_generate_password(12, false);\n    $user_id = wp_insert_user([\n        'user_email' =&gt; $values['awp_email'],\n        'user_login' =&gt; $values['awp_email'],\n        'user_pass' =&gt; $random_password,\n        'first_name' =&gt; $values['awp_first_name'],\n        'last_name' =&gt; $values['awp_last_name'],\n        'role' =&gt; 'author'\n    ]);\n    \/\/ Optional: custom user meta\n    if ($user_id) {\n        update_user_meta($user_id, 'address', $values['awp_address']);\n    }\n    \/\/ Return user ID (or WP_Error) back to metabox render function so we can display an appropriate message\n    return $user_id;\n}<\/code><\/pre>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>T\u00e4m\u00e4 viesti opastaa sinua luomaan kaikenlaista sis\u00e4lt\u00f6\u00e4 (k\u00e4ytt\u00e4ji\u00e4, viestej\u00e4 tai jotain muuta mukautettua) Gravity Forms -lomakkeen merkint\u00f6jen perusteella.<\/p>\n","protected":false},"author":1,"featured_media":151471,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[895,895,813,917,917,1110,843,813,843,864,864],"tags":[1166],"class_list":["post-234000","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-koodi","category-laajennuksia","category-muut","category-n-a","category-opetusohjelmia","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/234000","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=234000"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/234000\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/151471"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=234000"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=234000"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=234000"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}