我在prestasshop上工作,我在控制器(后台)中创建了一个帮助器表单。我的问题是如何使用帮助器表单中的类型:'file'来上传文档。这是代码:
public function __construct()
{
$this->context = Context::getContext();
$this->table = 'games';
$this->className = 'Games';
$this->lang = true;
$this->addRowAction('edit');
$this->addRowAction('delete');
$this->bulk_actions = array('delete' => array('text' => $this->l('Delete selected'),
'confirm' => $this->l('Delete selected items?')));
$this->multishop_context = Shop::CONTEXT_ALL;
$this->fieldImageSettings = array(
'name' => 'image',
'dir' => 'games'
);
$this->fields_list = array(
'id_game' => array(
'title' => $this->l('ID'),
'width' => 25
)
);
$this->identifier = 'id_game';
parent::__construct();
}
public function renderForm()
{
if (!($obj = $this->loadObject(true)))
return;
$games_list = Activity::getGamesList();
$this->fields_form = array(
'tinymce' => true,
'legend' => array(
'title' => $this->l('Game'),
'image' => '../img/admin/tab-payment.gif'
),
'input' => array(
array(
'type' => 'select',
'label' => $this->l('Game:'),
'desc' => $this->l('Choose a Game'),
'name' => 'id_games',
'required' => true,
'options' => array(
'query' => $games_list,
'id' => 'id_game',
'name' => 'name'
)
),
array(
'type' => 'text',
'label' => $this->l('Game Title:'),
'name' => 'name',
'size' => 64,
'required' => true,
'lang' => true,
'hint' => $this->l('Invalid characters:').' <>;=#{}'
),
array(
'type' => 'file',
'label' => $this->l('Photo:'),
'name' => 'uploadedfile',
'id' => 'uploadedfile',
'display_image' => false,
'required' => false,
'desc' => $this->l('Upload your document')
)
)
);
$this->fields_form['submit'] = array(
'title' => $this->l(' Save '),
'class' => 'button'
);
return AdminController::renderForm();
}
现在我该如何上传文件? 我是否必须在db(游戏表)的表中创建一个列来存储文件或相关内容?
提前致谢
答案 0 :(得分:2)
我假设你的模型有这个AdminController。现在一个模型显然不能在表列中保存文件。你可以做的是保持上传文件的路径。这就是你可以节省的。
您应该查看AdminController类(您已扩展)。提交表单时,将执行以下两种方法之一:
processAdd()
processUpdate()
现在研究这些方法中的流逻辑。在此方法中调用其他方法,例如:
$this->beforeAdd($this->object); -> calls $this->_childValidation();
$this->validateRules();
$this->afterUpdate($object);
正如您所看到的,这些是您可以自定义内容的方法。如果在AdminController类中查找这些函数,则“为空”。它们是故意添加的,因此人们可以覆盖它们并将其自定义逻辑放在那里。
因此,使用这些函数,您可以验证上传的文件字段(即使它不在模型本身中),如果验证,则可以为对象分配路径;然后在beforeAdd方法中,您实际上可以将上传的文件移动到所需的位置(因为子验证和默认验证都已通过)。
我做的方式:
protected function _childValidation()
{
// Check upload errors, file type, writing permissions
// Use $this->errors['file'] if there is an error;
protected function beforeAdd($object)
{
// create filename and filepath
// assign these fields to object;
protected function afterAdd($object)
{
// move the file
如果您允许更新文件字段,则您还需要执行这些步骤以获取更新方法。
答案 1 :(得分:1)
您可以在函数processAdd()和processUpdate()中使用$ _FILES [&#39;上传文件&#39;]来上传文件,您可以在调用$ this-&gt; object-之前检查那里的所有条件&GT;保存();要保存表单数据,您可以编写代码以将文件上传到所需的位置,如
move_uploaded_file($ _ FILES [&#39;上传文件&#39;] [&#39; tmp_name&#39;],$ target_path)
由于您无法将文件保存在数据库中,因此您只需要保存数据库中文件或位置的名称
希望有所帮助