| 
<?php/**
 * @author           Pierre-Henry Soria <[email protected]>
 * @copyright        (c) 2013, Pierre-Henry Soria. All Rights Reserved.
 * @link             http://github.com/pH-7/Slim-URL-Shortener
 * @license          GNU General Public License <http://www.gnu.org/licenses/gpl.html>
 */
 
 namespace PHS;
 
 use Slim\Slim, Slim\Extras\Views\Twig, PHS\Model\Url;
 
 define('PHS', 1);
 
 
 require 'constants.php';
 require ROOT_PATH . 'inc/init.inc.php';
 
 putenv('LC_ALL=' . DEFAULT_LANG);
 setlocale(LC_ALL, DEFAULT_LANG);
 
 bindtextdomain(LANG_DOMAIN, LANG_PATH);
 bind_textdomain_codeset(LANG_DOMAIN, ENCODING);
 
 // Choose domain
 textdomain(LANG_DOMAIN);
 
 Slim::registerAutoloader();
 
 // Views
 Twig::$twigDirectory = VENDOR_PATH . '/Twig/';
 
 Twig::$twigOptions = array('debug' => DEBUG);
 
 if (is_writable(TPL_CACHE))
 Twig::$twigOptions['cache'] = TPL_CACHE;
 
 Twig::$twigExtensions = array(
 'Twig_Extensions_Slim',
 'Twig_Extension_Debug',
 'Twig_Extensions_Extension_I18n'
 );
 
 
 $oApp = new Slim(array(
 'debug' => DEBUG,
 'locales.path' => LANG_PATH,
 'view' => new Twig,
 'templates.path' => 'views'
 ));
 
 define('ROOT_URL', $oApp->request()->getUrl() . $oApp->request()->getRootUri());
 
 // Models
 \ORM::configure( sprintf('mysql:host=%s;dbname=%s', DB_HOSTNAME, DB_NAME) );
 \ORM::configure('username', DB_USR);
 \ORM::configure('password', DB_PWD);
 \Model::$auto_prefix_models = '\\PHS\Model\\';
 
 $aViewParams = array('encoding' => ENCODING, 'lang' => DEFAULT_LANG, 'url' => ROOT_URL, 'style_name' => STYLE_NAME);
 
 // URLs list
 $oApp->get('/', function() use ($oApp)
 {
 $oUrls = \Model::factory('Url');
 $oAllUrls = $oUrls->order_by_desc('createdDate')->find_many();
 $iTotalUrls =  $oUrls->count();
 
 global $aViewParams;
 $_aViewParams = $aViewParams + array('urls' => $oAllUrls, 'total_urls' => $iTotalUrls);  // Update array
 return $oApp->render('list.twig', $_aViewParams);
 });
 
 // Add URL
 $oApp->get('/add', function() use ($oApp)
 {
 global $aViewParams;
 return $oApp->render('add.twig', $aViewParams);
 });
 
 // Add URL in submit form
 $oApp->post('/add', function() use ($oApp)
 {
 $oUrls = \Model::factory('Url');
 $sLink = $oApp->request()->post('link');
 
 // Check link
 if (!filter_var($sLink, FILTER_VALIDATE_URL))
 {
 $oApp->flash('error', gettext('Invalid link!'));
 $oApp->redirect(ROOT_URL);
 }
 else
 {
 $oLink = $oUrls->where('link', $sLink);
 if ($oLink->count() < 1)
 {
 $oUrl = $oUrls->create();
 $oUrl->link = $sLink;
 $oUrl->createdDate = date('Y-m-d H:i:s');
 $oUrl->ip = $oApp->request()->getIp();
 $oUrl->save();
 }
 $oApp->flash('success', sprintf(gettext('The shortened URL is available at: %s'), ROOT_URL . '/' . $oLink->find_many()[0]->id));
 $oApp->redirect(ROOT_URL); // Go to the list of links
 }
 });
 
 // Contact
 $oApp->get('/contact', function() use ($oApp) {
 global $aViewParams;
 return $oApp->render('contact.twig', $aViewParams);
 });
 
 // Redirect ID towards the URL
 $oApp->get('/:id', function($iId) use ($oApp) {
 $oUrl = \Model::factory('Url')->find_one($iId);
 if (! $oUrl instanceof Url) {
 $oApp->notFound();
 } else {
 $oUrl->nb_access += 1; // Count the number of visit for the link
 $oUrl->save();
 $oApp->redirect($oUrl->link);
 }
 });
 
 // GO!
 $oApp->run();
 
 |