{"id":233476,"date":"2023-02-15T17:07:00","date_gmt":"2023-02-15T14:07:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233476"},"modified":"2022-11-10T23:53:46","modified_gmt":"2022-11-10T20:53:46","slug":"oppitunti-kehittyneen-mukautetun-painovoiman-kenttaetyypin-luominen-ja-useiden-syoettoearvojen-kaesittely","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/oppitunti-kehittyneen-mukautetun-painovoiman-kenttaetyypin-luominen-ja-useiden-syoettoearvojen-kaesittely\/","title":{"rendered":"Oppitunti: Kehittyneen mukautetun painovoiman kentt\u00e4tyypin luominen ja useiden sy\u00f6tt\u00f6arvojen k\u00e4sittely"},"content":{"rendered":"\n<p>T\u00e4ss\u00e4 opetusohjelmassa n\u00e4yt\u00e4n sinulle, kuinka luodaan edistynyt mukautettu Gravity Forms -kentt\u00e4tyyppi. Kent\u00e4ss\u00e4 on useita sy\u00f6tteit\u00e4, ja se vaatii erityisk\u00e4sittely\u00e4 l\u00e4hetettyjen arvojen tallentamiseksi ja n\u00e4ytt\u00e4miseksi.<\/p>\n<h2>Mit\u00e4 teemme<\/h2>\n<p>T\u00e4ss\u00e4 esimerkiss\u00e4 oletan esimerkin WordPress-verkkosivuston omistajasta, joka k\u00e4sittelee lounastoimituksia ty\u00f6paikalla. Omistajalla on lomake, johon ihmiset voivat t\u00e4ytt\u00e4\u00e4, millaisen lounaan he haluavat ja kuinka monta viikon kullekin p\u00e4iv\u00e4lle. T\u00e4m\u00e4 voidaan ratkaista taulukkomaisena tapana sy\u00f6tt\u00e4\u00e4 numero mille tahansa kurssille min\u00e4 tahansa p\u00e4iv\u00e4n\u00e4, jona he haluavat toimituksen.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153179-61e509da5343d.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-153179-61e509da5343d.png\" alt=\"Oppitunti: Kehittyneen mukautetun painovoiman kentt\u00e4tyypin luominen ja useiden sy\u00f6tt\u00f6arvojen k\u00e4sittely\" ><\/a><\/p>\n<p>Kurssit ovat muokattavissa kent\u00e4n asetuksista lomakeeditorissa ja niit\u00e4 voi muuttaa milloin tahansa. Ja jokaisesta lomakkeen l\u00e4hetyksest\u00e4 verkkosivuston omistaja saa t\u00e4ydellisen yleiskatsauksen l\u00e4hetetyist\u00e4 arvoista:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153179-61e509dbe8f8c.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-153179-61e509dbe8f8c.png\" alt=\"Oppitunti: Kehittyneen mukautetun painovoiman kentt\u00e4tyypin luominen ja useiden sy\u00f6tt\u00f6arvojen k\u00e4sittely\" ><\/a><\/p>\n<p>Ilmeisesti t\u00e4m\u00e4 on vain esimerkki, ja sinun on todenn\u00e4k\u00f6isesti mukautettava t\u00e4m\u00e4 tapauksesi mukaan. Mutta t\u00e4m\u00e4n esimerkkitapauksen avulla saamme mahdollisuuden oppia k\u00e4sittelem\u00e4\u00e4n useita sy\u00f6tteit\u00e4 yhdess\u00e4 kent\u00e4ss\u00e4. Sen pit\u00e4isi antaa sinulle ideoita oman mukautetun kentt\u00e4tyypin k\u00e4sittelemiseen.<\/p>\n<h2>Ennen kuin aloitat koodauksen<\/h2>\n<p>Ennen kuin aloitamme, tarvitsemme paikan koodin lis\u00e4\u00e4miseen. Voit lis\u00e4t\u00e4 t\u00e4m\u00e4n teemaasi <code>functions.php<\/code>tai laajennustiedostoosi.<\/p>\n<p>Menetelm\u00e4, jonka olen valinnut, on oliosuuntautunut, mik\u00e4 tarkoittaa luokan luomista, joka laajentaa Gravity Formsin <code>GF_Field<\/code>luokkaa. Suosittelen sijoittamaan luokan erilliseen tiedostoon projektissasi. Sinun tulee my\u00f6s tarkistaa, ett\u00e4 Gravity Forms -laajennus on olemassa, ennen kuin sis\u00e4llyt\u00e4t luokkasi, jotta sivustosi ei kaatuisi.<\/p>\n<p>Jos olet kiinnostunut, voit katsoa <a href=\"https:\/\/docs.gravityforms.com\/gf_field\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Gravity Formsin dokumentaatiota GF_Fieldiss\u00e4<\/a>. L\u00f6yd\u00e4t lis\u00e4\u00e4 toimintoja ja muuttujia, joita saatat tarvita kentt\u00e4tyypille.<\/p>\n<p>Laajentamalla <code>GF_Field<\/code>luokkaa voimme yksinkertaisesti ohittaa funktiot, joita meid\u00e4n on muutettava. Mit\u00e4 tulee toimintoihin, joita emme ohita, Gravity Forms suorittaa oletusarvon, joka on m\u00e4\u00e4ritetty sis\u00e4ll\u00e4 <code>GF_Field<\/code>. Alla olevassa opetusohjelmassa k\u00e4ymme l\u00e4pi jokainen toiminto, joka meid\u00e4n on ohitettava mukautetussa kent\u00e4ss\u00e4mme yksitellen. Sen enemp\u00e4\u00e4 puhumatta, aloitetaan!<\/p>\n<h2>Mukautetun kentt\u00e4tyypin luominen<\/h2>\n<p>Ensimm\u00e4inen vaihe on mukautetun PHP-luokan m\u00e4\u00e4ritt\u00e4minen, joka ulottuu <code>GF_Field<\/code>. Anna luokalle yksil\u00f6llinen nimi ja varmista, ett\u00e4 se sis\u00e4ltyy projektiisi. Luokan m\u00e4\u00e4rittelyn j\u00e4lkeen suoritamme <code>register()<\/code>staattisen funktion <code>GF_Field<\/code>antamalla luokkamme esiintym\u00e4n parametrina. T\u00e4m\u00e4 alustaa luokkamme ja rekister\u00f6i kentt\u00e4tyypin.<\/p>\n<p>Ainoa pakollinen muuttuja, jota tarvitset luokassasi, on <code>$type<\/code>. Luokkamuuttujan <code>$type<\/code>on oltava yksil\u00f6llinen, ja se on kentt\u00e4tyyppisi slug-nimi. Esimerkiss\u00e4ni olen antanut sille nimen &quot; <code>food_delivery<\/code>&quot;.<\/p>\n<pre><code>if (class_exists('GF_Field')) {\n    class FoodDelivery extends GF_Field {\n        public $type = 'food_delivery';\n\u00a0\n        \/\/ The rest of the code is added here...\n    }\n    GF_Fields::register(new FoodDelivery());\n}<\/code><\/pre>\n<p>T\u00e4m\u00e4n pienen koodinp\u00e4tk\u00e4n avulla mukautettu kentt\u00e4tyyppimme tulisi lis\u00e4t\u00e4 Gravity Forms -editorissa k\u00e4ytett\u00e4viss\u00e4 olevaksi valinnaksi. Oletuksena se n\u00e4kyy &quot;Standard Fields&quot; -ruudun lopussa. Koska emme ole viel\u00e4 antaneet kent\u00e4llemme oikeaa nime\u00e4 (se on seuraava vaihe), painike on merkitty arvoksi <code>$type<\/code>.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153179-61e509dd8f563.jpg\" 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-153179-61e509dd8f563.jpg\" alt=\"Oppitunti: Kehittyneen mukautetun painovoiman kentt\u00e4tyypin luominen ja useiden sy\u00f6tt\u00f6arvojen k\u00e4sittely\" ><\/a><\/p>\n<h2>Kent\u00e4n nimen m\u00e4\u00e4ritt\u00e4minen<\/h2>\n<p>Seuraava vaihe on helppo; annamme alallemme paremman nimen. T\u00e4t\u00e4 varten ohitamme funktion <code>get_form_editor_field_title()<\/code>. Meid\u00e4n tarvitsee vain palauttaa merkkijono kent\u00e4n nimell\u00e4.<\/p>\n<pre><code>public function get_form_editor_field_title() {\n    return esc_attr__('Food Delivery', 'txtdomain');\n}<\/code><\/pre>\n<p>T\u00e4ll\u00e4 toiminnolla luokassamme kent\u00e4n lis\u00e4yspainike p\u00e4ivitet\u00e4\u00e4n paljon paremmalla tunnisteella.<\/p>\n<h2>Kent\u00e4n luokan muuttaminen<\/h2>\n<p>T\u00e4m\u00e4 vaihe on valinnainen. Oletuksena mukautettu kentt\u00e4tyyppimme n\u00e4kyy &quot;Standard Fields&quot; -ruudussa, mutta voimme muuttaa sit\u00e4. Oletetaan, ett\u00e4 haluamme sen n\u00e4kyv\u00e4n &quot;Lis\u00e4kent\u00e4t&quot; -ruudussa.<\/p>\n<p>Jos haluat muuttaa luokkaa, jossa haluamme kent\u00e4n n\u00e4kyv\u00e4n, ohitamme toiminnon <code>get_form_editor_button()<\/code>. Meid\u00e4n on palautettava assosiatiivinen taulukko, jossa on kaksi elementti\u00e4. Arvona avaimelle &#8217; <code>group<\/code>&#8217; annat sen kategorian sis\u00e4isen nimen, jossa haluat painikkeen n\u00e4kyv\u00e4n. T\u00e4ss\u00e4 k\u00e4ytett\u00e4viss\u00e4 olevat vaihtoehdot ovat &#8217; <code>standard_fields<\/code>&#8217;, &#8217; <code>advanced_fields<\/code>&#8217;, &#8217; <code>post_fields<\/code>&#8217; tai &#8217; <code>pricing_fields<\/code>&#8217;. (Voit my\u00f6s luoda oman kategorian, mutta sit\u00e4 ei k\u00e4sitell\u00e4 t\u00e4ss\u00e4). Taulukon toinen elementti tarvitsee avaimen &#8217; <code>text<\/code>&#8217; ja sit\u00e4 varten yksinkertaisesti palautamme kent\u00e4n nimen kutsumalla <code>get_form_editor_field_title()<\/code>. T\u00e4m\u00e4 on toiminto, jonka loimme juuri yll\u00e4.<\/p>\n<pre><code>public function get_form_editor_button() {\n    return [\n        'group' =&gt; 'advanced_fields',\n        'text'  =&gt; $this-&gt;get_form_editor_field_title(),\n    ];\n}<\/code><\/pre>\n<p>Nyt painike mukautetun kentt\u00e4tyypin lis\u00e4\u00e4miseksi on siirretty &quot;Lis\u00e4kent\u00e4t&quot; -ruutuun.<\/p>\n<h2>Aktivoidaan kentt\u00e4asetuksia<\/h2>\n<p>Jos olet yritt\u00e4nyt lis\u00e4t\u00e4 kentt\u00e4tyyppi\u00e4 lomakkeeseen, olet ehk\u00e4 huomannut, ett\u00e4 asetuksia ei ole ollenkaan. Et voi edes muokata etiketti\u00e4. T\u00e4m\u00e4 toimii siten, ett\u00e4 kaiken tyyppiset asetukset ovat olemassa, ne on yksinkertaisesti piilotettu CSS:ll\u00e4 Gravity Formsin toimesta. Meid\u00e4n on m\u00e4\u00e4ritett\u00e4v\u00e4 erikseen, mitk\u00e4 asetukset haluamme ottaa k\u00e4ytt\u00f6\u00f6n, ja Gravity Forms n\u00e4ytt\u00e4\u00e4 sitten valitut asetukset puolestamme.<\/p>\n<p>Meid\u00e4n on m\u00e4\u00e4ritett\u00e4v\u00e4 funktio <code>get_form_editor_field_settings()<\/code>ja palautettava joukko kaikkia asetuksia, joita emme halua piilottaa kentt\u00e4tyypille. Se, mitk\u00e4 asetukset haluat lis\u00e4t\u00e4, on t\u00e4ysin sinun ja projektisi p\u00e4\u00e4tett\u00e4viss\u00e4. Muista, ett\u00e4 kent\u00e4n tulee tukea kaikkia aktivoimiasi asetuksia, muuten ei ole mielek\u00e4st\u00e4 n\u00e4ytt\u00e4\u00e4 sille asetusta.<\/p>\n<p>Olen luonut alle pikakatsauksen asetusten nimist\u00e4. T\u00e4m\u00e4 ei ole l\u00e4hesk\u00e4\u00e4n t\u00e4ydellinen luettelo, koska on monia asetuksia, jotka ovat hy\u00f6dyllisi\u00e4 vain hyvin tietyille kentt\u00e4tyypeille. Esimerkiksi puhelinmuoto, p\u00e4iv\u00e4m\u00e4\u00e4r\u00e4\/aikamuoto ja joukko asetuksia, jotka liittyv\u00e4t Posti- ja Hinnoittelu-kenttiin.<\/p>\n<h4>Yleiset-v\u00e4lilehti<\/h4>\n<ul>\n<li>Kent\u00e4n tunniste:<code>label_setting<\/code><\/li>\n<li>Kent\u00e4n kuvaus:<code>description_setting<\/code><\/li>\n<li>Valinnat:<code>choices_setting<\/code><\/li>\n<li>Vaaditaan:<code>rules_setting<\/code><\/li>\n<li>Ei kaksoiskappaleita:<code>duplicate_setting<\/code><\/li>\n<li>Ota sarakkeet k\u00e4ytt\u00f6\u00f6n:<code>columns_setting<\/code><\/li>\n<li>Ota &quot;valitse kaikki&quot; k\u00e4ytt\u00f6\u00f6n:<code>select_all_choices_setting<\/code><\/li>\n<li>Ota &quot;muu&quot; valinta k\u00e4ytt\u00f6\u00f6n:<code>other_choice_setting<\/code><\/li>\n<\/ul>\n<h4>Ulkoasu-v\u00e4lilehti<\/h4>\n<ul>\n<li>Paikanpit\u00e4j\u00e4:<code>placeholder_setting<\/code><\/li>\n<li>Kentt\u00e4tunnisteen n\u00e4kyvyys ja kuvauksen sijainti:<code>label_placement_setting<\/code><\/li>\n<li>Mukautettu vahvistusviesti:<code>error_message_setting<\/code><\/li>\n<li>Mukautettu CSS-luokka:<code>css_class_setting<\/code><\/li>\n<li>Kent\u00e4n koko:<code>size_setting<\/code><\/li>\n<\/ul>\n<h4>Lis\u00e4asetukset-v\u00e4lilehti<\/h4>\n<ul>\n<li>J\u00e4rjestelm\u00e4nvalvojan kent\u00e4n tunniste:<code>admin_label_setting<\/code><\/li>\n<li>Oletusarvo:<code>default_value_setting<\/code><\/li>\n<li>Ota salasanan sy\u00f6tt\u00f6 k\u00e4ytt\u00f6\u00f6n:<code>password_field_setting<\/code><\/li>\n<li>Pakota SSL:<code>force_ssl_field_setting<\/code><\/li>\n<li>N\u00e4kyvyys:<code>visibility_setting<\/code><\/li>\n<li>Salli kent\u00e4n t\u00e4ytt\u00e4minen dynaamisesti:<code>prepopulate_field_setting<\/code><\/li>\n<li>Ota ehdollinen logiikka k\u00e4ytt\u00f6\u00f6n:<code>conditional_logic_field_setting<\/code><\/li>\n<li>Ota sivun ehdollinen logiikka k\u00e4ytt\u00f6\u00f6n:<code>conditional_logic_page_setting<\/code><\/li>\n<\/ul>\n<p>Esimerkiss\u00e4mme t\u00e4rkeimm\u00e4t ovat kent\u00e4n nimi, kuvaus, valinnat ja pakollinen kentt\u00e4 vai ei. Sallimme my\u00f6s CSS-luokan, mukautetun vahvistusviestin ja ehdollisen logiikan asetukset.<\/p>\n<pre><code>public function get_form_editor_field_settings() {\n    return [\n        'label_setting',\n        'choices_setting',\n        'description_setting',\n        'rules_setting',\n        'error_message_setting',\n        'css_class_setting',\n        'conditional_logic_field_setting'\n    ];\n}<\/code><\/pre>\n<p>P\u00e4ivit\u00e4 lomakeeditori, niin sinun pit\u00e4isi nyt n\u00e4hd\u00e4 kaikki valitut asetukset ja v\u00e4lilehdet kent\u00e4ss\u00e4mme. Gravity Forms k\u00e4sittelee ja tallentaa kaikki asetukset automaattisesti.<\/p>\n<p>Mene eteenp\u00e4in ja lis\u00e4\u00e4 joitain kohteita Choices-luetteloon, jotta meill\u00e4 on jotain teht\u00e4v\u00e4\u00e4. T\u00e4ss\u00e4 on mit\u00e4 olen asettanut esimerkiksi:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153179-61e509df36138.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-153179-61e509df36138.png\" alt=\"Oppitunti: Kehittyneen mukautetun painovoiman kentt\u00e4tyypin luominen ja useiden sy\u00f6tt\u00f6arvojen k\u00e4sittely\" ><\/a><\/p>\n<h2>Mukautettujen oletusvalintojen m\u00e4\u00e4ritt\u00e4minen<\/h2>\n<p>Jos olet tottunut k\u00e4ytt\u00e4m\u00e4\u00e4n esim. valintapainikkeita tai valintaruutuja Gravity Formsissa, olet luultavasti huomannut, ett\u00e4 ne ovat t\u00e4ynn\u00e4 valintoja, kuten &quot;First Choice&quot;, &quot;Second Choice&quot;, &quot;Third Choice&quot;. T\u00e4m\u00e4 on Gravity Formsin oletusk\u00e4ytt\u00e4ytyminen, jos valintoja ei ole tallennettu (ennen), ja t\u00e4m\u00e4 laukaisee vain n\u00e4iss\u00e4 tietyiss\u00e4 kentt\u00e4tyypeiss\u00e4. Mutta mukautetun kentt\u00e4tyypin kohdalla valintoja ei t\u00e4ytet\u00e4. T\u00e4m\u00e4 tekee siit\u00e4 hieman hankalia, koska et saa &quot;+&quot; -painiketta lis\u00e4t\u00e4ksesi toista vaihtoehtoa. Sinun on k\u00e4ytett\u00e4v\u00e4 &quot;Joukkolis\u00e4ys \/ ennalta m\u00e4\u00e4ritetyt valinnat&quot; -painiketta, lis\u00e4tt\u00e4v\u00e4 siihen joitain vaihtoehtoja, ja sen j\u00e4lkeen p\u00e4\u00e4set k\u00e4ytt\u00e4m\u00e4\u00e4n &quot;+&quot; -painikkeita vaihtoehtojen lis\u00e4\u00e4miseksi. Mutta on helppo m\u00e4\u00e4ritt\u00e4\u00e4 joitain mukautettuja valintoja \u2013 sinun tarvitsee vain m\u00e4\u00e4ritt\u00e4\u00e4 luokkataulukkomuuttuja<code>public $choices<\/code>ja Gravity Forms luo automaattisesti ennalta m\u00e4\u00e4ritettyj\u00e4 valintoja kentt\u00e4\u00e4n, kun lis\u00e4\u00e4t sen lomakkeihisi.<\/p>\n<p>Huomautus: T\u00e4m\u00e4 on luokkamuuttuja, jonka voit lis\u00e4t\u00e4 luokan yl\u00e4osaan, aivan alle <code>public $type<\/code>. Jokaisen valinnan on oltava taulukko, jossa valinnan on oltava arvo avaimelle &#8217; <code>text<\/code>&#8217;.<\/p>\n<pre><code>public $choices = [\n    [ 'text' =&gt; 'Food Choice 1' ],\n    [ 'text' =&gt; 'Food Choice 2' ],\n    [ 'text' =&gt; 'Food Choice 3' ],\n];<\/code><\/pre>\n<p>Muista, ett\u00e4 jos olet jo lis\u00e4nnyt kent\u00e4n lomakkeeseen, se ei t\u00e4yt\u00e4 valintoja takautuvasti. T\u00e4m\u00e4 tulee voimaan vain, kun lis\u00e4\u00e4t lomakkeeseen uuden kent\u00e4n.<\/p>\n<p><strong>Huomautus<\/strong>: Gravity Formsissa n\u00e4ytt\u00e4\u00e4 olevan mahdollista lis\u00e4t\u00e4 my\u00f6s n\u00e4pp\u00e4imet &#8217; <code>value<\/code>&#8217; jokaiseen valintaan. Mutta en ole saanut t\u00e4t\u00e4 toimimaan \u2013 arvoista tulee automaattisesti samat kuin valintateksti.<\/p>\n<h2>Kent\u00e4n arvon m\u00e4\u00e4ritt\u00e4minen taulukoksi<\/h2>\n<p>Seuraava vaihe on melko yksinkertainen, mutta v\u00e4ltt\u00e4m\u00e4t\u00f6n. Gravity Formsin kenttien oletusarvot ovat merkkijonoja. Arvon on oltava taulukko, koska ty\u00f6skentelemme useiden sy\u00f6tteiden kanssa. T\u00e4t\u00e4 varten m\u00e4\u00e4rittelemme funktion <code>is_value_submission_array()<\/code>ja return <code>true<\/code>.<\/p>\n<pre><code>public function is_value_submission_array() {\n    return true;\n}<\/code><\/pre>\n<p>T\u00e4m\u00e4 varmistaa, ett\u00e4 voimme ty\u00f6skennell\u00e4 oikein useiden sy\u00f6tteidemme sy\u00f6tt\u00e4mien arvojen kanssa.<\/p>\n<h2>Kent\u00e4n tulosteen render\u00f6iminen<\/h2>\n<p>Kun on kyse kent\u00e4n tuotoksen render\u00f6imisest\u00e4, on pari asiaa tiedostettava.<\/p>\n<p>Ensinn\u00e4kin sinun on valittava kahdesta toiminnosta; <code>get_field_input()<\/code>tai <code>get_field_content()<\/code>. Ensimm\u00e4isess\u00e4 menetelm\u00e4ss\u00e4 Gravity Forms render\u00f6i automaattisesti rivitysluetteloelementin, etiketin, kuvauksen ja vahvistuss\u00e4ili\u00f6n virheilmoituksen kentt\u00e4\u00e4n, ja sin\u00e4 hallitset vain sis\u00e4kent\u00e4n tulostetta. Toisella menetelm\u00e4ll\u00e4 t\u00e4t\u00e4 ei tapahdu ja hallitset paremmin kent\u00e4n tulosta. Tarra, kuvaus ja virheilmoitukset on kuitenkin hahmonnettava manuaalisesti. Ensimm\u00e4inen menetelm\u00e4, <code>get_field_input()<\/code>, on t\u00e4ysin hyv\u00e4 useimmissa tapauksissa.<\/p>\n<p>Toinen asia, joka on huomioitava, on, ett\u00e4 kent\u00e4n render\u00f6intitoiminto vaikuttaa kolmeen eri paikkaan. N\u00e4m\u00e4 kolme ovat kent\u00e4n tulosteen render\u00f6inti k\u00e4ytt\u00f6liittym\u00e4ss\u00e4, kent\u00e4n esikatselu lomakeeditorissa ja lopuksi my\u00f6s kentt\u00e4 merkint\u00e4\u00e4 muokatessa. Onneksi Gravity Forms tarjoaa toimintoja, joiden avulla voit helposti m\u00e4\u00e4ritt\u00e4\u00e4, miss\u00e4 n\u00e4kym\u00e4ss\u00e4 olemme. Yleens\u00e4 hahmonnat kent\u00e4n samalla tavalla kaikissa kolmessa tapauksessa. Mutta koska suuren taulukon, jossa on paljon sy\u00f6tteit\u00e4, render\u00f6inti k\u00e4y tarpeettomasti k\u00f6mpel\u00f6lle lomakeeditorissa, olen p\u00e4\u00e4tt\u00e4nyt render\u00f6id\u00e4 kent\u00e4n eri tavalla lomakeeditorissa.<\/p>\n<p>Ja lopuksi meid\u00e4n on varmistettava, ett\u00e4 kaikki sy\u00f6tteet saavat oikean <code>name<\/code>attribuutin, jotta Gravity Forms pystyy ker\u00e4\u00e4m\u00e4\u00e4n arvon lomakkeen l\u00e4hett\u00e4misen yhteydess\u00e4. Kaikki Gravity Formsin sy\u00f6tteet tarvitsevat <code>name<\/code>attribuutteja, jotka noudattavat t\u00e4t\u00e4 s\u00e4\u00e4nt\u00f6\u00e4: <code>name=\"input_{FIELD_ID}\"<\/code>(multiselect kent\u00e4t k\u00e4ytt\u00e4v\u00e4t lis\u00e4tunnusta, mutta meid\u00e4n ei tarvitse huolehtia siit\u00e4 meid\u00e4n tapauksessamme). Meill\u00e4 on p\u00e4\u00e4sy kentt\u00e4tunnukseen, koska se on luokkamuuttuja (alkaen <code>GF_Field<\/code>). Mutta meid\u00e4n tapauksessamme olemme kertoneet Gravity Formsille, ett\u00e4 arvo on taulukko eik\u00e4 yksikk\u00f6arvo (edellinen vaihe), joten lis\u00e4\u00e4mme hakasulkeet nimiattribuutin per\u00e4\u00e4n; <code>name=\"input_{FIELD_ID}[]\"<\/code>. Joten jos kent\u00e4n tunnus on 4 lomakkeen sis\u00e4ll\u00e4, name-attribuutin tulee olla &quot; <code>input_4[]<\/code>&quot;.<\/p>\n<p>Valitsen k\u00e4yt\u00f6n, <code>get_field_input()<\/code>jonka mukana tulee kolme parametria. Ensimm\u00e4inen parametri on lomakeobjekti, jota emme todellakaan tarvitse esimerkiss\u00e4mme. Toinen parametri on nykyinen arvo. T\u00e4m\u00e4 voi olla joko kent\u00e4n arvo, <code>$_POST<\/code>kun lomake yritettiin l\u00e4hett\u00e4\u00e4, mutta se ep\u00e4onnistui. Voimme s\u00e4ilytt\u00e4\u00e4 aiemmat l\u00e4hetetyt arvot. Tai jos toiminto on k\u00e4ynniss\u00e4 merkinn\u00e4n muokkaamisessa, arvo on l\u00e4hetyksest\u00e4 tallennettu arvo. K\u00e4sittelemme arvoa tarkemmin my\u00f6hemmin. Ja kolmas parametri on sy\u00f6tt\u00f6objekti, jota emme my\u00f6sk\u00e4\u00e4n tarvitse esimerkiss\u00e4mme.<\/p>\n<p>Aloitetaan toteuttaminen <code>get_field_input()<\/code>, joka odottaa lopullisen render\u00f6innin merkkijonona. Suoraan lepakkosta p\u00e4\u00e4t\u00e4n palauttaa tyhj\u00e4n merkkijonon, jos olemme lomakeeditorin sis\u00e4ll\u00e4 \u2013 koska en halua hahmontaa koko taulukkoa t\u00e4ss\u00e4 n\u00e4kym\u00e4ss\u00e4. Menetelm\u00e4n <code>$this-&gt;is_form_editor()<\/code>avulla voimme tarkistaa, olemmeko lomakkeen muokkauksen sis\u00e4ll\u00e4. Voit ohittaa t\u00e4m\u00e4n tai tehd\u00e4 jotain muuta, jos haluat esikatselun kent\u00e4st\u00e4 lomakeeditorissa.<\/p>\n<pre><code>public function get_field_input($form, $value = '', $entry = null) {\n    if ($this-&gt;is_form_editor()) {\n        return '';\n    }\n    \/\/ .. Rest of code for frontend and edit entry here...\n}<\/code><\/pre>\n<p>Seuraava vaihe on HTML-koodin rakentaminen taulukolle, joka silmukoi useita p\u00e4ivi\u00e4 sarakkeiden ja kunkin kurssikohteen rivien luomiseksi. Mutta koska tarvitsemme p\u00e4\u00e4syn p\u00e4ivien joukkoon (taulukon sarakkeet) useisiin paikkoihin, meid\u00e4n tulisi m\u00e4\u00e4ritt\u00e4\u00e4 se luokkamuuttujaksi, jolloin se on k\u00e4ytett\u00e4viss\u00e4 kaikista sen sis\u00e4ll\u00e4 olevista funktioista. M\u00e4\u00e4rit\u00e4n luokkamuuttujan <code>$delivery_days<\/code>, joka sis\u00e4lt\u00e4\u00e4 joukon p\u00e4ivi\u00e4, joille haluan tarjota toimitusta.<\/p>\n<pre><code>class FoodDelivery extends GF_Field {\n    public $type = 'food_delivery';\n\u00a0\n    private $delivery_days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'];\n\u00a0\n    public function get_form_editor_field_title() {\n        ...\n}<\/code><\/pre>\n<p>T\u00e4m\u00e4 on vain esimerkki! Haluat ehk\u00e4 hakea sarakkeiden taulukon jostain muualta, jota ei ole koodattu.<\/p>\n<p>Palataan takaisin <code>get_field_input()<\/code>ja rakennetaan taulukko sy\u00f6tteill\u00e4. Ensin silmukan luokkamuuttujan yli ja luon taulukon otsikot. Sitten k\u00e4yn l\u00e4pi Vaihtoehdot-kentt\u00e4\u00e4n sy\u00f6tetyt vaihtoehdot. T\u00e4m\u00e4 on k\u00e4ytett\u00e4viss\u00e4 luokkamuuttujasta (alkaen <code>GF_Field<\/code>) <code>$this-&gt;choices<\/code>. Jokaiselle valinnalle teen sy\u00f6tteen oikealla nimen attribuutilla. Meill\u00e4 on p\u00e4\u00e4sy kent\u00e4n tunnukseen <code>GF_Field<\/code>luokan muuttujasta <code>$this-&gt;id<\/code>.<\/p>\n<pre><code>public function get_field_input($form, $value = '', $entry = null) {\n    if ($this-&gt;is_form_editor()) {\n        return '';\n    }\n\u00a0\n    $id = (int) $this-&gt;id;\n    $table = '&lt;table class=\"delivery-table\"&gt;&lt;tbody&gt;&lt;tr&gt;';\n    $table .= '&lt;th&gt;'. __('Course', 'txtdomain'). '&lt;\/th&gt;';\n    foreach ($this-&gt;delivery_days as $day) {\n        $table .= '&lt;th&gt;'. $day. '&lt;\/th&gt;';\n    }\n    $table .= '&lt;\/tr&gt;';\n\u00a0\n    foreach ($this-&gt;choices as $course) {\n        $table .= '&lt;tr&gt;';\n        $table .= '&lt;td&gt;'. $course['text']. '&lt;\/td&gt;';\n        foreach ($this-&gt;delivery_days as $day) {\n            $table .= '&lt;td&gt;&lt;input type=\"number\" size=\"1\" name=\"input_'. $id. '[]\" \/&gt;&lt;\/td&gt;';\n        }\n        $table .= '&lt;\/tr&gt;';\n    }\n    $table .= '&lt;\/tbody&gt;&lt;\/table&gt;';\n\u00a0\n    return $table;\n}<\/code><\/pre>\n<p>Kun t\u00e4m\u00e4 koodi on paikallaan, meid\u00e4n pit\u00e4isi saada mukava taulukko render\u00f6id\u00e4\u00e4n kentt\u00e4tyypille k\u00e4ytt\u00f6liittym\u00e4\u00e4n! Ilmeisesti HTML on t\u00e4ysin sinun p\u00e4\u00e4tett\u00e4viss\u00e4si, t\u00e4m\u00e4 on vain perusesimerkki.<\/p>\n<p><strong>J\u00e4t\u00e4mme t\u00e4m\u00e4n toiminnon toistaiseksi, mutta palaamme siihen my\u00f6hemmin k\u00e4sittelem\u00e4\u00e4n l\u00e4hetetty\u00e4 arvoa!<\/strong><\/p>\n<h2>S\u00e4ilyt\u00e4 arvo oikein<\/h2>\n<p>T\u00e4ll\u00e4 hetkell\u00e4 Gravity Forms tallentaa kentt\u00e4mme yksiulotteisena taulukkona, joka on t\u00e4ytetty sy\u00f6tetyill\u00e4 arvoilla ja tyhjill\u00e4 merkkijonoilla, joissa sy\u00f6te oli tyhj\u00e4. Ei ole tietoa siit\u00e4, mille p\u00e4iv\u00e4lle tai valinnalle arvo kuuluu, paitsi indeksin. Meid\u00e4n on muutettava t\u00e4m\u00e4 yksiulotteinen taulukko moniulotteiseksi assosiatiiviseksi taulukoksi, johon tallennamme p\u00e4iv\u00e4n ja valintamerkinn\u00e4n. Voimme sitten helposti k\u00e4ytt\u00e4\u00e4 tallennettua numeroarvoa esim <code>$value['Ham sandwich']['Monday']<\/code>.. T\u00e4m\u00e4n taulukkomuunnoksen j\u00e4lkeen meid\u00e4n on my\u00f6s sarjoitava taulukko, jotta Gravity Forms voi tallentaa arvon oikein tietokantaan.<\/p>\n<p>Meid\u00e4n on muutettava t\u00e4m\u00e4 arvotaulukko useaan paikkaan, joten m\u00e4\u00e4rit\u00e4n t\u00e4lle erillisen funktion. Funktio hyv\u00e4ksyy yksiulotteisen taulukon ja muuntaa sen moniulotteiseksi taulukoksi, johon on tallennettu p\u00e4ivien ja valintojen arvot:<\/p>\n<pre><code>private function translateValueArray($value) {\n    if (empty($value)) {\n        return [];\n    }\n    $table_value = [];\n    $counter = 0;\n    foreach ($this-&gt;choices as $course) {\n        foreach ($this-&gt;delivery_days as $day) {\n            $table_value[$course['text']][$day] = $value[$counter++];\n        }\n    }\n    return $table_value;\n}<\/code><\/pre>\n<p>T\u00e4m\u00e4 tallentaa p\u00e4ivien nimet ja valinnat suoraan kent\u00e4n arvon sis\u00e4\u00e4n. T\u00e4ll\u00e4 tavalla valintoja voidaan muuttaa my\u00f6hemmin rikkomatta vanhoja merkint\u00f6j\u00e4.<\/p>\n<p>Siirryt\u00e4\u00e4n nyt l\u00e4hetetyn arvon tallentamista k\u00e4sittelev\u00e4n funktion ohittamiseen; <code>get_value_save_entry()<\/code>. Siin\u00e4 on viisi parametria, mutta tarvitsemme vain ensimm\u00e4isen, joka on l\u00e4hetetty arvo. Toiminnon sis\u00e4ll\u00e4 v\u00e4lit\u00e4mme arvon yll\u00e4 olevaan mukautettuun funktioomme, sarjoimme sen palautuksen ja lopuksi palautamme uuden arvon.<\/p>\n<pre><code>public function get_value_save_entry($value, $form, $input_name, $lead_id, $lead) {\n    if (empty($value)) {\n        $value = '';\n    } else {\n        $table_value = $this-&gt;translateValueArray($value);\n        $value = serialize($table_value);\n    }\n    return $value;\n}<\/code><\/pre>\n<p>T\u00e4ss\u00e4 vaiheessa Gravity Forms tallentaa arvomme onnistuneesti juuri haluamallamme tavalla! Kuitenkin tallennettu arvo on nyt sarjoitettu matriisi, jonka Gravity Forms iloisesti kaikuu suoraan ulos. Meid\u00e4n on otettava k\u00e4ytt\u00f6\u00f6n toimintoja muuttaaksemme sen rumasta sarjoitetusta taulukosta kauniiksi ulostuloksi miss\u00e4 sit\u00e4 tarvitsemme.<\/p>\n<h2>L\u00e4hetetyn arvon n\u00e4ytt\u00e4minen<\/h2>\n<p>On kolme paikkaa, joissa meid\u00e4n on muutettava kentt\u00e4mme arvon tulosta; merkint\u00f6jen luettelo, katsomalla yht\u00e4 merkint\u00e4\u00e4 ja Gravity Formsin yhdist\u00e4mistunnisteiden sis\u00e4ll\u00e4. Yhdist\u00e4mistunnisteita k\u00e4ytet\u00e4\u00e4n yleisimmin s\u00e4hk\u00f6posti-ilmoituksissa. Esimerkiksi <code>{all_fields}<\/code>yhdist\u00e4mistunniste, joka n\u00e4ytt\u00e4\u00e4 kaikki l\u00e4hetetyt lomakkeen arvot s\u00e4hk\u00f6posteissa.<\/p>\n<p>Koska render\u00f6imme saman tulosteen kolmessa eri tapauksessa, on j\u00e4rkev\u00e4\u00e4 tehd\u00e4 sille erillinen funktio. Olen m\u00e4\u00e4ritellyt mukautetun funktion, joka hyv\u00e4ksyy arvon; sarjoittamaton moniulotteinen taulukko parametrina. Funktio rakentaa sitten HTML-koodia, joka n\u00e4ytt\u00e4\u00e4 taulukon kauniilla tavalla ja palauttaa merkkijonon. Olen valinnut sis\u00e4kk\u00e4isen <code>&lt;ul&gt;<\/code>luettelon, mutta voit muuttaa tulosta haluamallasi tavalla.<\/p>\n<pre><code>private function prettyListOutput($value) {\n    $str = '&lt;ul&gt;';\n    foreach ($value as $course =&gt; $days) {\n        $week = '';\n        foreach ($days as $day =&gt; $delivery_number) {\n            if (!empty($delivery_number)) {\n                $week .= '&lt;li&gt;'. $day. ': '. $delivery_number. '&lt;\/li&gt;';\n            }\n        }\n        \/\/ Only add week if there were any requests at all\n        if (!empty($week)) {\n            $str .= '&lt;li&gt;&lt;h3&gt;'. $course. '&lt;\/h3&gt;&lt;ul class=\"days\"&gt;'. $week. '&lt;\/ul&gt;&lt;\/li&gt;';\n        }\n    }\n    $str .= '&lt;\/ul&gt;';\n    return $str;\n}<\/code><\/pre>\n<p>Hienoa, aloitetaan ensimm\u00e4isest\u00e4: merkint\u00f6jen luettelosta: <code>get_value_entry_list()<\/code>. Voit halutessasi tulostaa koko tulosteen t\u00e4\u00e4ll\u00e4, mutta se voi olla melko k\u00f6mpel\u00f6 ja pitk\u00e4 luettelon\u00e4kym\u00e4ss\u00e4, joten olen valinnut yksinkertaisesti palauttamisen kiinte\u00e4n merkkijonon, joka selitt\u00e4\u00e4, ett\u00e4 k\u00e4ytt\u00e4j\u00e4n on ment\u00e4v\u00e4 sy\u00f6tt\u00f6tietoihin n\u00e4hd\u00e4kseen t\u00e4ydellisen yleiskatsauksen.<\/p>\n<pre><code>public function get_value_entry_list($value, $entry, $field_id, $columns, $form) {\n    return __('Enter details to see delivery details', 'txtdomain');\n}<\/code><\/pre>\n<p>T\u00e4m\u00e4 on tietysti t\u00e4ysin sinun p\u00e4\u00e4tett\u00e4viss\u00e4si, voit valita esimerkiksi vain ensimm\u00e4isen x merkkim\u00e4\u00e4r\u00e4n n\u00e4ytt\u00e4misen.<\/p>\n<p>Toinen toiminto on se, joka vaikuttaa yksitt\u00e4isen merkinn\u00e4n n\u00e4kym\u00e4\u00e4n: <code>get_value_entry_detail()<\/code>:<\/p>\n<pre><code>public function get_value_entry_detail($value, $currency = '', $use_text = false, $format = 'html', $media = 'screen') {\n    $value = maybe_unserialize($value);     \n    if (empty($value)) {\n        return '';\n    }\n    $str = $this-&gt;prettyListOutput($value);\n    return $str;\n}<\/code><\/pre>\n<p>Perumme taulukon sarjoituksen WordPress-funktiolla <code>[maybe_unserialize](https:\/\/developer.wordpress.org\/reference\/functions\/maybe_unserialize\/)()<\/code>ja palautamme mukautetun funktiomme merkkijonotulosteen.<\/p>\n<p>Viimeinen toiminto vaikuttaa yhdist\u00e4mistunnisteisiin ja varmista, ett\u00e4 kentt\u00e4mme arvo n\u00e4ytt\u00e4\u00e4 hyv\u00e4lt\u00e4 my\u00f6s s\u00e4hk\u00f6postien sis\u00e4ll\u00e4: <code>get_value_merge_tag()<\/code>.<\/p>\n<pre><code>public function get_value_merge_tag($value, $input_id, $entry, $form, $modifier, $raw_value, $url_encode, $esc_html, $format, $nl2br) {\n    return $this-&gt;prettyListOutput($value);\n}<\/code><\/pre>\n<p>Huomaa, ett\u00e4 meid\u00e4n ei tarvitse peruuttaa t\u00e4m\u00e4n funktion arvoa.<\/p>\n<p>Kun n\u00e4m\u00e4 kolme funktiota ovat paikallaan, kaikkien l\u00e4hetettyjen arvojen pit\u00e4isi n\u00e4ytt\u00e4\u00e4 melko hyvilt\u00e4 kaikkialla! Esimerkiksi kun katselet l\u00e4hetetty\u00e4 merkint\u00e4\u00e4:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153179-61e509dbe8f8c.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-153179-61e509dbe8f8c.png\" alt=\"Oppitunti: Kehittyneen mukautetun painovoiman kentt\u00e4tyypin luominen ja useiden sy\u00f6tt\u00f6arvojen k\u00e4sittely\" ><\/a><\/p>\n<p>Yksi t\u00e4rke\u00e4 asia kuitenkin puuttuu! T\u00e4ss\u00e4 vaiheessa sy\u00f6tteemme eiv\u00e4t s\u00e4ilyt\u00e4 aiemmin l\u00e4hetettyj\u00e4 arvoja ja se on melko huonoa.<\/p>\n<h2>Varmista, ett\u00e4 sy\u00f6tteemme s\u00e4ilytt\u00e4v\u00e4t aiemmin l\u00e4hetetyn arvon<\/h2>\n<p>On p\u00e4\u00e4asiassa kaksi tapausta, joissa meid\u00e4n on varmistettava, ett\u00e4 sy\u00f6tteet s\u00e4ilytt\u00e4v\u00e4t aiemmin l\u00e4hetetyt arvot. Ensimm\u00e4inen tapaus on, kun lomakkeen l\u00e4hetys ep\u00e4onnistui (esimerkiksi k\u00e4ytt\u00e4j\u00e4 unohti pakollisen kent\u00e4n). T\u00e4ll\u00e4 hetkell\u00e4 kaikki sy\u00f6tteemme menett\u00e4v\u00e4t kaikki aiemmin sy\u00f6tetyt arvot ja k\u00e4ytt\u00e4j\u00e4n on sy\u00f6tett\u00e4v\u00e4 kaikki arvot uudelleen. Toiseksi, kun sivuston omistaja muokkaa merkint\u00e4\u00e4, sy\u00f6tteit\u00e4 ei t\u00e4ytet\u00e4 l\u00e4hetetyill\u00e4 arvoilla &#8211; mik\u00e4 tekee arvojen muokkaamisen melko mahdottomaksi.<\/p>\n<p>Korjataksemme t\u00e4m\u00e4n palaamme funktioon <code>get_field_input()<\/code>. T\u00e4m\u00e4n funktion toinen parametri on arvo. Muista kuitenkin, ett\u00e4 t\u00e4m\u00e4 toiminto vaikuttaa sek\u00e4 k\u00e4ytt\u00f6liittym\u00e4n render\u00f6intiin ett\u00e4 merkinn\u00e4n muokkaukseen. T\u00e4m\u00e4 on t\u00e4rke\u00e4\u00e4, koska tallennettu arvo on erilainen n\u00e4iss\u00e4 kahdessa tapauksessa. Jos olemme k\u00e4ytt\u00f6liittym\u00e4ss\u00e4 ja k\u00e4sittelemme lomakkeiden l\u00e4hetyst\u00e4, arvo on aiemmin mainitun yksiulotteisen taulukon muodossa. Ja jos muokkaamme merkint\u00e4\u00e4, arvo on sarjamuotoisen moniulotteisen taulukon muodossa. Joten meid\u00e4n on k\u00e4\u00e4nnett\u00e4v\u00e4 annettu arvo oikein, jotta p\u00e4\u00e4semme <code>get_field_input()<\/code>helposti todellisiin arvoihin.<\/p>\n<pre><code>public function get_field_input($form, $value = '', $entry = null) {\n    if ($this-&gt;is_form_editor()) {\n        return '';\n    }\n\u00a0\n    $id = (int) $this-&gt;id;\n    if ($this-&gt;is_entry_detail()) {\n        $table_value = maybe_unserialize($value);\n    } else {\n        $table_value = $this-&gt;translateValueArray($value);\n    }\n\u00a0\n    $table = '&lt;table class=\"delivery-table\"&gt;&lt;tbody&gt;&lt;tr&gt;';\n    ...\n}<\/code><\/pre>\n<p>Yll\u00e4 olevassa koodissa, ennen kuin alamme luoda HTML-koodia kent\u00e4n tulosteelle, luomme muuttujan <code>$table_value<\/code>, joka sis\u00e4lt\u00e4\u00e4 oikein k\u00e4\u00e4nnetyn arvon. K\u00e4yt\u00e4mme <code>GF_Field<\/code>toimintoa <code>is_entry_detail()<\/code>tarkistaaksemme, muokkaammeko merkint\u00e4\u00e4 vai emme. Ja sitten sy\u00f6tteillemme on helppo p\u00e4\u00e4st\u00e4 k\u00e4siksi oikeisiin arvoihin ja asettaa ne sy\u00f6tteiden <code>value<\/code>attribuutteiksi:<\/p>\n<pre><code>...\nforeach ($this-&gt;delivery_days as $day) {\n    $table .= '&lt;td&gt;&lt;input type=\"number\" size=\"1\" name=\"input_'. $id. '[]\" value=\"'. $table_value[$course['text']][$day]. '\" \/&gt;&lt;\/td&gt;';\n}\n...<\/code><\/pre>\n<p>Kun yll\u00e4 oleva p\u00e4ivitys on tehty, <code>get_field_input()<\/code>kaikki mukautetut sy\u00f6tteemme tulisi aina t\u00e4ytt\u00e4\u00e4 edellisell\u00e4 arvolla; ei ole v\u00e4li\u00e4, onko kyseess\u00e4 merkinn\u00e4n muokkaaminen vai lomakkeen l\u00e4hett\u00e4misen uudelleenyritys.<\/p>\n<p>T\u00e4ss\u00e4 vaiheessa kaikki arvojen render\u00f6imisest\u00e4 ja tallentamisesta on tehty ja toimii t\u00e4ysin. Mutta on viel\u00e4 yksi asia, joka meid\u00e4n on ehdottomasti korjattava.<\/p>\n<h2>Tee kentt\u00e4passistamme &quot;pakollinen&quot; vahvistus<\/h2>\n<p>Gravity Forms tarkistaa, onko kent\u00e4n arvo tyhj\u00e4 vai ei. T\u00e4m\u00e4 on usein tarpeen, kun kentt\u00e4 on asetettu vaaditulla tavalla. Kun kentt\u00e4 on pakollinen, et voi l\u00e4hett\u00e4\u00e4 lomaketta, jos se on tyhj\u00e4, eik\u00f6 niin? Meid\u00e4n ongelmamme on, ett\u00e4 meill\u00e4 on useita sy\u00f6tteit\u00e4 ja haluamme antaa joidenkin niist\u00e4 olla tyhji\u00e4. T\u00e4st\u00e4 tulee ongelma, jos kentt\u00e4mme on asetettu pakolliseksi. Gravity Forms valitettavasti tulkitsee &quot;onko t\u00e4m\u00e4 tyhj\u00e4&quot; v\u00e4\u00e4rin ja vaatii, ett\u00e4 kaikki sy\u00f6tteet on t\u00e4ytett\u00e4v\u00e4. Joten meid\u00e4n on lis\u00e4tt\u00e4v\u00e4 s\u00e4\u00e4nt\u00f6, joka sanoo, ett\u00e4 jos ainakin yksi monista sy\u00f6tteist\u00e4mme on t\u00e4ytetty, kent\u00e4n kokonaisarvo ei ole tyhj\u00e4.<\/p>\n<p>Viimeinen funktio, joka meid\u00e4n on ohitettava luokassamme, on <code>is_value_submission_empty()<\/code>. Saamme vain lomakkeen tunnuksen parametrina t\u00e4lle funktiolle, joten meid\u00e4n on poimittava kent\u00e4n arvo Gravity Forms -funktiolla sen hakemiseksi <code>$_POST<\/code>taulukosta: <code>rgpost('input_&lt;FIELD ID&gt;')<\/code>. Palautuksen pit\u00e4isi olla yksiulotteinen taulukko, jonka olemme n\u00e4hneet aiemmin. Meid\u00e4n tarvitsee vain k\u00e4yd\u00e4 l\u00e4pi taulukon ja palata <code>false<\/code>, jos l\u00f6yd\u00e4mme arvon jostain. Muussa tapauksessa palaamme <code>true<\/code>, koska kent\u00e4n arvo on todellakin t\u00e4ysin tyhj\u00e4.<\/p>\n<pre><code>public function is_value_submission_empty($form_id) {\n    $value = rgpost('input_'. $this-&gt;id);\n    foreach ($value as $input) {\n        if (strlen(trim($input)) &gt; 0) {\n            return false;\n        }\n    }\n    return true;\n}<\/code><\/pre>\n<p>Kun yll\u00e4 oleva toiminto on k\u00e4yt\u00f6ss\u00e4, kentt\u00e4mme ei ep\u00e4onnistu l\u00e4hett\u00e4misess\u00e4, jos se on asetettu pakolliseksi ja v\u00e4hint\u00e4\u00e4n yksi sy\u00f6te on t\u00e4ytetty.<\/p>\n<h2>Johtop\u00e4\u00e4t\u00f6s ja lopullinen koodi<\/h2>\n<p>T\u00e4m\u00e4 opetusohjelma on osoittanut sinulle yksityiskohtaisesti, kuinka voit luoda oman mukautetun edistyneen kentt\u00e4tyypin Gravity Formsille. Vaikka projektisi on erilainen kuin esimerkkini, toivon, ett\u00e4 sinulla on vinkkej\u00e4 ja a-ha:ta matkan varrella. Minusta Gravity Forms -dokumentaatio on joissain tapauksissa melko puutteellinen, ja t\u00e4m\u00e4 on monien yrityksen ja erehdyksen tulos! Joka tapauksessa, toivottavasti t\u00e4st\u00e4 on ollut sinulle hy\u00f6ty\u00e4!<\/p>\n<p>Viitteeksi t\u00e4ss\u00e4 on t\u00e4ydellinen koodi kokonaisuudessaan:<\/p>\n<pre><code>if (class_exists('GF_Field')) {\n    class FoodDelivery extends GF_Field {\n        public $type = 'food_delivery';\n\u00a0\n        public $choices = [\n            [ 'text' =&gt; 'Food Choice 1' ],\n            [ 'text' =&gt; 'Food Choice 2' ],\n            [ 'text' =&gt; 'Food Choice 3' ],\n        ];\n\u00a0\n        private $delivery_days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'];\n\u00a0\n        public function get_form_editor_field_title() {\n            return esc_attr__('Food Delivery', 'txtdomain');\n        }\n\u00a0\n        public function get_form_editor_button() {\n            return [\n                'group' =&gt; 'advanced_fields',\n                'text'  =&gt; $this-&gt;get_form_editor_field_title(),\n            ];\n        }\n\u00a0\n        public function get_form_editor_field_settings() {\n            return [\n                'label_setting',\n                'choices_setting',\n                'description_setting',\n                'rules_setting',\n                'error_message_setting',\n                'css_class_setting',\n                'conditional_logic_field_setting',\n            ];\n        }\n\u00a0\n        public function is_value_submission_array() {\n            return true;\n        }\n\u00a0\n        public function get_field_input($form, $value = '', $entry = null) {\n            if ($this-&gt;is_form_editor()) {\n                return '';\n            }\n\u00a0\n            $id = (int) $this-&gt;id;\n            if ($this-&gt;is_entry_detail()) {\n                $table_value = maybe_unserialize($value);\n            } else {\n                $table_value = $this-&gt;translateValueArray($value);\n            }\n\u00a0\n            $table = '&lt;table class=\"delivery-table\"&gt;&lt;tbody&gt;&lt;tr&gt;';\n            $table .= '&lt;th&gt;'. __('Course', 'txtdomain'). '&lt;\/th&gt;';\n            foreach ($this-&gt;delivery_days as $day) {\n                $table .= '&lt;th&gt;'. $day. '&lt;\/th&gt;';\n            }\n            $table .= '&lt;\/tr&gt;';\n\u00a0\n            foreach ($this-&gt;choices as $course) {\n                $table .= '&lt;tr&gt;';\n                $table .= '&lt;td&gt;'. $course['text']. '&lt;\/td&gt;';\n                foreach ($this-&gt;delivery_days as $day) {\n                    $table .= '&lt;td&gt;&lt;input type=\"number\" size=\"1\" name=\"input_'. $id. '[]\" value=\"'. $table_value[$course['text']][$day]. '\" \/&gt;&lt;\/td&gt;';\n                }\n                $table .= '&lt;\/tr&gt;';\n            }\n\u00a0\n            $table .= '&lt;\/tbody&gt;&lt;\/table&gt;';\n\u00a0\n            return $table;\n        }\n\u00a0\n        private function translateValueArray($value) {\n            if (empty($value)) {\n                return [];\n            }\n            $table_value = [];\n            $counter = 0;\n            foreach ($this-&gt;choices as $course) {\n                foreach ($this-&gt;delivery_days as $day) {\n                    $table_value[$course['text']][$day] = $value[$counter++];\n                }\n            }\n            return $table_value;\n        }\n\u00a0\n        public function get_value_save_entry($value, $form, $input_name, $lead_id, $lead) {\n            if (empty($value)) {\n                $value = '';\n            } else {\n                $table_value = $this-&gt;translateValueArray($value);\n                $value = serialize($table_value);\n            }\n            return $value;\n        }\n\u00a0\n        private function prettyListOutput($value) {\n            $str = '&lt;ul&gt;';\n            foreach ($value as $course =&gt; $days) {\n                $week = '';\n                foreach ($days as $day =&gt; $delivery_number) {\n                    if (!empty($delivery_number)) {\n                        $week .= '&lt;li&gt;'. $day. ': '. $delivery_number. '&lt;\/li&gt;';\n                    }\n                }\n                \/\/ Only add week if there were any requests at all\n                if (!empty($week)) {\n                    $str .= '&lt;li&gt;&lt;h3&gt;'. $course. '&lt;\/h3&gt;&lt;ul class=\"days\"&gt;'. $week. '&lt;\/ul&gt;&lt;\/li&gt;';\n                }\n            }\n            $str .= '&lt;\/ul&gt;';\n            return $str;\n        }\n\u00a0\n        public function get_value_entry_list($value, $entry, $field_id, $columns, $form) {\n            return __('Enter details to see delivery details', 'txtdomain');\n        }\n\u00a0\n        public function get_value_entry_detail($value, $currency = '', $use_text = false, $format = 'html', $media = 'screen') {\n            $value = maybe_unserialize($value);     \n            if (empty($value)) {\n                return $value;\n            }\n            $str = $this-&gt;prettyListOutput($value);\n            return $str;\n        }\n\u00a0\n        public function get_value_merge_tag($value, $input_id, $entry, $form, $modifier, $raw_value, $url_encode, $esc_html, $format, $nl2br) {\n            return $this-&gt;prettyListOutput($value);\n        }\n\u00a0\n        public function is_value_submission_empty($form_id) {\n            $value = rgpost('input_'. $this-&gt;id);\n            foreach ($value as $input) {\n                if (strlen(trim($input)) &gt; 0) {\n                    return false;\n                }\n            }\n            return true;\n        }\n    }\n    GF_Fields::register(new FoodDelivery());\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>Opetusohjelma, jossa n\u00e4ytet\u00e4\u00e4n, kuinka luodaan edistynyt mukautettu Gravity Forms -kentt\u00e4tyyppi, jossa on useita sy\u00f6tteit\u00e4 erityisell\u00e4 k\u00e4sittelyll\u00e4 arvojen tallentamista ja n\u00e4ytt\u00e4mist\u00e4 varten.<\/p>\n","protected":false},"author":1,"featured_media":153180,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[895,895,813,1110,843,803,803,813,843,864,864],"tags":[1166],"class_list":{"0":"post-233476","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-koodi","9":"category-laajennuksia","10":"category-n-a","11":"category-opetusohjelmia","12":"category-php-5","16":"category-wordpress-5","18":"tag-affiai-fi"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/233476","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=233476"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/233476\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/153180"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=233476"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=233476"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=233476"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}