1919use Chamilo \PluginBundle \Zoom \Meeting ;
2020use Chamilo \PluginBundle \Zoom \MeetingActivity ;
2121use Chamilo \PluginBundle \Zoom \MeetingRepository ;
22+ use Chamilo \PluginBundle \Zoom \Presenter ;
2223use Chamilo \PluginBundle \Zoom \Recording ;
2324use Chamilo \PluginBundle \Zoom \RecordingRepository ;
2425use Chamilo \PluginBundle \Zoom \Registrant ;
@@ -71,6 +72,7 @@ public function __construct()
7172 self ::SETTING_CLIENT_SECRET => 'text ' ,
7273 self ::SETTING_SECRET_TOKEN => 'text ' ,
7374 'enableParticipantRegistration ' => 'boolean ' ,
75+ 'enablePresenter ' => 'boolean ' ,
7476 'enableCloudRecording ' => [
7577 'type ' => 'select ' ,
7678 'options ' => [
@@ -623,6 +625,60 @@ public function getRegisterParticipantForm($meeting)
623625 return $ form ;
624626 }
625627
628+ public function getRegisterPresenterForm (Meeting $ meeting ): FormValidator
629+ {
630+ $ form = new FormValidator ('register_presenter ' , 'post ' , $ _SERVER ['REQUEST_URI ' ]);
631+
632+ $ presenterIdSelect = $ form ->addSelect ('presenterIds ' , $ this ->get_lang ('RegisteredPresenters ' ));
633+ $ presenterIdSelect ->setMultiple (true );
634+
635+ $ form ->addButtonSend ($ this ->get_lang ('UpdateRegisteredUserList ' ));
636+
637+ $ users = $ meeting ->getRegistrableUsers ();
638+
639+ foreach ($ users as $ user ) {
640+ $ presenterIdSelect ->addOption (
641+ api_get_person_name ($ user ->getFirstname (), $ user ->getLastname ()),
642+ $ user ->getId ()
643+ );
644+ }
645+
646+ if ($ form ->validate ()) {
647+ $ selectedPresenterIds = $ form ->getSubmitValue ('presenterIds ' ) ?: [];
648+ $ selectedPresenters = [];
649+
650+ foreach ($ users as $ user ) {
651+ if (in_array ($ user ->getId (), $ selectedPresenterIds )) {
652+ $ selectedPresenters [] = $ user ;
653+ }
654+ }
655+
656+ try {
657+ $ this ->updatePresenterList ($ meeting , $ selectedPresenters );
658+
659+ Display::addFlash (
660+ Display::return_message ($ this ->get_lang ('RegisteredUserListWasUpdated ' ), 'confirm ' )
661+ );
662+ } catch (Exception $ exception ) {
663+ Display::addFlash (
664+ Display::return_message ($ exception ->getMessage (), 'error ' )
665+ );
666+ }
667+ }
668+
669+ $ registeredPresenterIds = [];
670+
671+ foreach ($ meeting ->getPresenters () as $ registrant ) {
672+ if ($ registrant instanceof Presenter) {
673+ $ registeredPresenterIds [] = $ registrant ->getUser ()->getId ();
674+ }
675+ }
676+
677+ $ presenterIdSelect ->setSelected ($ registeredPresenterIds );
678+
679+ return $ form ;
680+ }
681+
626682 /**
627683 * Generates a meeting recording files management form.
628684 * Takes action on validation.
@@ -1250,6 +1306,16 @@ public function userIsConferenceManager($meeting)
12501306 return true ;
12511307 }
12521308
1309+ $ currentUser = api_get_user_entity (api_get_user_id ());
1310+
1311+ if ('true ' === $ this ->get ('enableParticipantRegistration ' )
1312+ && 'true ' === $ this ->get ('enablePresenter ' )
1313+ && $ currentUser
1314+ && $ meeting ->hasUserAsPresenter ($ currentUser )
1315+ ) {
1316+ return true ;
1317+ }
1318+
12531319 return $ meeting ->isUserMeeting () && $ meeting ->getUser ()->getId () == api_get_user_id ();
12541320 }
12551321
@@ -1559,6 +1625,32 @@ public function registerUsers(Meeting $meeting, array $users)
15591625 return $ failedUsers ;
15601626 }
15611627
1628+ /**
1629+ * @param Meeting $meeting
1630+ * @param array<User> $users
1631+ *
1632+ * @throws OptimisticLockException
1633+ * @throws \Doctrine\ORM\ORMException
1634+ *
1635+ * @return array
1636+ */
1637+ public function registerPresenters (Meeting $ meeting , array $ users ): array
1638+ {
1639+ $ failedUsers = [];
1640+
1641+ foreach ($ users as $ user ) {
1642+ try {
1643+ $ this ->registerUser ($ meeting , $ user , false , true );
1644+ } catch (Exception $ exception ) {
1645+ $ failedUsers [$ user ->getId ()] = $ exception ->getMessage ();
1646+ }
1647+ }
1648+
1649+ Database::getManager ()->flush ();
1650+
1651+ return $ failedUsers ;
1652+ }
1653+
15621654 /**
15631655 * Removes registrants from a meeting.
15641656 *
@@ -1626,13 +1718,55 @@ private function updateRegistrantList($meeting, $users)
16261718 $ this ->unregister ($ meeting , $ registrantsToRemove );
16271719 }
16281720
1721+ private function updatePresenterList ($ meeting , $ users )
1722+ {
1723+ /** @var array<Registrant> $presenters */
1724+ $ presenters = $ meeting ->getPresenters ();
1725+
1726+ $ presenterToAdd = [];
1727+
1728+ foreach ($ users as $ user ) {
1729+ $ foundPresenter = false ;
1730+
1731+ foreach ($ presenters as $ presenter ) {
1732+ if ($ presenter ->getUser () === $ user ) {
1733+ $ foundPresenter = true ;
1734+
1735+ break ;
1736+ }
1737+ }
1738+
1739+ if (!$ foundPresenter ) {
1740+ $ presenterToAdd [] = $ user ;
1741+ }
1742+ }
1743+
1744+ $ registrantsToRemove = [];
1745+
1746+ foreach ($ presenters as $ registrant ) {
1747+ $ found = false ;
1748+ foreach ($ users as $ user ) {
1749+ if ($ registrant ->getUser () === $ user ) {
1750+ $ found = true ;
1751+ break ;
1752+ }
1753+ }
1754+ if (!$ found ) {
1755+ $ registrantsToRemove [] = $ registrant ;
1756+ }
1757+ }
1758+
1759+ $ this ->registerPresenters ($ meeting , $ presenterToAdd );
1760+ $ this ->unregister ($ meeting , $ registrantsToRemove );
1761+ }
1762+
16291763 /**
16301764 * @throws Exception
16311765 * @throws OptimisticLockException
16321766 *
16331767 * @return Registrant
16341768 */
1635- private function registerUser (Meeting $ meeting , User $ user , $ andFlush = true )
1769+ private function registerUser (Meeting $ meeting , User $ user , $ andFlush = true , bool $ isPresenter = false )
16361770 {
16371771 if (empty ($ user ->getEmail ())) {
16381772 throw new Exception ($ this ->get_lang ('CannotRegisterWithoutEmailAddress ' ));
@@ -1652,7 +1786,13 @@ private function registerUser(Meeting $meeting, User $user, $andFlush = true)
16521786 );
16531787 }
16541788
1655- $ registrantEntity = (new Registrant ())
1789+ $ registrantEntity = new Registrant ();
1790+
1791+ if ($ isPresenter ) {
1792+ $ registrantEntity = new Presenter ();
1793+ }
1794+
1795+ $ registrantEntity
16561796 ->setMeeting ($ meeting )
16571797 ->setUser ($ user )
16581798 ->setMeetingRegistrant ($ meetingRegistrant )
0 commit comments