ShowbuilderController.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. <?php
  2. class ShowbuilderController extends Zend_Controller_Action
  3. {
  4. public function init()
  5. {
  6. $ajaxContext = $this->_helper->getHelper('AjaxContext');
  7. $ajaxContext->addActionContext('schedule-move', 'json')
  8. ->addActionContext('schedule-add', 'json')
  9. ->addActionContext('schedule-remove', 'json')
  10. ->addActionContext('builder-dialog', 'json')
  11. ->addActionContext('check-builder-feed', 'json')
  12. ->addActionContext('builder-feed', 'json')
  13. ->addActionContext('context-menu', 'json')
  14. ->initContext();
  15. }
  16. public function indexAction()
  17. {
  18. $CC_CONFIG = Config::getConfig();
  19. $request = $this->getRequest();
  20. $baseUrl = Application_Common_OsPath::getBaseDir();
  21. $user = Application_Model_User::GetCurrentUser();
  22. $userType = $user->getType();
  23. $this->view->headScript()->appendScript("localStorage.setItem( 'user-type', '$userType' );");
  24. $this->view->headScript()->appendFile($baseUrl.'js/contextmenu/jquery.contextMenu.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
  25. $this->view->headScript()->appendFile($baseUrl.'js/datatables/js/jquery.dataTables.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
  26. $this->view->headScript()->appendFile($baseUrl.'js/datatables/plugin/dataTables.pluginAPI.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
  27. $this->view->headScript()->appendFile($baseUrl.'js/datatables/plugin/dataTables.fnSetFilteringDelay.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
  28. $this->view->headScript()->appendFile($baseUrl.'js/datatables/plugin/dataTables.ColVis.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
  29. $this->view->headScript()->appendFile($baseUrl.'js/datatables/plugin/dataTables.ColReorder.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
  30. $this->view->headScript()->appendFile($baseUrl.'js/datatables/plugin/dataTables.FixedColumns.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
  31. $this->view->headScript()->appendFile($baseUrl.'js/datatables/plugin/dataTables.columnFilter.js?'.$CC_CONFIG['airtime_version'], 'text/javascript');
  32. $this->view->headScript()->appendFile($baseUrl.'js/blockui/jquery.blockUI.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
  33. $this->view->headScript()->appendFile($baseUrl.'js/airtime/buttons/buttons.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
  34. $this->view->headScript()->appendFile($baseUrl.'js/airtime/utilities/utilities.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
  35. $this->view->headLink()->appendStylesheet($baseUrl.'css/media_library.css?'.$CC_CONFIG['airtime_version']);
  36. $this->view->headLink()->appendStylesheet($baseUrl.'css/jquery.contextMenu.css?'.$CC_CONFIG['airtime_version']);
  37. $this->view->headLink()->appendStylesheet($baseUrl.'css/datatables/css/ColVis.css?'.$CC_CONFIG['airtime_version']);
  38. $this->view->headLink()->appendStylesheet($baseUrl.'css/datatables/css/ColReorder.css?'.$CC_CONFIG['airtime_version']);
  39. $refer_sses = new Zend_Session_Namespace('referrer');
  40. if ($request->isPost()) {
  41. $form = new Application_Form_RegisterAirtime();
  42. $values = $request->getPost();
  43. if ($values["Publicise"] != 1 && $form->isValid($values)) {
  44. Application_Model_Preference::SetSupportFeedback($values["SupportFeedback"]);
  45. if (isset($values["Privacy"])) {
  46. Application_Model_Preference::SetPrivacyPolicyCheck($values["Privacy"]);
  47. }
  48. // unset session
  49. Zend_Session::namespaceUnset('referrer');
  50. } elseif ($values["Publicise"] == '1' && $form->isValid($values)) {
  51. Application_Model_Preference::SetHeadTitle($values["stnName"], $this->view);
  52. Application_Model_Preference::SetPhone($values["Phone"]);
  53. Application_Model_Preference::SetEmail($values["Email"]);
  54. Application_Model_Preference::SetStationWebSite($values["StationWebSite"]);
  55. Application_Model_Preference::SetPublicise($values["Publicise"]);
  56. $form->Logo->receive();
  57. $imagePath = $form->Logo->getFileName();
  58. Application_Model_Preference::SetStationCountry($values["Country"]);
  59. Application_Model_Preference::SetStationCity($values["City"]);
  60. Application_Model_Preference::SetStationDescription($values["Description"]);
  61. Application_Model_Preference::SetStationLogo($imagePath);
  62. Application_Model_Preference::SetSupportFeedback($values["SupportFeedback"]);
  63. if (isset($values["Privacy"])) {
  64. Application_Model_Preference::SetPrivacyPolicyCheck($values["Privacy"]);
  65. }
  66. // unset session
  67. Zend_Session::namespaceUnset('referrer');
  68. } else {
  69. $logo = Application_Model_Preference::GetStationLogo();
  70. if ($logo) {
  71. $this->view->logoImg = $logo;
  72. }
  73. $this->view->dialog = $form;
  74. $this->view->headScript()->appendFile($baseUrl.'js/airtime/nowplaying/register.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
  75. }
  76. }
  77. //popup if previous page was login
  78. if ($refer_sses->referrer == 'login' && Application_Model_Preference::ShouldShowPopUp()
  79. && !Application_Model_Preference::GetSupportFeedback() && $user->isAdmin()){
  80. $form = new Application_Form_RegisterAirtime();
  81. $logo = Application_Model_Preference::GetStationLogo();
  82. if ($logo) {
  83. $this->view->logoImg = $logo;
  84. }
  85. $this->view->dialog = $form;
  86. $this->view->headScript()->appendFile($baseUrl.'js/airtime/nowplaying/register.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
  87. }
  88. //determine whether to remove/hide/display the library.
  89. $showLib = false;
  90. if (!$user->isGuest()) {
  91. $disableLib = false;
  92. $data = Application_Model_Preference::getNowPlayingScreenSettings();
  93. if (!is_null($data)) {
  94. if ($data["library"] == "true") {
  95. $showLib = true;
  96. }
  97. }
  98. } else {
  99. $disableLib = true;
  100. }
  101. $this->view->disableLib = $disableLib;
  102. $this->view->showLib = $showLib;
  103. //only include library things on the page if the user can see it.
  104. if (!$disableLib) {
  105. $this->view->headScript()->appendFile($baseUrl.'js/airtime/library/library.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
  106. $this->view->headScript()->appendFile($baseUrl.'js/airtime/library/events/library_showbuilder.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
  107. $data = Application_Model_Preference::getCurrentLibraryTableSetting();
  108. if (!is_null($data)) {
  109. $libraryTable = json_encode($data);
  110. $this->view->headScript()->appendScript("localStorage.setItem( 'datatables-library', JSON.stringify($libraryTable) );");
  111. } else {
  112. $this->view->headScript()->appendScript("localStorage.setItem( 'datatables-library', '' );");
  113. }
  114. }
  115. $data = Application_Model_Preference::getTimelineDatatableSetting();
  116. if (!is_null($data)) {
  117. $timelineTable = json_encode($data);
  118. $this->view->headScript()->appendScript("localStorage.setItem( 'datatables-timeline', JSON.stringify($timelineTable) );");
  119. } else {
  120. $this->view->headScript()->appendScript("localStorage.setItem( 'datatables-timeline', '' );");
  121. }
  122. //populate date range form for show builder.
  123. $now = time();
  124. $from = $request->getParam("from", $now);
  125. $to = $request->getParam("to", $now + (24*60*60));
  126. $utcTimezone = new DateTimeZone("UTC");
  127. $displayTimeZone = new DateTimeZone(Application_Model_Preference::GetTimezone());
  128. $start = DateTime::createFromFormat("U", $from, $utcTimezone);
  129. $start->setTimezone($displayTimeZone);
  130. $end = DateTime::createFromFormat("U", $to, $utcTimezone);
  131. $end->setTimezone($displayTimeZone);
  132. $form = new Application_Form_ShowBuilder();
  133. $form->populate(array(
  134. 'sb_date_start' => $start->format("Y-m-d"),
  135. 'sb_time_start' => $start->format("H:i"),
  136. 'sb_date_end' => $end->format("Y-m-d"),
  137. 'sb_time_end' => $end->format("H:i")
  138. ));
  139. $this->view->sb_form = $form;
  140. $this->view->headScript()->appendFile($baseUrl.'js/timepicker/jquery.ui.timepicker.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
  141. $this->view->headScript()->appendFile($baseUrl.'js/airtime/showbuilder/builder.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
  142. $this->view->headScript()->appendFile($baseUrl.'js/airtime/showbuilder/main_builder.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
  143. $this->view->headLink()->appendStylesheet($baseUrl.'css/jquery.ui.timepicker.css?'.$CC_CONFIG['airtime_version']);
  144. $this->view->headLink()->appendStylesheet($baseUrl.'css/showbuilder.css?'.$CC_CONFIG['airtime_version']);
  145. }
  146. public function contextMenuAction()
  147. {
  148. $baseUrl = Application_Common_OsPath::getBaseDir();
  149. $id = $this->_getParam('id');
  150. $now = floatval(microtime(true));
  151. $request = $this->getRequest();
  152. $menu = array();
  153. $user = Application_Model_User::getCurrentUser();
  154. $item = CcScheduleQuery::create()->findPK($id);
  155. $instance = $item->getCcShowInstances();
  156. $menu["preview"] = array("name"=> _("Preview"), "icon" => "play");
  157. //select the cursor
  158. $menu["selCurs"] = array("name"=> _("Select cursor"),"icon" => "select-cursor");
  159. $menu["delCurs"] = array("name"=> _("Remove cursor"),"icon" => "select-cursor");
  160. if ($now < floatval($item->getDbEnds("U.u")) && $user->canSchedule($instance->getDbShowId())) {
  161. //remove/truncate the item from the schedule
  162. $menu["del"] = array("name"=> _("Delete"), "icon" => "delete", "url" => $baseUrl."showbuilder/schedule-remove");
  163. }
  164. $this->view->items = $menu;
  165. }
  166. public function builderDialogAction()
  167. {
  168. $request = $this->getRequest();
  169. $id = $request->getParam("id");
  170. $instance = CcShowInstancesQuery::create()->findPK($id);
  171. if (is_null($instance)) {
  172. $this->view->error = _("show does not exist");
  173. return;
  174. }
  175. $displayTimeZone = new DateTimeZone(Application_Model_Preference::GetTimezone());
  176. $start = $instance->getDbStarts(null);
  177. $start->setTimezone($displayTimeZone);
  178. $end = $instance->getDbEnds(null);
  179. $end->setTimezone($displayTimeZone);
  180. $show_name = $instance->getCcShow()->getDbName();
  181. $start_time = $start->format("Y-m-d H:i:s");
  182. $end_time = $end->format("Y-m-d H:i:s");
  183. $this->view->title = "{$show_name}: {$start_time} - {$end_time}";
  184. $this->view->start = $start_time;
  185. $this->view->end = $end_time;
  186. $this->view->dialog = $this->view->render('showbuilder/builderDialog.phtml');
  187. }
  188. public function checkBuilderFeedAction()
  189. {
  190. $request = $this->getRequest();
  191. $show_filter = intval($request->getParam("showFilter", 0));
  192. $my_shows = intval($request->getParam("myShows", 0));
  193. $timestamp = intval($request->getParam("timestamp", -1));
  194. $instances = $request->getParam("instances", array());
  195. list($startsDT, $endsDT) = Application_Common_HTTPHelper::getStartEndFromRequest($request);
  196. $opts = array("myShows" => $my_shows, "showFilter" => $show_filter);
  197. $showBuilder = new Application_Model_ShowBuilder($startsDT, $endsDT, $opts);
  198. //only send the schedule back if updates have been made.
  199. // -1 default will always call the schedule to be sent back if no timestamp is defined.
  200. $this->view->update = $showBuilder->hasBeenUpdatedSince(
  201. $timestamp, $instances);
  202. }
  203. public function builderFeedAction()
  204. {
  205. $current_time = time();
  206. $request = $this->getRequest();
  207. $show_filter = intval($request->getParam("showFilter", 0));
  208. $show_instance_filter = intval($request->getParam("showInstanceFilter", 0));
  209. $my_shows = intval($request->getParam("myShows", 0));
  210. list($startsDT, $endsDT) = Application_Common_HTTPHelper::getStartEndFromRequest($request);
  211. $opts = array("myShows" => $my_shows,
  212. "showFilter" => $show_filter,
  213. "showInstanceFilter" => $show_instance_filter);
  214. $showBuilder = new Application_Model_ShowBuilder($startsDT, $endsDT, $opts);
  215. $data = $showBuilder->getItems();
  216. $this->view->schedule = $data["schedule"];
  217. $this->view->instances = $data["showInstances"];
  218. $this->view->timestamp = $current_time;
  219. }
  220. public function scheduleAddAction()
  221. {
  222. $request = $this->getRequest();
  223. $mediaItems = $request->getParam("mediaIds", array());
  224. $scheduledItems = $request->getParam("schedIds", array());
  225. $log_vars = array();
  226. $log_vars["url"] = $_SERVER['HTTP_HOST'];
  227. $log_vars["action"] = "showbuilder/schedule-add";
  228. $log_vars["params"] = array();
  229. $log_vars["params"]["media_items"] = $mediaItems;
  230. $log_vars["params"]["scheduled_items"] = $scheduledItems;
  231. Logging::info($log_vars);
  232. try {
  233. $scheduler = new Application_Model_Scheduler();
  234. $scheduler->scheduleAfter($scheduledItems, $mediaItems);
  235. } catch (OutDatedScheduleException $e) {
  236. $this->view->error = $e->getMessage();
  237. Logging::info($e->getMessage());
  238. } catch (Exception $e) {
  239. $this->view->error = $e->getMessage();
  240. Logging::info($e->getMessage());
  241. }
  242. }
  243. public function scheduleRemoveAction()
  244. {
  245. $request = $this->getRequest();
  246. $items = $request->getParam("items", array());
  247. try {
  248. $scheduler = new Application_Model_Scheduler();
  249. $scheduler->removeItems($items);
  250. } catch (OutDatedScheduleException $e) {
  251. $this->view->error = $e->getMessage();
  252. Logging::info($e->getMessage());
  253. } catch (Exception $e) {
  254. $this->view->error = $e->getMessage();
  255. Logging::info($e->getMessage());
  256. }
  257. }
  258. public function scheduleMoveAction()
  259. {
  260. $request = $this->getRequest();
  261. $selectedItems = $request->getParam("selectedItem");
  262. $afterItem = $request->getParam("afterItem");
  263. try {
  264. $scheduler = new Application_Model_Scheduler();
  265. $scheduler->moveItem($selectedItems, $afterItem);
  266. } catch (OutDatedScheduleException $e) {
  267. $this->view->error = $e->getMessage();
  268. Logging::info($e->getMessage());
  269. } catch (Exception $e) {
  270. $this->view->error = $e->getMessage();
  271. Logging::info($e->getMessage());
  272. }
  273. }
  274. public function scheduleReorderAction()
  275. {
  276. throw new Exception("this controller is/was a no-op please fix your
  277. code");
  278. }
  279. }