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
+
0
-

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
+
0
-

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ší :)