Начало работы с руководством по быстрому запуску cakephp-file-storage

https://github.com/burzum/cakephp-file-storage/blob/3.0/docs/Tutorials/Quick-Start.md

После урока все перепутано или я испорчен.

Три таблицы Products Images и ProductImages просто пытаются поймать что-нибудь работающее.

Ну первая ошибка в upload.ctp productImage не определяется. Ну да, я вижу, что в контроллере его не установлено. Я, честно говоря, не знаю, как передать это в форме создания надстройки. Я знаю, что для редактирования он будет заполнять данные.

Следующая ошибка. Когда я отправляю сообщение, я получаю сообщение об ошибке. ProductTable не ассоциируется с таблицей ProductImages, и вы видите ее прямо в учебном пособии, она указана как hasMany "Изображения".

Так что я изменил его на ProductImagesTable

И я получаю сообщение об ошибке, что загрузка не определена, я предполагаю, что они ссылаются на контроллер и что он наследуется от ImageStorageTable. Я изменил его на uploadImage, просто пытаясь не получить ошибку.

Я просто пытаюсь понять, как это работает. Если кто-то может просто поделиться со мной проектом с этой работой. Я могу расшифровать, что не так.

Я хотел бы поделиться своим кодом, но я только что скопировал с быстрого запуска

1 ответ

Решение

Недавно я тоже начал использовать CakePHP 3 (у меня тоже было немного проблем), в первую очередь я использую локальное хранилище, тогда это будет подходящая настройка

В файле bootstrap.php

C: \ XAMPP \ HTDOCS \ [ProjectFolder] \ Config \ bootstrap.php

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

Поместите этот блок ниже использования блока (не забудьте использовать Burzum lib использовать Burzum \ FileStorage \ Lib \ StorageManager;)

use Burzum\FileStorage\Lib\StorageManager;
use Cake\Cache\Cache;
use Cake\Console\ConsoleErrorHandler;
use Cake\Core\App;
use Cake\Core\Configure;

Эта строка может быть настроена в соответствии с вашими потребностями (папка, в которой хранится файл).

'adapterOptions' => [TMP, true],

к (необязательно равно этому)

'adapterOptions' => [ROOT . DS . 'PicturesResources' . DS],

Это мои таблицы в MySql (только две таблицы продуктов и носителей, которые хранят пути к изображениям (media_types не важен для этого примера))

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)
);

Я запускаю торт, выпекаю все продукты и выпекаю торт, все средства массовой информации и результат:

В ProductsTable.php

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' => 'product_id'
    ]);
}

Я добавляю 'className' => 'Medias', (я не помню, если это необязательно, но я поставил его).

MediasTable.php - это то же самое, что и bake.

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'
    ]);
}

Мой метод загрузки в ProductsController.php

 public function upload() {

    if ($this->request->is('post')) {
        $mediaTypeId = 1;
        $productId = 2;
        $path = $this->request->data['Media']['file']['tmp_name'];
        $inserted = $this->Insert->insertMedia($mediaTypeId, $productId, $path);

        //-------------------------------------------------------------------------

        $stringSeparator = '_';
        $storeName = 'StoreGYN';
        $productName = 'TestProduct';
        $saved = $this->UploadFile->saveFileLFS($stringSeparator, $storeName,
            $productName);

        if($inserted === true && $saved === true){
            $this->Flash->set(__('Upload successful!'));
        }
    }
}

Я поместил метод, ответственный за Хранение файла в компоненте (это необязательно):

public function saveFileLFS($stringSeparator, $storeName, $productName)
{
    $key = $storeName . $stringSeparator . $productName . $stringSeparator .
        $this->request->data['Media']['file']['name'];
    if(StorageManager::adapter('Local')->write($key,
        file_get_contents($this->request->data['Media']['file']['tmp_name']))){
        return true;
    }else
    {
        return false;
    }
}

И поместите метод, ответственный за сохранение пути к изображению, также в компоненте:

public function insertMedia($mediaTypeId, $productId, $path)
{
    $media = TableRegistry::get('Medias')->newEntity();
    $media->media_type_id = $mediaTypeId;
    $media->product_id = $productId;
    $media->path = $path;

    if(TableRegistry::get('Medias')->save($media)){
        return true;
    }
    else{
        return false;
    }
}

Это шаблон, обратите внимание на имя элементов ввода, они должны совпадать с ключами $this->request->data['Media']['file']['tmp_name']; в противном случае вы не сможете получить доступ к информации, отправленной в форме (включая файл изображения).

<?php
echo $this->Form->create(null, array(
    'type' => 'file'
));
echo $this->Form->file('Media.file');
echo $this->Form->error('file');
echo $this->Form->submit(__('Upload'));
echo $this->Form->end();
?>

Примечания: я использую XAMPP и CakePHP 3

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