Сохранение связанных данных в MVC (cakephp) - PullRequest
0 голосов
/ 27 апреля 2011

Я снова и снова читаю книгу из cakephp, не понимая, как сохранить связанные данные.У меня есть раздел под названием Works и раздел под названием Мебель, который может содержать Images:

  • id
  • title
  • body
  • url
  • user_id
  • создан
  • изменен
  • активен
  • id
  • title
  • body
  • url
  • user_id
  • создан
  • изменен
  • active
  • id
  • name
  • type
  • filepath
  • user_id
  • создано
  • изменено
  • активно

Я создал один MVC для каждой сущности (Work, Furnitureи Image), и теперь я пытаюсь добавить Work на мой сайт с представлением add:

<script>/* script for .add_image, Work and other models can have 0 or more images */</script>
<div><?php echo $this->Form->input('Work.title', array('value'=>'titolo', 'label' => 'Nome lavoro')); ?></div>
<div><?php echo $this->Form->input('Work.body', array('type' => 'textarea', 'value'=>'description', 'label' => 'Descrizione')); ?></div>
<div><?php echo $this->Form->input('Work.url', array('value'=>'http://', 'label'=> false)); ?></div>
<div>Immagini</div>
<div><?php echo $this->Form->input('Image.name', array('label'=> false, 'value'=>'Nome immagine'));?></div>
<div><?php echo $this->Form->file('Image.file'); ?></div>
<div><div class="add_image">Add image</div></div>
<div><?php echo $this->Form->end('Inserisci lavoro'); ?></div>

Это сохраняет только данные Work без Imageсвязанные, я предполагаю, что я что-то упускаю в Model и в Controller:

<?php

class Work extends AppModel {
    var $name = 'Work';
    var $belongsTo = array ('User');
    var $hasAndBelongsToMany = array (
        'Image' => array (
            'className' => 'Image',
            'order' => 'Image.created DESC',
            'exclusive' => true,
            'dependent' => true // this will remove all images related to article
        ),
        'Tag' => array (
            'className' => 'Tag',
            'order' => 'Tag.name DESC'
        )
    );

    var $validate = array (
        'title' => array(
            'rule' => array('maxLength', 60),
            'allowEmpty' => false
        ),
        'body' => array (
            'rule' => array('maxLength', 250),
            'allowEmpty' => false
        ),
        'url' => array (
            'rule' => array('url', true),
            'allowEmpty' => true
        )
    );

    function parentNode () {
        return null;
    }
}

?>

WorksController:

<?php

class WorksController extends AppController {

    var $name = 'Works';
    var $components = array ('Session');

    function index () {
        $this->set('works', $this->Work->find('all'));
    }

    function view () {
        $this->Work->id = $id;
        $this->set('work', $this->Work->read());
    }

    function add () {
        if (!empty($this->data)) {
            $work = $this->Work->save($this->data);
            if (!empty($work)) {
                // this is wrong, but what should I write?
                // $this->data['Image']['user_id'] = $this->Work->User->id;
                // $this->Work->Image->saveAll($this->data);
                $this->Session->setFlash ('Lavoro inserito correttamente');
                $this->redirect(array('action'=>'index'));
            }
        }
    }
}
?>

ImageModel:

<?php

class Image extends AppModel {
    var $name = 'Image';

    var $hasAndBelongsToMany = array (
        'Work' => array (
            'className' => 'Work'
        ),
        'Furniture' => array (
            'className' => 'Furniture'
        )
    );

    var $actsAs = array ('FileUpload.FileUpload' => array (
        'uploadDir' => 'img/shared',// 'forceWebroot' => true, is default
        'allowedTypes' => array(
            'jpg' => array('image/jpeg', 'image/pjpeg'),
            'jpeg' => array('image/jpeg', 'image/pjpeg'), 
            'gif' => array('image/gif'),
            'png' => array('image/png','image/x-png'),
        ),
        'maxFileSize' => 614400, // 600kB in bytes
        'unique' => true
    ));

    // in the wiew file: echo $form->input('Image.file', array('type' => 'file'));

    var $validate = array (
        'name' => array (
            'rule' => 'notEmpty',
            'message' => 'Nome dell\'immagine in fase di cariamento mancante'
        ),
        'filename' => array (
            'rule' => 'notEmpty',
            'message' => 'Nome dell\'immagine in fase di cariamento mancante'
        )
    );
}
?>

Сохраняет только часть Works данных:

  • id - ok
  • title - ok
  • body -ok
  • url - ok
  • user_id - 0
  • создан - ok
  • изменен - ​​ok
  • active - это 0

Как мне реализовать Images в Works?

Я думал добавить таблицу БД с именем images_works всвязать Works с Images и furnitures_images, чтобы связать Furnitures с Images, что мне нужно сделать, чтобы продолжить и исправить user_id missing error?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2011

Имя входа должно быть другим и соответствовать структуре данных, которую CakePHP ожидает для Image для saveAll ().Введите имя [Image] [ counter ] [name] или [ Counter ] [Image] [name].(Не уверен, какую именно модель ожидает торт). В противном случае вы получите только одно изображение, и будет сохранено только одно изображение.

Также убедитесь, что элемент формы имеет атрибут enctype, установленный длязагрузка файла.

0 голосов
/ 27 апреля 2011

first

<?php
class WorkdsController extends AppController
    var $components = array('Session', 'Auth');
    if($this->Wok->create($data) && $this->Work->save($this->data)){
        $work_id = $this->Work->getID;
        // and than use work_id work with work id. then you should somehow get user_id
        // for example $this->Auth->user(id');
    }
}

, затем, если вы хотите связать изображения с работами, как описано выше (hasMany), вам нужно добавить work_id в таблицу изображений.

в противном случае создайтеновая таблица images_works (id, image_id, work_id) и использовать $ hasAndBelongsToMany вместо $ hasMay

...