Проверка количества полей, которые изменились при сохранении формы

Я сохраняю записи в транзакции, используя symfony1.4 и Doctrine.

Вставленные строки берутся из CSV-файла, который регулярно обновляется. У меня уже есть метод, который проверяет, совпадают ли записи в CSV с записями в БД и не вставляются.

Что я в идеале хочу сделать, так это настроить флэш-память пользователя, сообщающую им, сколько строк было обновлено всякий раз, когда они импортируют файл CSV.

            $conn = ProductTable::getInstance()->getConnection();
            $conn->beginTransaction();

            try {
                $row = 1;
                while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
                    if ($row > 1) {
                        $values = array(
                            'blah'            => null
                        );

                        $obj= ProductTable::getInstance()->findOrCreateNewProduct(
                            $values['blah']
                        );


                        $obj->merge($values);
                        $obj->save($conn);
                    }

                    $row++;
                }

                $conn->commit();

            } catch (Doctrine_Exception $e) {
                $conn->rollback();

                throw $e;
            }

Мне интересно, как я получу эти обновленные поля. Это в файле actions.class.php или в самом файле form.class.php?

Спасибо


person sipher_z    schedule 24.09.2012    source источник


Ответы (1)


На вы можете вызвать Doctrine_Record::getModified(), который даст вам массив измененных полей (с их значениями, хотя это не имеет значения для вас). Затем вы можете вызвать count для возвращаемого массива и сохранить совокупный итог вне цикла.

        $conn = ProductTable::getInstance()->getConnection();
        $conn->beginTransaction();
        $nbModified = 0;

        try {
            $row = 1;
            while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
                if ($row > 1) {
                    $values = array(
                        'blah'            => null
                    );

                    $obj= ProductTable::getInstance()->findOrCreateNewProduct(
                        $values['blah']
                    );


                    $obj->merge($values);
                    $nbModified += count($obj->getModified());
                    $obj->save($conn);
                }

                $row++;
            }

            $conn->commit();

            // return $nbModified or otherwise do something with it here

        } catch (Doctrine_Exception $e) {
            $conn->rollback();
            // youre rolling back so just for consistency set $nbModified to zero
            $nbModified = 0;

            throw $e;
        }
person prodigitalson    schedule 24.09.2012
comment
Куда бы я поместил `Doctrine_Record::getModified()'? внутри петли? Спасибо - person sipher_z; 24.09.2012
comment
Кажется, работает, когда я обновляю поля своего CSV и повторно загружаю. Спасибо. - person sipher_z; 24.09.2012
comment
Как в основной записи вы сохраняете или добавляете обновления к отношениям? - person prodigitalson; 24.09.2012
comment
Хорошо, скажем, у меня есть 10 строк в моей БД. В файле CSV их 5. Если я затем проанализирую CSV, и 3 строки в CSV отличаются от строк db, то я хотел бы отправить пользователю «3 строки обновлены» с помощью флэш-сообщения. - person sipher_z; 25.09.2012