Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem HTML úloha

Dobrý den,

mám vyřešit následující úlohu a jako člověk bez zkušeností s touto látkou bych se touto cestou chtěl obrátit na kohokoliv, kdo mi dokáže pomoci. Ze zadání mi totiž není zcela jasné, jak má vypadat kýžený výstup a už vůbec jak se k němu dopracovat. Budu rád za dílčí rady i za odkazy na zdroje informací.

Zde je zadání:

Úkolem je připravit jednoduchou nabídku pro klienta z fiktivních dat, která jsou v souboru v příloze. Nabídka by měla obsahovat následující údaje:

základní údaje o klientovi
- pojistka.osoby.pojistnik
základní údaje o vozidle
- pojistka.predmet.vozidlo
produkt povinného ručení, který se klientovi nabízí včetně limitů
- pojistka.rizika.zakladni.povinneRuceni.produkt
seznam nabízených doplňkových pojištění
- pojistka.rizika.doplnkova
vypsat název doplňku (pojistka.rizika.doplnkova.zverPoskozeni.balicek.nazev)
- pokud je vyplněný limit1 (pojistka.rizika.doplnkova.<doplnek>.varianta.limit1), tak ho vypsat s popiskem Limit
- pokud je vyplněná cena doplňku (pojistka.rizika.doplnkova.<doplnek>.varianta.splatka), tak jí vypsat s popiskem Cena. V opačném případě vypsat hodnotu z pojistka.rizika.doplnkova.<doplnek>.varianta.sazbaText

k výpisu doplňkových pojištění použít cyklus

Pro simulaci uvedeného problému, respektive pro výpis dat, je třeba využít nástroj TWIGFiddle dostupný na https://twigfiddle.com/.

Předmět Autor Datum
a kde je konkrétne problém. Tam jde len o to z JSONu vyparsovať dáta na základe zvolenej položky v s…
Mlocik97 12.08.2019 22:51
Mlocik97
A nemá to dělat náhodou v tom TWIGFiddle? Kdyby to mělo být na mně, tak bych mu navrhl PHP, protože…
kacikac 12.08.2019 23:13
kacikac
oh aha... a to je čo za nezmysel? Ono je to šablonovací systém bez logiky (neco ako Mustache) alebo…
Mlocik97 12.08.2019 23:23
Mlocik97
Děkuji všem za odpovědi. Pořád mi ale není jasné, co mám psát do nástroje twigfiddle a co má přesně…
TX2000 13.08.2019 13:19
TX2000
Máš tam len {{ objekt.mojtext }} čož je interpolácia... toto v podstate ako keby z JSONu vloží hod…
Mlocik97 13.08.2019 13:28
Mlocik97
Ze zadání není jasné, jak to má vlastně vypadat. Takže zkus začít něčím takovým: Osoba Jméno: {{ po…
Wikan 13.08.2019 13:35
Wikan
mám vyřešit následující úlohu a jako člověk bez zkušeností s touto látkou... Proboha, kdo tě úkoluj…
IQ37 13.08.2019 13:47
IQ37
Typnul bych že škola... Sám mám skúsenosti že aké nezmysli sa učia na školách. Ona tá úloha je primi…
Mlocik97 13.08.2019 13:57
Mlocik97
Děkuji za předchozí příspěvek. Na jeho základě jsem teprv pochopil, co je co a jak to spolu funguje.…
TX2000 13.08.2019 20:32
TX2000
{% for i in 0..4 %} {% if i==2 %} {{ pozdrav }} {% else %} {{ cisla[i] }} {% endif %} {% endfor %}…
Mlocik97 13.08.2019 20:47
Mlocik97
Děkuji za konstrukci. Jen potřebuji definici co je co a kam psát cesty k datům. Ani jednou se mi to…
TX2000 16.08.2019 14:03
TX2000
Zejména nevím, jak nadefinovat co je "i", aby program pochopil, co má vypisovat.
TX2000 16.08.2019 14:05
TX2000
Pokud nadefinuji něco takového: {% for (i = 0; i < 7; i++) %} Kam mám vložit cestu k datům a jak za…
TX2000 16.08.2019 14:19
TX2000
cyklus s pevným počtom iterácií: {% for i in 0..5 %} namiesto 0 a 5 môžu byť hocijaké čísla, akurá…
Mlocik97 16.08.2019 15:25
Mlocik97
Děkuji za zevrubnou odpověď a velice si vážím Vašeho času a trpělivosti. Ale tohle je přesně ta teor…
TX2000 17.08.2019 13:37
TX2000
Jak tedy mám nadefinovat cyklus a dosáhnout toho, že v každé iteraci program přeskočí na další větev…
TX2000 17.08.2019 13:54
TX2000
Pokud to je otázka práce tak nechápu proč řešíš něco, na co prostě nemáš vlohy a nejsi schopen vyřeš…
kacikac 17.08.2019 14:27
kacikac
... a varianta pro to druhé if (toto je kratší): Cena: {{ doplnek.varianta.splatka ? doplnek.varia…
kacikac 17.08.2019 17:14
kacikac
Děkuji za řešení úlohy. Pro mě jako pro laika je jednodušší se učit z již napsaného kódu než vymýšle…
TX2000 17.08.2019 18:12
TX2000
"těžkopádné konstrukce" nic těžkopádneho na tom neni... je to primitivne, ani to neni programovanie…
Mlocik97 17.08.2019 18:19
Mlocik97
Já jsem taky laik. Zjistit jak se píše for a if je přece napsáno tu: https://twig.symfony.com/doc/2.…
kacikac 17.08.2019 19:41
kacikac
{{ doplnek.varianta.limit1 ? " Limit: " + doplnek.varianta.limit1 }}
Wikan 17.08.2019 19:51
Wikan
To mi tam nefunguje, ale už jsem na to došel sám, funguje mi toto: {{ doplnek.varianta.limit1 ? " L… poslední
kacikac 17.08.2019 19:57
kacikac
Ono je to len podľa hierarchie... máte neco ako: { "krava": "boo", "koza: "mee" "domace_zvire": { "…
Mlocik97 17.08.2019 18:15
Mlocik97

a kde je konkrétne problém. Tam jde len o to z JSONu vyparsovať dáta na základe zvolenej položky v soznamu. Vytvoríte inputy. Získate hodnotu do premennej v JS, dáte podmienky if, alebo case a pod. A pak v cykle (trebárs for) vypíšete do DOMu čo je potrebné. Ako sú tam len základy práce s DOMom, JSONom, parsovanie a podmienky, cykly. Skuste napsať nejaký kód a potom už vieme povedať kde sú chyby. Tutoriálov na nete je dosť. Najdete snaď aj presne túto celú úlohu už hocikde vyriešenú.

oh aha... a to je čo za nezmysel? Ono je to šablonovací systém bez logiky (neco ako Mustache) alebo aj s logikou? Ak tam sa dajú dať podmienkové direktívy tak to vlastne není čo riešiť, len je napsať. A pozerám že jo, že to má nejakú logiku (nie síce formou direktív ale formou interpolácie). Tak tam fakt nič netreba riešiť.

Děkuji všem za odpovědi. Pořád mi ale není jasné, co mám psát do nástroje twigfiddle a co má přesně vygenerovat za výstup. Mohl by mi někdo napsat první dva řádky kódu, který se tam zadává, abych pochopil, jak to funguje?

Máš tam len

{{ objekt.mojtext }}

čož je interpolácia... toto v podstate ako keby z JSONu vloží hodnotu z objektu "objekt" z mojtext nejaký text (v prípade JSONu nižšie by to bolo slovo "ahoj"). Ak máš v JSONu array tak za názov premennej udáš do hranatých zátvoriek číslo (index). napríklad

{{ objekt.mojepole[2] }}

čož vypíše "druhý index" v prípade JSONu dole.

JSON:

{
    "objekt": {
        "mojtext": "ahoj",
        "cukor": "je sladký",
        "mojepole": [
             "nultý index",
             "prvý index",
             "druhý index",
             "tretí index"
        ]
    }
}

Podmienky a cyklus, to máš len:

{% if 'neco' in mojapremenna %} // alebo nejaké klasické aritmetické podmienky
    // neco urobíme
{% else % }
   // urobíme nieco iné
{% end if %}

a

cyklus

{% for 'neco' in mojepole %} // alebo udáš presné číslo počtu opakovaní, {% for i in 0..3 %} // je to isté ako for (var i = 0; i < 3; i++) {...} // (možno je to <= namiest len <, to ale zistíš když to napíšeš.
  // neco
{% endfor %}

to je v podstate všetko čo potrebuješ.

Ze zadání není jasné, jak to má vlastně vypadat.
Takže zkus začít něčím takovým:

Osoba
Jméno: {{ pojistka.osoby.pojistnik.jmeno }}
Příjmení: {{ pojistka.osoby.pojistnik.prijmeni }}

Vozidlo
Značka: {{ pojistka.predmet.vozidlo.znacka.nazev }}
Model: {{ pojistka.predmet.vozidlo.model.nazev }}

Typnul bych že škola... Sám mám skúsenosti že aké nezmysli sa učia na školách. Ona tá úloha je primitívna ale blbá... je to ako dostať na úlohu napsať 10 krát slovo "vrána" (doslova, vlastne teraz som vysvetlil čo je to cyklus for).

Naučiť sa princíp je záležitosť 2 až 3 minút (pre úplných začiatočníkov). Naučiť sa syntax toho twigfiddle je záležitosť 5 minút. A to je všetko.

Tak ono tam je len aritmetika, čož je vlastne matematika pre prvý stupeň ZŠ... sčitovanie, odčitovanie, násobenie, delenie a modulo. Snaď len to modulo je novinka pre začiatočníkov a to sa naučiť je záležitosť minúty.
Sú tam podmienky if/else a cyklus for. Záležitosť tiež minúty, možno dvoch.
A JSON naučiť sa array a objekt, záležitosť 2 minút.

Za 5 minút jak hovorím úplne všetko aj omnoho viac než čo má zadané na úlohu. Toto ak sa učia na SŠ nebodaj na VŠ tak Česko ako štát je v prdeli. Toto je pre základnú školu.

Děkuji za předchozí příspěvek. Na jeho základě jsem teprv pochopil, co je co a jak to spolu funguje. Mým cílem je vyřešit tuto úlohu a naučit se řešit podobné úlohy bez obsáhlejšího studia příslušné teorie. Mým oborem je ekonomie a účetnictví, tudíž jsem na první pohled nechápal, co se ode mě očekává. Tato úloha se týká práce, nikoli školy. Doufám, že studenti IT jsou bystřejší než já :-)

Nicméně mám stále problém s druhou částí, kde se pracuje s cykly. Za zadání chápu, že by výsledek měl vypadat asi takto:

Služba 1
Limit: xy
Cena: xy

Služba 2
Limit: xy
Cena: xy

atd.

Ale nechápu, jak vnořit podmínky do cyklu. Vlastně ani nechápu, jak nadefinovat funkční cyklus :D Stačí mi jen funkční konstrukce, cesty k datům si dohledám sám.

Děkuji za konstrukci. Jen potřebuji definici co je co a kam psát cesty k datům. Ani jednou se mi to nepodařilo nastavit tak, aby mi to něco vyplivlo. Vím, že mám 7 položek a ke každé potřebuji vypsat dodatečná data na základě podmínek ze zadání.

Pokud nadefinuji něco takového: {% for (i = 0; i < 7; i++) %}

Kam mám vložit cestu k datům a jak zajistím, aby se mi měnila konkrétní úroveň řetězce, tzn. v řetězci pojistka.rizika.doplnkova.asistencniSluzby.balicek.nazev potřebuji přeskočit z "asistencniSluzby" na další v pořadí.

cyklus s pevným počtom iterácií:

{% for i in 0..5 %}

namiesto 0 a 5 môžu byť hocijaké čísla, akurát prvé číslo musí byť menšie alebo rovné než druhé.

v prípade cyklusu riadeného podľa veľkosti poľa:

{% for i in myarray %}

pričom myarray je názov poľa v JSONe, podobne jak cisla v mojom priklade. v prípade že sa poľe nachádza v nejakom objekte. Použiteje v cykle myobj.myarray pričom myobj je názov objektu.
cykli môžene zanorovať v prípade ak by ste prechádzali poľom vo vnútri iného poľa. Díky pričom v zanorenom cykli môžete použiť index nadriadeného cyklu ako podmienku, díky tomu jde vytvoriť prkotniky ako: https://www.youtube.com/watch?v=q-D8BKfYKn4
v prípade podmienok môžete použiť rôzne porovnania "==, "<" ">" "<=" ">=" atd... spájať podmienky môžete skrz OR a AND. Pričom pri or stačí aby platila jedna podmienka a bude vykonaná if vetva, v prípade and musia byť všetky platné, ak neni platná vykonáva sa else vetva (ak existuje).
v prípade samotnej interpolácia, tá vkladá do výstupu hodnoty z JSONu. Tam sa odkazuje buď priamo hodnota: napríklad pozdrav v mojom prípade. Alebo objekt v ktorej je hodnota, to je ta bodka medzi názvami, tie objekty môžu byť rôznak vnorené takže existuje i pojistka.rizika.doplnkova.nazev (trocha som to skrátil) když použijete toto, to načitáva hodnotu "mojahodnota" z takéhoto JSONu:


{
    "pojista" : {
        "rizika" {
            "doplnkova": {
                "nazev": "mojahodnota"
            }
        }
    }
}

V prípade poľa používať hranaté zátvorky v interpolácii. Napríklad obj.array[i].premenna to je v JSONe:


{
    "obj" : {
        "arrray": [
           {
                "premenna": "mojahodnota",
                "dalsiapremenna" :"hodnota2"
            },
          {
                "premenna": "ahoj",
               "dalsipremenna": "cukor"
         }
        ]
    }
}

toto vypíše:

mojahodnota
ahoj

môžete polia a objekty rôzne zanorovať, takže môže vzniknúť kludne aj niečo takéto:

obj.pole[2][i].objektdva.pole[j][2][k].cukor.muka.muka[6]

toto když dáte vo vnútri cyklu s premennými i, j a k až po veľkosť celých arrayov tak to vypíše všetky hodnoty z pole[2] (druhý riadok poľa obsahuje ďalšie poľe z ktorého vypíše všetky hodnoty splnajuce všetko v interpolácii zapísané za týmto výrazom, teda z toho poľa načíta objektdva v ktorom je pole, u toho poľa rovnako ako v prípade všetky prvky s druhým indexom 2, z neho vyjme cukor, z toho muku, a z toho hodnotu z pola muka na indexe 6.

Teraz asi máte v tom chaos. Ale v prípade objektov zanorenie je jasné, v prípade poľa je možné v prípade pole[i] si predstaviť ako očíslovaný zoznam... v prípade pole[i][j] ako tabuľku, kde prvá hodnota je riadok a druhá stĺpec... potom pole[i][j][k] je už vhodnejšie si predstaviť spôsobom čo na čo ukazuje.

Vysvetlí to tento obrázok:

[ij8bS.jpg]

kde i je vlastne index políčka, z ktorého šipka smeruje do druhého zoznamu, j je index z ktorého políčka smeruje šipka do tretieho zoznamu a zároveň do ktorého smerovala z prvého zoznamu, a k je políčko už v tom tretom zozname.

Takže z obrázku by vybralo číslo 0 z toho zoznamu úplne hore na pravo kdyby si napísal pole[0][0][5]

a nakoniec môžeš urobiť i to že v indexu urobíš niečo ako pole[ (i+j-2) ] čož najskôr spočíta výraz i+j-2 a následne hodnotu použije pre získanie položky. V indexy môžeme odkázať aj na premennú z JSONu. to Znamená že ak máme:

{
    "pole": ["nulty", "prvy", "druhy", "treti"],
    "cislo": 2
}

a použijeme interpoláciu: {{ pole[cislo] }} tak to vypíše slovo druhy. Treba si zapamätať že počítač počíta od nuly. Tzv, prvé slovo v zozname má index 0, druhé slovo index 1 atd...

Možno to znie komplikovane, ale je to v podstate strašne jednoduché... když si to nakreslíte na papier tak to hneď pochopíte. Ono najlepšie by to bolo vysvetliť na reálnych príkladoch a kreslením. Myslím že až pozriete toto video tak pochopíte:

https://www.youtube.com/watch?v=C30NQ1vHdnY (prvé 2 minuty môžete preskočiť, môžete preskočiť aj 13 až 16 minutu)). Tam len vysvetluje špecifickú retardaci pri deklarácií polí v Jave... Java je celkom blbý jazyk čo sa takýchto vecí týka, ale samotný princíp pola je v tom videu dobre vysvetlené... Nezamerujte sa na kód, len na princíp, ktorý okecáva.

Arraye / polia ; a objekty sú vo všetkých bežných progr. jazykoch zhodné (a aj v JSONe), a rovnako je to i v tom TWIGFiddle, akurát rozdiel je že když zistujete dĺžku poľa pre cyklus, tak stačí tam dať "i in array" a nemusíte písať "i in array.lenght" to jak robí nákres pre array vo videu, tie štvorčeky na tabule, tak to je podobné aj pre objekty, len s rozdielom, že tie nie sú indexované číselne automaticky od nuly, ale je každému políčku priradený názov, cez ktorý sa odkazuješ. Jak vidíš v mojom prvom príklade "pojistka.rizika.doplnkova.nazev"

Děkuji za zevrubnou odpověď a velice si vážím Vašeho času a trpělivosti. Ale tohle je přesně ta teorie, které jsem se chtěl vyhnout, protože bez hlubšího studia problému to neposkládám dohromady. Pořád nerozumím, která proměnná je která a který index co znamená.

Potřebuji si rozdělit zbytek úkolu na dvě fáze.

1) Jak vypsat názvy doplňkových služeb pomocí cyklu
2) Jak do této konstrukce zanořit podmínky dle zadání, aby bylo vypsáno to, co jsem znázorňoval v některém příspěvku výše

Jak tedy mám nadefinovat cyklus a dosáhnout toho, že v každé iteraci program přeskočí na další větev? S tím, že cyklus se ukončí při použití poslední možnosti ze zdrojových dat.

Zkouším tohle, ale něco dělám špatně. {% for i in {pojistka.rizika.doplnkova.[i].balicek.nazev} %}

Pokud to je otázka práce tak nechápu proč řešíš něco, na co prostě nemáš vlohy a nejsi schopen vyřešit ani za 5 dní něco, co je pro normálně uvažujícího jedince otázka na pár sekund doslovně. Nikdy jsem s twigfiddle nedělal, ale prostě hodím tam json a testuju, jak se tvoří for je jasné, pokud dáš jen name, ukáže ti to pak array, takže přímo přihodíš cestu jakou chceš a máš výsledek, nechápu co furt řešíš:

{% for doplnek in pojistka.rizika.doplnkova %}
{{ doplnek.balicek.nazev }}
{% endfor %}

A doufám, že aspoň tu podmínku si vyřešíš sám.

Základní údaje o klientovi
Jméno:    {{ pojistka.osoby.pojistnik.jmeno }}
Příjmení: {{ pojistka.osoby.pojistnik.prijmeni }}
atd.

Základní údaje o vozidle
Značka:   {{ pojistka.predmet.vozidlo.znacka.nazev }}
Model:    {{ pojistka.predmet.vozidlo.model.nazev }}
atd.

Produkt povinného ručení, který se klientovi nabízí včetně limitů
Název:    {{ pojistka.rizika.zakladni.povinneRuceni.produkt.nazev }}
atd.

Seznam nabízených doplňkových pojištění
{% for doplnek in pojistka.rizika.doplnkova %}
{{ doplnek.balicek.nazev }}
{% if doplnek.varianta.limit1 %}
	Limit: {{ doplnek.varianta.limit1 }}
{% endif %}
{% if doplnek.varianta.splatka %}
	Cena:  {{ doplnek.varianta.splatka }}
{% else %}
	Cena:  {{ doplnek.varianta.sazbaText }}
{% endif %}
{% endfor %}

Děkuji za řešení úlohy. Pro mě jako pro laika je jednodušší se učit z již napsaného kódu než vymýšlet těžkopádné konstrukce a hledat chyby. Smyslem mého dotazu bylo zjistit, jak se píšou ony funkce, cesty k datům si již mohu doplnit a následně otestovat.

Každopádně ještě jednou děkuji všem za řešení a přeji hezký zbytek víkendu.

Já jsem taky laik.
Zjistit jak se píše for a if je přece napsáno tu:
https://twig.symfony.com/doc/2.x/tags/for.html
https://twig.symfony.com/doc/2.x/tags/if.html
V prvním odkazu je for, kde za user doplníš třeba doplnek. Za users doplníš cestu k tvé sekvenci, tedy pojistka.rizika.doplnkova. A pak můžeš použít relativní cestu od doplnek. Co na tom proboha není jasné?
V druhém odkazu je if. Dole je uvedeno, že "numeric zero" a "null" (máš je v json jako hodnoty, které budeš testovat v případě, kdy má být stav false, tedy nevyplněno) jsou false, takže za if dáš jen proměnnou, kterou testuješ. Co na tom proboha není jasné?
Spíš to vypadá tak, že ty ses ani nenamáhal zjistit, kde ten for a if je popsaný...

Pro všechny:
Jen takový špek, ještě si s tím hraju, toto funguje:

{{ doplnek.varianta.limit1 ? doplnek.varianta.limit1 }}

Nevěděl by někdo, jestli jde a jak udělat něco v tomto smyslu?

{{ doplnek.varianta.limit1 ? "    Limit: " doplnek.varianta.limit1 }}

Ono je to len podľa hierarchie... máte neco ako:

{
    "krava": "boo",
    "koza: "mee"
    "domace_zvire": {
            "pes": "haw",
            "mačka": "mňau"
            "nejaky_cyklus": [
                    "a",
                    "b"
            ]
    }
}

tak ono sa to da nakresliť takto: [87725-nacrt-png]

a teraz na vrhu je rootovský objekt (koreň) a ideš ako když lezeš po strome na konár,... chceš ísť na miesto kde je napísané písmeno a:

napíšeš: "domace_zvire.nejaky_cyklus[0]"

chceš psa, teda konrétnejšie vypísať "haw"? tak "domace_zvire.pes"

to je v podstate celé...

když toto prečítate a uvidíte obrázok (snaď som mal len dať tu šipku inou farbou, a orámovanie na čo ukazuje, tie šipky ukazujú ako na celý druhý riadok, nie len na mačku, podobne pri tretom riadku), jemne sa zamyslíte a už musíte vedieť to napsať celé taky...
v podstate je to uplne primitivne.... for cyklus je jasny,... je to len počet opakovaní, kde i predstavuje číslo, v koľkej iterácii cyklus je. To když použiješ pre poľe. Tak ak dáš i in array, tak vypíšeš všetky prvky poľa {{ pole[i] }}... když zadáš rozsah 2..6, tak vypíšeš prvky od indexu 2 až po index 6. Nič zložité. If_else taky nič zložité. Zanoriť to do cyklusu. Cyklus do podmienky. Neni vôbec problém. A to je v podstate všetko.

Stačí si ten JSON takto preklesliť na papier, a potom iba podľa šipiek písať výrazy do interpolácie teda medzi takéto zátvorky {{ }} ... a potom už ako tam pridať základnú logiku, že ak platí podmienka tak vypíšem jednu vec, ak neplatí tak niečo iné... pridám cyklus, a hotovo. Nič viac netreba riešiť...

Zpět do poradny Odpovědět na původní otázku Nahoru