public function evaluate(APILimitationValue $value, APIUserReference $currentUser, ValueObject $object, array $targets = null)
{
if (!$value instanceof APILocationLimitation) {
throw new InvalidArgumentException('$value', 'Must be of type: APILocationLimitation');
}
if ($object instanceof ContentCreateStruct) {
return $this->evaluateForContentCreateStruct($value, $targets);
} elseif ($object instanceof Content) {
$object = $object->getVersionInfo()->getContentInfo();
} elseif ($object instanceof VersionInfo) {
$object = $object->getContentInfo();
} elseif (!$object instanceof ContentInfo) {
throw new InvalidArgumentException('$object', 'Must be of type: ContentCreateStruct, Content, VersionInfo or ContentInfo');
}
// Load locations if no specific placement was provided
if ($targets === null) {
if ($object->published) {
$targets = $this->persistence->locationHandler()->loadLocationsByContent($object->id);
} else {
// @todo Need support for draft locations to to work correctly
$targets = $this->persistence->locationHandler()->loadParentLocationsForDraftContent($object->id);
}
}
foreach ($targets as $target) {
if (!$target instanceof Location && !$target instanceof SPILocation) {
throw new InvalidArgumentException('$targets', 'Must contain objects of type: Location');
}
// Single match is sufficient
if (in_array($target->id, $value->limitationValues)) {
return true;
}
}
return false;
}