Skip to content
Snippets Groups Projects
Commit f1ee7912 authored by Owen Bush's avatar Owen Bush
Browse files

Update coding standards in recurring_events_registration

parent f7ff5976
No related branches found
No related tags found
No related merge requests found
Showing
with 144 additions and 66 deletions
......@@ -2,4 +2,7 @@ Recurring Events (recurring_events)
============
## Introduction
The Recurring Events Registration module is a submodule of recurring_events. It provides a registration system designed to be site agnostic and extensible. Detailed information about the module is available on the module's help page at /admin/help/recurring_events_registration.
\ No newline at end of file
The Recurring Events Registration module is a submodule of recurring_events. It
provides a registration system designed to be site agnostic and extensible.
Detailed information about the module is available on the module's help page at
/admin/help/recurring_events_registration.
......@@ -24,4 +24,4 @@ instance_modification_notification_subject: 'An Event Has Been Modified'
instance_modification_notification_body: "The [eventinstance:title] [eventinstance:reg_type] has been modified, please check back for details.\r\n\r\nModify your registration: [registrant:edit_url]\r\nDelete your registration: [registrant:delete_url]"
series_modification_notification_enabled: true
series_modification_notification_subject: 'An Event Series Has Been Modified'
series_modification_notification_body: 'The [eventinstance:title] [eventinstance:reg_type] has been modified, and all instances have been removed, and your registration has been deleted.'
\ No newline at end of file
series_modification_notification_body: 'The [eventinstance:title] [eventinstance:reg_type] has been modified, and all instances have been removed, and your registration has been deleted.'
......@@ -3,4 +3,4 @@ status: true
dependencies: { }
label: Default
id: default
description: 'A default registrant type.'
\ No newline at end of file
description: 'A default registrant type.'
......@@ -24,6 +24,7 @@ use Drupal\recurring_events_registration\Entity\Registrant;
*/
function hook_recurring_events_registration_first_waitlist_alter(Registrant $registrant) {
// Find the ID of the registrant you wish to promote, then load the entity.
$id = 1234567;
$new_registrant = \Drupal::entityTypeManager()->getStorage('registrant')->load($id);
return $new_registrant;
}
......
......@@ -4,4 +4,4 @@ entity.registrant.instance_contact:
title: 'Contact Registrants'
appears_on:
- entity.registrant.instance_listing
- view.registrations.event_registrant_list
\ No newline at end of file
- view.registrations.event_registrant_list
......@@ -162,10 +162,6 @@ function template_preprocess_registrant(array &$variables) {
* Implements hook_mail().
*/
function recurring_events_registration_mail($key, &$message, $params) {
$options = [
'langcode' => $message['langcode'],
];
$service = \Drupal::service('recurring_events_registration.notification_service');
$service->setKey($key)->setEntity($params['registrant']);
......
......@@ -179,4 +179,4 @@ entity.registrant.instance_contact:
options:
parameters:
eventinstance:
type: entity:eventinstance
\ No newline at end of file
type: entity:eventinstance
......@@ -7,4 +7,4 @@ services:
arguments: ['@string_translation', '@config.factory', '@logger.factory', '@messenger', '@token', '@module_handler', '@recurring_events_registration.creation_service']
recurring_events_registration.access_handler:
class: Drupal\recurring_events_registration\AccessHandler
arguments: ['@string_translation', '@recurring_events_registration.creation_service', '@current_route_match']
\ No newline at end of file
arguments: ['@string_translation', '@recurring_events_registration.creation_service', '@current_route_match', '@entity_type.manager']
......@@ -70,7 +70,6 @@ function recurring_events_registration_tokens($type, $tokens, array $data, array
$replacements = [];
if ($type == 'eventinstance' && !empty($data['eventinstance'])) {
$event_instance = $data['eventinstance'];
$event_series = $event_instance->getEventSeries();
$creation_service = \Drupal::service('recurring_events_registration.creation_service');
$creation_service->setEventInstance($event_instance);
foreach ($tokens as $name => $original) {
......
......@@ -9,6 +9,7 @@ use Drupal\Core\Access\AccessResult;
use Drupal\Core\Routing\CurrentRouteMatch;
use Drupal\recurring_events\EventInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
/**
* AccessHandler class definition.
......@@ -35,6 +36,13 @@ class AccessHandler {
*/
protected $routeMatch;
/**
* The entity type manager service.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* Class constructor.
*
......@@ -44,11 +52,14 @@ class AccessHandler {
* The registration creation service.
* @param Drupal\Core\Routing\CurrentRouteMatch $route_match
* The current route match.
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* The entity type manager service.
*/
public function __construct(TranslationInterface $translation, RegistrationCreationService $creation_service, CurrentRouteMatch $route_match) {
public function __construct(TranslationInterface $translation, RegistrationCreationService $creation_service, CurrentRouteMatch $route_match, EntityTypeManagerInterface $entity_type_manager) {
$this->translation = $translation;
$this->creationService = $creation_service;
$this->routeMatch = $route_match;
$this->entityTypeManager = $entity_type_manager;
}
/**
......@@ -58,7 +69,8 @@ class AccessHandler {
return new static(
$container->get('string_translation'),
$container->get('recurring_events_registration.creation_service'),
$container->get('current_route_match')
$container->get('current_route_match'),
$container->get('entity_type.manager')
);
}
......@@ -74,7 +86,7 @@ class AccessHandler {
if (!empty($event_instance)) {
if (!$event_instance instanceof EventInterface && is_numeric($event_instance)) {
$event_instance = \Drupal::entityTypeManager()->getStorage('eventinstance')->load($event_instance);
$event_instance = $this->entityTypeManager->getStorage('eventinstance')->load($event_instance);
}
if ($event_instance instanceof EventInterface) {
......
......@@ -10,7 +10,7 @@ use Drupal\recurring_events_registration\Entity\RegistrantInterface;
use Drupal\Core\Access\AccessResult;
use Drupal\recurring_events\Entity\EventInstance;
use Drupal\Core\Session\AccountProxyInterface;
use Drupal\user\Entity\User;
use Drupal\Core\Entity\EntityTypeManagerInterface;
/**
* The RegistrantController class.
......@@ -31,6 +31,13 @@ class RegistrantController extends ControllerBase implements ContainerInjectionI
*/
protected $currentUser;
/**
* The entity type manager service.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* Constructs a RegistrantController object.
*
......@@ -38,10 +45,13 @@ class RegistrantController extends ControllerBase implements ContainerInjectionI
* The renderer service.
* @param \Drupal\Core\Session\AccountProxyInterface $current_user
* The current user.
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* The entity type manager service.
*/
public function __construct(RendererInterface $renderer, AccountProxyInterface $current_user) {
public function __construct(RendererInterface $renderer, AccountProxyInterface $current_user, EntityTypeManagerInterface $entity_type_manager) {
$this->renderer = $renderer;
$this->currentUser = $current_user;
$this->entityTypeManager = $entity_type_manager;
}
/**
......@@ -50,7 +60,8 @@ class RegistrantController extends ControllerBase implements ContainerInjectionI
public static function create(ContainerInterface $container) {
return new static(
$container->get('renderer'),
$container->get('current_user')
$container->get('current_user'),
$container->get('entity_type.manager')
);
}
......@@ -88,7 +99,7 @@ class RegistrantController extends ControllerBase implements ContainerInjectionI
*/
public function canContactRegistrants(EventInstance $eventinstance) {
if (!empty($eventinstance)) {
$account = User::load($this->currentUser->id());
$account = $this->entityTypeManager->getStorage('user')->load($this->currentUser->id());
return AccessResult::allowedIfHasPermission($account, 'contact registrants');
}
return AccessResult::forbidden();
......
......@@ -11,9 +11,9 @@ use Drupal\recurring_events_registration\NotificationService;
use Drupal\Core\Messenger\Messenger;
use Drupal\Core\Mail\MailManager;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Drupal\recurring_events\Entity\EventInstance;
use Drupal\Core\Link;
use Drupal\Core\Url;
use Drupal\Core\Language\LanguageManagerInterface;
/**
* Registrant contact form.
......@@ -62,6 +62,13 @@ class ContactForm extends FormBase {
*/
protected $eventInstance;
/**
* The language manager service.
*
* @var \Drupal\Core\Language\LanguageManagerInterface
*/
protected $languageManager;
/**
* Constructs a ContactForm object.
*
......@@ -75,13 +82,16 @@ class ContactForm extends FormBase {
* The messenger service.
* @param \Drupal\Core\Mail\MailManager $mail
* The mail manager service.
* @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
* The language manager service.
*/
public function __construct(RequestStack $request, RegistrationCreationService $creation_service, NotificationService $notification_service, Messenger $messenger, MailManager $mail) {
public function __construct(RequestStack $request, RegistrationCreationService $creation_service, NotificationService $notification_service, Messenger $messenger, MailManager $mail, LanguageManagerInterface $language_manager) {
$this->request = $request;
$this->creationService = $creation_service;
$this->notificationService = $notification_service;
$this->messenger = $messenger;
$this->mail = $mail;
$this->languageManager = $language_manager;
$request = $this->request->getCurrentRequest();
$params = $request->attributes->all();
......@@ -104,7 +114,8 @@ class ContactForm extends FormBase {
$container->get('recurring_events_registration.creation_service'),
$container->get('recurring_events_registration.notification_service'),
$container->get('messenger'),
$container->get('plugin.manager.mail')
$container->get('plugin.manager.mail'),
$container->get('language_manager')
);
}
......@@ -208,7 +219,7 @@ class ContactForm extends FormBase {
$params['registrant'] = $registrant;
$to = $registrant->mail->value;
$this->mail->mail('recurring_events_registration', 'custom', $to, \Drupal::languageManager()->getDefaultLanguage()->getId(), $params);
$this->mail->mail('recurring_events_registration', 'custom', $to, $this->languageManager->getDefaultLanguage()->getId(), $params);
if ($registrant->getWaitlist() == '1') {
$wait_count++;
......
......@@ -300,7 +300,6 @@ class RegistrantForm extends ContentEntityForm {
$availability = $this->creationService->retrieveAvailability();
$waitlist = $this->creationService->hasWaitlist();
$registration_open = $this->creationService->registrationIsOpen();
$reg_type = $this->creationService->getRegistrationType();
// Prevent the form being displayed if registration is closed, or there are
// no spaces left, and no waitlist.
......@@ -351,7 +350,6 @@ class RegistrantForm extends ContentEntityForm {
$availability = $this->creationService->retrieveAvailability();
$waitlist = $this->creationService->hasWaitlist();
$registration_open = $this->creationService->registrationIsOpen();
$reg_type = $this->creationService->getRegistrationType();
$add_to_waitlist = $form_state->getValue('add_to_waitlist');
......@@ -381,8 +379,6 @@ class RegistrantForm extends ContentEntityForm {
* {@inheritdoc}
*/
public function save(array $form, FormStateInterface $form_state) {
$entity = $this->entity;
$event_series = $form_state->getTemporaryValue('series');
// We need to grab a fresh copy of the series to check for updates.
$event_series = $this->entityTypeManager->getStorage('eventseries')->load($event_series->id());
......
......@@ -11,10 +11,10 @@ use Drupal\recurring_events_registration\NotificationService;
use Drupal\Core\Messenger\Messenger;
use Drupal\Core\Mail\MailManager;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Drupal\recurring_events\Entity\EventInstance;
use Drupal\Core\Render\Renderer;
use Drupal\Core\Link;
use Drupal\Core\Url;
use Drupal\Core\Language\LanguageManagerInterface;
/**
* Provides a form for resending Registrant registration emails.
......@@ -79,6 +79,13 @@ class RegistrantResendForm extends FormBase {
*/
protected $registrant;
/**
* The language manager service.
*
* @var \Drupal\Core\Language\LanguageManagerInterface
*/
protected $languageManager;
/**
* Constructs a ContactForm object.
*
......@@ -94,14 +101,17 @@ class RegistrantResendForm extends FormBase {
* The mail manager service.
* @param \Drupal\Core\Render\Renderer $renderer
* The renderer service.
* @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
* The language manager service.
*/
public function __construct(RequestStack $request, RegistrationCreationService $creation_service, NotificationService $notification_service, Messenger $messenger, MailManager $mail, Renderer $renderer) {
public function __construct(RequestStack $request, RegistrationCreationService $creation_service, NotificationService $notification_service, Messenger $messenger, MailManager $mail, Renderer $renderer, LanguageManagerInterface $language_manager) {
$this->request = $request;
$this->creationService = $creation_service;
$this->notificationService = $notification_service;
$this->messenger = $messenger;
$this->mail = $mail;
$this->renderer = $renderer;
$this->languageManager = $language_manager;
$request = $this->request->getCurrentRequest();
$params = $request->attributes->all();
......@@ -131,7 +141,8 @@ class RegistrantResendForm extends FormBase {
$container->get('recurring_events_registration.notification_service'),
$container->get('messenger'),
$container->get('plugin.manager.mail'),
$container->get('renderer')
$container->get('renderer'),
$container->get('language_manager')
);
}
......@@ -222,7 +233,7 @@ class RegistrantResendForm extends FormBase {
];
$to = $this->registrant->mail->value;
$this->mail->mail('recurring_events_registration', 'custom', $to, \Drupal::languageManager()->getDefaultLanguage()->getId(), $params);
$this->mail->mail('recurring_events_registration', 'custom', $to, $this->languageManager->getDefaultLanguage()->getId(), $params);
$this->messenger->addMessage($this->t('Registrant email successfully resent.'));
}
......
......@@ -9,6 +9,7 @@ use Drupal\Core\Url;
use Drupal\Core\Link;
use Drupal\recurring_events_registration\NotificationService;
use Drupal\recurring_events_registration\RegistrationCreationService;
use Drupal\Core\Extension\ModuleHandler;
/**
* Class RegistrantSettingsForm.
......@@ -31,6 +32,13 @@ class RegistrantSettingsForm extends ConfigFormBase {
*/
protected $creationService;
/**
* The module handler service.
*
* @var \Drupal\Core\Extension\ModuleHandler
*/
protected $moduleHandler;
/**
* Constructs a RegistrantSettingsForm object.
*
......@@ -38,10 +46,13 @@ class RegistrantSettingsForm extends ConfigFormBase {
* The registration notification service.
* @param \Drupal\recurring_events_registration\RegistrationCreationService $creation_service
* The registration creation service.
* @param \Drupal\Core\Extension\ModuleHandler $module_handler
* The module handler service.
*/
public function __construct(NotificationService $notification_service, RegistrationCreationService $creation_service) {
public function __construct(NotificationService $notification_service, RegistrationCreationService $creation_service, ModuleHandler $module_handler) {
$this->notificationService = $notification_service;
$this->creationService = $creation_service;
$this->moduleHandler = $module_handler;
}
/**
......@@ -50,7 +61,8 @@ class RegistrantSettingsForm extends ConfigFormBase {
public static function create(ContainerInterface $container) {
return new static(
$container->get('recurring_events_registration.notification_service'),
$container->get('recurring_events_registration.creation_service')
$container->get('recurring_events_registration.creation_service'),
$container->get('module_handler')
);
}
......@@ -88,7 +100,7 @@ class RegistrantSettingsForm extends ConfigFormBase {
->set('email_notifications', $form_state->getValue('email_notifications'));
$notification_types = [];
\Drupal::moduleHandler()->alter('recurring_events_registration_notification_types', $notification_types);
$this->moduleHandler->alter('recurring_events_registration_notification_types', $notification_types);
foreach ($notification_types as $type => $notification) {
$config
......@@ -194,7 +206,7 @@ class RegistrantSettingsForm extends ConfigFormBase {
$tokens = $this->notificationService->getAvailableTokens();
$notification_types = [];
\Drupal::moduleHandler()->alter('recurring_events_registration_notification_types', $notification_types);
$this->moduleHandler->alter('recurring_events_registration_notification_types', $notification_types);
foreach ($notification_types as $type => $notification) {
$form['notifications'][$type] = [
......
......@@ -4,12 +4,40 @@ namespace Drupal\recurring_events_registration\Form;
use Drupal\Core\Entity\EntityForm;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Messenger\Messenger;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Class RegistrantTypeForm.
*/
class RegistrantTypeForm extends EntityForm {
/**
* The messenger service.
*
* @var \Drupal\Core\Messenger\Messenger
*/
protected $messenger;
/**
* Constructs a RegistrantTypeForm object.
*
* @param \Drupal\Core\Messenger\Messenger $messenger
* The messenger service.
*/
public function __construct(Messenger $messenger) {
$this->messenger = $messenger;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('messenger')
);
}
/**
* {@inheritdoc}
*/
......@@ -53,13 +81,13 @@ class RegistrantTypeForm extends EntityForm {
switch ($status) {
case SAVED_NEW:
\Drupal::messenger()->addMessage($this->t('Created the %label registrant type.', [
$this->messenger->addMessage($this->t('Created the %label registrant type.', [
'%label' => $registrant_type->label(),
]));
break;
default:
\Drupal::messenger()->addMessage($this->t('Saved the %label registrant type.', [
$this->messenger->addMessage($this->t('Saved the %label registrant type.', [
'%label' => $registrant_type->label(),
]));
}
......
......@@ -5,6 +5,7 @@ namespace Drupal\recurring_events_registration\Plugin\Field\FieldWidget;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\datetime_range\Plugin\Field\FieldWidget\DateRangeDefaultWidget;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
/**
* Plugin implementation of the 'event registration' widget.
......@@ -19,6 +20,8 @@ use Drupal\Core\Form\FormStateInterface;
*/
class EventRegistrationWidget extends DateRangeDefaultWidget {
use StringTranslationTrait;
/**
* {@inheritdoc}
*/
......@@ -29,21 +32,21 @@ class EventRegistrationWidget extends DateRangeDefaultWidget {
$element['registration'] = [
'#type' => 'checkbox',
'#title' => t('Enable Registration'),
'#description' => t('Select this box to enable registrations for this event. By doing so you will be able to specify the capacity of the event, and if applicable enable a waitlist.'),
'#title' => $this->t('Enable Registration'),
'#description' => $this->t('Select this box to enable registrations for this event. By doing so you will be able to specify the capacity of the event, and if applicable enable a waitlist.'),
'#weight' => 0,
'#default_value' => $items[$delta]->registration ?: '',
];
$element['registration_type'] = [
'#type' => 'radios',
'#title' => t('Registration Type'),
'#description' => t('Select whether registrations are for the entire series, or for individual instances.'),
'#title' => $this->t('Registration Type'),
'#description' => $this->t('Select whether registrations are for the entire series, or for individual instances.'),
'#weight' => 1,
'#default_value' => $items[$delta]->registration_type ?: 'instance',
'#options' => [
'instance' => t('Individual Event Registration'),
'series' => t('Entire Series Registration'),
'instance' => $this->t('Individual Event Registration'),
'series' => $this->t('Entire Series Registration'),
],
'#states' => [
'visible' => [
......@@ -54,13 +57,13 @@ class EventRegistrationWidget extends DateRangeDefaultWidget {
$element['registration_dates'] = [
'#type' => 'radios',
'#title' => t('Registration Dates'),
'#description' => t('Choose between open or scheduled registration.'),
'#title' => $this->t('Registration Dates'),
'#description' => $this->t('Choose between open or scheduled registration.'),
'#weight' => 2,
'#default_value' => $items[$delta]->registration_dates ?: 'open',
'#options' => [
'open' => t('Open Registration'),
'scheduled' => t('Scheduled Registration'),
'open' => $this->t('Open Registration'),
'scheduled' => $this->t('Scheduled Registration'),
],
'#states' => [
'visible' => [
......@@ -71,7 +74,7 @@ class EventRegistrationWidget extends DateRangeDefaultWidget {
$element['series_registration'] = [
'#type' => 'fieldset',
'#title' => t('Series Registration'),
'#title' => $this->t('Series Registration'),
'#weight' => 3,
'#states' => [
'visible' => [
......@@ -87,12 +90,12 @@ class EventRegistrationWidget extends DateRangeDefaultWidget {
unset($element['value']);
unset($element['end_value']);
$element['series_registration']['value']['#title'] = t('Registration Opens');
$element['series_registration']['end_value']['#title'] = t('Registration Closes');
$element['series_registration']['value']['#title'] = $this->t('Registration Opens');
$element['series_registration']['end_value']['#title'] = $this->t('Registration Closes');
$element['instance_registration'] = [
'#type' => 'fieldset',
'#title' => t('Instance Registration'),
'#title' => $this->t('Instance Registration'),
'#weight' => 3,
'#states' => [
'visible' => [
......@@ -105,8 +108,8 @@ class EventRegistrationWidget extends DateRangeDefaultWidget {
$element['instance_registration']['time_amount'] = [
'#type' => 'number',
'#title' => t('Registration Time Amount'),
'#description' => t('Enter the amount of time in days or hours before the event(s) start time(s) that registration should open.'),
'#title' => $this->t('Registration Time Amount'),
'#description' => $this->t('Enter the amount of time in days or hours before the event(s) start time(s) that registration should open.'),
'#weight' => 0,
'#default_value' => $items[$delta]->time_amount ?: '',
'#min' => 0,
......@@ -114,20 +117,20 @@ class EventRegistrationWidget extends DateRangeDefaultWidget {
$element['instance_registration']['time_type'] = [
'#type' => 'select',
'#title' => t('Registration Time Type'),
'#description' => t("Select either Days or Hours to choose how long before which an event's registration will open."),
'#title' => $this->t('Registration Time Type'),
'#description' => $this->t("Select either Days or Hours to choose how long before which an event's registration will open."),
'#weight' => 1,
'#default_value' => $items[$delta]->time_type ?: '',
'#options' => [
'days' => t('Days'),
'hours' => t('Hours'),
'days' => $this->t('Days'),
'hours' => $this->t('Hours'),
],
];
$element['capacity'] = [
'#type' => 'number',
'#title' => t('Total Number of Spaces Available'),
'#description' => t('Maximum number of attendees available for each series, or individual event.'),
'#title' => $this->t('Total Number of Spaces Available'),
'#description' => $this->t('Maximum number of attendees available for each series, or individual event.'),
'#weight' => 4,
'#default_value' => $items[$delta]->capacity ?: '',
'#min' => 0,
......@@ -140,8 +143,8 @@ class EventRegistrationWidget extends DateRangeDefaultWidget {
$element['waitlist'] = [
'#type' => 'checkbox',
'#title' => t('Enable Waiting List'),
'#description' => t('Enable a waiting list if the number of registrations reaches capacity.'),
'#title' => $this->t('Enable Waiting List'),
'#description' => $this->t('Enable a waiting list if the number of registrations reaches capacity.'),
'#weight' => 5,
'#default_value' => $items[$delta]->waitlist ?: '',
'#states' => [
......
......@@ -18,9 +18,6 @@ class RegistrantTypeHtmlRouteProvider extends AdminHtmlRouteProvider {
*/
public function getRoutes(EntityTypeInterface $entity_type) {
$collection = parent::getRoutes($entity_type);
// Provide your custom entity routes here.
return $collection;
}
......
......@@ -292,8 +292,6 @@ class RegistrationCreationService {
* Whether this user has already registered for this event.
*/
public function hasUserRegisteredById($uid) {
$properties = [];
$registrants = $this->retrieveRegisteredParties(TRUE, TRUE, $uid);
return !empty($registrants);
}
......@@ -323,7 +321,7 @@ class RegistrationCreationService {
$waitlisted_users = $this->retrieveWaitlistedParties();
if (!empty($waitlisted_users)) {
$first = reset($waitlisted_users);
\Drupal::moduleHandler()->alter('recurring_events_registration_first_waitlist', $first);
$this->moduleHandler->alter('recurring_events_registration_first_waitlist', $first);
return $first;
}
return NULL;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment