selectbox s kategoriemi z mysql
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- Petr Parolek
- Člen | 455
Ahoj, přemýšlím, jak mám implementovat načítání selectboxu s kategoriemi a subkategoriemi.
Struktura tabulky:
CREATE TABLE IF NOT EXISTS `web_menu_items` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`menutype` varchar(24) NOT NULL COMMENT 'The type of menu this item belongs to. FK to #__menu_types.menutype',
`title` varchar(255) NOT NULL COMMENT 'The display title of the menu item.',
`alias` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'The SEF alias of the menu item.',
`published` tinyint(4) NOT NULL DEFAULT '0' COMMENT 'The published state of the menu link.',
`parent_id` int(10) unsigned NOT NULL DEFAULT '1' COMMENT 'The parent menu item in the menu tree.',
`level` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'The relative level in the tree.',
`access` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'The access level required to view the menu item.',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Rád bych měl např. v selectboxu:
- aaa
-- bb
– cc - ddd
Prosím poraďte mi někdo. Díky moc
- trejjam
- Backer | 65
Zvolil bych něco takového:
class MenuItems {
protected $database;
function __construct(Nette\Database\Context $database) {
$this->database=$database;
}
public function getList() {
$list=[];
foreach ($this->database->table('web_menu_items')->where(['parent_id'=>NULL, 'published'=>1]) as $item) {
//parent_id povolit NULL a navázat přes FK na id
//výběr kořenových prvků, případně doplnit access restrikci
$item[$item->title]=[]; //počítá s UNIQUE title
foreach ($item->related('web_menu_items', 'parent_id')->where(['published'=>1]) as $subItem) {
//výběr potomků
$item[$item->title][$subItem->id]=$subItem->title;
}
}
return $list;
}
}
class FooPresenter extends Nette\Application\UI\Presenter {
/**
* @var MenuItems @inject
*/
public $model;
public function createComponentForm() {
$form = new UI\Form;
$form->addSelect('menu', 'Label', $this->model->getList());
return $form;
}
}
Tento kód vytěsní potřebu ‚level‘.
Kód jsem psal z hlavy nemusí být bez chyb
Pokud máš hlubší strom a nechceš pokládat několik dotazů (kód výše by měl položit 2 SELECTy) bude kód o trochu složitější :)