og-8.x-1.x-dev/src/Entity/OgMembershipType.php
src/Entity/OgMembershipType.php
<?php
declare(strict_types=1);
namespace Drupal\og\Entity;
use Drupal\Core\Config\Entity\ConfigEntityBase;
use Drupal\Core\Entity\Attribute\ConfigEntityType;
use Drupal\Core\Entity\EntityAccessControlHandler;
use Drupal\Core\Entity\EntityDeleteForm;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\field\Entity\FieldConfig;
use Drupal\og\Form\OgMembershipTypeForm;
use Drupal\og\OgMembershipInterface;
use Drupal\og\OgMembershipTypeInterface;
use Drupal\og\OgMembershipTypeListBuilder;
/**
* The membership type entity.
*
* A membership type is the bundle of the OG membership. There is a single
* "default" bundle that comes out of the box, but others can be created. The
* use case for membership types, is for example creating a "premium"
* membership.
*
* By having a different membership type, also different fields can be attached,
* so in our "premium" membership, we could add a date field, to indicate when
* the subscription should be ended.
*
* @ConfigEntityType(
* id = "og_membership_type",
* label = @Translation("OG membership type"),
* handlers = {
* "access" = "Drupal\Core\Entity\EntityAccessControlHandler",
* "form" = {
* "add" = "Drupal\og\Form\OgMembershipTypeForm",
* "edit" = "Drupal\og\Form\OgMembershipTypeForm",
* "delete" = "Drupal\Core\Entity\EntityDeleteForm"
* },
* "list_builder" = "Drupal\og\OgMembershipTypeListBuilder"
* },
* admin_permission = "administer organic groups",
* config_prefix = "og_membership_type",
* bundle_of = "og_membership",
* entity_keys = {
* "id" = "type",
* "label" = "name"
* },
* config_export = {
* "type",
* "name",
* "description"
* },
* links = {
* "edit-form" = "/admin/structure/membership-types/manage/{og_membership_type}",
* "delete-form" = "/admin/structure/membership-types/manage/{og_membership_type}/delete",
* "collection" = "/admin/structure/membership-types",
* }
* )
*/
#[ConfigEntityType(
id: 'og_membership_type',
label: new TranslatableMarkup('OG membership type'),
config_prefix: 'og_membership_type',
entity_keys: [
'id' => 'type',
'label' => 'name',
],
handlers: [
'access' => EntityAccessControlHandler::class,
'form' => [
'add' => OgMembershipTypeForm::class,
'edit' => OgMembershipTypeForm::class,
'delete' => EntityDeleteForm::class,
],
'list_builder' => OgMembershipTypeListBuilder::class,
],
links: [
'edit-form' => '/admin/structure/membership-types/manage/{og_membership_type}',
'delete-form' => '/admin/structure/membership-types/manage/{og_membership_type}/delete',
'collection' => '/admin/structure/membership-types',
],
admin_permission: 'administer organic groups',
bundle_of: 'og_membership',
config_export: [
'type',
'name',
'description',
],
)]
class OgMembershipType extends ConfigEntityBase implements OgMembershipTypeInterface {
/**
* The membership type.
*/
protected ?string $type = NULL;
/**
* Return the ID of the entity.
*
* @return string|null
* The type of the entity.
*/
public function id() {
return $this->type;
}
/**
* {@inheritdoc}
*/
public function save() {
$status = parent::save();
if ($this->isSyncing()) {
// Do not create config while config import is in progress.
return $status;
}
if ($status === SAVED_NEW) {
FieldConfig::create([
'field_name' => OgMembershipInterface::REQUEST_FIELD,
'entity_type' => 'og_membership',
'bundle' => $this->id(),
'label' => 'Request Membership',
'description' => 'Explain the motivation for your request to join this group.',
'translatable' => TRUE,
'settings' => [],
])->save();
}
return $status;
}
/**
* {@inheritdoc}
*/
public function delete() {
if ($this->id() === OgMembershipInterface::TYPE_DEFAULT) {
// Remove the default OG membership type only if there are no other types.
$query = $this->entityTypeManager()
->getStorage('og_membership_type')
->getQuery()
->accessCheck(FALSE);
$membership_types = $query->execute();
if (count($membership_types) > 1) {
throw new \Exception('The default OG membership type cannot be deleted.');
}
}
parent::delete();
}
}
