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

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

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

Три таблицы Продукты Изображения и ProductImages просто пытаются поймать что-нибудь работающее.

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

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

Поэтому я меняю его на ProductImagesTable

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

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

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

Solutions Collecting From Web of "Начало работы с руководством по быстрому старту cakephp-file-storage"

Недавно я начал использовать 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 – это то же самое, что и выпечка .

 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