2013-11-20 5 views
0

Я нахожусь в поиске с высоким и низким уровнем. Я не уверен, где я ошибся, потому что у меня нет ошибок.Cakephp HABTM save -.-

У меня есть 3 таблицы:

Movies - идентификатор, название, жанр и т.д.

жанры - идентификатор, жанровые

GENRES_MOVIES - movie_id, genre_id

модель фильма:

public $hasAndBelongsToMany = array(
'Genre' => array(
     'className' => 'Genre', 
     'joinTable' => 'genres_movies', 
     'foreignKey' => 'movie_id', 
     'associationForeignKey' => 'genre_id' 
    ) 
); 

Вид:

echo $this->Form->create('Movie', array('controller' => 'movies', 'action' => 'add', 'type' => 'file')); 
echo $this->Form->input('title'); 
echo $this->Form->input('description', array('type' => 'textarea'); 
echo $this->Form->input('imdb_url'); 
echo $this->Form->year('release_year', 1900, date('Y')); 
echo $this->Form->input('length', array('type' => 'number')); 
echo $this->Form->input('genre', array('type'=>'select', 'multiple'=>'checkbox', 'options'=> $genres)); 
echo $this->Form->input('image', array('type' => 'file')); 
echo $this->Form->button('Submit'); 

MoviesController:

public function add() 
     { 
     /* for populating checkbox */ 
     $this->set('genres', $this->Movie->Genre->find('list', array('fields' => array('Genre.id', 'Genre.genre')))); 

     if($this->request->is('post')) 
      { 
      $data_movie = array(
      'title' => $this->request->data['Movie']['title'], 
      'description' => $this->request->data['Movie']['description'], 
      'imdb_url' => $this->request->data['Movie']['imdb_url'], 
      'release_year' => (int)$this->request->data['Movie']['release_year']['year'], 
      'length' => (int)$this->request->data['Movie']['length'], 
      'user_id' => (int)$this->Auth->user('id') 
      ); 

      $data_genre = array('Genre' => array()); 
      foreach($this->request->data['Movie']['genre'] as $genre) 
       array_push($data_genre['Genre'], (int)$genre); 

      $data = array('Movie' => $data_movie, 'Genre' => $data_genre); 
      $this->Movie->create(); 

        if($this->Movie->save($data) 
        { 
        echo 'success'; 
       } 
      } 

     } 

Итак, почему я потрудился настройки данных вручную для сохранения в movieController, это происходит потому, что учебники говорят мне данные должны быть организованы так, как сейчас (до этого это выглядело немного иначе .. поэтому я попытался и это то, что я есть сейчас (это выглядит нормально для меня) http://s10.postimg.org/ikewszo95/Untitled_1.jpg

вы можете увидеть форму здесь http://marko-stimac.iz.hr/temp/movies/movies/add (хотя представить не будет работать, я думаю, это из-за Компонент Auth, не позволяющий незарегистрированному использованию RS)

гм любая помощь будет оценена greeatly :)

EDIT - обновленный контроллер

public function add() 
    { 
      $this->set('genres', $this->Movie->Genre->find('list', array('fields' => array('Genre.id', 'Genre.genre')))); 

    if($this->request->is('post')) 
     { 
      ($this->Movie->saveAssociated($this->request->data))  
       { 
       $this->redirect('/'); 
       $this->Session->setFlash('Success.'); 
      } 
     } 

    } 

ответ

0

Не изменять данные, то есть, чтобы избавиться от этих линий

$data_genre = array('Genre' => array()); 
foreach($this->request->data['Movie']['genre'] as $genre) 
      array_push($data_genre['Genre'], (int)$genre); 
$data = array('Movie' => $data_movie, 'Genre' => $data_genre); 
$this->Movie->create(); 

И сохраните ваши данные, используя

if ($this->Movie->saveAssociated($this->request->data) { 
    ... 

EDIT

Измените форму, изменить

echo $this->Form->input('genre', array('type'=>'select', 'multiple'=>'checkbox', 'options'=> $genres)); 

к этому

echo $this->Form->input('Genre', array('type'=>'select', 'multiple'=>'checkbox', 'options'=> $genres)); 
+0

он не работает .. и это то, что я получаю с отладки ($ this-> request- > data) http://s22.postimg.org/j2i8mpvlt/Untitled_2.jpg – Marko

+0

Почему это не удается? вы проверили validationErrors? –

+0

У меня даже нет ничего, чтобы проверить. не существует $ validate или функции beforeSave в модели Movie:/ – Marko