commit
3d0617d42e
@ -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