Ура, наконец-то! Так с этого нужно и начинать было. Тут все намного проще.
Тебе вообще пока 3 таблицы нужно (из них одна связующая), а не то, что ты там навыдумывал, впрочем, как я в самом начале и говорил)
1. Таблица разделов (назовем ее жанры - genres)
Код:
id parent_id title
1 0 Комедии
2 0 Боевики
3 0 Триллеры
4 3 Остросюжетные триллеры
5 3 Фантастические триллеры
6 3 Психологические триллеры
7 1 Криминальные комедии
8 1 Молодежные комедии
9 1 Приключенческие комедии
10 1 Фантастические комедии
11 2 Криминальные боевики
12 2 Военные боевики
13 2 Восточные единоборства
14 2 Комедийные боевики
15 2 Фантастические боевики
Разделы с parent_id = 0 - это пусть будут жанры (категории)
Разделы с parent_id != 0 - это пусть будут поджанры (подкатегории)
parent_id показывает к какому жанру относится поджанр.
2. Таблица фильмов (назовем ее фильмы - films)
Код:
id title description
1 Люди Икс: Первый класс (Positive Multimedia) Описание к фильму Люди Икс: Первый класс
2 Другой мир 1-4 (Positive Multimedia) (4 DVD) Описание к фильму Другой мир 1-4
3 Мачо и Ботан (Positive Multimedia) Описание к фильму Мачо и Ботан
3. Связывающая таблица (назовем ее genre2film)
Код:
genre_id film_id
2 3
14 3
2 1
5 1
5 2
2 2
15 1
Вот диаграмма:
http://clip2net.com/s/28yTZСвязь genres к films - это связь "многие-ко-многим", т.е. к любому жанру может относится несколько фильмов и любой фильм может относится к нескольким жанрам.
Такая связь реализуется через промежуточную таблицу, т.е. фактически genres относится к genre2film как "один-ко-многим" и films к genre2film как "один-ко-многим" (читать литературу по базам данных)
Вот так это выглядит в базе. А с помощью kohana ORM мы можем это все описать в коде и работать с этим, как с классами, используя методы и свойства.
Все! И как я в самом начале писал тут
viewtopic.php?f=31&t=247#p1226 - так это и реализуется.
Код:
class Model_Genre extends ORM
{
protected $_has_many = array(
'films' => array(
'model' => 'film',
'through' => 'genre2film',
),
);
}
class Model_Film extends ORM
{
protected $_has_many = array(
'genres' => array(
'model' => 'genre',
'through' => 'genre2film',
),
);
}
Код:
class Controller_Catalogue extends Controller_Template
{
public function action_genre()
{
$id = $this->request->param('id');
$o_genre = ORM::factory('genre', $id);
if ( ! $o_genre->loaded())
throw new HTTP_Exception_404();
$o_films = $o_genre->films->find_all();
$this->template->title = 'Films';
$this->template->content = View::factory('catalogue/genre',
array(
'o_genre' => $o_genre,
'o_films' => $o_films,
));
}
public function action_film()
{
$id = $this->request->param('id');
$o_film = ORM::factory('film', $id);
if ( ! $o_film->loaded())
throw new HTTP_Exception_404();
$o_genres = $o_film->genres->find_all();
$this->template->title = 'Film';
$this->template->content = View::factory('catalogue/film',
array(
'o_film' => $o_film,
'o_genres' => $o_genres,
));
}
}
genre.php
Код:
echo '<h1>' . $o_genre->title . '</h1>';
foreach ($o_films as $o_film)
{
echo $o_film->title . '<br />';
}
film.php
Код:
echo '<h1>' . $o_film->title . '</h1>';
foreach ($o_genres as $o_genre)
{
echo $o_genre->title . '<br />';
}
На данный момент этой структуры вполне достаточно для того примера, а не то, что ты там наворотил)
Смотри методы ORM для работы с базой и связями.
И чего было голову морочить?))
Как добавлять фильм в категорию писал тут:
viewtopic.php?f=31&t=247#p1237Т.е. при добавлении фильма передашь массив id-шников, отмеченных (выбранных) жанров и делаешь типа такого:
Код:
$obj->save();
$obj->add('genres', $cids);
Только с хлебными крошками не все просто, но если вложенность всего 2 (жанры-поджанры), то можно сделать и на 1 запрос больше.
Так же (в будущем) как на том сайте можно к таблице genres добавить поле type (FILMS, MULT, MUSIC) и делать выборку главных разделов с учетом типа используя все те же 3 таблицы (ну или типа того, нужно подумать, но пока этого достаточно)
Инфы с головой!!! Портал писать за тебя не буду)
Надеюсь это понятно. Понятнее уже не напишу. Куда ты там пытался добраться, надеюсь уже не понадобится)