1

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

我正在尝试将 ATK 的 upload/filestore_image 与 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');
}
}

}

我的问题:

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

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

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

TIA PG

4

1 回答 1

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

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

$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。

于 2011-12-10T02:37:38.390 回答