konto usunięte

Temat: Wyświetlanie drzewa kategorii w Select - problem z...

Witam

Ostatnio walcze z sorotwaniem drzewa kategorii wyświetlanych w formularzu za pomocą SELECT. Udało mi się dostosować skrypt zaprezentowany na blogu Crisp do potrzeb Kohana 3.3

Nawet działa. Teraz mam problem z dodaniem wcięcia dla kategorii potomków, czyli:

Rodzic 1
- - Potomek 1
- - Potomek 2
Rodzic 2
itd.

Może macie pomysły jak to ugryźć? Z góry dzięki za rady. Poniżej prezentuje kod:

Helper z metodą do sortowania rekursywnego:

class Kohana_Treebuilder extends Kohana {

public static function buildMenu($parentId, $menuData)
{

$sorted_categories = array();

if (isset($menuData['parents'][$parentId]))
{
foreach ($menuData['parents'][$parentId] as $itemId)
{
$sorted_categories[$itemId] = $menuData['items'][$itemId];
// find childitems recursively
$sorted_categories = Arr::merge($sorted_categories, Kohana_Treebuilder::buildMenu($itemId, $menuData));
}
}
return $sorted_categories;
}


Controller:

$categories = ORM::factory('Category')
->find_all();


View:

foreach ($categories as $menuItem)
{

$menuData['items'][$menuItem->id] = $menuItem->category;
$menuData['parents'][$menuItem->category_parent_id][] = $menuItem->id;
}

$sorted_categories = Kohana_Treebuilder::buildMenu(0, $menuData);

//A na koniec juz tylko wyswietlanie:
echo Form::select('category',$sorted_categories, $post['category']);
Paweł Dymek

Paweł Dymek Full Stack Web &
Mobile Developer

Temat: Wyświetlanie drzewa kategorii w Select - problem z...

Potrzebujesz znać poziom zagłębienia (0 - rodzic, 1 - potomek, 2 - potomek potomka, itd.), który następnie będziesz mógł wykorzystać w helperze odpowiadającym za generowanie opcji wyboru select'a. Wystarczy po prostu pomnożyć przez niego ilość wyświetlanych znaków tworzących wcięcie przed nazwą.

Generalnie bardzo polecam Ci oprzeć drzewo o strukturę MPTT. Więcej
możesz przeczytać tutaj: http://en.wikipedia.org/wiki/Nested_set_model
i skorzystać z gotowego modułu do Kohany, który możesz pobrać stąd: https://github.com/kiall/kohana3-orm_mptt

Taka struktura pozwala Ci m.in. pobrać całe drzewo jednym, prostym i szybkim zapytaniem, a moduł, do którego dałem link wyżej pilnuje, aby pole oznaczające poziom zagłębienia (lvl), było aktualne po każdej zmianie. Ponadto zawiera metody, które pozwolą szybko przenieść część drzewa w inne miejsce, pobrać dowolny fragment, itp. Znacznie ułatwia życie i fajnie daje się zintegrować z pluginem nestedSortable do jQuery.Paweł Dymek edytował(a) ten post dnia 04.04.13 o godzinie 22:35

konto usunięte

Temat: Wyświetlanie drzewa kategorii w Select - problem z...

Dzięki za podpowiedź o mnożniku. Narazie wygląda lepiej. Zerknę też na strukturę MPTT. Właśnie czegoś takiego szukałem.

konto usunięte

Temat: Wyświetlanie drzewa kategorii w Select - problem z...

Witam
Wreszcie znalazłem chwilę, aby pobawić się modułem MPTT do Kohany od kiall.
Jestem w stanie dodać kategorię root, ale gdy przychodzi dodanie childa do takiej kategorii, to niestety już nie działa. Jest tylko root. Macie pomysły jak to ugryźć? Mi już nie przychodzi nic do głowy. Dzięki.

Exception:

ErrorException [ Warning ]: Missing argument 5 for Kohana_Model_MPTT::insert(), called in /home/users/server/modules/mptt/classes/Kohana/Model/MPTT.php on line 513 and defined


Kod PHP:

$mptt = Model_MPTT::factory('Category');
$mptt->name = 'Music';
$mptt->new_root();
$c1 = $mptt;
$mptt->clear();
$mptt->name = 'Rock';
$mptt->insert_as_first_child($c1);


A poniżej struktura tabeli:

CREATE TABLE IF NOT EXISTS `categories` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`parent_id` int(11) UNSIGNED NULL,
`lft` int(11) UNSIGNED NOT NULL,
`rgt` int(11) UNSIGNED NOT NULL,
`lvl` int(11) UNSIGNED NOT NULL,
`scope` int(11) UNSIGNED NOT NULL,
`name` varchar(254) DEFAULT NULL,
`active` int(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



Wyślij zaproszenie do