commit
28ed19d76b
@ -0,0 +1,33 @@ |
||||
<?php |
||||
/* For licensing terms, see /license.txt */ |
||||
|
||||
/** |
||||
* Class HookResubscribe |
||||
* @var \SplObjectStorage $observers |
||||
*/ |
||||
class HookResubscribe extends HookEvent implements HookResubscribeEventInterface |
||||
{ |
||||
/** |
||||
* Constructor |
||||
*/ |
||||
protected function __construct() |
||||
{ |
||||
parent::__construct('HookResubscribe'); |
||||
} |
||||
|
||||
/** |
||||
* Update all the observers |
||||
* @param int $type |
||||
* |
||||
* @return int |
||||
*/ |
||||
public function notifyResubscribe($type) |
||||
{ |
||||
/** @var \HookResubscribeObserverInterface $observer */ |
||||
$this->eventData['type'] = $type; |
||||
foreach ($this->observers as $observer) { |
||||
$observer->hookResubscribe($this); |
||||
} |
||||
return 1; |
||||
} |
||||
} |
@ -0,0 +1,21 @@ |
||||
<?php |
||||
/* For licensing terms, see /license.txt */ |
||||
/** |
||||
* This file contains all Hook interfaces and their relation. |
||||
* They are used for Hook classes |
||||
* @package chamilo.library.hook |
||||
*/ |
||||
|
||||
/** |
||||
* Interface HookResubscribeEventInterface |
||||
*/ |
||||
interface HookResubscribeEventInterface extends HookEventInterface |
||||
{ |
||||
/** |
||||
* Update all the observers |
||||
* @param int $type |
||||
* |
||||
* @return int |
||||
*/ |
||||
public function notifyResubscribe($type); |
||||
} |
@ -0,0 +1,20 @@ |
||||
<?php |
||||
/* For licensing terms, see /license.txt */ |
||||
/** |
||||
* This file contains all Hook interfaces and their relation. |
||||
* They are used for Hook classes |
||||
* @package chamilo.library.hook |
||||
*/ |
||||
|
||||
/** |
||||
* Interface ResubscribeHookInterface |
||||
*/ |
||||
interface HookResubscribeObserverInterface extends HookObserverInterface |
||||
{ |
||||
/** |
||||
* @param HookResubscribeObserverInterface $hook |
||||
* |
||||
* @return int |
||||
*/ |
||||
public function hookResubscribe(HookResubscribeEventInterface $hook); |
||||
} |
@ -0,0 +1,4 @@ |
||||
Resubscription |
||||
============== |
||||
|
||||
Limit session resubscriptions |
@ -0,0 +1,9 @@ |
||||
<?php |
||||
/* For licensing terms, see /license.txt */ |
||||
/** |
||||
* Config the plugin |
||||
* @author Imanol Losada Oriol <imanol.losada@beeznest.com> |
||||
* @package chamilo.plugin.resubscription |
||||
*/ |
||||
|
||||
require_once api_get_path(SYS_PATH) . 'main/inc/global.inc.php'; |
@ -0,0 +1,8 @@ |
||||
<?php |
||||
/* For licensing terms, see /license.txt */ |
||||
/** |
||||
* Config the plugin |
||||
* @author Imanol Losada Oriol <imanol.losada@beeznest.com> |
||||
* @package chamilo.plugin.resubscription |
||||
*/ |
||||
require_once __DIR__ . '/config.php'; |
@ -0,0 +1,10 @@ |
||||
<?php |
||||
/* For licensing terms, see /license.txt */ |
||||
/** |
||||
* Initialization install |
||||
* @author Imanol Losada Oriol <imanol.losada@beeznest.com> |
||||
* @package chamilo.plugin.resubscription |
||||
*/ |
||||
require_once __DIR__ . '/config.php'; |
||||
|
||||
Resubscription::create()->install(); |
@ -0,0 +1,13 @@ |
||||
<?php |
||||
/* For licensing terms, see /license.txt */ |
||||
/** |
||||
* Strings to english L10n |
||||
* @author Imanol Losada Oriol <imanol.losada@beeznest.com> |
||||
* @package chamilo.plugin.resubscription |
||||
*/ |
||||
$strings['plugin_title'] = 'Resubscription'; |
||||
$strings['plugin_comment'] = 'This plugin limits session resubscription.'; |
||||
|
||||
$strings['resubscription_limit'] = 'Resubscription limit'; |
||||
$strings['resubscription_limit_help'] = 'This limits how often a user can be resubscribed'; |
||||
$strings['CanResubscribeFromX'] = 'Subscription available from %s'; |
@ -0,0 +1,13 @@ |
||||
<?php |
||||
/* For licensing terms, see /license.txt */ |
||||
/** |
||||
* Strings to spanish L10n |
||||
* @author Imanol Losada Oriol <imanol.losada@beeznest.com> |
||||
* @package chamilo.plugin.resubscription |
||||
*/ |
||||
$strings['plugin_title'] = 'Reinscripción'; |
||||
$strings['plugin_comment'] = 'Este plugin limita las reinscripiones a sesiones.'; |
||||
|
||||
$strings['resubscription_limit'] = 'Límite de reinscripción'; |
||||
$strings['resubscription_limit_help'] = 'Esto limita cada cuánto puede reinscribirse un usuario'; |
||||
$strings['CanResubscribeFromX'] = 'Inscripción posible a partir del %s'; |
@ -0,0 +1,10 @@ |
||||
<?php |
||||
/* For licensing terms, see /license.txt */ |
||||
/** |
||||
* Get the plugin info |
||||
* @author Imanol Losada Oriol <imanol.losada@beeznest.com> |
||||
* @package chamilo.plugin.resubscription |
||||
*/ |
||||
require_once __DIR__.'/config.php'; |
||||
|
||||
$plugin_info = Resubscription::create()->get_info(); |
@ -0,0 +1,2 @@ |
||||
<h1>Resubscription</h1> |
||||
<p>Limit session resubscriptions</p> |
@ -0,0 +1,105 @@ |
||||
<?php |
||||
/* For licensing terms, see /license.txt */ |
||||
|
||||
/** |
||||
* Hook to limit session resubscriptions |
||||
* |
||||
* @author Imanol Losada Oriol <imanol.losada@beeznest.com> |
||||
* @package chamilo.plugin.resubscription |
||||
*/ |
||||
class HookResubscription extends HookObserver implements HookResubscribeObserverInterface |
||||
{ |
||||
|
||||
/** |
||||
* Class constructor |
||||
*/ |
||||
public function __construct() |
||||
{ |
||||
parent::__construct( |
||||
'plugin/resubscription/src/Resubscription.php', 'resubscription' |
||||
); |
||||
} |
||||
|
||||
/** |
||||
* Limit session resubscription when a Chamilo user is resubscribed to a session |
||||
* @param HookCreateUserEventInterface $hook The hook |
||||
*/ |
||||
public function hookResubscribe(HookResubscribeEventInterface $hook) |
||||
{ |
||||
$data = $hook->getEventData(); |
||||
if ($data['type'] === HOOK_EVENT_TYPE_PRE) { |
||||
|
||||
$resubscriptionLimit = Resubscription::create()->get('resubscription_limit'); |
||||
|
||||
$limitDate = gmdate('Y-m-d'); |
||||
|
||||
switch ($resubscriptionLimit) { |
||||
case 'calendar_year': |
||||
$resubscriptionLimit = "1 year"; |
||||
$limitDate = gmdate('Y-m-d', strtotime(gmdate('Y-m-d')." -$resubscriptionLimit")); |
||||
break; |
||||
} |
||||
|
||||
$join = " INNER JOIN ".Database::get_main_table(TABLE_MAIN_SESSION)."ON id = id_session"; |
||||
|
||||
// User sessions and courses |
||||
$userSessions = Database::select( |
||||
'id_session, date_end', |
||||
Database::get_main_table(TABLE_MAIN_SESSION_USER).$join, |
||||
array( |
||||
'where' => array( |
||||
'id_user = ? AND date_end >= ?' => array( |
||||
api_get_user_id(), |
||||
$limitDate |
||||
) |
||||
), |
||||
'order' => 'date_end DESC' |
||||
) |
||||
); |
||||
$userSessionCourses = array(); |
||||
foreach ($userSessions as $userSession) { |
||||
$userSessionCourseResult = Database::select( |
||||
'course_code', |
||||
Database::get_main_table(TABLE_MAIN_SESSION_COURSE), |
||||
array( |
||||
'where' => array( |
||||
'id_session = ?' => array( |
||||
$userSession['id_session'] |
||||
) |
||||
) |
||||
) |
||||
); |
||||
foreach ($userSessionCourseResult as $userSessionCourse) { |
||||
if (!isset($userSessionCourses[$userSessionCourse['course_code']])) { |
||||
$userSessionCourses[$userSessionCourse['course_code']] = $userSession['date_end']; |
||||
} |
||||
|
||||
} |
||||
} |
||||
|
||||
// Current session and courses |
||||
$currentSessionCourseResult = Database::select( |
||||
'course_code', |
||||
Database::get_main_table(TABLE_MAIN_SESSION_COURSE), |
||||
array( |
||||
'where' => array( |
||||
'id_session = ?' => array( |
||||
$data['session_id'] |
||||
) |
||||
) |
||||
) |
||||
); |
||||
|
||||
// Check if current course code matches with one of the users |
||||
foreach ($currentSessionCourseResult as $currentSessionCourse) { |
||||
if (isset($userSessionCourses[$currentSessionCourse['course_code']])) { |
||||
$endDate = $userSessionCourses[$currentSessionCourse['course_code']]; |
||||
$resubscriptionDate = gmdate('Y-m-d', strtotime($endDate." +$resubscriptionLimit")); |
||||
$icon = Display::return_icon('students.gif', get_lang('Student')); |
||||
$canResubscribeFrom = sprintf(get_plugin_lang('CanResubscribeFromX', 'resubscription'), $resubscriptionDate); |
||||
throw new Exception(Display::label($icon . ' ' . $canResubscribeFrom, "info")); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,78 @@ |
||||
<?php |
||||
/* For licensing terms, see /license.txt */ |
||||
|
||||
/** |
||||
* Limit session resubscriptions |
||||
* |
||||
* @author Imanol Losada Oriol <imanol.losada@beeznest.com> |
||||
* @package chamilo.plugin.resubscription |
||||
*/ |
||||
class Resubscription extends Plugin implements HookPluginInterface |
||||
{ |
||||
|
||||
/** |
||||
* Class constructor |
||||
*/ |
||||
protected function __construct() |
||||
{ |
||||
$options = array( |
||||
'calendar_year' => get_lang('CalendarYear') |
||||
); |
||||
$parameters = array( |
||||
'resubscription_limit' => array( |
||||
'type' => 'select', |
||||
'options' => $options |
||||
) |
||||
); |
||||
|
||||
parent::__construct('0.1', 'Imanol Losada Oriol', $parameters); |
||||
} |
||||
|
||||
/** |
||||
* Instance the plugin |
||||
* @staticvar null $result |
||||
* @return Resubscription |
||||
*/ |
||||
static function create() |
||||
{ |
||||
static $result = null; |
||||
|
||||
return $result ? $result : $result = new self(); |
||||
} |
||||
|
||||
/** |
||||
* Install the plugin |
||||
*/ |
||||
public function install() |
||||
{ |
||||
$this->installHook(); |
||||
} |
||||
|
||||
/** |
||||
* Uninstall the plugin |
||||
* @return void |
||||
*/ |
||||
public function uninstall() |
||||
{ |
||||
$this->uninstallHook(); |
||||
} |
||||
|
||||
/** |
||||
* Install the Resubscription hook |
||||
*/ |
||||
public function installHook() |
||||
{ |
||||
$hook = HookResubscription::create(); |
||||
HookResubscribe::create()->attach($hook); |
||||
} |
||||
|
||||
/** |
||||
* Uninstall the Resubscription hook |
||||
*/ |
||||
public function uninstallHook() |
||||
{ |
||||
$hook = HookResubscription::create(); |
||||
HookResubscribe::create()->detach($hook); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,10 @@ |
||||
<?php |
||||
/* For licensing terms, see /license.txt */ |
||||
/** |
||||
* Initialization uninstall |
||||
* @author Imanol Losada Oriol <imanol.losada@beeznest.com> |
||||
* @package chamilo.plugin.resubscription |
||||
*/ |
||||
require_once __DIR__ . '/config.php'; |
||||
|
||||
Resubscription::create()->uninstall(); |
Loading…
Reference in new issue