<?php class Application_Common_UsabilityHints { /** * @param $userPath User's current location in Airtime (i.e. /Plupload) * @return string */ public static function getUsabilityHint($userPath=null) { // We want to display hints in this order: // 1. Check if files are uploaded // 2. Check if a show is scheduled // 3. Check if current or next show needs content // Once the user is on the page linked to from the hint we want to // display a new message further describing what to do. Once this // action has been done we can hide the message and get the next // usability hint, if there is one. $userIsOnCalendarPage = false; $userIsOnAddMediaPage = false; $userIsOnShowbuilderPage = false; $userIsSuperAdmin = Application_Model_User::getCurrentUser()->isSuperAdmin(); // If $userPath is set the request came from AJAX so the user's // current location inside Airtime gets passed in to this function. if (!is_null($userPath)) { // We check if the controller names are in the user's current location // so we can ignore leading or trailing slashes, special characters like '#', // and additional controller action names like '/user/add-user' if (strpos(strtolower($userPath), 'plupload') !== false) { $userIsOnAddMediaPage = true; } if (strpos(strtolower($userPath), 'schedule') !== false) { $userIsOnCalendarPage = true; } if (strpos(strtolower($userPath), 'showbuilder') !== false) { $userIsOnShowbuilderPage = true; } } else { // If $userPath is not set the request came from inside Airtime so // we can use Zend's Front Controller to get the user's current location. $currentController = strtolower(Zend_Controller_Front::getInstance()->getRequest()->getControllerName()); if ($currentController == "schedule") { $userIsOnCalendarPage = true; } if ($currentController == "plupload") { $userIsOnAddMediaPage = true; } if ($currentController == 'showbuilder') { $userIsOnShowbuilderPage = true; } } if (self::zeroFilesUploaded()) { if ($userIsOnAddMediaPage) { return _("Upload some tracks below to add them to your library!"); } else { return sprintf(_("It looks like you haven't uploaded any audio files yet. %sUpload a file now%s."), "<a href=\"/plupload\">", "</a>"); } } else if (!self::isFutureOrCurrentShowScheduled()) { if ($userIsOnCalendarPage) { return _("Click the 'New Show' button and fill out the required fields."); } else { return sprintf(_("It looks like you don't have any shows scheduled. %sCreate a show now%s."), "<a href=\"/schedule\">", "</a>"); } } else if (self::isCurrentShowEmpty()) { // If the current show is linked users cannot add content to it so we have to provide a different message. if (self::isCurrentShowLinked()) { if ($userIsOnCalendarPage) { return _("To start broadcasting, cancel the current linked show by clicking on it and selecting 'Cancel Show'."); } else { return sprintf(_("Linked shows need to be filled with tracks before it starts. To start broadcasting cancel the current linked show and schedule an unlinked show. %sCreate an unlinked show now%s."), "<a href=\"/schedule\">", "</a>"); } } else { if ($userIsOnCalendarPage) { return _("To start broadcasting, click on the current show and select 'Schedule Tracks'"); } else { return sprintf(_("It looks like the current show needs more tracks. %sAdd tracks to your show now%s."), "<a href=\"/schedule\">", "</a>"); } } } else if (!self::getCurrentShow() && self::isNextShowEmpty()) { if ($userIsOnCalendarPage) { return _("Click on the show starting next and select 'Schedule Tracks'"); } else { return sprintf(_("It looks like the next show is empty. %sAdd tracks to your show now%s."), "<a href=\"/schedule\">", "</a>"); } } return ""; } /** * Returns true if no files have been uploaded. */ private static function zeroFilesUploaded() { $fileCount = CcFilesQuery::create() ->filterByDbFileExists(true) ->filterByDbHidden(false) ->count(); if ($fileCount == 0) { return true; } else { return false; } } /** * Returns true if there is at least one show currently scheduled * or in the future. */ private static function isFutureOrCurrentShowScheduled() { $futureShow = self::getNextFutureShow(); $currentShow = self::getCurrentShow(); if (is_null($futureShow) && is_null($currentShow)) { return false; } else { return true; } } private static function isCurrentShowEmpty() { $currentShow = self::getCurrentShow(); if (is_null($currentShow)) { return false; } else { $now = new DateTime("now", new DateTimeZone("UTC")); $scheduledTracks = CcScheduleQuery::create() ->filterByDbInstanceId($currentShow->getDbId()) ->filterByDbEnds($now, Criteria::GREATER_EQUAL) ->find(); if ($scheduledTracks->count() == 0) { return true; } else { return false; } } } private static function isNextShowEmpty() { $futureShow = self::getNextFutureShow(); if (is_null($futureShow)) { return false; } else { $now = new DateTime("now", new DateTimeZone("UTC")); $scheduledTracks = CcScheduleQuery::create() ->filterByDbInstanceId($futureShow->getDbId()) ->filterByDbStarts($now, Criteria::GREATER_EQUAL) ->find(); if ($scheduledTracks->count() == 0) { return true; } else { return false; } } } private static function getCurrentShow() { $now = new DateTime("now", new DateTimeZone("UTC")); return CcShowInstancesQuery::create() ->filterByDbStarts($now, Criteria::LESS_THAN) ->filterByDbEnds($now, Criteria::GREATER_THAN) ->filterByDbModifiedInstance(false) ->findOne(); } private static function getNextFutureShow() { $now = new DateTime("now", new DateTimeZone("UTC")); return CcShowInstancesQuery::create() ->filterByDbStarts($now, Criteria::GREATER_THAN) ->filterByDbModifiedInstance(false) ->orderByDbStarts() ->findOne(); } private static function isCurrentShowLinked() { $currentShow = self::getCurrentShow(); if (!is_null($currentShow)) { $show = CcShowQuery::create() ->filterByDbId($currentShow->getDbShowId()) ->findOne(); if ($show->isLinked()) { return true; } else { return false; } } else { return false; } } }