Example #1
0
 /**
  * Execute an update API request.
  *
  * @param string $resource
  * @param mixed $id
  * @param array $data
  * @param array $fileData
  * @param bool $partial
  * @return Response
  */
 public function update($resource, $id, $data = [], $fileData = [], $partial = false)
 {
     $request = new Request(Request::UPDATE, $resource);
     $request->setId($id);
     $request->setContent($data);
     $request->setFileData($fileData);
     $request->setIsPartial($partial);
     return $this->execute($request);
 }
Example #2
0
 /**
  * {@inheritDoc}
  */
 public function hydrate(Request $request, EntityInterface $entity, ErrorStore $errorStore)
 {
     parent::hydrate($request, $entity, $errorStore);
     if ($this->shouldHydrate($request, 'o:item_set')) {
         $itemSetsData = $request->getValue('o:item_set', []);
         $itemSetAdapter = $this->getAdapter('item_sets');
         $itemSets = $entity->getItemSets();
         $itemSetsToRetain = [];
         foreach ($itemSetsData as $itemSetData) {
             if (is_array($itemSetData) && array_key_exists('o:id', $itemSetData) && is_numeric($itemSetData['o:id'])) {
                 $itemSetId = $itemSetData['o:id'];
             } elseif (is_numeric($itemSetData)) {
                 $itemSetId = $itemSetData;
             } else {
                 continue;
             }
             if (!($itemSet = $itemSets->get($itemSetId))) {
                 // Item set not already assigned. Assign it.
                 $itemSet = $itemSetAdapter->findEntity($itemSetId);
                 $itemSets->add($itemSet);
             }
             $itemSetsToRetain[] = $itemSet;
         }
         // Unassign item sets that were not included in the passed data.
         foreach ($itemSets as $itemSet) {
             if (!in_array($itemSet, $itemSetsToRetain)) {
                 $itemSets->removeElement($itemSet);
             }
         }
     }
     if ($this->shouldHydrate($request, 'o:media')) {
         $mediasData = $request->getValue('o:media', []);
         $adapter = $this->getAdapter('media');
         $class = $adapter->getEntityClass();
         $retainMedia = [];
         $position = 1;
         foreach ($mediasData as $mediaData) {
             $subErrorStore = new ErrorStore();
             if (isset($mediaData['o:id'])) {
                 $media = $adapter->findEntity($mediaData['o:id']);
                 $media->setPosition($position);
                 if (isset($mediaData['o:is_public'])) {
                     $media->setIsPublic($mediaData['o:is_public']);
                 }
                 $retainMedia[] = $media;
             } else {
                 // Create a new media.
                 $media = new $class();
                 $media->setItem($entity);
                 $media->setPosition($position);
                 $subrequest = new Request(Request::CREATE, 'media');
                 $subrequest->setContent($mediaData);
                 $subrequest->setFileData($request->getFileData());
                 try {
                     $adapter->hydrateEntity($subrequest, $media, $subErrorStore);
                 } catch (Exception\ValidationException $e) {
                     $errorStore->mergeErrors($e->getErrorStore(), 'o:media');
                 }
                 $entity->getMedia()->add($media);
                 $retainMedia[] = $media;
             }
             $position++;
         }
         // Remove media not included in request.
         foreach ($entity->getMedia() as $media) {
             if (!in_array($media, $retainMedia, true)) {
                 $entity->getMedia()->removeElement($media);
             }
         }
     }
 }