From 937985257cd65952a91eca49839d2df4da24bfb9 Mon Sep 17 00:00:00 2001 From: Elinore Tenorio Date: Sat, 14 Nov 2015 21:29:20 +0800 Subject: [PATCH] New feature #5 - add RSS feed to categories and cities --- controllers/categories.php | 35 ++++++++++++++++++++++++++++++ controllers/cities.php | 35 ++++++++++++++++++++++++++++++ models/Applications.php | 3 ++- models/Categories.php | 7 ++++++ models/Cities.php | 7 ++++++ models/Jobs.php | 6 +++-- views/default/assets/css/theme.css | 4 ++++ views/default/categories.php | 2 +- views/default/cities.php | 2 +- views/default/home.php | 2 +- 10 files changed, 97 insertions(+), 6 deletions(-) diff --git a/controllers/categories.php b/controllers/categories.php index 00f1d99..57af177 100755 --- a/controllers/categories.php +++ b/controllers/categories.php @@ -16,6 +16,41 @@ $app->get('/', function () use ($app) { $app->redirect(BASE_URL); }); + + // rss category jobs + $app->get('/:id/:name/rss', function ($id, $name) use ($app) { + + global $lang; + + $id = (int)$id; + $cat = new Categories($id); + $info = $cat->findCategory(); + + $jobs = $cat->findAllCategoryJobs(); + + $app->response->headers->set('Content-Type', 'application/rss+xml'); + + $xml = new SimpleXMLElement(''); + $xml->addChild('channel'); + $xml->channel->addChild('title', $info->name ." ". $lang->t('jobs|jobs') .' | '. APP_NAME); + $xml->channel->addChild('link', BASE_URL . "categories/{$info->id}/{$info->url}"); + $xml->channel->addChild('description', htmlentities($info->description)); + foreach ($jobs as $job) { + $item = $xml->channel->addChild('item'); + $item->addChild('title', htmlentities($job->title)); + $item->addChild('link', BASE_URL . "jobs/{$job->id}/". slugify($job->title ." {$lang->t('jobs|at')} ". $job->company_name)); + $item->addChild('description', htmlentities($job->description)); + $guid = $item->addChild('guid', $job->id .'@' . BASE_URL); + $guid->addAttribute('isPermaLink', "false"); + $item->addChild('pubDate', date(DATE_RSS, strtotime($job->created))); + } + $dom = new DOMDocument(); + $dom->preserveWhiteSpace = false; + $dom->formatOutput = true; + $dom->loadXML($xml->asXML()); + echo $dom->saveXML(); + + }); // get category jobs $app->get('/:id(/:name(/:page))', function ($id, $name=null, $page=1) use ($app) { diff --git a/controllers/cities.php b/controllers/cities.php index f6004da..3de5bcc 100755 --- a/controllers/cities.php +++ b/controllers/cities.php @@ -16,6 +16,41 @@ $app->get('/', function () use ($app) { $app->redirect(BASE_URL); }); + + // rss city jobs + $app->get('/:id/:name/rss', function ($id, $name) use ($app) { + + global $lang; + + $id = (int)$id; + $city = new Cities($id); + $info = $city->findCity(); + + $jobs = $city->findAllCityJobs(); + + $app->response->headers->set('Content-Type', 'application/rss+xml'); + + $xml = new SimpleXMLElement(''); + $xml->addChild('channel'); + $xml->channel->addChild('title', $info->name ." ". $lang->t('jobs|jobs') .' | '. APP_NAME); + $xml->channel->addChild('link', BASE_URL . "cities/{$info->id}/{$info->url}"); + $xml->channel->addChild('description', htmlentities($info->description)); + foreach ($jobs as $job) { + $item = $xml->channel->addChild('item'); + $item->addChild('title', htmlentities($job->title)); + $item->addChild('link', BASE_URL . "jobs/{$job->id}/". slugify($job->title ." {$lang->t('jobs|at')} ". $job->company_name)); + $item->addChild('description', htmlentities($job->description)); + $guid = $item->addChild('guid', $job->id .'@' . BASE_URL); + $guid->addAttribute('isPermaLink', "false"); + $item->addChild('pubDate', date(DATE_RSS, strtotime($job->created))); + } + $dom = new DOMDocument(); + $dom->preserveWhiteSpace = false; + $dom->formatOutput = true; + $dom->loadXML($xml->asXML()); + echo $dom->saveXML(); + + }); // get city jobs $app->get('/:id(/:name(/:page))', function ($id, $name=null, $page=1) use ($app) { diff --git a/models/Applications.php b/models/Applications.php index 6ca860c..cfcc7fb 100755 --- a/models/Applications.php +++ b/models/Applications.php @@ -28,8 +28,9 @@ public function getJobTitle() public function getJobTitleURL() { + global $lang; $job = R::load('jobs', $this->_job_id); - $job_url = $job->title . ' at ' . $job->company_name; + $job_url = $job->title ." {$lang->t('jobs|at')} ". $job->company_name; return slugify($job_url); } diff --git a/models/Categories.php b/models/Categories.php index 26093c6..2a92588 100755 --- a/models/Categories.php +++ b/models/Categories.php @@ -30,6 +30,13 @@ public function findCategoryJobs($start, $limit) array(':category'=>$this->_id, ':start'=>$start, ':limit'=>$limit)); return $jobs; } + + public function findAllCategoryJobs() + { + $jobs = R::findAll('jobs', " status=1 AND category=:category ORDER BY created DESC LIMIT 0, 100", + array(':category'=>$this->_id)); + return $jobs; + } public function countCategoryJobs() { $count = R::count('jobs', " status=1 AND category=:category ", array(':category'=>$this->_id)); diff --git a/models/Cities.php b/models/Cities.php index e3c2983..59e250a 100755 --- a/models/Cities.php +++ b/models/Cities.php @@ -30,6 +30,13 @@ public function findCityJobs($start, $limit) array(':city'=>$this->_id, ':start'=>$start, ':limit'=>$limit)); return $jobs; } + + public function findAllCityJobs() + { + $jobs = R::findAll('jobs', " status=1 AND city=:city ORDER BY created DESC LIMIT 0, 100", + array(':city'=>$this->_id)); + return $jobs; + } public function countCityJobs() { $count = R::count('jobs', " status=1 AND city=:city ", array(':city'=>$this->_id)); diff --git a/models/Jobs.php b/models/Jobs.php index b1066f9..1c386d7 100755 --- a/models/Jobs.php +++ b/models/Jobs.php @@ -172,14 +172,16 @@ public function getStatus() public function getSlugTitle() { + global $lang; $job = $this->showJobDetails(); - return slugify($job->title . ' at ' . $job->company_name); + return slugify($job->title ." {$lang->t('jobs|at')} ". $job->company_name); } public function getSeoTitle() { + global $lang; $job = $this->showJobDetails(); - return $job->title . ' at ' . $job->company_name; + return $job->title ." {$lang->t('jobs|at')} ". $job->company_name; } } diff --git a/views/default/assets/css/theme.css b/views/default/assets/css/theme.css index 2051bd4..764b500 100755 --- a/views/default/assets/css/theme.css +++ b/views/default/assets/css/theme.css @@ -25,4 +25,8 @@ body { .job-highlight { background-color: #ffc; +} + +.job-rss { + background-color: #ff6600 !important; } \ No newline at end of file diff --git a/views/default/categories.php b/views/default/categories.php index b0e4c6d..f0703c1 100755 --- a/views/default/categories.php +++ b/views/default/categories.php @@ -2,7 +2,7 @@ -

name); ?> t('jobs|jobs'); ?>

+

name); ?> t('jobs|jobs'); ?> id}/{$categ->url}/rss"); ?>" target="_blank" class="badge job-rss">RSS

id}/". slugify($job->title ." {$lang->t('jobs|at')} ". $job->company_name)); ?>"> diff --git a/views/default/cities.php b/views/default/cities.php index 0b3c3c0..ca7bc50 100755 --- a/views/default/cities.php +++ b/views/default/cities.php @@ -2,7 +2,7 @@ -

name); ?> t('jobs|jobs'); ?>

+

name); ?> t('jobs|jobs'); ?> id}/{$city->url}/rss"); ?>" target="_blank" class="badge job-rss">RSS