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