public function getBody() { $indexer = $this->container->get('es_indexer'); $em = $this->container->get('doctrine')->getManager(); $rs = $this->container->get('review'); $body = array(); $c = $this->entity; // Alias for entity $body['name'] = $c->getName(); $body['id'] = $c->getId(); $body['videoIntro'] = $c->getVideoIntro(); $body['length'] = $c->getLength(); $body['slug'] = $c->getSlug(); $body['description'] = $c->getDescription(); $body['longDescription'] = $c->getLongDescription(); $body['syllabus'] = $c->getSyllabus(); $body['searchDesc'] = $c->getSearchDesc(); $body['status'] = $c->getStatus(); $body['certificate'] = $c->getCertificate(); $body['verifiedCertificate'] = $c->getVerifiedCertificate(); $body['url'] = $c->getUrl(); if ($c->getCreated()) { $body['created'] = $c->getCreated()->format(DATE_ISO8601); } // Tags $tags = array(); foreach ($c->getTags() as $tag) { $tags[] = strtolower($tag->getName()); } $body['tags'] = $tags; // Instructors $body['instructors'] = array(); foreach ($c->getInstructors() as $instructor) { $body['instructors'][] = $instructor->getName(); } // Language $body['language'] = array(); $lang = $c->getLanguage(); if ($lang) { $body['language']['name'] = $lang->getName(); $body['language']['id'] = $lang->getId(); $body['language']['slug'] = $lang->getSlug(); } else { // Set the default to english $l = $em->getRepository('ClassCentralSiteBundle:Language')->findOneBy(array('slug' => 'english')); $body['language']['name'] = $l->getName(); $body['language']['id'] = $l->getId(); $body['language']['slug'] = $l->getSlug(); } // Institutions $body['institutions'] = array(); foreach ($c->getInstitutions() as $ins) { $iDoc = new InstitutionDocumentType($ins, $this->container); $body['institutions'][] = $iDoc->getBody(); } // Provider $body['provider'] = array(); if ($c->getInitiative()) { $provider = $c->getInitiative(); } else { // create an independent provider $provider = new Initiative(); $provider->setName('Independent'); $provider->setCode('independent'); } $pDoc = new ProviderDocumentType($provider, $this->container); $body['provider'] = $pDoc->getBody(); // Get the next session $body['nextSession'] = array(); $ns = CourseUtility::getNextSession($c); if ($ns) { $nsDoc = new SessionDocumentType($ns, $this->container); $body['nextSession'] = $nsDoc->getBody(); } // Subject $subjects = array(); $sub = $c->getStream(); if ($sub->getParentStream()) { // Add the parent stream first $psDoc = new SubjectDocumentType($sub->getParentStream(), $this->container); $subjects[] = $psDoc->getBody(); } $sDoc = new SubjectDocumentType($sub, $this->container); $subjects[] = $sDoc->getBody(); $body['subjects'] = $subjects; // Sessions. Add sessions to the records $sessions = array(); $body['sessions'] = array(); foreach ($c->getOfferings() as $session) { // Ignore invalid session if ($session->getStatus() == Offering::COURSE_NA) { continue; } $sDoc = new SessionDocumentType($session, $this->container); $sessions[] = $sDoc->getBody(); } $body['sessions'] = $sessions; $body['numSessions'] = count($sessions); $body['rating'] = $rs->getRatings($c->getId()); $body['ratingSort'] = $rs->getBayesianAverageRating($c->getId()); $rArray = $rs->getReviewsArray($c->getId()); $body['reviewsCount'] = $rArray['count']; $body['ratingStars'] = ReviewUtility::getRatingStars($body['rating']); $body['formattedRating'] = ReviewUtility::formatRating($body['rating']); // Get Followed count $courseRepo = $this->container->get('doctrine')->getManager()->getRepository('ClassCentralSiteBundle:Course'); $body['followed'] = intval($courseRepo->getListedCount($c)); // Check if the course being offered is new // Definition of new - created 30 days ago $oneMonthAgo = new \DateTime(); $oneMonthAgo->sub(new \DateInterval("P30D")); $newCourse = false; if ($c->getCreated() >= $oneMonthAgo) { $newCourse = true; } $body['new'] = intval($newCourse); $startingSoon = false; $oneMonthLater = new \DateTime(); $oneMonthLater->add(new \DateInterval("P30D")); if ($ns && !in_array('selfpaced', $body['nextSession']['states']) && in_array('upcoming', $body['nextSession']['states'])) { if ($ns->getStartDate() < $oneMonthLater and $ns->getStatus() != Offering::START_DATES_UNKNOWN) { $startingSoon = true; } } $body['startingSoon'] = intval($startingSoon); // Get the Credential $credential = array(); if (!$c->getCredentials()->isEmpty()) { $cred = $c->getCredentials()->first(); if ($cred->getStatus() < 100) { $credential['id'] = $cred->getId(); $credential['name'] = $cred->getName(); $credential['slug'] = $cred->getSlug(); $credential['certificateName'] = ''; $credential['certificateSlug'] = ''; $credFormatter = $cred->getFormatter(); $credential['certificateName'] = $credFormatter->getCertificateName(); $credential['certificateSlug'] = $credFormatter->getCertificateSlug(); } } $body['credential'] = $credential; return $body; }
/** * Wrapper around static function so that it can be accessed from twig * @param $rating * @return float */ public function formatRating($rating) { return ReviewUtility::formatRating($rating); }
public function getCredentialReviews($slug) { $em = $this->container->get('doctrine')->getManager(); $credential = $em->getRepository('ClassCentralCredentialBundle:Credential')->findOneBy(array('slug' => $slug)); if (!$credential) { throw new \Exception("{$slug} is not a valid credential"); } $rating = $this->calculateAverageRating($credential); $reviewEntities = $em->createQuery("\n SELECT r,LENGTH (r.text) as reviewLength from ClassCentralCredentialBundle:CredentialReview r JOIN r.credential c WHERE c.slug = '{$slug}'\n ORDER BY r.rating DESC, reviewLength DESC")->getResult(); $reviewCount = 0; $ratingCount = 0; $r = array(); foreach ($reviewEntities as $review) { $review = $review[0]; if ($review->getStatus() < Review::REVIEW_NOT_SHOWN_STATUS_LOWER_BOUND) { $ratingCount++; $reviewCount++; $r[] = $this->getCredentialReviewArray($review); } } $reviews = array(); $reviews['count'] = $ratingCount; $reviews['ratingCount'] = $ratingCount; $reviews['reviewCount'] = $reviewCount; $reviews['rating'] = $rating['rating']; $reviews['formattedRating'] = ReviewUtility::formatRating($rating['rating']); $reviews['reviews'] = $r; return $reviews; }
/** * Renders the review widget * @param Request $request */ public function getReviewWidgetAction(Request $request) { $logger = $this->container->get('monolog.logger.review_widget'); $cache = $this->get('Cache'); $courseId = $request->query->get('course-id'); $courseCode = $request->query->get('course-code'); $courseName = urldecode($request->query->get('course-name')); $providerName = $request->query->get('provider-name'); $providerCourseUrl = $request->query->get('provider-course-url'); $providerCourseId = $request->query->get('provider-course-id'); // Basic check - if both course id and course code are empty then return a blank page if (empty($courseId) && empty($courseCode)) { $logger->error("Course Id and course code missing", $request->query->all()); // This returns an empty blank page return $this->render('ClassCentralSiteBundle:Review:review.widget.html.twig', array('course' => null)); } // If course-id is auto-detect then the course page url is a required field if ($courseId == 'auto-detect' && empty($providerCourseUrl)) { $logger->error("Provider Course url missing", $request->query->all()); // This returns an empty blank page return $this->render('ClassCentralSiteBundle:Review:review.widget.html.twig', array('course' => null)); } $data = $cache->get($this->generateReviewWidgetCacheKey($courseId, $courseCode, $providerCourseUrl), function () use($courseId, $courseCode, $providerCourseUrl, $courseName, $providerName, $request) { $em = $this->getDoctrine()->getManager(); $rs = $this->get('review'); $logger = $this->container->get('monolog.logger.review_widget'); // STEP 1: Figure out which course it is $course = null; if (!empty($courseId) and is_numeric($courseId)) { $course = $em->getRepository('ClassCentralSiteBundle:Course')->find($courseId); } if (empty($course) && !empty($courseCode)) { $course = $em->getRepository('ClassCentralSiteBundle:Course')->findOneBy(array('shortName' => $courseCode)); } // Use the provider url if available if (empty($course) && $courseId == 'auto-detect') { // Use the provider url to get the offering $offering = $em->getRepository('ClassCentralSiteBundle:Offering')->findOneBy(array('url' => $providerCourseUrl)); if ($offering) { $course = $offering->getCourse(); } } // Use the course name and provider name if (empty($course) and !empty($courseName) and !empty($providerName)) { $course = $em->getRepository('ClassCentralSiteBundle:Course')->findOneBy(array('name' => $courseName)); if ($course) { // Check its from the same provider $provider = null; if ($course->getInitiative()) { $provider = $course->getInitiative()->getCode(); } if (strcasecmp($provider, $providerName) != 0) { $course = null; } } } if ($course) { // Step 2: Get 5 reviews that are to be displayed $query = $em->createQueryBuilder(); $query->add('select', 'r')->add('from', 'ClassCentralSiteBundle:Review r')->join('r.reviewSummary', 'rs')->add('orderBy', 'r.rating DESC')->add('where', 'r.course = :course')->andWhere('rs is NOT NULL')->andWhere('r.status < :status')->setMaxResults(5)->setParameter('course', $course)->setParameter(':status', Review::REVIEW_NOT_SHOWN_STATUS_LOWER_BOUND); $reviewsWithSummaries = array(); foreach ($query->getQuery()->getResult() as $review) { $reviewsWithSummaries[] = ReviewUtility::getReviewArray($review); } // Get reviews and ratings count $rating = $rs->getRatings($course->getId()); $reviews = $rs->getReviews($course->getId()); return array('reviews' => $reviews, 'rating' => $rating, 'formattedRating' => ReviewUtility::formatRating($rating), 'reviewsWithSummaries' => $reviewsWithSummaries, 'course' => $em->getRepository('ClassCentralSiteBundle:Course')->getCourseArray($course)); } else { $logger->error("Course Not Found", $request->query->all()); return array('course' => null); } }); return $this->render('ClassCentralSiteBundle:Review:review.widget.html.twig', $data); }
public function getBody() { $indexer = $this->container->get('es_indexer'); $em = $this->container->get('doctrine')->getManager(); $rs = $this->container->get('review'); $body = array(); $c = $this->entity; // Alias for entity $body['name'] = $c->getName(); $body['id'] = $c->getId(); $body['videoIntro'] = $c->getVideoIntro(); $body['length'] = $c->getLength(); $body['slug'] = $c->getSlug(); $body['description'] = $c->getDescription(); $body['longDescription'] = $c->getLongDescription(); $body['syllabus'] = $c->getSyllabus(); $body['searchDesc'] = $c->getSearchDesc(); $body['status'] = $c->getStatus(); $body['certificate'] = $c->getCertificate(); $body['verifiedCertificate'] = $c->getVerifiedCertificate(); $body['url'] = $c->getUrl(); // Tags $tags = array(); foreach ($c->getTags() as $tag) { $tags[] = strtolower($tag->getName()); } $body['tags'] = $tags; // Instructors $body['instructors'] = array(); foreach ($c->getInstructors() as $instructor) { $body['instructors'][] = $instructor->getName(); } // Language $body['language'] = array(); $lang = $c->getLanguage(); if ($lang) { $body['language']['name'] = $lang->getName(); $body['language']['id'] = $lang->getId(); $body['language']['slug'] = $lang->getSlug(); } else { // Set the default to english $l = $em->getRepository('ClassCentralSiteBundle:Language')->findOneBy(array('slug' => 'english')); $body['language']['name'] = $l->getName(); $body['language']['id'] = $l->getId(); $body['language']['slug'] = $l->getSlug(); } // Institutions $body['institutions'] = array(); foreach ($c->getInstitutions() as $ins) { $iDoc = new InstitutionDocumentType($ins, $this->container); $body['institutions'][] = $iDoc->getBody(); } // Provider $body['provider'] = array(); if ($c->getInitiative()) { $provider = $c->getInitiative(); } else { // create an independent provider $provider = new Initiative(); $provider->setName('Independent'); $provider->setCode('independent'); } $pDoc = new ProviderDocumentType($provider, $this->container); $body['provider'] = $pDoc->getBody(); // Get the next session $body['nextSession'] = array(); $ns = CourseUtility::getNextSession($c); if ($ns) { $nsDoc = new SessionDocumentType($ns, $this->container); $body['nextSession'] = $nsDoc->getBody(); } // Subject $subjects = array(); $sub = $c->getStream(); if ($sub->getParentStream()) { // Add the parent stream first $psDoc = new SubjectDocumentType($sub->getParentStream(), $this->container); $subjects[] = $psDoc->getBody(); } $sDoc = new SubjectDocumentType($sub, $this->container); $subjects[] = $sDoc->getBody(); $body['subjects'] = $subjects; // Sessions. Add sessions to the records $sessions = array(); $body['sessions'] = array(); foreach ($c->getOfferings() as $session) { // Ignore invalid session if ($session->getStatus() == Offering::COURSE_NA) { continue; } $sDoc = new SessionDocumentType($session, $this->container); $sessions[] = $sDoc->getBody(); } $body['sessions'] = $sessions; $body['rating'] = $rs->getRatings($c->getId()); $body['ratingSort'] = $rs->getBayesianAverageRating($c->getId()); $rArray = $rs->getReviewsArray($c->getId()); $body['reviewsCount'] = $rArray['count']; $body['ratingStars'] = ReviewUtility::getRatingStars($body['rating']); $body['formattedRating'] = ReviewUtility::formatRating($body['rating']); // Get the Credential $credential = array(); if (!$c->getCredentials()->isEmpty()) { $cred = $c->getCredentials()->first(); if ($cred->getStatus() < 100) { $credential['id'] = $cred->getId(); $credential['name'] = $cred->getName(); $credential['slug'] = $cred->getSlug(); $credential['certificateName'] = ''; $credential['certificateSlug'] = ''; $credFormatter = $cred->getFormatter(); $credential['certificateName'] = $credFormatter->getCertificateName(); $credential['certificateSlug'] = $credFormatter->getCertificateSlug(); } } $body['credential'] = $credential; return $body; }
public function getBody() { $body = array(); $credentialService = $this->container->get('credential'); $c = $this->entity; // Alias for entity $formatter = $c->getFormatter(); $body['name'] = $c->getName(); $body['id'] = $c->getId(); $body['slug'] = $c->getSlug(); $body['oneLiner'] = $c->getOneLiner(); $body['subTitle'] = $c->getSubTitle(); $body['price'] = $c->getPrice(); $body['pricePeriod'] = $c->getPricePeriod(); $body['displayPrice'] = $formatter->getPrice(); $body['durationMin'] = $c->getDurationMin(); $body['durationMax'] = $c->getDurationMax(); $body['displayDuration'] = $formatter->getDuration(); $body['workloadMin'] = $c->getWorkloadMin(); $body['workloadMax'] = $c->getDurationMax(); $body['workloadType'] = $c->getWorkloadType(); $body['displayWorkload'] = $formatter->getWorkload(); $body['url'] = $c->getUrl(); $body['description'] = $c->getDescription(); $body['status'] = $c->getStatus(); $body['image'] = $credentialService->getImage($c); $body['cardImage'] = $credentialService->getCardImage($c); $body['subjectSlug'] = null; $body['subject'] = null; if ($c->getSubject()) { $body['subjectSlug'] = $c->getSubject(); $body['subject'] = Credential::$SUBJECTS[$c->getSubject()]; } $orgs = array(); // Array of names of organizations who are involved in creating the credential // Provider $body['provider'] = array(); if ($c->getInitiative()) { $provider = $c->getInitiative(); $body['certificateName'] = $formatter->getCertificateName(); $body['certificateSlug'] = $formatter->getCertificateSlug(); $bulletOrg = "{$formatter->getCertificateName()} via "; $orgs[] = $provider->getName(); // Populate the organization list } else { // create an independent provider $provider = new Initiative(); $provider->setName('Independent'); $provider->setCode('independent'); } $pDoc = new ProviderDocumentType($provider, $this->container); $body['provider'] = $pDoc->getBody(); // Institutions $body['institutions'] = array(); $institutions = array(); foreach ($c->getInstitutions() as $ins) { $iDoc = new InstitutionDocumentType($ins, $this->container); $body['institutions'][] = $iDoc->getBody(); $orgs[] = $ins->getName(); // Populate the organization list } // Get the ratings $rating = $credentialService->calculateAverageRating($this->entity); $body['rating'] = $rating['rating']; $body['formattedRating'] = ReviewUtility::formatRating($rating['rating']); // Rounds the rating to the nearest 0.5 $body['numRatings'] = $rating['numRatings']; $courses = array(); foreach ($this->entity->getCourses() as $course) { $cDoc = new CourseDocumentType($course, $this->container); $courses[] = $cDoc->getBody(); } $body['courses'] = $courses; $body['isSponsered'] = $c->isSponsored(); // Build the bullet points in the array $bulletPoints = array(); $bulletPoints[] = $bulletOrg . UniversalHelper::commaSeparateList($orgs); // Bullet Price and Duration $bulletPriceAndDuration = $formatter->getPrice(); $displayDuration = $formatter->getDuration(); if ($displayDuration) { $bulletPriceAndDuration .= ' for ' . $displayDuration; } $bulletPoints[] = $bulletPriceAndDuration; // Bullet effort $effort = $formatter->getWorkload(); if ($effort) { $bulletPoints[] = $effort . ' of effort'; } if ($provider->getName() == 'Coursera') { $bulletPoints[] = count($body['courses']) - 1 . ' courses + capstone project '; } elseif ($provider->getName() == 'HBX') { $bulletPoints[] = '3 courses and a final exam. Application Required'; } if ($formatter->getEnrollment()) { $bulletPoints[] = $formatter->getEnrollment(); } $body['bulletPoints'] = $bulletPoints; return $body; }
/** * Renders the review widget * @param Request $request */ public function getReviewWidgetAction(Request $request) { $cache = $this->get('Cache'); $courseId = $request->query->get('course-id'); $courseCode = $request->query->get('course-code'); // Basic check if ((empty($courseId) || !is_numeric($courseId)) && empty($courseCode)) { // This returns an empty blank page return $this->render('ClassCentralSiteBundle:Review:review.widget.html.twig', array('course' => null)); } $data = $cache->get($this->generateReviewWidgetCacheKey($courseId, $courseCode), function () use($courseId, $courseCode) { $em = $this->getDoctrine()->getManager(); $rs = $this->get('review'); // STEP 1: Figure out which course it is $course = null; if (!empty($courseId) and is_numeric($courseId)) { $course = $em->getRepository('ClassCentralSiteBundle:Course')->find($courseId); } if (empty($course) && !empty($courseCode)) { $course = $em->getRepository('ClassCentralSiteBundle:Course')->findOneBy(array('shortName' => $courseCode)); $courseId = $course->getId(); } if ($course) { // Step 2: Get 5 reviews that are to be displayed $query = $em->createQueryBuilder(); $query->add('select', 'r')->add('from', 'ClassCentralSiteBundle:Review r')->join('r.reviewSummary', 'rs')->add('orderBy', 'r.rating DESC')->add('where', 'r.course = :course')->andWhere('rs is NOT NULL')->andWhere('r.status = :status')->setMaxResults(5)->setParameter('course', $course)->setParameter(':status', Review::REVIEW_STATUS_APPROVED); $reviewsWithSummaries = array(); foreach ($query->getQuery()->getResult() as $review) { $reviewsWithSummaries[] = ReviewUtility::getReviewArray($review); } // Get reviews and ratings count $rating = $rs->getRatings($courseId); $reviews = $rs->getReviews($courseId); return array('reviews' => $reviews, 'rating' => $rating, 'formattedRating' => ReviewUtility::formatRating($rating), 'reviewsWithSummaries' => $reviewsWithSummaries, 'course' => $em->getRepository('ClassCentralSiteBundle:Course')->getCourseArray($course)); } else { return array('course' => null); } }); return $this->render('ClassCentralSiteBundle:Review:review.widget.html.twig', $data); }