$form->addSelect() – výběr kategorií z databáze a nastavení option disabled

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

Ahoj,

Mám tabulku categories(id, name, categories_id) categories_id je cizi klic do categories.id :)
Pokud je categories_id nastaveno na NULL, je to hlavni kategorie.
Napriklad kategorie Filmy, ta ma subkategorie divx, hd atd… Neresim nekonecne zanoreni, staci mi mit hlavni,a pod kategorii :)
No a ted uz si nevim rady, jak udelat to, aby se mi vypsali kategorie, ale aby ty hlavni nesly vybrat? To znamena pokud je categories_id NULL, bude mit nastaveno disabled na true.
Zatim to resim

$categories = $this->getModels()->categories->where('lang', $this->lang)->fetchPairs('id', 'name');

A pak klasicky ve formu

$form->addSelect( 'category', 'Kategorie')->setItems($categories)->setPrompt('Vyber kategorii:');

Tím se ale dají vybrat i hlavní kategorie..
Snad jsem to napsal pochopitelně.. mohl by mi někdo poradit? Díky

Melmen
Člen | 132
+
0
-

Odpovím si tedy sám, pokud by někdo řešil něco podobného :)

$model = $this->model->categories(); // Model na získání všech kategorií

foreach ($model as $value)
{

	$parent = $value['categories_id']; //cií klíč do kategorií

	if ( $parent !== NULL )
	{
		$categories[$value->cats['name']][$value['id']] = $value['name'];
	}

}

//následně ve formu

$form->addSelect( 'category', 'Kategorie', $categories )->setPrompt('Vyber kategorii');

V $categories je pole:

array(2) {
   Filmy => array(2) {
      7 => "DivX / Xvid" (11)
      9 => "HD" (20)
   }
   Hry => array(2) {
      11 => "Akční" (7)
      12 => "Strategické" (12)
   }
}
Hurass
Člen | 114
+
0
-

Zdravím, nemůžu si pomoct, ale v jednom projektu mi to jde normálně a v druhém ne. Nedaří se mi přijít na to, čím to je. Chová se to, jako kdybych měl pojmenovanou jinak tabulku, ale tabulka se jmenuje categories

if ($parent !== NULL) {

	$categories[$value->categories['Name']][$value['Id']] = $value['Name'];
}

Chybová hláška:

Cannot read an undeclared column "categories".
David Matějka
Moderator | 6445
+
0
-

@Hurass: pouzivas innodb? mas spravne nastavene cizi klice v db?

Hurass
Člen | 114
+
0
-

Myslím, že ano. Ještě tu jedna věc, která mě zaráží. Když to mám takto, vyvolá se mi ještě tento dotaz:

SELECT CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = DATABASE() AND REFERENCED_TABLE_NAME IS NOT NULL AND TABLE_NAME = 'categories'

Přitom v druhém projektu, kde vše funguje, se tento dotaz neprovádí.

David Matějka
Moderator | 6445
+
0
-

ten dotaz se provadi jen poprve, pak se to nacachuje

zkontroluj si ty klice.. a kdyztak sem ukaz strukturu databaze, dotaz atd.

Hurass
Člen | 114
+
0
-
CREATE TABLE IF NOT EXISTS `categories` (
  `Id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
  `Name` varchar(25) COLLATE utf8_czech_ci NOT NULL,
  `Parent` tinyint(3) unsigned DEFAULT NULL,
  PRIMARY KEY (`Id`),
  UNIQUE KEY `Name_UNIQUE` (`Name`),
  KEY `fk_Parent` (`Parent`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=3 ;


ALTER TABLE `categories`
  ADD CONSTRAINT `fk_categories_Parent` FOREIGN KEY (`Parent`) REFERENCES `categories` (`Id`) ON DELETE NO ACTION ON UPDATE NO ACTION;

Dotaz se mi normálně naplní řádky z tabulky.

SELECT `Id`, `Name`, `Parent`
FROM `categories`

Editoval Hurass (14. 1. 2014 16:52)

David Matějka
Moderator | 6445
+
0
-

a ty potrebujes parent? nebo co? nazev cilove tabulky je dulezity pro pro to many smer, tedy pro related atd. pro to one (tedy ref atd) je dulezity nazev sloupecku – respektive jeho cast.
prejmenuj si sloupecek na Parent_id a pouzij $value->Parent

Hurass
Člen | 114
+
0
-

Ano, potřebuji sloupeček Parent, který jsem opravil na Parent_id, ale stejnak mi to nefunguje. :-(