ppound
4 years ago
commit
1fca4151f1
9 changed files with 239 additions and 0 deletions
@ -0,0 +1,8 @@
|
||||
name: roblib_bee_limits |
||||
type: module |
||||
description: Adds validation to limit both the number of active bookings as well as the max duration of bookings a user can have based on their roles. |
||||
package: Custom |
||||
core: 8.x |
||||
core_version_requirement: ^8 || ^9 |
||||
dependencies: |
||||
- bee |
@ -0,0 +1,38 @@
|
||||
<?php |
||||
|
||||
/** |
||||
* @file |
||||
* Install, update and uninstall functions for the roblib_bee_limits module. |
||||
*/ |
||||
|
||||
/** |
||||
* Implements hook_install(). |
||||
*/ |
||||
function roblib_bee_limits_install() { |
||||
\Drupal::messenger()->addStatus(__FUNCTION__); |
||||
} |
||||
|
||||
/** |
||||
* Implements hook_uninstall(). |
||||
*/ |
||||
function roblib_bee_limits_uninstall() { |
||||
\Drupal::messenger()->addStatus(__FUNCTION__); |
||||
} |
||||
|
||||
/** |
||||
* Implements hook_requirements(). |
||||
*/ |
||||
function roblib_bee_limits_requirements($phase) { |
||||
$requirements = []; |
||||
|
||||
if ($phase == 'runtime') { |
||||
$value = mt_rand(0, 100); |
||||
$requirements['roblib_bee_limits_status'] = [ |
||||
'title' => t('roblib_bee_limits status'), |
||||
'value' => t('roblib_bee_limits value: @value', ['@value' => $value]), |
||||
'severity' => $value > 50 ? REQUIREMENT_INFO : REQUIREMENT_WARNING, |
||||
]; |
||||
} |
||||
|
||||
return $requirements; |
||||
} |
@ -0,0 +1,37 @@
|
||||
# Custom module library for general purposes. |
||||
roblib_bee_limits: |
||||
js: |
||||
js/roblib-bee-limits.js: {} |
||||
css: |
||||
component: |
||||
css/roblib-bee-limits.css: {} |
||||
dependencies: |
||||
- core/drupalSettings |
||||
- roblib_bee_limits/jquery-labelauty |
||||
|
||||
# Third-party library (self hosted). |
||||
jquery-labelauty: |
||||
remote: https://github.com/fntneves/jquery-labelauty |
||||
version: 1.1.0 |
||||
license: |
||||
name: MIT |
||||
url: https://github.com/fntneves/jquery-labelauty/blob/v1.1.0/LICENSE |
||||
gpl-compatible: true |
||||
js: |
||||
/libraries/jquery-labelauty/source/jquery-labelauty.js: {} |
||||
css: |
||||
component: |
||||
/libraries/jquery-labelauty/source/jquery-labelauty.css: {} |
||||
dependencies: |
||||
- core/jquery |
||||
|
||||
# Third-party library (CDN). |
||||
vuejs: |
||||
remote: https://vuejs.org |
||||
version: 2.0.5 |
||||
license: |
||||
name: MIT |
||||
url: https://github.com/vuejs/vue/blob/dev/LICENSE |
||||
gpl-compatible: true |
||||
js: |
||||
https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.min.js: {type: external, minified: true} |
@ -0,0 +1,6 @@
|
||||
roblib_bee_limits.settings_form: |
||||
title: roblib_bee_limits |
||||
description: Configure roblib_bee_limits. |
||||
parent: system.admin_config_system |
||||
route_name: roblib_bee_limits.settings_form |
||||
weight: 10 |
@ -0,0 +1,55 @@
|
||||
<?php |
||||
|
||||
/** |
||||
* @file |
||||
* Primary module hooks for roblib_bee_limits module. |
||||
* |
||||
*/ |
||||
|
||||
use Drupal\Core\Form\FormBase; |
||||
use Drupal\Core\Form\FormStateInterface; |
||||
use Drupal\node\Entity\Node; |
||||
|
||||
/** |
||||
* Implements hook_form_FORM_ID_alter. |
||||
* |
||||
* @param $form |
||||
* @param \Drupal\Core\Form\FormStateInterface $form_state |
||||
* @param $form_id |
||||
*/ |
||||
function roblib_bee_limits_form_bee_add_reservation_form_alter(&$form, FormStateInterface $form_state, $form_id){ |
||||
$form['#validate'][] = 'roblib_bee_limits_validate_reservation'; |
||||
} |
||||
|
||||
/** |
||||
* Additional form validation for bee_add_reservation_form. |
||||
* |
||||
* Limits hourly bookings. |
||||
* |
||||
* @param $form |
||||
* @param \Drupal\Core\Form\FormStateInterface $form_state |
||||
* |
||||
* @throws \Exception |
||||
*/ |
||||
function roblib_bee_limits_validate_reservation($form, FormStateInterface $form_state) { |
||||
$user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id()); |
||||
$roles = $user->getRoles(); |
||||
debug($roles, 'pp-roles', TRUE); |
||||
$values = $form_state->getValues(); |
||||
$node = Node::load($values['node']); |
||||
$config_factory = \Drupal::configFactory(); |
||||
$bee_settings = $config_factory->get('node.type.' . $node->bundle())->get('bee'); |
||||
// we only want to limit hourly reservations |
||||
if($bee_settings['bookable_type'] != 'hourly') { |
||||
return; |
||||
} |
||||
$start_date = $values['start_date']; |
||||
$end_date = $values['end_date']; |
||||
$start_timestamp = new \DateTime($start_date->format('Y-m-d H:i')); |
||||
$end_timestamp = new \DateTime($end_date->format('Y-m-d H:i')); |
||||
$minutes_diff = abs($end_timestamp->getTimestamp() - $start_timestamp->getTimestamp()) / 60; |
||||
debug($minutes_diff, 'pp-minutesdiff', TRUE); |
||||
if($minutes_diff > 120) { |
||||
$form_state->setError($form, t('Reservation exceeded max booking time of 2 hours.')); |
||||
} |
||||
} |
@ -0,0 +1,4 @@
|
||||
administer roblib_bee_limits configuration: |
||||
title: 'Administer roblib_bee_limits configuration' |
||||
description: 'Allow a user to configure limits on Bee reservation bookings.' |
||||
restrict access: true |
@ -0,0 +1,7 @@
|
||||
roblib_bee_limits.settings_form: |
||||
path: '/admin/config/system/roblib-bee-limits' |
||||
defaults: |
||||
_title: 'roblib_bee_limits settings' |
||||
_form: 'Drupal\roblib_bee_limits\Form\SettingsForm' |
||||
requirements: |
||||
_permission: 'administer roblib_bee_limits configuration' |
@ -0,0 +1,25 @@
|
||||
<?php |
||||
|
||||
namespace Drupal\roblib_bee_limits\Controller; |
||||
|
||||
use Drupal\Core\Controller\ControllerBase; |
||||
|
||||
/** |
||||
* Returns responses for roblib_bee_limits routes. |
||||
*/ |
||||
class RoblibBeeLimitsController extends ControllerBase { |
||||
|
||||
/** |
||||
* Builds the response. |
||||
*/ |
||||
public function build() { |
||||
|
||||
$build['content'] = [ |
||||
'#type' => 'item', |
||||
'#markup' => $this->t('It works!'), |
||||
]; |
||||
|
||||
return $build; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,59 @@
|
||||
<?php |
||||
|
||||
namespace Drupal\roblib_bee_limits\Form; |
||||
|
||||
use Drupal\Core\Form\ConfigFormBase; |
||||
use Drupal\Core\Form\FormStateInterface; |
||||
|
||||
/** |
||||
* Configure roblib_bee_limits settings for this site. |
||||
*/ |
||||
class SettingsForm extends ConfigFormBase { |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getFormId() { |
||||
return 'roblib_bee_limits_settings'; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
protected function getEditableConfigNames() { |
||||
return ['roblib_bee_limits.settings']; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function buildForm(array $form, FormStateInterface $form_state) { |
||||
$form['example'] = [ |
||||
'#type' => 'textfield', |
||||
'#title' => $this->t('Example'), |
||||
'#default_value' => $this->config('roblib_bee_limits.settings')->get('example'), |
||||
]; |
||||
return parent::buildForm($form, $form_state); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function validateForm(array &$form, FormStateInterface $form_state) { |
||||
if ($form_state->getValue('example') != 'example') { |
||||
$form_state->setErrorByName('example', $this->t('The value is not correct.')); |
||||
} |
||||
parent::validateForm($form, $form_state); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function submitForm(array &$form, FormStateInterface $form_state) { |
||||
$this->config('roblib_bee_limits.settings') |
||||
->set('example', $form_state->getValue('example')) |
||||
->save(); |
||||
parent::submitForm($form, $form_state); |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue