{"id":233489,"date":"2023-02-15T17:29:00","date_gmt":"2023-02-15T14:29:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233489"},"modified":"2022-11-10T23:58:25","modified_gmt":"2022-11-10T20:58:25","slug":"opetus-taepsemate-kohandatud-gravitatsioonivormide-vaeljatueuebi-loomine-ja-mitme-sisendvaeaertuse-kaesitlemine","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/opetus-taepsemate-kohandatud-gravitatsioonivormide-vaeljatueuebi-loomine-ja-mitme-sisendvaeaertuse-kaesitlemine\/","title":{"rendered":"\u00d5petus: t\u00e4psemate kohandatud gravitatsioonivormide v\u00e4ljat\u00fc\u00fcbi loomine ja mitme sisendv\u00e4\u00e4rtuse k\u00e4sitlemine"},"content":{"rendered":"\n<p>Selles \u00f5petuses n\u00e4itan teile, kuidas luua t\u00e4psemat kohandatud gravitatsioonivormide v\u00e4ljat\u00fc\u00fcpi. V\u00e4ljal on mitu sisendit ja see vajab esitatud v\u00e4\u00e4rtuste salvestamiseks ja kuvamiseks spetsiaalset k\u00e4sitsemist.<\/p>\n<h2>Mida me teeme<\/h2>\n<p>Selles n\u00e4ites eeldan n\u00e4idet WordPressi veebisaidi omanikust, kes tegeleb l\u00f5unas\u00f6\u00f6gi kohaletoimetamisega t\u00f6\u00f6kohas. Omanikul on ankeet, kus inimesed saavad t\u00e4ita, millist l\u00f5unas\u00f6\u00f6ki nad soovivad ja kui palju igaks n\u00e4dalap\u00e4evaks. Seda saab lahendada tabelitaolise meetodina, mille abil sisestatakse mis tahes kursuse arv igal p\u00e4eval, mida nad soovivad edastada.<\/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=\"\u00d5petus: t\u00e4psemate kohandatud gravitatsioonivormide v\u00e4ljat\u00fc\u00fcbi loomine ja mitme sisendv\u00e4\u00e4rtuse k\u00e4sitlemine\" ><\/a><\/p>\n<p>Kursused on vormiredaktoris v\u00e4lja seadistustes redigeeritavad ja neid saab igal ajal muuta. Ja iga vormi esitamise kohta saab veebisaidi omanik t\u00e4ieliku \u00fclevaate esitatud v\u00e4\u00e4rtustest:<\/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=\"\u00d5petus: t\u00e4psemate kohandatud gravitatsioonivormide v\u00e4ljat\u00fc\u00fcbi loomine ja mitme sisendv\u00e4\u00e4rtuse k\u00e4sitlemine\" ><\/a><\/p>\n<p>Ilmselgelt on see vaid n\u00e4ide ja t\u00f5en\u00e4oliselt peate seda oma juhtumiga kohandama. Kuid selle n\u00e4ite puhul saame v\u00f5imaluse \u00f5ppida, kuidas k\u00e4sitleda mitut sisendit \u00fchel v\u00e4ljal. See peaks andma teile ideid, kuidas oma kohandatud v\u00e4ljat\u00fc\u00fcpi k\u00e4sitleda.<\/p>\n<h2>Enne kodeerimise alustamist<\/h2>\n<p>Enne alustamist vajame koodi lisamise kohta. Saate selle lisada oma teemasse <code>functions.php<\/code>v\u00f5i pistikprogrammi faili.<\/p>\n<p>Meetod, mille valisin, on objektorienteeritud, mis t\u00e4hendab klassi loomist, mis laiendab Gravity Formsi <code>GF_Field<\/code>klassi. Soovitan panna klassi oma projektis eraldi faili. Saidi kokkujooksmise v\u00e4ltimiseks peaksite enne klassi kaasamist kontrollima ka Gravity Formsi pistikprogrammi olemasolu.<\/p>\n<p>Kui olete huvitatud, v\u00f5ite vaadata <a href=\"https:\/\/docs.gravityforms.com\/gf_field\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Gravity Formsi dokumentatsiooni saidil GF_Field<\/a>. Siit leiate rohkem funktsioone ja muutujaid, mida v\u00f5ite oma v\u00e4ljat\u00fc\u00fcbi jaoks vajada.<\/p>\n<p>Klassi laiendamisega <code>GF_Field<\/code>saame lihtsalt valida, kas t\u00fchistada funktsioonid, mida peame muutma. Mis puutub funktsioonidesse, mida me ei alista, siis Gravity Forms k\u00e4ivitab sees m\u00e4\u00e4ratletud vaikev\u00e4\u00e4rtused <code>GF_Field<\/code>. Allolevas \u00f5petuses k\u00e4sitleme \u00fckshaaval iga funktsiooni, mille peame oma kohandatud v\u00e4lja jaoks alistama. Ilma pikema jututa alustame!<\/p>\n<h2>Kohandatud v\u00e4ljat\u00fc\u00fcbi loomine<\/h2>\n<p>Esimene samm on kohandatud PHP klassi m\u00e4\u00e4ratlemine, mis laieneb <code>GF_Field<\/code>. Andke klassile kordumatu nimi ja veenduge, et see oleks teie projekti kaasatud. P\u00e4rast klassi m\u00e4\u00e4ratlust k\u00e4ivitame <code>register()<\/code>staatilise funktsiooni, <code>GF_Field<\/code>edastades parameetrina meie klassi eksemplari. See initsialiseerib meie klassi ja registreerib v\u00e4lja t\u00fc\u00fcbi.<\/p>\n<p>Ainus n\u00f5utav muutuja, mida oma klassi sees vajate, on <code>$type<\/code>. Klassi muutuja <code>$type<\/code>peab olema kordumatu ja see on teie v\u00e4ljat\u00fc\u00fcbi n\u00e4pun\u00e4ide. Oma n\u00e4ites panin sellele nimeks &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>Selle v\u00e4ikese koodil\u00f5igu abil tuleks meie kohandatud v\u00e4ljat\u00fc\u00fcp lisada Gravity Forms redaktoris saadaoleva valikuna. Vaikimisi kuvatakse see kasti &quot;Standardv\u00e4ljad&quot; l\u00f5pus. Kuna me pole veel oma v\u00e4ljale \u00f5iget nime andnud (see on j\u00e4rgmine samm), on nupp t\u00e4histatud v\u00e4\u00e4rtusena <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=\"\u00d5petus: t\u00e4psemate kohandatud gravitatsioonivormide v\u00e4ljat\u00fc\u00fcbi loomine ja mitme sisendv\u00e4\u00e4rtuse k\u00e4sitlemine\" ><\/a><\/p>\n<h2>V\u00e4lja nime m\u00e4\u00e4ramine<\/h2>\n<p>J\u00e4rgmine samm on lihtne; lihtsalt andes meie valdkonnale parema nime. Selleks alistame funktsiooni <code>get_form_editor_field_title()<\/code>. Peame vaid tagastama stringi v\u00e4lja nimega.<\/p>\n<pre><code>public function get_form_editor_field_title() {\n    return esc_attr__('Food Delivery', 'txtdomain');\n}<\/code><\/pre>\n<p>Selle funktsiooniga meie klassis v\u00e4rskendatakse v\u00e4lja lisamise nuppu palju parema sildiga.<\/p>\n<h2>V\u00e4lja kategooria muutmine<\/h2>\n<p>See samm on valikuline. Vaikimisi kuvatakse meie kohandatud v\u00e4ljat\u00fc\u00fcp kastis \u201eStandardsed v\u00e4ljad&quot;, kuid me saame seda muuta. Oletame, et tahame, et see ilmuks kastis \u201eT\u00e4psemad v\u00e4ljad&#8221;.<\/p>\n<p>Kategooria muutmiseks, milles v\u00e4lja kuvatakse, alistame funktsiooni <code>get_form_editor_button()<\/code>. Peame tagastama kahe elemendiga assotsiatiivse massiivi. V\u00f5tme v\u00e4\u00e4rtusena <code>group<\/code>esitate selle kategooria sisemise nime, milles soovite nuppu kuvada. Siin on saadaval valikud &quot; <code>standard_fields<\/code>&quot;, &quot; <code>advanced_fields<\/code>&quot;, &quot; <code>post_fields<\/code>&quot; v\u00f5i &quot; <code>pricing_fields<\/code>&quot;. (Saate luua ka oma kategooria, kuid seda siin ei k\u00e4sitleta). Massiivi teine \u200b\u200belement vajab v\u00f5tit &#8216; <code>text<\/code>&#8216; ja selleks tagastame lihtsalt v\u00e4lja nime, helistades <code>get_form_editor_field_title()<\/code>. See on funktsioon, mille me just \u00fclal l\u00f5ime.<\/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>N\u00fc\u00fcd on kohandatud v\u00e4ljat\u00fc\u00fcbi lisamise nupp teisaldatud kasti &quot;T\u00e4psemad v\u00e4ljad&quot;.<\/p>\n<h2>V\u00e4ljaseadete aktiveerimine<\/h2>\n<p>Kui olete proovinud vormile v\u00e4lja t\u00fc\u00fcpi lisada, v\u00f5isite m\u00e4rgata, et s\u00e4tteid pole \u00fcldse. Te ei saa isegi silti muuta. See toimib nii, et tegelikult on olemas k\u00f5ik t\u00fc\u00fcpi s\u00e4tted, need on Gravity Formsi CSS-iga lihtsalt peidetud. Peame individuaalselt m\u00e4\u00e4ratlema, milliseid seadeid tahame lubada, ja Gravity Forms kuvab seej\u00e4rel meie jaoks valitud seaded.<\/p>\n<p>Peame m\u00e4\u00e4ratlema funktsiooni <code>get_form_editor_field_settings()<\/code>ja tagastama k\u00f5igi s\u00e4tete massiivi, mida me ei soovi oma v\u00e4ljat\u00fc\u00fcbi puhul peita. Milliseid seadeid soovite lisada, s\u00f5ltub t\u00e4ielikult teie ja teie projektist. Pidage meeles, et teie v\u00e4li peaks toetama k\u00f5iki aktiveeritud s\u00e4tteid, vastasel juhul pole selle seadete kuvamine m\u00f5ttetu.<\/p>\n<p>Olen loonud allpool kiire \u00fclevaate seadete nimedest. See pole kaugeltki t\u00e4ielik loetelu \u2013 kuna on palju s\u00e4tteid, mis on kasulikud ainult v\u00e4ga konkreetsete v\u00e4ljat\u00fc\u00fcpide puhul. N\u00e4iteks telefoni vorming, kuup\u00e4eva\/kellaaja vorming ja terve hulk s\u00e4tteid, mis on seotud v\u00e4ljadega Postitus ja Hinnakujundus.<\/p>\n<h4>\u00dcldine vahekaart<\/h4>\n<ul>\n<li>V\u00e4lja silt:<code>label_setting<\/code><\/li>\n<li>V\u00e4lja kirjeldus:<code>description_setting<\/code><\/li>\n<li>Valikud:<code>choices_setting<\/code><\/li>\n<li>N\u00f5utud:<code>rules_setting<\/code><\/li>\n<li>Duplikaate pole:<code>duplicate_setting<\/code><\/li>\n<li>Luba veerud:<code>columns_setting<\/code><\/li>\n<li>Luba valik &quot;vali k\u00f5ik&quot;:<code>select_all_choices_setting<\/code><\/li>\n<li>Luba valik &quot;muu&quot;:<code>other_choice_setting<\/code><\/li>\n<\/ul>\n<h4>V\u00e4limus vahekaart<\/h4>\n<ul>\n<li>Kohat\u00e4ide:<code>placeholder_setting<\/code><\/li>\n<li>V\u00e4lja sildi n\u00e4htavus ja kirjelduse paigutus:<code>label_placement_setting<\/code><\/li>\n<li>Kohandatud kinnituss\u00f5num:<code>error_message_setting<\/code><\/li>\n<li>Kohandatud CSS-klass:<code>css_class_setting<\/code><\/li>\n<li>V\u00e4lja suurus:<code>size_setting<\/code><\/li>\n<\/ul>\n<h4>Vahekaart T\u00e4psemalt<\/h4>\n<ul>\n<li>Administraatoriv\u00e4lja silt:<code>admin_label_setting<\/code><\/li>\n<li>Vaikev\u00e4\u00e4rtus:<code>default_value_setting<\/code><\/li>\n<li>Luba parooli sisestamine:<code>password_field_setting<\/code><\/li>\n<li>Sunni SSL:<code>force_ssl_field_setting<\/code><\/li>\n<li>N\u00e4htavus:<code>visibility_setting<\/code><\/li>\n<li>Luba v\u00e4lja d\u00fcnaamiliselt t\u00e4ita:<code>prepopulate_field_setting<\/code><\/li>\n<li>Luba tingimusloogika:<code>conditional_logic_field_setting<\/code><\/li>\n<li>Luba lehe tingimusloogika:<code>conditional_logic_page_setting<\/code><\/li>\n<\/ul>\n<p>Meie n\u00e4ite puhul on k\u00f5ige olulisemad v\u00e4lja silt, kirjeldus, valikud ja see, kas v\u00e4li on kohustuslik v\u00f5i mitte. Lubame ka CSS-klassi, kohandatud valideerimiss\u00f5numi ja tingimusliku loogika s\u00e4tteid.<\/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>V\u00e4rskendage vormiredaktorit ja n\u00fc\u00fcd peaksite meie v\u00e4ljale ilmuma k\u00f5ik valitud s\u00e4tted ja vahelehed. Gravity Forms haldab ja salvestab k\u00f5ik seaded automaatselt.<\/p>\n<p>J\u00e4tkake ja lisage valikute loendisse m\u00f5ned \u00fcksused, et meil oleks, millega t\u00f6\u00f6tada. Siin on see, mille olen n\u00e4itena \u00fcles seadnud:<\/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=\"\u00d5petus: t\u00e4psemate kohandatud gravitatsioonivormide v\u00e4ljat\u00fc\u00fcbi loomine ja mitme sisendv\u00e4\u00e4rtuse k\u00e4sitlemine\" ><\/a><\/p>\n<h2>Kohandatud vaikevalikute m\u00e4\u00e4ratlemine<\/h2>\n<p>Kui olete harjunud Gravity Formsis nt raadionuppe v\u00f5i m\u00e4rkeruutusid kasutama, olete ilmselt m\u00e4rganud, et need on varustatud selliste valikutega nagu &quot;Esimene valik&quot;, &quot;Teine valik&quot;, &quot;Kolmas valik&quot;. See on Gravity Formsi vaikek\u00e4itumine, kui \u00fchtegi valikut pole salvestatud (varem) ja see k\u00e4ivitub ainult nende konkreetsete v\u00e4ljat\u00fc\u00fcpide puhul. Kuid meie kohandatud v\u00e4ljat\u00fc\u00fcbi puhul valikuid ei t\u00e4ideta. See muudab selle pisut t\u00fclikaks, kuna te ei n\u00e4e nuppu &quot;+&quot;, et lisada m\u00f5ni muu valik. Peaksite kasutama nuppu &quot;Hulgilisa\/Eelm\u00e4\u00e4ratletud valikud&quot;, lisama sinna m\u00f5ned valikud ja p\u00e4rast seda p\u00e4\u00e4sete valikute lisamiseks juurde &quot;+&quot; nuppudele. Kuid m\u00f5ningaid kohandatud valikuid on lihtne m\u00e4\u00e4ratleda \u2013 vajate vaid klassimassiivi muutuja m\u00e4\u00e4ratlemist<code>public $choices<\/code>ja Gravity Forms loovad automaatselt teie v\u00e4ljale eelm\u00e4\u00e4ratletud valikud, kui lisate selle oma vormidele.<\/p>\n<p>M\u00e4rkus. See on klassi muutuja, mille saate lisada klassi \u00fclaossa, otse alla <code>public $type<\/code>. Iga valik peab olema massiiv, kusjuures valik peab olema v\u00f5tme \u201e <code>text<\/code>&#8221; v\u00e4\u00e4rtus.<\/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>Pidage meeles, et kui olete v\u00e4lja juba vormile lisanud, siis see valikuid tagasiulatuvalt ei t\u00e4ida. See j\u00f5ustub ainult siis, kui lisate vormile uue v\u00e4lja.<\/p>\n<p><strong>M\u00e4rkus<\/strong>: Gravity Formsis n\u00e4ib olevat v\u00f5imalik lisada <code>value<\/code>igale valikule ka klahvid &#8216; &#8216;. Kuid ma ei saanud seda t\u00f6\u00f6le \u2013 v\u00e4\u00e4rtused muutuvad automaatselt samadeks, mis valikutekst.<\/p>\n<h2>V\u00e4lja v\u00e4\u00e4rtuse defineerimine massiivina<\/h2>\n<p>J\u00e4rgmine samm on \u00fcsna lihtne, kuid vajalik. Gravity Forms&#8217;i v\u00e4ljade vaikev\u00e4\u00e4rtustena on stringid. Meil on vaja, et v\u00e4\u00e4rtus oleks massiiv, kuna t\u00f6\u00f6tame mitme sisendiga. Selleks m\u00e4\u00e4ratleme funktsiooni <code>is_value_submission_array()<\/code>ja tagastame <code>true<\/code>.<\/p>\n<pre><code>public function is_value_submission_array() {\n    return true;\n}<\/code><\/pre>\n<p>See tagab, et saame oma mitme sisendi sisestatud v\u00e4\u00e4rtusega korralikult t\u00f6\u00f6tada.<\/p>\n<h2>V\u00e4lja v\u00e4ljundi renderdamine<\/h2>\n<p>Kui tegemist on v\u00e4lja v\u00e4ljundi renderdamisega, tuleb arvestada paari asjaga.<\/p>\n<p>K\u00f5igepealt peate valima kahe funktsiooni vahel; <code>get_field_input()<\/code>v\u00f5i <code>get_field_content()<\/code>. Esimese meetodi puhul renderdab Gravity Forms teie v\u00e4ljale automaatselt \u00fcmbrisloendi elemendi, sildi, kirjelduse ja valideerimise konteineri ning teie juhite ainult sisemise v\u00e4lja v\u00e4ljundit. Teise meetodi puhul seda ei juhtu ja teie kontrollite rohkem v\u00e4lja v\u00e4ljundit. Siiski peate sildi, kirjelduse ja veateated k\u00e4sitsi renderdama. Esimene meetod <code>get_field_input()<\/code>on enamikul juhtudel t\u00e4iesti sobiv.<\/p>\n<p>Teine asi, mida tuleb meeles pidada, on see, et v\u00e4lja renderdusfunktsioon m\u00f5jutab kolme erinevat asukohta. Need kolm on v\u00e4lja v\u00e4ljundi renderdamine esiservas, v\u00e4lja eelvaade vormiredaktoris ja l\u00f5puks ka v\u00e4li kirje redigeerimisel. \u00d5nneks pakub Gravity Forms funktsioone, mis v\u00f5imaldavad h\u00f5lpsalt m\u00e4\u00e4rata, millises vaates me oleme. Tavaliselt renderdaksite v\u00e4lja k\u00f5igil kolmel juhul \u00fchtemoodi. Kuid kuna suure ja paljude sisenditega tabeli renderdamine muutub vormiredaktoris tarbetuks kohmakaks, olen otsustanud vormiredaktoris v\u00e4lja renderdada erinevalt.<\/p>\n<p>Ja l\u00f5puks peame tagama, et k\u00f5ik sisendid saavad \u00f5ige <code>name<\/code>atribuudi, et Gravity Forms saaks vormi esitamisel selle v\u00e4\u00e4rtuse koguda. K\u00f5ik Gravity Formsi sisendid vajavad <code>name<\/code>atribuute, mis j\u00e4rgivad seda reeglit: <code>name=\"input_{FIELD_ID}\"<\/code>(mitmevaliku v\u00e4ljad kasutavad t\u00e4iendavat ID-d, kuid me ei pea oma juhtumi puhul selle p\u00e4rast muretsema). Meil on juurdep\u00e4\u00e4s v\u00e4lja ID-le, kuna see on klassi muutuja (alates <code>GF_Field<\/code>). Kuid meie puhul oleme Gravity Formsile \u00f6elnud, et v\u00e4\u00e4rtus on massiiv, mitte ainsuse v\u00e4\u00e4rtus (eelmine samm), seega lisame atribuudi name j\u00e4rele sulud; <code>name=\"input_{FIELD_ID}[]\"<\/code>. Seega, kui vormi sees on v\u00e4lja ID-ga 4, peaks nimeatribuut olema &quot; <code>input_4[]<\/code>&quot;.<\/p>\n<p>Ma valin selle kasutamise, <code>get_field_input()<\/code>millel on kolm parameetrit. Esimene parameeter on vormiobjekt, mida me oma n\u00e4ite jaoks tegelikult ei vaja. Teine parameeter on praegune v\u00e4\u00e4rtus. See v\u00f5ib olla kas v\u00e4lja v\u00e4\u00e4rtus ajast, <code>$_POST<\/code>mil vormi prooviti esitada, kuid see ei \u00f5nnestunud. Saame s\u00e4ilitada eelmised esitatud v\u00e4\u00e4rtused. V\u00f5i kui funktsioon t\u00f6\u00f6tab kirje redigeerimisel, on v\u00e4\u00e4rtus esituses salvestatud v\u00e4\u00e4rtus. Hiljem k\u00e4sitleme v\u00e4\u00e4rtust l\u00e4hemalt. Ja kolmas parameeter on sisestusobjekt, mida me ka oma n\u00e4ite jaoks ei vaja.<\/p>\n<p>Alustame juurutamist <code>get_field_input()<\/code>, mis ootab l\u00f5plikku renderdust stringina. Otsustan otsekohe tagastada t\u00fchja stringi, kui oleme vormiredaktoris \u2013 sest ma ei taha selles vaates renderdada t\u00e4istabelit. Meetodi <code>$this-&gt;is_form_editor()<\/code>abil saame kontrollida, kas oleme vormi muutmise sees v\u00f5i mitte. V\u00f5ite selle vahele j\u00e4tta v\u00f5i renderdada midagi muud, kui soovite vormiredaktoris v\u00e4lja eelvaadet n\u00e4ha.<\/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>J\u00e4rgmine samm on HTML-i koostamine tabeli jaoks, mis loob veergude ja iga kursuse elemendi jaoks ridade arvu p\u00e4evade massiivi. Kuid kuna vajame juurdep\u00e4\u00e4su p\u00e4evade massiivile (tabeli veergudele) mitmes kohas, peaksime selle m\u00e4\u00e4ratlema klassimuutujana, muutes selle juurdep\u00e4\u00e4setavaks k\u00f5igi selle sees olevate funktsioonide kaudu. Ma m\u00e4\u00e4ratlen klassi muutuja <code>$delivery_days<\/code>p\u00e4evade massiiviga, mille jaoks tahan kohaletoimetamist pakkuda.<\/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>See on vaid n\u00e4ide! V\u00f5ib-olla soovite tuua veergude massiivi mujalt, mis pole k\u00f5vakoodiga.<\/p>\n<p>L\u00e4hme tagasi <code>get_field_input()<\/code>ja koostame oma sisenditega tabeli. K\u00f5igepealt liigun \u00fcle klassi muutuja ja genereerin tabeli pealkirjad. Seej\u00e4rel vaatan valikute valikute v\u00e4ljaseadesse sisestatud valikuid. Sellele p\u00e4\u00e4seb juurde klassimuutujast (alates <code>GF_Field<\/code>) <code>$this-&gt;choices<\/code>. Iga valiku jaoks esitan sisendi \u00f5ige nime atribuutidega. Meil on juurdep\u00e4\u00e4s v\u00e4lja ID-le <code>GF_Field<\/code>klassi muutujast <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>Kui see kood on paigas, peaksime kasutajaliideses saama kena tabeli, mis on meie v\u00e4ljat\u00fc\u00fcbi jaoks renderdatud! Ilmselt on HTML t\u00e4ielikult teie otsustada, see on vaid p\u00f5hin\u00e4ide.<\/p>\n<p><strong>J\u00e4tame selle funktsiooni praegu, kuid tuleme selle juurde hiljem tagasi, et esitatud v\u00e4\u00e4rtust k\u00e4sitleda!<\/strong><\/p>\n<h2>V\u00e4\u00e4rtuse \u00f5ige salvestamine<\/h2>\n<p>Praeguse seisuga salvestab Gravity Forms meie v\u00e4lja \u00fchem\u00f5\u00f5tmelise massiivina, mis on t\u00e4idetud sisestatud v\u00e4\u00e4rtuste ja t\u00fchjade stringidega, kus sisend oli t\u00fchi. Puudub teave selle kohta, millisele p\u00e4evale v\u00f5i valikule v\u00e4\u00e4rtus kuulub, peale indeksi. Peame muutma selle \u00fchem\u00f5\u00f5tmelise massiivi mitmem\u00f5\u00f5tmeliseks assotsiatiivseks massiiviks, kuhu salvestame p\u00e4eva ja valikusildi. Seej\u00e4rel saame h\u00f5lpsasti juurde p\u00e4\u00e4seda n\u00e4iteks salvestatud arvu v\u00e4\u00e4rtusele <code>$value['Ham sandwich']['Monday']<\/code>. P\u00e4rast seda massiivi teisendust peame ka massiivi serialiseerima, et Gravity Forms saaks v\u00e4\u00e4rtuse \u00f5igesti andmebaasi salvestada.<\/p>\n<p>Peame selle v\u00e4\u00e4rtusmassiivi mitmesse kohta teisendama, nii et ma m\u00e4\u00e4ratlen selle jaoks eraldi funktsiooni. Funktsioon aktsepteerib \u00fchem\u00f5\u00f5tmelist massiivi ja teisendab selle mitmem\u00f5\u00f5tmeliseks massiiviks, kus on salvestatud p\u00e4evade ja valikute v\u00e4\u00e4rtused:<\/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>See salvestab p\u00e4evade nimed ja valikud otse v\u00e4lja v\u00e4\u00e4rtuse sisse. Sel viisil toimides on v\u00f5imalik valikuid hiljem muuta ilma vanu kirjeid rikkumata.<\/p>\n<p>N\u00fc\u00fcd p\u00f6\u00f6rdume esitatud v\u00e4\u00e4rtuse salvestamist k\u00e4sitleva funktsiooni alistamise juurde; <code>get_value_save_entry()<\/code>. Sellel on viis parameetrit, kuid vajame ainult esimest, mis on esitatud v\u00e4\u00e4rtus. Funktsiooni sees edastame v\u00e4\u00e4rtuse meie \u00fclaltoodud kohandatud funktsioonile, j\u00e4rjestame selle tagastamise ja l\u00f5puks tagastame uue v\u00e4\u00e4rtuse.<\/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>Sel hetkel salvestab Gravity Forms meie v\u00e4\u00e4rtused edukalt just nii, nagu me neid soovime! Salvestatud v\u00e4\u00e4rtus on n\u00fc\u00fcd aga j\u00e4rjestatud massiiv, mida Gravity Forms r\u00f5\u00f5muga otse v\u00e4lja kajab. Peame rakendama funktsioone, et muuta see koledast serialiseeritud massiivist ilusaks v\u00e4ljundiks k\u00f5ikjal, kus seda vajame.<\/p>\n<h2>Esitatud v\u00e4\u00e4rtuse kuvamine<\/h2>\n<p>Meil on kolm kohta, kus peame oma v\u00e4lja v\u00e4\u00e4rtuse v\u00e4ljundit muutma; kirjete loend, vaadates \u00fchte kirjet ja Gravity Formsi liitm\u00e4rgendites. \u00dchendamism\u00e4rgendeid kasutatakse k\u00f5ige sagedamini meiliteatistes. N\u00e4iteks <code>{all_fields}<\/code>on liitm\u00e4rgend, mis kuvab meilides esitatud vormide t\u00e4ielikud v\u00e4\u00e4rtused.<\/p>\n<p>Kuna renderdame sama v\u00e4ljundit kolmel erineval juhul, on m\u00f5ttekas teha selle jaoks eraldi funktsioon. Olen m\u00e4\u00e4ratlenud kohandatud funktsiooni, mis aktsepteerib v\u00e4\u00e4rtust; parameetrina j\u00e4rjestamata mitmem\u00f5\u00f5tmeline massiiv. Seej\u00e4rel koostab funktsioon HTML-i, mis kuvab massiivi kaunil viisil ja tagastab stringi. Olen valinud pesastatud <code>&lt;ul&gt;<\/code>loendi, kuid saate v\u00e4ljundit igal juhul muuta.<\/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>Suurep\u00e4rane, alustame esimesest: kirjete loendist: <code>get_value_entry_list()<\/code>. Siin saate valida t\u00e4ieliku v\u00e4ljundi v\u00e4ljastamiseks, kuid loendivaate jaoks v\u00f5ib see muutuda \u00fcsna kohmakaks ja kauaks, seega olen valinud lihtsalt fikseeritud stringi tagastamise, mis selgitab, et kasutaja peab t\u00e4ieliku \u00fclevaate n\u00e4gemiseks sisestama sisestuse \u00fcksikasjadesse.<\/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>See on muidugi t\u00e4ielikult teie otsustada, n\u00e4iteks v\u00f5ite valida ainult esimese x m\u00e4rkide arvu kuvamise.<\/p>\n<p>Teine funktsioon on see, mis m\u00f5jutab \u00fcksiku kirje vaadet <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>Me lihtsalt t\u00fchistame massiivi WordPressi funktsiooniga <code>[maybe_unserialize](https:\/\/developer.wordpress.org\/reference\/functions\/maybe_unserialize\/)()<\/code>ja tagastame oma kohandatud funktsiooni stringi v\u00e4ljundi.<\/p>\n<p>L\u00f5plik funktsioon m\u00f5jutab liitmism\u00e4rgendeid ja veenduge, et meie v\u00e4lja v\u00e4\u00e4rtus n\u00e4eb hea v\u00e4lja ka meilides: <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>Pange t\u00e4hele, et me ei pea selle funktsiooni v\u00e4\u00e4rtust t\u00fchistama.<\/p>\n<p>Kui need kolm funktsiooni on paigas, peaksid k\u00f5ik esitatud v\u00e4\u00e4rtused igal pool p\u00e4ris head v\u00e4lja n\u00e4gema! N\u00e4iteks saadetud kirje vaatamisel:<\/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=\"\u00d5petus: t\u00e4psemate kohandatud gravitatsioonivormide v\u00e4ljat\u00fc\u00fcbi loomine ja mitme sisendv\u00e4\u00e4rtuse k\u00e4sitlemine\" ><\/a><\/p>\n<p>Siiski on \u00fcks oluline asi puudu! Siinkohal meie sisendid ei s\u00e4ilita varem esitatud v\u00e4\u00e4rtusi ja see on \u00fcsna halb.<\/p>\n<h2>S\u00e4ilitage meie sisendites varem esitatud v\u00e4\u00e4rtus<\/h2>\n<p>Peamiselt on kaks juhtumit, kus peame tagama, et sisendid s\u00e4ilitaksid eelnevalt esitatud v\u00e4\u00e4rtused. Esimene juhtum on siis, kui vormi esitamine eba\u00f5nnestus (n\u00e4iteks unustas kasutaja kohustusliku v\u00e4lja). Praegu kaotavad k\u00f5ik meie sisendid k\u00f5ik varem sisestatud v\u00e4\u00e4rtused ja kasutaja peab k\u00f5ik v\u00e4\u00e4rtused uuesti sisestama. Teiseks, kui saidi omanik kirjet redigeerib, ei t\u00e4ideta sisestusi esitatud v\u00e4\u00e4rtustega, mis muudab v\u00e4\u00e4rtuste korrektse redigeerimise \u00fcsna v\u00f5imatuks.<\/p>\n<p>Selle parandamiseks p\u00f6\u00f6rdume tagasi funktsiooni juurde <code>get_field_input()<\/code>. Selle funktsiooni teine \u200b\u200bparameeter on v\u00e4\u00e4rtus. Kuid pidage meeles, et see funktsioon m\u00f5jutab nii esiserva renderdamist kui ka kirje redigeerimist. See on oluline, kuna salvestatud v\u00e4\u00e4rtus on neil kahel juhul erinev. Kui oleme eesotsas ja k\u00e4sitleme vormi esitamist, on v\u00e4\u00e4rtus varem mainitud \u00fchem\u00f5\u00f5tmelise massiivi vormingus. Ja kui me muudame kirjet, on v\u00e4\u00e4rtus j\u00e4rjestikuse mitmem\u00f5\u00f5tmelise massiivi vormingus. Seega peame esitatud v\u00e4\u00e4rtuse \u00f5igesti t\u00f5lkima, <code>get_field_input()<\/code>et tegelikele v\u00e4\u00e4rtustele h\u00f5lpsasti juurde p\u00e4\u00e4seda.<\/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>\u00dclaltoodud koodis loome enne v\u00e4ljav\u00e4ljundi jaoks HTML-i loomise alustamist muutuja <code>$table_value<\/code>, mis sisaldab \u00f5igesti t\u00f5lgitud v\u00e4\u00e4rtust. Kasutame <code>GF_Field<\/code>funktsiooni <code>is_entry_detail()<\/code>, et kontrollida, kas me muudame kirjet v\u00f5i mitte. Ja siis on meie sisendite jaoks lihtne juurde p\u00e4\u00e4seda \u00f5igetele v\u00e4\u00e4rtustele ja m\u00e4\u00e4rata need sisendite <code>value<\/code>atribuutidena:<\/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>\u00dclaltoodud v\u00e4rskendamise <code>get_field_input()<\/code>korral peaksid k\u00f5ik meie kohandatud sisendid olema alati t\u00e4idetud eelmise v\u00e4\u00e4rtusega; olenemata sellest, kas see on kirje redigeerimine v\u00f5i vormi esitamise uuesti proovimine.<\/p>\n<p>Praeguseks on k\u00f5ik, mis puudutab meie v\u00e4\u00e4rtuste renderdamist ja salvestamist, tehtud ja t\u00f6\u00f6tab t\u00e4ielikult. Kuid on veel \u00fcks asi, mille peame kindlasti parandama.<\/p>\n<h2>Tehke meie p\u00f5llupassi &quot;n\u00f5utav&quot; valideerimine<\/h2>\n<p>Gravity Forms kontrollib, kas v\u00e4lja v\u00e4\u00e4rtus on t\u00fchi v\u00f5i mitte. See on sageli vajalik, kui v\u00e4li on seatud vajalikuks. Kui v\u00e4li on kohustuslik, ei saa te vormi esitada, kui see on t\u00fchi, eks? Meie jaoks on probleem selles, et meil on mitu sisendit ja me tahame lubada, et m\u00f5ned neist oleksid t\u00fchjad. See muutub probleemiks, kui meie v\u00e4li on n\u00f5utud. Gravity Forms t\u00f5lgendab kahjuks s\u00f5na &quot;kas see on t\u00fchi&quot; valesti ja n\u00f5uab k\u00f5igi sisendite t\u00e4itmist. Seega peame lisama reegli, mis \u00fctleb, et kui v\u00e4hemalt \u00fcks meie paljudest sisenditest on t\u00e4idetud, ei ole v\u00e4lja koguv\u00e4\u00e4rtus t\u00fchi.<\/p>\n<p>Viimane funktsioon, mille peame oma klassis alistama, on <code>is_value_submission_empty()<\/code>. Selle funktsiooni parameetrina saame ainult vormi ID, seega peame v\u00e4lja v\u00e4\u00e4rtuse ekstraheerima, kasutades selle <code>$_POST<\/code>massiivist toomiseks funktsiooni Gravity Forms: <code>rgpost('input_&lt;FIELD ID&gt;')<\/code>. Tagastus peaks olema \u00fchem\u00f5\u00f5tmeline massiiv, mida oleme varem n\u00e4inud. Peame vaid massiivi l\u00e4bima ja naasta, <code>false<\/code>kui leiame kuskilt v\u00e4\u00e4rtuse. Vastasel juhul tagastame <code>true<\/code>, kuna v\u00e4lja v\u00e4\u00e4rtus on t\u00f5epoolest t\u00e4iesti t\u00fchi.<\/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>Kui \u00fclaltoodud funktsioon on paigas, ei nurju meie v\u00e4li esitamine, kui see on seatud kohustuslikuks ja v\u00e4hemalt \u00fcks sisestus on t\u00e4idetud.<\/p>\n<h2>J\u00e4reldus ja l\u00f5plik kood<\/h2>\n<p>See \u00f5petus on teile \u00fcksikasjalikult n\u00e4idanud, kuidas luua gravitatsioonivormide jaoks oma kohandatud t\u00e4psem v\u00e4ljat\u00fc\u00fcp. Isegi kui teie projekt erineb minu n\u00e4itest, loodan, et teil on m\u00f5ned n\u00e4pun\u00e4ited ja a-ha. Ma leian, et Gravity Formsi dokumentatsioon on m\u00f5nel juhul \u00fcsna puudulik ja see on paljude katse-eksituse tulemus! Igatahes, loodetavasti on sellest teile kasu olnud!<\/p>\n<p>Viitamiseks siin on t\u00e4ielik kood tervikuna:<\/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>\u00d5petus, mis n\u00e4itab, kuidas luua t\u00e4psemat kohandatud gravitatsioonivormide v\u00e4ljat\u00fc\u00fcpi mitme sisendiga ja v\u00e4\u00e4rtuste salvestamiseks ja kuvamiseks.<\/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":[894,894,1110,842,802,802,812,812,842,863,863],"tags":[1165],"class_list":{"0":"post-233489","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-kood","9":"category-n-a","10":"category-opetused","11":"category-php-4","13":"category-pistikprogrammid","16":"category-wordpress-4","18":"tag-affiai-et"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/233489","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/comments?post=233489"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/233489\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/153180"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=233489"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=233489"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=233489"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}