csvファイルでpostで受け取り
1行ごとにバリデーションをかけるところで
DBを調べてバリデーションをかけたいです。
コントローラ側は、以下のような実装で、
while ($data = $file->fgetcsv()) { // CSVファイルの1レコード
~中略~
$lineInputFilter->setData($data); // データをセット
if (!$lineInputFilter->isValid()) { // バリデーション
モデル側で以下のようになります。
use Zend\InputFilter\InputFilter;
use Zend\Db\Sql\Where;
class A extends InputFilter
{
public $originalData;
public function init()
{
$self = $this;
$where = new Where();
$where->equalTo('colA', $self->originalData[0])
->notEqualTo('colB', $self->originalData[1]);
$this->add(array(
'name' => 'colA',
'filters' => array(
array(
'name' => 'string_trim',
),
array(
'name' => 'null',
'options' => array(
'type' => 'string',
),
),
),
'validators' => array(
array(
'name' => 'dbnorecordexists',
'options' => array(
'message' => 'すでに登録されています',
'adapter' => $this->getDbAdapter(),
'table' => 'TABLE_A',
'field' => 'colA',
'exclude' => $where,
),
'break_chain_on_failure' => true,
),
),
));
public function setData($data)
{
$this->originalData = $data;
$keys = array(
'colA',
'colB',
);
$normalizedData = array();
foreach ($keys as $key) {
$normalizedData[$key] = array_shift($data);
}
parent::setData($normalizedData);
return $this;
}
上記の$where->equalToにある
$self->originalData[0]
$self->originalData[1]
を、CSVの1行毎に変化させたいのですが、
2行目、3行目も1行目の値のままになってしまいます。
2行目は2行目のデータを3行目は3行目のデータにするには
どのようにすればよいでしょうか。
コメント(0件)