public function GroupContentCardinalityValidator::validate in Group 2.0.x        
                          
                  
                        Same name and namespace in other branches
- 8 src/Plugin/Validation/Constraint/GroupContentCardinalityValidator.php \Drupal\group\Plugin\Validation\Constraint\GroupContentCardinalityValidator::validate()
File
 
   - src/Plugin/Validation/Constraint/GroupContentCardinalityValidator.php, line 52
Class
  
  - GroupContentCardinalityValidator 
- Checks the amount of times a single content entity can be added to a group.
Namespace
  Drupal\group\Plugin\Validation\Constraint
Code
public function validate($group_content, Constraint $constraint) {
  
  
  if (!isset($group_content)) {
    return;
  }
  
  if (!($group = $group_content
    ->getGroup())) {
    return;
  }
  
  if (!($entity = $group_content
    ->getEntity())) {
    return;
  }
  
  $plugin = $group_content
    ->getRelationPlugin();
  
  $group_cardinality = $plugin
    ->getGroupCardinality();
  $entity_cardinality = $plugin
    ->getEntityCardinality();
  
  if ($group_cardinality <= 0 && $entity_cardinality <= 0) {
    return;
  }
  
  $field_name = $group_content
    ->getFieldDefinition('entity_id')
    ->getLabel();
  
  if ($group_cardinality > 0) {
    
    $properties = [
      'type' => $plugin
        ->getContentTypeConfigId(),
      'entity_id' => $entity
        ->id(),
    ];
    $group_instances = $this->entityTypeManager
      ->getStorage('group_content')
      ->loadByProperties($properties);
    
    $group_ids = [];
    foreach ($group_instances as $instance) {
      
      if ($instance
        ->getGroup()
        ->id() != $group
        ->id()) {
        $group_ids[] = $instance
          ->getGroup()
          ->id();
      }
    }
    $group_count = count(array_unique($group_ids));
    
    if ($group_count >= $group_cardinality) {
      $this->context
        ->buildViolation($constraint->groupMessage)
        ->setParameter('@field', $field_name)
        ->setParameter('%content', $entity
        ->label())
        ->atPath('entity_id.0')
        ->addViolation();
    }
  }
  
  if ($entity_cardinality > 0) {
    
    $entity_instances = $group
      ->getContentByEntityId($plugin
      ->getPluginId(), $entity
      ->id());
    $entity_count = count($entity_instances);
    
    if ($group_content_id = $group_content
      ->id()) {
      foreach ($entity_instances as $instance) {
        
        if ($instance
          ->id() == $group_content_id) {
          $entity_count--;
          break;
        }
      }
    }
    
    if ($entity_count >= $entity_cardinality) {
      $this->context
        ->buildViolation($constraint->entityMessage)
        ->setParameter('@field', $field_name)
        ->setParameter('%content', $entity
        ->label())
        ->setParameter('%group', $group
        ->label())
        ->atPath('entity_id.0')
        ->addViolation();
    }
  }
}