#0 | count
/var/www/ua.studyforyou.info/apps/modules/frontend/controllers/CoursesCatalogController.php (409) <?php
namespace Modules\Frontend\Controllers;
use Phalcon\Mvc\View;
class CoursesCatalogController extends ControllerBase
{
public function indexAction()
{
$lang_code = $this->language;
$languagesModel = new \Languages();
$lang = $languagesModel::findFirstByCode($lang_code)->id;
//second param is filters you want use
$translates = $this->setViewTranslates($lang, ['menu', 'header', 'filters', 'footer', 'content']);
$this->assets->addCss('frontend/dist/css/courses-catalog.css' . $this->disableCache());
$this->assets->addJs('frontend/js/courses-catalog.js' . $this->disableCache());
$activeFilters = [
'search' => null,
'category' => null,
'type' => null,
'country' => null,
'city' => null,
'lang' => null,
'cost' => null,
'duration' => null,
'age' => null,
'profile' => null,
];
if ($this->request->get()) {
if ($this->request->get('searchText')) {
$search = $this->request->get('searchText');
$activeFilters['search'] = $search;
}
if ($this->request->get('category')) {
$categoryId = $this->request->get('category');
$activeFilters['category'] = $categoryId;
$activeFiltersValues['category'] = [
'value' => \FilterTranslates::findFirst($categoryId)->title,
'name' => ''//$translates['t_filters']->language_teaching
];
}
if ($this->request->get('type')) {
$typeId = $this->request->get('type');
$activeFilters['type'] = $typeId;
$activeFiltersValues['type'] = [
'value' => \FilterTranslates::findFirst($typeId)->title,
'name' => $translates['t_filters']->course_type
];
}
if ($this->request->get('country')) {
$countryId = $this->request->get('country');
$activeFilters['country'] = $countryId;
$activeFiltersValues['country'] = [
'value' => \CountriesTranslates::findFirst(["country_id = :country_id: AND language_id = :language_id:", "bind" => ["country_id" => $countryId, 'language_id' => $lang]])->title,
'name' => $translates['t_filters']->country
];
}
if ($this->request->get('city')) {
$cityId = $this->request->get('city');
$activeFilters['city'] = $cityId;
$activeFiltersValues['city'] = [
'value' => \CitiesTranslates::findFirst(["city_id = :city_id: AND language_id = :language_id:", "bind" => ["city_id" => $cityId, 'language_id' => $lang]])->title,
'name' => $translates['t_filters']->city
];
}
if ($this->request->get('lang')) {
$langId = $this->request->get('lang');
$activeFilters['lang'] = $langId;
$activeFiltersValues['lang'] = [
'value' => \FilterTranslates::findFirst($langId)->title,
'name' => $translates['t_filters']->language_teaching
];
}
if ($this->request->get('cost')) {
$costTo = $this->request->get('cost');
$activeFilters['cost'] = $costTo;
$activeFiltersValues['cost'] = [
'value' => \FilterTranslates::findFirst($costTo)->title,
'name' => $translates['t_filters']->cost_to
];
}
if ($this->request->get('duration')) {
$durationId = $this->request->get('duration');
$activeFilters['duration'] = $durationId;
$activeFiltersValues['duration'] = [
'value' => \FilterTranslates::findFirst($durationId)->title,
'name' => $translates['t_filters']->course_duration
];
}
if ($this->request->get('age')) {
$ageId = $this->request->get('age');
$activeFilters['age'] = $ageId;
$activeFiltersValues['age'] = [
'value' => \FilterTranslates::findFirst($ageId)->title,
'name' => $translates['t_filters']->course_age
];
}
if ($this->request->get('profile')) {
$profileId = $this->request->get('profile');
$activeFilters['profile'] = $profileId;
$activeFiltersValues['profile'] = [
'value' => \FilterTranslates::findFirst($profileId)->title,
'name' => $translates['t_filters']->course_profile
];
}
}
$data = $this->getCourses($activeFilters, $lang);
$this->setPageContents('courses', $lang);
$this->view->setVars([
'countries' => \CountriesTranslates::findByLanguageId($lang),
'cities' => \CitiesTranslates::findByLanguageId($lang),
'languages' => \FilterTranslates::findManyByGroup('study_lang', $lang),
'categories' => \FilterTranslates::findManyByGroup('course_tabor_category', $lang),
'types' => \FilterTranslates::findManyByGroup('course_tabor_type', $lang),
'costs' => \FilterTranslates::findManyByGroup('course_cost', $lang),
'durations' => \FilterTranslates::findManyByGroup('course_tabor_duration', $lang),
'ages' => \FilterTranslates::findManyByGroup('ages', $lang),
'profiles' => \FilterTranslates::findManyByGroup('course_tabor_profile', $lang),
'lang' => $lang_code,
'courses' => $data ? $data['courses'] : false,
'current' => $data ? $data['current'] : false,
'activeFilters' => $activeFilters,
'activeFiltersValues' => $activeFiltersValues,
'coursesCount' => $data['count'],
//'meta' => \StringsTranslates::getMetaTranslates('courses', $lang)
]);
$breadcrumbs = $this->getBaseBreadCrumbs($translates, $lang_code);
$breadcrumbs[] = [
'pos' => '2',
'title' => $translates['t_content']->courses_catalog,
'url' => '/' . $lang_code . '/courses',
'last' => true
];
$this->view->breadcrumbs = $breadcrumbs;
}
public function getCoursesAction()
{
$lang_code = $this->language;
$languagesModel = new \Languages();
$lang = $languagesModel::findFirstByCode($lang_code)->id;
$activeFilters = [];
$translates = $this->setViewTranslates($lang, ['filters', 'content']);
if ($this->request->get()) {
if ($this->request->get('sort') != null) {
$sort = $this->request->get('sort');
$activeFilters['sort'] = $sort;
}
if ($this->request->get('searchText') != null) {
$search = $this->request->get('searchText');
$activeFilters['search'] = $search;
}
if ($this->request->get('category') != null) {
$categoryId = $this->request->get('category');
$activeFilters['category'] = $categoryId;
}
if ($this->request->get('type') != null) {
$typeId = $this->request->get('type');
$activeFilters['type'] = $typeId;
}
if ($this->request->get('country') != null) {
$countryId = $this->request->get('country');
$activeFilters['country'] = $countryId;
}
if ($this->request->get('city') != null) {
$cityId = $this->request->get('city');
$activeFilters['city'] = $cityId;
}
if ($this->request->get('lang') != null) {
$langId = $this->request->get('lang');
$activeFilters['lang'] = $langId;
}
if ($this->request->get('cost') != null) {
$costTo = $this->request->get('cost');
$activeFilters['cost'] = $costTo;
}
if ($this->request->get('duration') != null) {
$durationId = $this->request->get('duration');
$activeFilters['duration'] = $durationId;
}
if ($this->request->get('age') != null) {
$ageId = $this->request->get('age');
$activeFilters['age'] = $ageId;
}
if ($this->request->get('profile') != null) {
$profileId = $this->request->get('profile');
$activeFilters['profile'] = $profileId;
}
}
$data = $this->getCourses($activeFilters, $lang);
$this->view->setRenderLevel(
View::LEVEL_ACTION_VIEW
);
$this->view->partial(
'courses-catalog/courses-list',
[
'courses' => $data && isset($data['courses']) ? $data['courses'] : false,
'current' => $data && isset($data['current']) ? $data['current'] : false,
'filters' => json_encode($activeFilters),
'coursesCount' => $data ? $data['count'] : 0,
]
);
}
public function load($start, $data)
{
$count = 15;
$all_data = count($data);
if ($start <= $all_data) {
$end = (($start + $count) < $all_data) ? ($start + $count) : $all_data;
for ($i = $start; $i < $end; $i++) {
$result[$i] = $data[$i];
}
}
return [
'courses' => $result ? : false,
'current' => ($end < $all_data) ? $end : false,
];
}
public function getSearchTipsAction()
{
$this->view->disable();
$lang_code = $this->language;
$languagesModel = new \Languages();
$lang = $languagesModel::findFirstByCode($lang_code)->id;
$search = $this->request->get('search');
$bind['language_id'] = $lang;
if ($search != null) {
$where = "ctr.title LIKE '%$search%'";
$courses = $this->modelsManager->createBuilder()
->addFrom('Courses', 'c')
->columns("
c.id id,
ctr.title title
")
->leftjoin('CourseTranslates', 'ctr.course_id = c.id AND ctr.language_id = :language_id:', 'ctr')
->andwhere($where)
->andWhere("c.is_published = 1")
->getQuery()
->execute($bind)
->toArray();
foreach ($courses as $key => $item) {
$courses[$key]['title'] = preg_replace("/($search)/iu", '<b>' . $search . '</b>', $item['title']);
$courses[$key]['search'][] = $item['title'];
}
}
$this->response->setJsonContent(
$courses,
JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK
);
$this->response->send();
exit;
}
public function getCourses($filtersData, $lang)
{
$current = $this->request->get('current') ? $this->request->get('current') : 0;
$filters = [1];
$bind["language_id"] = $lang;
$search = '';
$ids = [];
$favorites = $this->getFavourites('course');
$orderBy = "c.id DESC";
if ($filtersData) {
if (isset($filtersData['search'])) {
$search = $filtersData['search'];
$filters['searchText'] = "(ctr.title LIKE '%$search%')";
}
if (isset($filtersData['sort']) && $filtersData['sort'] != 'none') {
$sort = explode('_', $filtersData['sort']);
switch ($sort[0]) {
case 'cost':
{
$field = 'cost';
break;
}
}
$orderBy = "c.$field " . $sort[1];
} else {
$orderBy = "c.id DESC";
}
if (isset($filtersData['category'])) {
$categoryId = $filtersData['category'];
$filters['categoryId'] = "ctr.category_id = $categoryId";
}
if (isset($filtersData['type'])) {
$typeId = $filtersData['type'];
$filters['typeId'] = "ctr.type_id = $typeId";
}
if (isset($filtersData['country'])) {
$countryId = $filtersData['country'];
$filters['countryId'] = "c.country_id = $countryId";
}
if (isset($filtersData['city'])) {
$cityId = $filtersData['city'];
$filters['cityId'] = "c.city_id = $cityId";
}
if (isset($filtersData['lang'])) {
$langId = $filtersData['lang'];
$sLangsIds = $this->getField(\CourseLanguages::findByLanguageId($langId)->toArray(), 'course_id');
if ((is_array($sLangsIds) && count($sLangsIds)) || $sLangsIds)
$ids[] = $sLangsIds;
}
if (isset($filtersData['cost'])) {
$costTo = $filtersData['cost'];
$filters['cost'] = "c.cost < $costTo";
}
if (isset($filtersData['duration'])) {
$durationId = $filtersData['duration'];
$filters['durationId'] = "ctr.duration = $durationId";
}
if (isset($filtersData['age'])) {
$ageId = $filtersData['age'];
$cAgesIds = $this->getField(\CourseAge::findByAgeId($ageId)->toArray(), 'course_id');
if ((is_array($cAgesIds) && count($cAgesIds)) || $cAgesIds)
$ids[] = $cAgesIds;
}
if (isset($filtersData['profile'])) {
$profileId = $filtersData['profile'];
$cProfilesIds = $this->getField(\CourseProfile::findByProfileId($profileId)->toArray(), 'course_id');
if ($cProfilesIds) {
if ((is_array($cProfilesIds) && count($cProfilesIds)) || $cProfilesIds)
$ids[] = $cProfilesIds;
}
}
}
if (count($ids)) {
if (count($ids) > 1) {
$intersection = call_user_func_array('array_intersect', $ids);
$filters['ids'] = $intersection ? "c.id IN (" . implode(',', $intersection) . ")" : 0;
} else {
if (count($ids[0]) > 1) {
$filters['ids'] = "c.id IN (" . implode(',', $ids[0]) . ")";
} else {
$filters['ids'] = $ids[0] ? "c.id = " . $ids[0][0] : 0;
}
}
}
$where = $filters ? implode(' AND ', $filters) : '1';
$courses = $this->modelsManager->createBuilder()
->addFrom('Courses', 'c')
->columns("
c.id id,
ctr.title title,
c.country_id country_id,
c.city_id city_id,
ctr.type_id type_id,
c.university_id university_id,
ctr.category_id category_id,
ctr.duration duration,
c.cost cost,
c.registration_fee registration_fee,
c.registration_end registration_end,
c.study_start study_start,
c.study_hours study_hours,
utr.title as university,
ctr.url_suffix url_suffix,
utr.url_suffix as university_url
")
->leftjoin('UniversityTranslates', 'utr.university_id = c.university_id AND utr.language_id = :language_id:', 'utr')
->leftjoin('CourseTranslates', 'ctr.course_id = c.id AND ctr.language_id = :language_id:', 'ctr')
->andwhere($where)
->andWhere("c.is_published = 1")
->orderBy($orderBy)
->getQuery()
->execute($bind)
->toArray();
if (count($courses)) {
foreach ($courses as $key => $course) {
$course_langs = \CourseLanguages::findByCourseId($courses[$key]['id'])->toArray();
$langs_ids = $this->getField($course_langs, 'language_id');
if (count($langs_ids))
$langs = \FilterTranslates::find(["id IN ({langs_ids:array}) AND language_id = :language_id:", "bind" => ["langs_ids" => $langs_ids, "language_id" => $lang]])->toArray();
$course_profiles = \CourseProfile::findByCourseId($courses[$key]['id'])->toArray();
$profiles_ids = $this->getField($course_profiles, 'profile_id');
if (count($profiles_ids))
$profiles = \FilterTranslates::find(["id IN ({profiles_ids:array}) AND language_id = :language_id:", "bind" => ["profiles_ids" => $profiles_ids, "language_id" => $lang]])->toArray();
$country = \CountriesTranslates::findFirst([
"country_id = :country_id: AND language_id = :language_id:",
"bind" => ["country_id" => $courses[$key]['country_id'], "language_id" => $lang]
]);
$city = \CitiesTranslates::findFirst([
"city_id = :city_id: AND language_id = :language_id:",
"bind" => ["city_id" => $courses[$key]['city_id'], "language_id" => $lang]
]);
$type = \FilterTranslates::findFirst(["id = :type_id: AND language_id = :language_id:", "bind" => ["type_id" => $courses[$key]['type_id'], "language_id" => $lang]]);
$duration = \FilterTranslates::findFirst(["id = :duration_id: AND language_id = :language_id:", "bind" => ["duration_id" => $courses[$key]['duration'], "language_id" => $lang]]);
$univer_id = \Universities::findFirstById($courses[$key]['university_id']);
if ($univer_id) {
if ($univer_id->university_logo_id) {
$univerLogo = \Medias::findFirst($univer_id->university_logo_id)->small_url ?? '';
$logoAlt = \MediaSeo::findFirst(["media_id = :media_id: AND language_id = :language_id:", "bind" => ["media_id" => $univer_id->university_logo_id, "language_id" => $lang]]);
}
if ($univer_id->banner_image_id) {
$univerBanner = \Medias::findFirst($univer_id->banner_image_id)->large_url;
$bannerAlt = \MediaSeo::findFirst(["media_id = :media_id: AND language_id = :language_id:", "bind" => ["media_id" => $univer_id->banner_image_id, "language_id" => $lang]]);
}
}
$courses[$key]['langs'] = $langs ? implode(', ', $this->getField($langs, 'title')) : null;
$courses[$key]['profiles'] = $profiles ? implode(', ', $this->getField($profiles, 'title')) : null;
$courses[$key]['country'] = $country ? $country->title : null;
$courses[$key]['country_code'] = $country ? \Countries::findFirstById($country->country_id)->code : null;
$courses[$key]['city'] = $city ? $city->title : null;
$courses[$key]['type'] = $type ? $type->title : null;
$courses[$key]['duration'] = $duration ? $duration->title : null;
$courses[$key]['univerLogo'] = $univerLogo;
$courses[$key]['univerBanner'] = $univerBanner;
$courses[$key]['logoAlt'] = $logoAlt ? $logoAlt->alt : null;
$courses[$key]['bannerAlt'] = $bannerAlt ? $bannerAlt->alt : null;
$courses[$key]['favorite'] = $favorites ? (in_array($courses[$key]['id'], $favorites) ? true : false) : false;
}
$data = $this->load($current, $courses);
} else {
$data = false;
}
if($data) {
$data['count'] = $courses ? count($courses) : 0;
}
return $data;
}
}
|
#1 | Modules\Frontend\Controllers\CoursesCatalogController->getCourses
/var/www/ua.studyforyou.info/apps/modules/frontend/controllers/CoursesCatalogController.php (115) <?php
namespace Modules\Frontend\Controllers;
use Phalcon\Mvc\View;
class CoursesCatalogController extends ControllerBase
{
public function indexAction()
{
$lang_code = $this->language;
$languagesModel = new \Languages();
$lang = $languagesModel::findFirstByCode($lang_code)->id;
//second param is filters you want use
$translates = $this->setViewTranslates($lang, ['menu', 'header', 'filters', 'footer', 'content']);
$this->assets->addCss('frontend/dist/css/courses-catalog.css' . $this->disableCache());
$this->assets->addJs('frontend/js/courses-catalog.js' . $this->disableCache());
$activeFilters = [
'search' => null,
'category' => null,
'type' => null,
'country' => null,
'city' => null,
'lang' => null,
'cost' => null,
'duration' => null,
'age' => null,
'profile' => null,
];
if ($this->request->get()) {
if ($this->request->get('searchText')) {
$search = $this->request->get('searchText');
$activeFilters['search'] = $search;
}
if ($this->request->get('category')) {
$categoryId = $this->request->get('category');
$activeFilters['category'] = $categoryId;
$activeFiltersValues['category'] = [
'value' => \FilterTranslates::findFirst($categoryId)->title,
'name' => ''//$translates['t_filters']->language_teaching
];
}
if ($this->request->get('type')) {
$typeId = $this->request->get('type');
$activeFilters['type'] = $typeId;
$activeFiltersValues['type'] = [
'value' => \FilterTranslates::findFirst($typeId)->title,
'name' => $translates['t_filters']->course_type
];
}
if ($this->request->get('country')) {
$countryId = $this->request->get('country');
$activeFilters['country'] = $countryId;
$activeFiltersValues['country'] = [
'value' => \CountriesTranslates::findFirst(["country_id = :country_id: AND language_id = :language_id:", "bind" => ["country_id" => $countryId, 'language_id' => $lang]])->title,
'name' => $translates['t_filters']->country
];
}
if ($this->request->get('city')) {
$cityId = $this->request->get('city');
$activeFilters['city'] = $cityId;
$activeFiltersValues['city'] = [
'value' => \CitiesTranslates::findFirst(["city_id = :city_id: AND language_id = :language_id:", "bind" => ["city_id" => $cityId, 'language_id' => $lang]])->title,
'name' => $translates['t_filters']->city
];
}
if ($this->request->get('lang')) {
$langId = $this->request->get('lang');
$activeFilters['lang'] = $langId;
$activeFiltersValues['lang'] = [
'value' => \FilterTranslates::findFirst($langId)->title,
'name' => $translates['t_filters']->language_teaching
];
}
if ($this->request->get('cost')) {
$costTo = $this->request->get('cost');
$activeFilters['cost'] = $costTo;
$activeFiltersValues['cost'] = [
'value' => \FilterTranslates::findFirst($costTo)->title,
'name' => $translates['t_filters']->cost_to
];
}
if ($this->request->get('duration')) {
$durationId = $this->request->get('duration');
$activeFilters['duration'] = $durationId;
$activeFiltersValues['duration'] = [
'value' => \FilterTranslates::findFirst($durationId)->title,
'name' => $translates['t_filters']->course_duration
];
}
if ($this->request->get('age')) {
$ageId = $this->request->get('age');
$activeFilters['age'] = $ageId;
$activeFiltersValues['age'] = [
'value' => \FilterTranslates::findFirst($ageId)->title,
'name' => $translates['t_filters']->course_age
];
}
if ($this->request->get('profile')) {
$profileId = $this->request->get('profile');
$activeFilters['profile'] = $profileId;
$activeFiltersValues['profile'] = [
'value' => \FilterTranslates::findFirst($profileId)->title,
'name' => $translates['t_filters']->course_profile
];
}
}
$data = $this->getCourses($activeFilters, $lang);
$this->setPageContents('courses', $lang);
$this->view->setVars([
'countries' => \CountriesTranslates::findByLanguageId($lang),
'cities' => \CitiesTranslates::findByLanguageId($lang),
'languages' => \FilterTranslates::findManyByGroup('study_lang', $lang),
'categories' => \FilterTranslates::findManyByGroup('course_tabor_category', $lang),
'types' => \FilterTranslates::findManyByGroup('course_tabor_type', $lang),
'costs' => \FilterTranslates::findManyByGroup('course_cost', $lang),
'durations' => \FilterTranslates::findManyByGroup('course_tabor_duration', $lang),
'ages' => \FilterTranslates::findManyByGroup('ages', $lang),
'profiles' => \FilterTranslates::findManyByGroup('course_tabor_profile', $lang),
'lang' => $lang_code,
'courses' => $data ? $data['courses'] : false,
'current' => $data ? $data['current'] : false,
'activeFilters' => $activeFilters,
'activeFiltersValues' => $activeFiltersValues,
'coursesCount' => $data['count'],
//'meta' => \StringsTranslates::getMetaTranslates('courses', $lang)
]);
$breadcrumbs = $this->getBaseBreadCrumbs($translates, $lang_code);
$breadcrumbs[] = [
'pos' => '2',
'title' => $translates['t_content']->courses_catalog,
'url' => '/' . $lang_code . '/courses',
'last' => true
];
$this->view->breadcrumbs = $breadcrumbs;
}
public function getCoursesAction()
{
$lang_code = $this->language;
$languagesModel = new \Languages();
$lang = $languagesModel::findFirstByCode($lang_code)->id;
$activeFilters = [];
$translates = $this->setViewTranslates($lang, ['filters', 'content']);
if ($this->request->get()) {
if ($this->request->get('sort') != null) {
$sort = $this->request->get('sort');
$activeFilters['sort'] = $sort;
}
if ($this->request->get('searchText') != null) {
$search = $this->request->get('searchText');
$activeFilters['search'] = $search;
}
if ($this->request->get('category') != null) {
$categoryId = $this->request->get('category');
$activeFilters['category'] = $categoryId;
}
if ($this->request->get('type') != null) {
$typeId = $this->request->get('type');
$activeFilters['type'] = $typeId;
}
if ($this->request->get('country') != null) {
$countryId = $this->request->get('country');
$activeFilters['country'] = $countryId;
}
if ($this->request->get('city') != null) {
$cityId = $this->request->get('city');
$activeFilters['city'] = $cityId;
}
if ($this->request->get('lang') != null) {
$langId = $this->request->get('lang');
$activeFilters['lang'] = $langId;
}
if ($this->request->get('cost') != null) {
$costTo = $this->request->get('cost');
$activeFilters['cost'] = $costTo;
}
if ($this->request->get('duration') != null) {
$durationId = $this->request->get('duration');
$activeFilters['duration'] = $durationId;
}
if ($this->request->get('age') != null) {
$ageId = $this->request->get('age');
$activeFilters['age'] = $ageId;
}
if ($this->request->get('profile') != null) {
$profileId = $this->request->get('profile');
$activeFilters['profile'] = $profileId;
}
}
$data = $this->getCourses($activeFilters, $lang);
$this->view->setRenderLevel(
View::LEVEL_ACTION_VIEW
);
$this->view->partial(
'courses-catalog/courses-list',
[
'courses' => $data && isset($data['courses']) ? $data['courses'] : false,
'current' => $data && isset($data['current']) ? $data['current'] : false,
'filters' => json_encode($activeFilters),
'coursesCount' => $data ? $data['count'] : 0,
]
);
}
public function load($start, $data)
{
$count = 15;
$all_data = count($data);
if ($start <= $all_data) {
$end = (($start + $count) < $all_data) ? ($start + $count) : $all_data;
for ($i = $start; $i < $end; $i++) {
$result[$i] = $data[$i];
}
}
return [
'courses' => $result ? : false,
'current' => ($end < $all_data) ? $end : false,
];
}
public function getSearchTipsAction()
{
$this->view->disable();
$lang_code = $this->language;
$languagesModel = new \Languages();
$lang = $languagesModel::findFirstByCode($lang_code)->id;
$search = $this->request->get('search');
$bind['language_id'] = $lang;
if ($search != null) {
$where = "ctr.title LIKE '%$search%'";
$courses = $this->modelsManager->createBuilder()
->addFrom('Courses', 'c')
->columns("
c.id id,
ctr.title title
")
->leftjoin('CourseTranslates', 'ctr.course_id = c.id AND ctr.language_id = :language_id:', 'ctr')
->andwhere($where)
->andWhere("c.is_published = 1")
->getQuery()
->execute($bind)
->toArray();
foreach ($courses as $key => $item) {
$courses[$key]['title'] = preg_replace("/($search)/iu", '<b>' . $search . '</b>', $item['title']);
$courses[$key]['search'][] = $item['title'];
}
}
$this->response->setJsonContent(
$courses,
JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK
);
$this->response->send();
exit;
}
public function getCourses($filtersData, $lang)
{
$current = $this->request->get('current') ? $this->request->get('current') : 0;
$filters = [1];
$bind["language_id"] = $lang;
$search = '';
$ids = [];
$favorites = $this->getFavourites('course');
$orderBy = "c.id DESC";
if ($filtersData) {
if (isset($filtersData['search'])) {
$search = $filtersData['search'];
$filters['searchText'] = "(ctr.title LIKE '%$search%')";
}
if (isset($filtersData['sort']) && $filtersData['sort'] != 'none') {
$sort = explode('_', $filtersData['sort']);
switch ($sort[0]) {
case 'cost':
{
$field = 'cost';
break;
}
}
$orderBy = "c.$field " . $sort[1];
} else {
$orderBy = "c.id DESC";
}
if (isset($filtersData['category'])) {
$categoryId = $filtersData['category'];
$filters['categoryId'] = "ctr.category_id = $categoryId";
}
if (isset($filtersData['type'])) {
$typeId = $filtersData['type'];
$filters['typeId'] = "ctr.type_id = $typeId";
}
if (isset($filtersData['country'])) {
$countryId = $filtersData['country'];
$filters['countryId'] = "c.country_id = $countryId";
}
if (isset($filtersData['city'])) {
$cityId = $filtersData['city'];
$filters['cityId'] = "c.city_id = $cityId";
}
if (isset($filtersData['lang'])) {
$langId = $filtersData['lang'];
$sLangsIds = $this->getField(\CourseLanguages::findByLanguageId($langId)->toArray(), 'course_id');
if ((is_array($sLangsIds) && count($sLangsIds)) || $sLangsIds)
$ids[] = $sLangsIds;
}
if (isset($filtersData['cost'])) {
$costTo = $filtersData['cost'];
$filters['cost'] = "c.cost < $costTo";
}
if (isset($filtersData['duration'])) {
$durationId = $filtersData['duration'];
$filters['durationId'] = "ctr.duration = $durationId";
}
if (isset($filtersData['age'])) {
$ageId = $filtersData['age'];
$cAgesIds = $this->getField(\CourseAge::findByAgeId($ageId)->toArray(), 'course_id');
if ((is_array($cAgesIds) && count($cAgesIds)) || $cAgesIds)
$ids[] = $cAgesIds;
}
if (isset($filtersData['profile'])) {
$profileId = $filtersData['profile'];
$cProfilesIds = $this->getField(\CourseProfile::findByProfileId($profileId)->toArray(), 'course_id');
if ($cProfilesIds) {
if ((is_array($cProfilesIds) && count($cProfilesIds)) || $cProfilesIds)
$ids[] = $cProfilesIds;
}
}
}
if (count($ids)) {
if (count($ids) > 1) {
$intersection = call_user_func_array('array_intersect', $ids);
$filters['ids'] = $intersection ? "c.id IN (" . implode(',', $intersection) . ")" : 0;
} else {
if (count($ids[0]) > 1) {
$filters['ids'] = "c.id IN (" . implode(',', $ids[0]) . ")";
} else {
$filters['ids'] = $ids[0] ? "c.id = " . $ids[0][0] : 0;
}
}
}
$where = $filters ? implode(' AND ', $filters) : '1';
$courses = $this->modelsManager->createBuilder()
->addFrom('Courses', 'c')
->columns("
c.id id,
ctr.title title,
c.country_id country_id,
c.city_id city_id,
ctr.type_id type_id,
c.university_id university_id,
ctr.category_id category_id,
ctr.duration duration,
c.cost cost,
c.registration_fee registration_fee,
c.registration_end registration_end,
c.study_start study_start,
c.study_hours study_hours,
utr.title as university,
ctr.url_suffix url_suffix,
utr.url_suffix as university_url
")
->leftjoin('UniversityTranslates', 'utr.university_id = c.university_id AND utr.language_id = :language_id:', 'utr')
->leftjoin('CourseTranslates', 'ctr.course_id = c.id AND ctr.language_id = :language_id:', 'ctr')
->andwhere($where)
->andWhere("c.is_published = 1")
->orderBy($orderBy)
->getQuery()
->execute($bind)
->toArray();
if (count($courses)) {
foreach ($courses as $key => $course) {
$course_langs = \CourseLanguages::findByCourseId($courses[$key]['id'])->toArray();
$langs_ids = $this->getField($course_langs, 'language_id');
if (count($langs_ids))
$langs = \FilterTranslates::find(["id IN ({langs_ids:array}) AND language_id = :language_id:", "bind" => ["langs_ids" => $langs_ids, "language_id" => $lang]])->toArray();
$course_profiles = \CourseProfile::findByCourseId($courses[$key]['id'])->toArray();
$profiles_ids = $this->getField($course_profiles, 'profile_id');
if (count($profiles_ids))
$profiles = \FilterTranslates::find(["id IN ({profiles_ids:array}) AND language_id = :language_id:", "bind" => ["profiles_ids" => $profiles_ids, "language_id" => $lang]])->toArray();
$country = \CountriesTranslates::findFirst([
"country_id = :country_id: AND language_id = :language_id:",
"bind" => ["country_id" => $courses[$key]['country_id'], "language_id" => $lang]
]);
$city = \CitiesTranslates::findFirst([
"city_id = :city_id: AND language_id = :language_id:",
"bind" => ["city_id" => $courses[$key]['city_id'], "language_id" => $lang]
]);
$type = \FilterTranslates::findFirst(["id = :type_id: AND language_id = :language_id:", "bind" => ["type_id" => $courses[$key]['type_id'], "language_id" => $lang]]);
$duration = \FilterTranslates::findFirst(["id = :duration_id: AND language_id = :language_id:", "bind" => ["duration_id" => $courses[$key]['duration'], "language_id" => $lang]]);
$univer_id = \Universities::findFirstById($courses[$key]['university_id']);
if ($univer_id) {
if ($univer_id->university_logo_id) {
$univerLogo = \Medias::findFirst($univer_id->university_logo_id)->small_url ?? '';
$logoAlt = \MediaSeo::findFirst(["media_id = :media_id: AND language_id = :language_id:", "bind" => ["media_id" => $univer_id->university_logo_id, "language_id" => $lang]]);
}
if ($univer_id->banner_image_id) {
$univerBanner = \Medias::findFirst($univer_id->banner_image_id)->large_url;
$bannerAlt = \MediaSeo::findFirst(["media_id = :media_id: AND language_id = :language_id:", "bind" => ["media_id" => $univer_id->banner_image_id, "language_id" => $lang]]);
}
}
$courses[$key]['langs'] = $langs ? implode(', ', $this->getField($langs, 'title')) : null;
$courses[$key]['profiles'] = $profiles ? implode(', ', $this->getField($profiles, 'title')) : null;
$courses[$key]['country'] = $country ? $country->title : null;
$courses[$key]['country_code'] = $country ? \Countries::findFirstById($country->country_id)->code : null;
$courses[$key]['city'] = $city ? $city->title : null;
$courses[$key]['type'] = $type ? $type->title : null;
$courses[$key]['duration'] = $duration ? $duration->title : null;
$courses[$key]['univerLogo'] = $univerLogo;
$courses[$key]['univerBanner'] = $univerBanner;
$courses[$key]['logoAlt'] = $logoAlt ? $logoAlt->alt : null;
$courses[$key]['bannerAlt'] = $bannerAlt ? $bannerAlt->alt : null;
$courses[$key]['favorite'] = $favorites ? (in_array($courses[$key]['id'], $favorites) ? true : false) : false;
}
$data = $this->load($current, $courses);
} else {
$data = false;
}
if($data) {
$data['count'] = $courses ? count($courses) : 0;
}
return $data;
}
}
|