Cakephp:多文件验证
我想用cakephp制作一个照片管理器。除了一件事之外,一切都按照我的预期进行。我似乎无法正确验证多个文件 我使用了一个名为Image的模型,在这里我验证了表单中的数据。 在我看来,这就是形式Cakephp:多文件验证,php,validation,cakephp,Php,Validation,Cakephp,我想用cakephp制作一个照片管理器。除了一件事之外,一切都按照我的预期进行。我似乎无法正确验证多个文件 我使用了一个名为Image的模型,在这里我验证了表单中的数据。 在我看来,这就是形式 <?php echo $this->Form->create('Image', array( 'type' => 'file', 'url' => array_merge(array('action' =>
<?php
echo $this->Form->create('Image', array(
'type' => 'file',
'url' => array_merge(array('action' => 'index'), $this->params['pass']),
'inputDefaults' => array(
'div' => 'form-group',
'wrapInput' => false,
'label' => false,
'class' => 'form-control'
),
'class' => 'well form-inline'
));
echo $this->Form->input('Image.image_manager.', array('type' => 'file', 'multiple'));
echo $this->Form->input('field', array(
'options' => $imageData['buildings'],
'empty' => '(choose one)',
'class' => 'form-control buildingSelector'
));
echo '<div class="flatForm">';
echo $this->Form->input('flat', array(
'options' => '',
'empty' => '(choose one)',
'class' => 'form-control uploadFlat',
'id' => "success"
));
echo '</div>';
echo $this->Form->submit(__('Submit'), array(
'div' => 'form-group',
'class' => 'btn btn-default pull-left'
));
echo $this->Form->end();
?>
第二次编辑ndm他的回答是正确的,在重新格式化我的数据后,这就是我发送给saveAll函数的数组的外观
array(
array('image_manager' => array('name' => 'a', 'type' => 'b', /* ... */)),
array('image_manager' => array('name' => 'c', 'type' => 'd', /* ... */)),
);
保存/验证多个文件的格式不正确
正如评论中已经指出的,数据的格式对于保存或验证许多记录来说是不正确的,应该是
array(
array(
'Image' => array(
'image_manager' => array('name' => 'a', 'type' => 'b', /* ... */)
)
),
array(
'Image' => array(
'image_manager' => array('name' => 'c', 'type' => 'd', /* ... */)
)
),
);
或
对于您当前使用的格式,它会将键名称
、类型
等视为要保存/验证的字段,而不是图像管理器
,因此会出现验证错误
手动重新格式化数据 由于您无法更改浏览器发送多个文件的方式,因此在保存/验证数据之前,您必须手动重新格式化数据,例如(可能最适合
图像
模型上的方法):
这将为您提供上面提到的前一种格式,然后您可以直接将其传递给Model::saveAll()
或Model::saveMany()
:
相应地调整您的自定义验证规则 现在,随着格式的更改,您很可能需要调整自定义的
processUpload
验证规则,因为传递给它的数据的格式将不同
另一方面,如果规则实际将文件移动/存储到磁盘上,这不是验证应该负责的,最好在
Model::beforeSave()
或Model::afterSave()中完成
回调。是否为每个文件显示?请正确检查规则。如果您显示…数据['Image']['Image\u manager']]
实际包含的内容,则会有所帮助。您可能以错误的格式传递了数据。有关正确的格式,请参阅。我已添加了一个示例,说明数据['Image']['Image\u manager']
中可能存在的问题。我没有立即发现第一次浏览时出现错误,因为它的格式肯定不正确。在我回答这个问题之前,是不是不应该为图像
模型创建表单?ie字段
和平面
实际上并不属于图像
模型,而是图像
模型与这些字段在xxx中所属的任何模型相关联。它确实不是用于图像模型。我的同事告诉我尝试使用图像模型,因为文件验证需要相同的规则。但该图像模型(尚未)与任何其他模型关联。这将是下一步。我还可以告诉您,photomanager位于app=>plugin文件夹中,而图像模型位于app=>model中。(我不知道这可能有多重要,但可能会有所帮助。)谢谢你,这很有魅力。我在我的问题中添加了一个重新格式化数据的示例,供遇到相同问题的人使用。我应该更加注意文档中的格式。Cakephp对我来说仍然有些模糊。
Array
(
[0] => Array
(
[name] => Hydrangeas.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpWfut6N
[error] => 0
[size] => 595284
)
[1] => Array
(
[name] => Jellyfish.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpLmxQtx
[error] => 0
[size] => 775702
)
[2] => Array
(
[name] => Tulips.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpi69Hsl
[error] => 0
[size] => 620888
)
)
Array
(
[0] => Array
(
[image_manager] => Array
(
[name] => Hydrangeas.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpWfut6N
[error] => 0
[size] => 595284
)
)
[1] => Array
(
[image_manager] => Array
(
[name] => Jellyfish.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpLmxQtx
[error] => 0
[size] => 775702
)
)
[2] => Array
(
[image_manager] => Array
(
[name] => Tulips.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpi69Hsl
[error] => 0
[size] => 620888
)
)
)
array(
array('image_manager' => array('name' => 'a', 'type' => 'b', /* ... */)),
array('image_manager' => array('name' => 'c', 'type' => 'd', /* ... */)),
);
array(
array(
'Image' => array(
'image_manager' => array('name' => 'a', 'type' => 'b', /* ... */)
)
),
array(
'Image' => array(
'image_manager' => array('name' => 'c', 'type' => 'd', /* ... */)
)
),
);
App::uses('Hash', 'Utility');
$data = Hash::map($this->request->data['Image']['image_manager'], '{n}', function($value) {
return ['image_manager' => $value];
});
$this->Image->saveMany($data, ['validate' => 'only']);