Jak na hodnoty u radiolistu vytažené z db?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
xciza
Člen | 194
+
0
-

Ahoj, na webu mám radio list který mám zatím řešený tak, že mám dány defaultní hodnoty pro každou možnost:

$materials = array(
            '0.85' => 'Název mat. 1',
            '0.9' => 'Název mat. 2',
        );

$form->addRadioList('mat', 'Materiál: ', $materials);

Potřeboval bych ale do toho pole načítat hodnoty uložené v db, protože je uživatel bude moci měnit. Hodnoty v poli budou cena a název. Tabulka má tři sloupce – id, nazev, cena. Jak hodnoty v poli $materials mohu nahradit cenou a nazvem z db? Používám NotORM.

Díky

David Ďurika
Člen | 328
+
0
-

ked chces menit cenu a nazov tak preco do davas do RadioList-u ? pouzi na to uplne inu componentu…
daj si tam 2 addText() (vykreslis to X krat, podla poctu riadkov) a mas po starosti

xciza
Člen | 194
+
0
-

Je to z toho důvodu že zákazník nesmí vidět tu cenu (neptejte se proč, mám k tomu důvody). Zákazník si vybere jen materiál a já pak už počítám jen s tou cenou…

David Ďurika
Člen | 328
+
0
-

no tak ked submitne form, tak si z DB vytiahnes cenu toho materialu…
ak to chces pocitat este pred odoslanim tak, pouzi addHidden kde si ulozis tie ceny…

xciza
Člen | 194
+
0
-

Moc nechápu, jak to myslíš a přijde mě to strašně složité :) To není možnost ty data vytáhnout do toho radiolistu?? Přijde mě to i přívětivější pro uživatele ten radio list

David Ďurika
Člen | 328
+
0
-

jasne ze sa da… hore si prasal ze ju zakaznik nesmie vidiet, a teraz ju uz chces vytiahnut?

ukaz ako vytahujes data do toho radioListu

xciza
Člen | 194
+
0
-

Já data z db zatím netahám. V prvním příspěvku je to defaultně nastavený tak jak to nette dovoluje – žádné data z db.

$materials = array(
            '0.85' => 'Název mat. 1',
            '0.9' => 'Název mat. 2',
        );

Čísla (0.85, 0.9) nejsou na webu viditelné, ale pak s těmi hodnotami můžu pracovat. Např. takto:

$CM = $form->values->mat;

Ale ty čísla a názvy bych potřeboval nahradit hodnotami z db.

Andrasin
Člen | 29
+
0
-

Prostě vytáhneš data z db a vytvoříš z nich pole.

$array = $this->connection->table('tabulka')->fetchPairs('cena', 'nazev');

$form->addRadioList('material', 'Materiál:', $array);

Editoval Andrasin (16. 9. 2012 21:31)

xciza
Člen | 194
+
0
-

Takto mě laděnka vypíše hlášku:

Cannot read an undeclared property AdminModule\DefaultPresenter::$connection.

Pro připojení k tabulkám používám továrničky a když to upravím takto:

$array = $this->context->createMaterial()->fetchPairs('cena', 'nazev');

Tak to vybere pouze poslední hodnotu z tabulky material…

David Ďurika
Člen | 328
+
0
-

aha sry, ja som tam hore zle pochopil…

ale toto

$array = $this->context->createMaterial()->fetchPairs('cena', 'nazev');

by ti malo ist…
ake tovarnicky pouzivas ? btw. pouzitie tovarniciek nieje najstastnejsia volba…
namiesto tovarnicek pouzi servisu https://github.com/…/config.neon#L44 a tu mas ukazky nejakych modelov https://github.com/…er/app/model

Editoval achtan (17. 9. 2012 7:29)

xciza
Člen | 194
+
0
-

Továrničku mám takto:

factories:
	material: Material

a k tomu model:

<?php

use Nette\Database\Connection,
    Nette\Database\Table\Selection;

class Material extends Selection {

    public function __construct(Connection $connection) {
        parent::__construct('material', $connection);
    }

}

Koukal jsem do nového quickstartu, že se používají už spíše services, ale musel bych celou aplikaci předělat od začátku.

EDIT: Dotaz v debug baru pak vypadá takto:

SELECT `id`, `nazev`, `cena`
FROM `material`

Editoval xciza (17. 9. 2012 7:36)

David Ďurika
Člen | 328
+
0
-

xciza napsal(a):
EDIT: Dotaz v debug baru pak vypadá takto:

SELECT `id`, `nazev`, `cena`
FROM `material`

cize dotaz je spravny… chyba bude niekde inde…

  • mas v tabulke viac zaznamov ?
  • urcite ti vrati len jeden ?
xciza
Člen | 194
+
0
-

Ano v db mám 3 záznamy. A ano vypíše to pouze poslední záznam. Viz zde . Mat. 3 je název posledního záznamu. Hodil bych celou aplikaci na web, ale zatím nemám kam.

Edit: Tak sem zkusil takto:

$array = $this->context->createMaterial()->fetchPairs('id', 'nazev');

kde místo cena jsem dal id a to jde… Ale tím pádem pracuji s id materiálu a ne s cenou

Editoval xciza (17. 9. 2012 10:23)

David Ďurika
Člen | 328
+
0
-

nemas nahodou rovnaku cenu u tych produktov? tak to je jasne ze ti vypise len jeden…
myslim si ze tu uz neriesime problem s nette…

xciza
Člen | 194
+
0
-

Stejná není. Sice se liší jen v desetinných místech ale stejná není. Je to snad problém ty desetinná místa?

David Ďurika
Člen | 328
+
0
-

sprav toto

<?php
$array = $this->context->createMaterial()->fetchPairs('cena', 'nazev');
dump($array);
?>

a uvidis co presne ti to vratilo…

xciza
Člen | 194
+
0
-

Nebere to setiny. Desetiny ještě zvládne, ale setiny zaokrouhlí na celé číslo a ty se pak shodují, tudíž je nevypíše. Jak tedy mohu vypsat ty hodnoty i když tam sou setiny u ceny?

David Ďurika
Člen | 328
+
0
-

a v DB to mas spravne, nezda sa mi ze by to nette robilo… ukaz dump s DB

xciza
Člen | 194
+
0
-

V db mám sloupec typu decimal. V případě dumpu to vypíše toto:

array(3) {
   0 => "mat. 1" (6)
   "0.90" => "mat. 2" (6)
   "1.50" => "mat. 3" (6)
}

a při výpisu dat z db v latte to vypisuje hodnoty správné, tedy 0.85, 0.9 a 1.5

Editoval xciza (17. 9. 2012 13:45)

xciza
Člen | 194
+
0
-

Žádný nápad?

Patrik Votoček
Člen | 2221
+
0
-

to vypadá na chybu v NotORM a s tím prosím sem https://groups.google.com/forum/?…

xciza
Člen | 194
+
0
-

Díky, zkusím

xciza
Člen | 194
+
0
-

Zatím žádné rady, někdo nějaký jiný nápad, prosím?

leninzprahy
Člen | 150
+
0
-

Zkusil bych změnit typ sloupce v DB, jestli se to pak bude chovat stejně, třeba na float, pak případně na string (varchar)

S NotORM nepracuju a nevím jak tam je udělané přetypování získaných dat, takže je to možná blbost…

xciza
Člen | 194
+
0
-

V DB už jsem zkusil všechny typy sloupců pro čísla a žádná změna.