Добавление файла 1 ко многим для загрузки в CRUD - PullRequest
1 голос
/ 09 декабря 2011

Мое приложение имеет функцию распечатки продаж, которая позволит пользователю добавить 1 или более фотографий для продукта, который он хочет продать.

Я пытаюсь использовать загрузку / filestore_image ATK с Joinтаблица для создания отношений - мои модели:

class Model_Listing extends Model_Table {

public $entity_code='listing';

function init(){
    parent::init();
    $this->addField('name');
    $this->addField('body')->type('text');
    $this->addField('status');

    $this->addField('showStatus')->calculated(true);
}

function calculate_showStatus(){

    return ($this->status == 1) ? "Sold" : "For Sale" ;
}
}

class Model_listingimages extends Model_Table {

public $entity_code='listing_images';

function init(){
    parent::init();
    $this->addField('listing_id')->refModel('Model_Listing');
    $this->addField('filestore_image_id')->refModel('Model_Filestore_Image');
}
}

В своем классе менеджера страниц я добавил файл для загрузки в crud:

class page_manager extends Page {
function init(){
    parent::init();

    $tabs=$this->add('Tabs');
$s = $tabs->addTab('Sales')->add('CRUD');
$s->setModel('Listing',array('name','body','status'),array('name','status'));

if ($s->form) {
   $f = $s->form;
   $f->addField('upload','Add Photos')->setModel('Filestore_Image');
   $f->add('FileGrid')->setModel('Filestore_Image');
}
}

}

Myвопросы:

  1. Я получаю ошибку «Невозможно включить FileGrid.php» - я хочу, чтобы пользователь мог видеть загруженные ими изображения и надеялся, что это будетЛучший способ сделать это - добавить сетку файлов в нижней части формы.- РЕДАКТИРОВАТЬ - игнорировать этот вопрос, я создал класс FileGrid на основе кода в приведенном ниже примере ссылки - это решило проблему.

  2. Как мне сделать связь между формой CRUD такчто отправка сохранит загруженные файлы и создаст записи в таблице соединений?

Я установил последний выпуск ATK4, добавил 4 таблицы хранилища файлов в базу данных и обратился к следующей страницев документации http://codepad.agiletoolkit.org/image

TIA PG

1 Ответ

0 голосов
/ 10 декабря 2011

Создавая модель на основе Filestore_File

Вам необходимо указать правильную модель. Под собственно я имею в виду:

  • Это должно быть расширение Model_Filestore_File
  • В нем должно быть установлено MasterField, чтобы связать его с вашей записью

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

$mymodel=$this->add('Model_listingimages');
$mymodel->setMasterField('listing_id',$listing_id);
$upload_field->setModel($mymodel);
$upload_field->allowMultiple();

Таким образом, все изображения, загруженные через поле, будут автоматически связаны с вашей записью. Вам нужно будет унаследовать модель от Model_Filestore_File. Model_Filestore_Image - отличный пример, который вы можете использовать. Вы должны добавить связанный объект (соединение) и определить поля в этой таблице.

Есть и другой способ:

Выполняя дополнительную работу по связыванию изображений

Когда форма отправлена, вы можете получить список идентификаторов файлов, просто получив их.

$form->get('add_photos')

Внутри обработчика отправки формы вы можете выполнить некоторую ручную вставку в листинг изображения.

$form->onSubmit(function($form) uses($listing_id){
    $photos = explode(',',$form->get('add_photos'));
    $m=$form->add('Model_listingimages');
    foreach($photos as $photo_id){
        $m->unloadDdata()->set('listing_id',$listing_id)
            ->set('filestore_image_id',$photo_id)->update();
    }
}); // I'm not sure if this will be called by CRUD, which has
    // it's own form submit handler, but give it a try.

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

ПРИМЕЧАНИЕ: вы не должны использовать пробелы в имени файла, 2-й аргумент addField, это нарушает JavaScript.

...