添加1到多个文件上传到CRUD

时间:2011-12-09 14:35:26

标签: atk4

我的应用具有销售列表功能,允许用户为他们想要销售的产品添加1张或更多张照片。

我正在尝试使用带有Join表的ATK的upload / filestore_image来创建关系 - 我的模型:

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

}

我的问题:

  1. 我收到“无法包含FileGrid.php”错误 - 我希望用户能够看到他们上传的图片,并希望这是最好的方法 - 通过添加文件网格到表单底部。 - 编辑 - 忽略这个问题,我根据下面示例链接中的代码创建了一个FileGrid类 - 修复了问题。

  2. 如何在CRUD表单之间建立关联,以便提交将保存上传的文件并在连接表中创建条目?

  3. 我已安装最新版本的ATK4,将4个文件存储表添加到数据库并引用文档http://codepad.agiletoolkit.org/image中的以下页面

    TIA PG

1 个答案:

答案 0 :(得分:0)

通过基于Filestore_File创建模型

您需要指定合适的模型。我的意思是:

  • 必须扩展Model_Filestore_File
  • 必须设置MasterField才能将其与您的条目
  • 相关联

在这种情况下,您必须在上传图像时知道引用的ID,因此如果您在创建记录之前上传图像,它将无法工作。只是为了让您了解代码看起来

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

这样,通过该字段上传的所有图片都会自动与您的商家信息相关联。您需要从Model_Filestore_File继承模型。 Model_Filestore_Image是一个非常好的例子,您可以使用它。您应该添加相关实体(join)并在该表中定义字段。

还有其他方式:

通过在链接图像方面做一些额外的工作

提交表单后,您只需获取文件ID即可检索文件ID列表。

$form->get('add_photos')

在内部表单提交处理程序中,您可以执行一些手动插入到listingimages中。

$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一起使用,您应该看到理论上可以访问哪些文件。这是正常的,这就是我推荐使用上述第一种方法的原因。

注意:你不应该在文件名中使用空格,addField的第二个参数,它会破坏javascript。