2011-12-09 15 views
1

我的应用程序具有销售列表功能,允许用户为他们想销售的产品添加1张或更多照片。添加1到很多文件上传到CRUD

我试图使用ATK的上传/ 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表单之间的关联,以便提交将保存上传的文件并在连接表中创建条目?

我已经安装ATK4的最新版本,增加了4个文件存储表到数据库和文档http://codepad.agiletoolkit.org/image

中引用以下页面TIA PG

+0

顺便说一句,你知道单场允许你上传多张照片吗? https://github.com/atk4/atk4/blob/master/lib/Form/Field/upload.php您还需要将“image”字段定义为varchar,但除非您在该字段上放置索引,否则它应该是好。我会考虑你的其他问题,稍后再回复。 – romaninsh

+0

是 - 用户可以根据需要添加尽可能多的图像(尽管我可能会在以后添加限制)。 filestore_image sql创建了4个表 - filestore_image.name被定义为varchar。我希望能够使用我的listing_images连接表/模型在清单表和filestore_image表之间建立关系 - 除非您认为有更好的方法来实现此目的。 –

+0

我不必在连接表中使用filestore_image - 我很高兴能够将图片上传到专用的表格中 - 因为列表中的图片会有1到多个图片,但是会看到大多数重的图片提升已经在filestore_image中被编码了,似乎试图实现和使用它似乎更容易。 –

回答

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是一个非常好的例子,您可以使用它。您应该添加相关实体(连接)并在该表中定义字段。

有太多其他的方式:

通过简单地让他们做一些额外的工作,在联系图片

当提交表单时,您可以检索文件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。