/**
  * Validates and saves the new or updated entity and returns the appropriate HTTP
  * response.
  *
  * @param Application $app
  * the current application
  * @param AbstractData $crudData
  * the data instance of the entity
  * @param Entity $instance
  * the entity
  * @param string $entity
  * the name of the entity
  * @param boolean $edit
  * whether to edit (true) or to create (false) the entity
  *
  * @return Response
  * the HTTP response of this modification
  */
 protected function modifyEntity(Application $app, AbstractData $crudData, Entity $instance, $entity, $edit)
 {
     $fieldErrors = [];
     $mode = $edit ? 'edit' : 'create';
     $request = $app['request_stack']->getCurrentRequest();
     if ($request->getMethod() == 'POST') {
         $instance->populateViaRequest($request);
         $validator = new EntityValidator($instance);
         $validation = $validator->validate($crudData, intval($request->get('version')));
         $fieldErrors = $validation['errors'];
         if (!$validation['valid']) {
             $optimisticLocking = isset($fieldErrors['version']);
             $this->setValidationFailedFlashes($app, $optimisticLocking, $mode);
         } else {
             $modified = $edit ? $crudData->update($instance) : $crudData->create($instance);
             $response = $modified ? $this->modifyFilesAndSetFlashBag($app, $crudData, $instance, $entity, $mode) : false;
             if ($response) {
                 return $response;
             }
             $app['session']->getFlashBag()->add('danger', $app['translator']->trans('crudlex.' . $mode . '.failed'));
         }
     }
     return $app['twig']->render($app['crud']->getTemplate($app, 'template', 'form', $entity), ['crudEntity' => $entity, 'crudData' => $crudData, 'entity' => $instance, 'mode' => $mode, 'fieldErrors' => $fieldErrors, 'layout' => $app['crud']->getTemplate($app, 'layout', $mode, $entity)]);
 }
 public function testValidate()
 {
     $entityLibrary1 = $this->dataLibrary->createEmpty();
     $entityLibrary1->set('name', 'lib a');
     $this->dataLibrary->create($entityLibrary1);
     $entityBook = $this->dataBook->createEmpty();
     $entityBook->set('title', 'title');
     $entityBook->set('author', 'author');
     $entityBook->set('pages', 111);
     $entityBook->set('library', $entityLibrary1->get('id'));
     $entityBook->set('secondLibrary', $entityLibrary1->get('id'));
     $entityBook->set('cover', 'cover');
     $entityBook->set('price', 3.99);
     $valid = ['valid' => true, 'errors' => []];
     $invalid = $valid;
     $invalid['valid'] = false;
     $validatorBook = new EntityValidator($entityBook);
     $read = $validatorBook->validate($this->dataBook, 0);
     $expected = $valid;
     $this->assertSame($read, $expected);
     $entityBook->set('title', null);
     $read = $validatorBook->validate($this->dataBook, 0);
     $expected = $invalid;
     $expected['errors']['title'] = ['required'];
     $this->assertSame($read, $expected);
     $entityBook->set('title', 'title');
     // Fixed values should override this.
     $entityBook->set('title', null);
     $this->dataBook->getDefinition()->setField('title', 'value', 'abc');
     $read = $validatorBook->validate($this->dataBook, 0);
     $expected = $valid;
     $this->assertSame($read, $expected);
     $entityBook->set('title', 'title');
     $this->dataBook->getDefinition()->setField('title', 'value', null);
     $invalidLibrary = $valid;
     $invalidLibrary['valid'] = false;
     $entityLibrary2 = $this->dataLibrary->createEmpty();
     $entityLibrary2->set('name', 'lib a');
     $validatorLibrary2 = new EntityValidator($entityLibrary2);
     $read = $validatorLibrary2->validate($this->dataLibrary, 0);
     $expected = $invalidLibrary;
     $expected['errors']['name'] = ['unique'];
     $this->assertSame($read, $expected);
     $entityLibrary1->set('type', 'large');
     $validatorLibrary1 = new EntityValidator($entityLibrary1);
     $read = $validatorLibrary1->validate($this->dataLibrary, 0);
     $expected = $valid;
     $this->assertSame($read, $expected);
     $entityLibrary1->set('type', 'foo');
     $read = $validatorLibrary1->validate($this->dataLibrary, 0);
     $expected = $invalidLibrary;
     $expected['errors']['type'] = ['inSet'];
     $this->assertSame($read, $expected);
     $entityLibrary1->set('type', null);
     $entityLibrary1->set('opening', '2014-08-31 12:00');
     $read = $validatorLibrary1->validate($this->dataLibrary, 0);
     $expected = $valid;
     $this->assertSame($read, $expected);
     $entityLibrary1->set('opening', '2014-08-31 12:00:00');
     $read = $validatorLibrary1->validate($this->dataLibrary, 0);
     $expected = $valid;
     $this->assertSame($read, $expected);
     $entityLibrary1->set('opening', 'foo');
     $read = $validatorLibrary1->validate($this->dataLibrary, 0);
     $expected = $invalidLibrary;
     $expected['errors']['opening'] = [['or' => ['dateTime', 'dateTime']]];
     $this->assertSame($read, $expected);
     $entityLibrary1->set('opening', null);
     $read = $validatorLibrary1->validate($this->dataLibrary, 0);
     $expected = $valid;
     $this->assertSame($read, $expected);
     $entityLibrary2->set('name', 'lib b');
     $this->dataLibrary->create($entityLibrary2);
     $expected = $valid;
     $this->assertSame($read, $expected);
     $entityLibrary2->set('name', 'lib a');
     $read = $validatorLibrary2->validate($this->dataLibrary, 0);
     $expected = $invalidLibrary;
     $expected['errors']['name'] = ['unique'];
     $this->assertSame($read, $expected);
     $entityBook->set('pages', 'abc');
     $read = $validatorBook->validate($this->dataBook, 0);
     $expected = $invalid;
     $expected['errors']['pages'] = ['integer'];
     $this->assertSame($read, $expected);
     $entityBook->set('pages', 111);
     $entityBook->set('pages', 0);
     $read = $validatorBook->validate($this->dataBook, 0);
     $expected = $valid;
     $this->assertSame($read, $expected);
     $entityBook->set('pages', 111);
     $entityBook->set('pages', null);
     $read = $validatorBook->validate($this->dataBook, 0);
     $expected = $invalid;
     $expected['errors']['pages'] = ['required'];
     $this->assertSame($read, $expected);
     $entityBook->set('pages', 111);
     $entityBook->set('price', 'abc');
     $read = $validatorBook->validate($this->dataBook, 0);
     $expected = $invalid;
     $expected['errors']['price'] = ['floating'];
     $this->assertSame($read, $expected);
     $entityBook->set('price', 3.99);
     $entityBook->set('price', 0);
     $read = $validatorBook->validate($this->dataBook, 0);
     $expected = $valid;
     $this->assertSame($read, $expected);
     $entityBook->set('price', 3.99);
     $entityBook->set('price', null);
     $read = $validatorBook->validate($this->dataBook, 0);
     $expected = $valid;
     $this->assertSame($read, $expected);
     $entityBook->set('price', 3.99);
     $entityBook->set('release', 'abc');
     $read = $validatorBook->validate($this->dataBook, 0);
     $expected = $invalid;
     $expected['errors']['release'] = ['dateTime'];
     $this->assertSame($read, $expected);
     $entityBook->set('release', '2014-08-31');
     $entityBook->set('library', 666);
     $read = $validatorBook->validate($this->dataBook, 0);
     $expected = $invalid;
     $expected['errors']['library'] = ['reference'];
     $this->assertSame($read, $expected, 0);
     $entityBook->set('library', $entityLibrary1->get('id'));
 }