Как сохранить изображения с Cakephp-File-Storage?

ОБНОВИТЬ

Поэтому я добавил несколько журналов для загрузки действия в ProductsController и метода загрузки в MediasTable, чтобы узнать, что происходит. Сущность от ProductsController this->Products->Medias->newEntity() был передан MediasTable, но не был сохранен.

Нужно загрузить файл для сохранения данных в БД? Например, если все данные в порядке, но файла нет, событие будет отклонять данные и ничего не делать в БД?


Я использую cakephp 3.1 с плагином для хранения файлов. Я следую руководству по быстрому старту из документов: Быстрый старт, но я не понимаю некоторые части и не загружаю, не вставляю в базу данных и не делаю эскизы.

Это моя база данных:

CREATE TABLE products (
   id INT AUTO_INCREMENT PRIMARY KEY,
   product_name VARCHAR(255) NOT NULL,
   quantity INT NOT NULL,
   sold INT NOT NULL,
   description VARCHAR(1000),
   price DECIMAL(7,2) NOT NULL,
   old_price DECIMAL(7,2) NOT NULL,
   visited INT NOT NULL,
   status INT NOT NULL,
   created DATETIME,
   modified DATETIME
);

CREATE TABLE media_types (
   id INT AUTO_INCREMENT PRIMARY KEY,
   name_media_type VARCHAR(255) NOT NULL,
   created DATETIME,
   modified DATETIME
);

 CREATE TABLE medias (
  id INT AUTO_INCREMENT PRIMARY KEY,
  media_type_id INT NOT NULL,
  product_id INT NOT NULL,
  path VARCHAR(255) NOT NULL,
  created DATETIME,
  modified DATETIME,
  FOREIGN KEY media_type_key (media_type_id) REFERENCES media_types(id),
  FOREIGN KEY product_key (product_id) REFERENCES products(id)
);

MediasTable:

...
use Burzum\FileStorage\Model\Table\ImageStorageTable;

class MediasTable extends ImageStorageTable {
    public function initialize(array $config) {
        parent::initialize($config);
        $this->table('medias');
        $this->displayField('id');
        $this->primaryKey('id');

        $this->addBehavior('Timestamp');

        $this->belongsTo('MediaTypes', [
            'foreignKey' => 'media_type_id',
            'joinType' => 'INNER'
        ]);
        $this->belongsTo('Products', [
            'foreignKey' => 'product_id',
            'joinType' => 'INNER'
        ]);
    }
    ...
    public function upload($productId, $entity) {
        $media = $this->patchEntity($entity, [
            'adapter' => 'Local',
            'model' => 'Media',
            'foreign_key' => $productId
        ]);
        Log::write('debug', $media);
        return $this->save($media);
    }
}

ProductsTable:

class ProductsTable extends Table {
    public function initialize(array $config) {
        parent::initialize($config);
        $this->table('products');
        $this->displayField('id');
        $this->primaryKey('id');

        $this->addBehavior('Timestamp');

        $this->hasMany('Medias', [
            'className' => 'Medias',
            'foreignKey' => 'foreign_key',
            'conditions' => [
                'Medias.model' => 'Media'
           ]
        ]);
    }
    ...
}

ProductsController:

class ProductsController extends AppController {
    public function upload($productId = null) {
        $productId = 2;
        $entity = $this->Products->Medias->newEntity();
        if ($this->request->is(['post', 'put'])) {
            $entity = $this->Products->Medias->patchEntity(
                $entity,
                $this->request->data
            );
            if ($this->Products->Medias->upload($productId, $entity)) {
                $this->Flash->set(__('Upload successful!'));
            }
        }
        $this->set('productImage', $entity);
    }
    ...
}

В config/local_store.php такой же, как в примере (я включаю этот файл в boostrap.php)

...
$listener = new LocalFileStorageListener();
EventManager::instance()->on($listener);

$listener = new ImageProcessingListener();
EventManager::instance()->on($listener);

Configure::write('FileStorage', [
'imageSizes' => [
    'Medias' => [
        'large' => [
                ...
]);

FileStorageUtils::generateHashes();

StorageManager::config('Local', [
    'adapterClass' => '\Gaufrette\Adapter\Local',
    'adapterOptions' => [TMP, true],
    'class' => '\Gaufrette\Filesystem'
]);

upload.ctp

echo $this->Form->create($productImage, array('type' => 'file'));
echo $this->Form->file('file');
echo $this->Form->error('file');
echo $this->Form->submit(__('Upload'));
echo $this->Form->end();

В быстром старте есть два метода загрузки: uploadImage и uploadDocument, но в контроллере они используют "upload".

В Примере есть другая ассоциация в Продуктах, мне это нужно?:

        $this->hasMany('Documents', [
        'className' => 'FileStorage.FileStorage',
        'foreignKey' => 'foreign_key',
        'conditions' => [
            'Documents.model' => 'ProductDocument'
        ]
    ]);

Я нашел этот вопрос (оттуда есть база данных, которую я использую). Начало работы с руководством по быстрому запуску cakephp-file-storage, загрузкой и вставкой, но миниатюры не создаются, и если я изменяю таблицу на ImageStoreTable, выдает ошибку "Класс не найденный"

Так что если кто-нибудь может мне помочь, я буду очень благодарен!

0 ответов

Другие вопросы по тегам