1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247:
<?php
namespace Omeka\Api\Adapter;
use Doctrine\ORM\QueryBuilder;
use Omeka\Api\Exception;
use Omeka\Api\Request;
use Omeka\Entity\EntityInterface;
use Omeka\Stdlib\ErrorStore;
class ItemAdapter extends AbstractResourceEntityAdapter
{
protected $sortFields = [
'id' => 'id',
'is_public' => 'isPublic',
'created' => 'created',
'modified' => 'modified',
];
public function getResourceName()
{
return 'items';
}
public function getRepresentationClass()
{
return 'Omeka\Api\Representation\ItemRepresentation';
}
public function getEntityClass()
{
return 'Omeka\Entity\Item';
}
public function buildQuery(QueryBuilder $qb, array $query)
{
parent::buildQuery($qb, $query);
if (isset($query['id'])) {
$qb->andWhere($qb->expr()->eq('Omeka\Entity\Item.id', $query['id']));
}
if (isset($query['item_set_id'])) {
$itemSets = $query['item_set_id'];
if (!is_array($itemSets)) {
$itemSets = [$itemSets];
}
$itemSets = array_filter($itemSets, 'is_numeric');
if ($itemSets) {
$itemSetAlias = $this->createAlias();
$qb->innerJoin(
$this->getEntityClass() . '.itemSets',
$itemSetAlias, 'WITH',
$qb->expr()->in("$itemSetAlias.id", $this->createNamedParameter($qb, $itemSets))
);
}
}
if (!empty($query['site_id'])) {
$siteAdapter = $this->getAdapter('sites');
try {
$site = $siteAdapter->findEntity($query['site_id']);
$params = $site->getItemPool();
if (!is_array($params)) {
$params = [];
}
unset($params['site_id']);
$this->buildQuery($qb, $params);
} catch (Exception\NotFoundException $e) {
$site = null;
}
if (isset($query['site_attachments_only']) && $query['site_attachments_only']) {
$siteBlockAttachmentsAlias = $this->createAlias();
$qb->innerJoin(
'Omeka\Entity\Item.siteBlockAttachments',
$siteBlockAttachmentsAlias
);
$sitePageBlockAlias = $this->createAlias();
$qb->innerJoin(
"$siteBlockAttachmentsAlias.block",
$sitePageBlockAlias
);
$sitePageAlias = $this->createAlias();
$qb->innerJoin(
"$sitePageBlockAlias.page",
$sitePageAlias
);
$siteAlias = $this->createAlias();
$qb->innerJoin(
"$sitePageAlias.site",
$siteAlias
);
$qb->andWhere($qb->expr()->eq(
"$siteAlias.id",
$this->createNamedParameter($qb, $query['site_id']))
);
}
}
}
public function validateRequest(Request $request, ErrorStore $errorStore)
{
$data = $request->getContent();
if (array_key_exists('o:item_set', $data)
&& !is_array($data['o:item_set'])
) {
$errorStore->addError('o:item_set', 'Item sets must be an array');
}
if (array_key_exists('o:media', $data)
&& !is_array($data['o:media'])
) {
$errorStore->addError('o:item_set', 'Media must be an array');
}
}
public function hydrate(Request $request, EntityInterface $entity,
ErrorStore $errorStore
) {
parent::hydrate($request, $entity, $errorStore);
$isUpdate = Request::UPDATE === $request->getOperation();
$isPartial = $isUpdate && $request->getOption('isPartial');
$append = $isPartial && 'append' === $request->getOption('collectionAction');
$remove = $isPartial && 'remove' === $request->getOption('collectionAction');
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) && isset($itemSetData['o:id'])) {
$itemSetId = $itemSetData['o:id'];
} elseif (is_numeric($itemSetData)) {
$itemSetId = $itemSetData;
} else {
continue;
}
$itemSet = $itemSets->get($itemSetId);
if ($remove) {
if ($itemSet) {
$itemSets->removeElement($itemSet);
}
continue;
}
if (!$itemSet) {
$itemSet = $itemSetAdapter->findEntity($itemSetId);
$itemSets->add($itemSet);
}
$itemSetsToRetain[] = $itemSet;
}
if (!$append && !$remove) {
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 {
$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++;
}
foreach ($entity->getMedia() as $media) {
if (!in_array($media, $retainMedia, true)) {
$entity->getMedia()->removeElement($media);
}
}
}
}
public function preprocessBatchUpdate(array $data, Request $request)
{
$rawData = $request->getContent();
$data = parent::preprocessBatchUpdate($data, $request);
if (isset($rawData['o:item_set'])) {
$data['o:item_set'] = $rawData['o:item_set'];
}
return $data;
}
}