Permalink
Browse files

added cross_app_link_to helper to switch between applications

  • Loading branch information...
1 parent e2c5fc0 commit 3b29e6f780666a71bffba35dcff4a3e8940e4df8 @oziks oziks committed Dec 15, 2011
@@ -4,7 +4,8 @@
<img class="avatar" src="<?php echo $sf_user->getProfile()->getAvatarUrl(20) ?>" />
<?php echo link_to($user, url_for('user/view?id='.$user->getId())) ?>
</li>
- <li><?php echo link_to('Home', '@homepage') ?></li>
+ <li><?php echo cross_app_link_to('Home', 'front', '@homepage') ?></li>
+ <li><?php echo link_to('Admin', '@homepage') ?></li>
<li><?php echo link_to('Help', 'http://github.com/pmsipilot/Crew/wiki') ?></li>
<li><?php echo link_to('Log Out', url_for('@sf_guard_signout')) ?></li>
<?php else: ?>
@@ -5,6 +5,7 @@
<?php echo link_to($user, url_for('user/view?id='.$user->getId())) ?>
</li>
<li><?php echo link_to('Home', '@homepage') ?></li>
+ <li><?php echo cross_app_link_to('Admin', 'admin', '@homepage') ?></li>
<li><?php echo link_to('Help', 'http://github.com/pmsipilot/Crew/wiki') ?></li>
<li><?php echo link_to('Log Out', url_for('@sf_guard_signout')) ?></li>
<?php else: ?>
View
@@ -44,3 +44,8 @@ all:
# Default secure
secure_module: auth
secure_action: error403
+
+ standard_helpers:
+ - Partial
+ - Url
+ - CrossApp
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * return an url for a given symfony application and an internal url
+ *
+ * @author Olivier Mansour
+ *
+ * @param string $app
+ * @param string $url
+ * @param boolean $absolute
+ * @param string $env
+ *
+ * @return string
+ */
+function cross_app_url_for($app, $url, $absolute = false, $env = null)
+{
+ return crossAppRouting::genUrl($app, $url, $absolute, $env);
+}
+
+/**
+ * Cette fonction est un infame copier coller de link_to1 avec un zeste de modif pour la rendre cross app
+ *
+ * @param string $name
+ * @param string $app l'application
+ * @param string $internalUri
+ * @param string $env
+ * @param array $options
+ *
+ * @see link_to1
+ *
+ *
+ * @return string
+ */
+function cross_app_link_to($name, $app, $internalUri, $env = null, $options = array())
+{
+ sfProjectConfiguration::getActive()->loadHelpers(array('Url'));
+
+ $crossUrl = cross_app_url_for($app, $internalUri, true, $env);
+
+ return link_to($name, $crossUrl, $options);
+}
@@ -0,0 +1,150 @@
+<?php
+
+class crossAppRouting
+{
+ protected static $urls = array();
+
+ /**
+ * Récupération du tableau d'urls cache static for test purpose
+ * @static
+ * @return void
+ */
+ public static function getUrls()
+ {
+ return static::$urls;
+ }
+
+ /**
+ * Génération d'une url cross application, et mise en cache de l'url
+ *
+ * @static
+ * @param string $app
+ * @param string $url
+ * @param bool $absolute
+ * @param string $env
+ * @param string $initialInstanceName for test purpose
+ * @return string
+ */
+ public static function genUrl($app, $url, $absolute = false, $env = null, $initialInstanceName = null)
+ {
+ $cacheKey = static::getCacheKey($app, $url, $absolute, $env);
+
+ // test du tableau statique
+ if(array_key_exists($cacheKey, static::$urls))
+ {
+ return static::$urls[$cacheKey];
+ }
+
+ $crossUrl = static::buildUrl($app, $url, $absolute, $env, $initialInstanceName);
+
+ //cache dans le tableau statique
+ static::$urls[$cacheKey] = $crossUrl;
+
+ return $crossUrl;
+ }
+
+ /**
+ * Génération brute de l'url cross app, passer par la fonction genUrl de préference (gestion du cache)
+ *
+ * @static
+ * @throws Exception
+ * @param string $app
+ * @param string $url
+ * @param bool $absolute
+ * @param string $env
+ * @param string $initialInstanceName for test purpose
+ * @return mixed
+ */
+ public static function buildUrl($app, $url, $absolute = false, $env = null, $initialInstanceName = null)
+ {
+ $initialApp = sfConfig::get('sf_app');
+ if($initialInstanceName == null)
+ {
+ $initialInstanceName = $initialApp;
+ }
+ $initialScriptName = $_SERVER['SCRIPT_NAME'];
+ $initialFrontController = basename($initialScriptName);
+ $initialConfig = sfConfig::getAll();
+ $debug = sfConfig::get('sf_debug');
+
+ //environnement par défaut
+ if($env == null)
+ {
+ $env = $initialConfig['sf_environment'];
+ }
+
+ //création du contexte
+ if(!sfContext::hasInstance($app))
+ {
+ sfConfig::set('sf_factory_storage', 'sfNoStorage'); // la config de base est restaurée à la fin de la fonction
+ sfConfig::set('sf_use_database', false);
+ $configuration = ProjectConfiguration::getApplicationConfiguration($app, $env, $debug);
+ $context = sfContext::createInstance($configuration, $app);
+ unset($configuration);
+ }
+ else
+ {
+ $context = sfContext::getInstance($app);
+ }
+
+ //détermination du front controller
+ $finalFrontController = $app;
+
+ if($env != 'prod')
+ {
+ $finalFrontController .= '_'.$env;
+ }
+
+ $finalFrontController.='.php';
+
+ $crossUrl = $context->getController()->genUrl($url, $absolute);
+ unset($context);
+
+ //vérrification de l'existence du front controller
+ if (!file_exists(sfConfig::get('sf_web_dir').DIRECTORY_SEPARATOR.$finalFrontController))
+ {
+ throw new Exception('Le front controller '.$finalFrontController.' est introuvable.');
+ }
+
+ $crossUrl = str_replace($initialFrontController, $finalFrontController, $crossUrl);
+
+ //retour au context initial
+ if($app !== $initialInstanceName)
+ {
+ sfContext::switchTo($initialInstanceName);
+ sfConfig::clear();
+ sfConfig::add($initialConfig);
+ }
+
+ return $crossUrl;
+ }
+
+ /**
+ * retourne la clef, différente pour chaque url selon l'environnement
+ *
+ * @static
+ * @param string $app
+ * @param string $url
+ * @param bool $absolute
+ * @param string $env
+ * @param string $sfRootDir for test purpose
+ * @return string
+ */
+ public static function getCacheKey($app, $url, $absolute = false, $env = null, $sfRootDir = null)
+ {
+ //for test purpose
+ if($sfRootDir == null)
+ {
+ $sfRootDir = sfConfig::get('sf_root_dir');
+ }
+
+ $key = $sfRootDir. //pour différencier deux instances de la même appli
+ $_SERVER['SERVER_NAME'].
+ $app.$url.sfConfig::get('sf_environment').
+ ($env ? $env : '').
+ ($absolute ? 'abs' : '');
+
+ // md5 pour éviter d'avoir une clef supérieure à 250 caractères.
+ return md5($key);
+ }
+}
View
@@ -0,0 +1,7 @@
+<?php
+
+
+require_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php');
+
+$configuration = ProjectConfiguration::getApplicationConfiguration('front', 'prod', false);
+sfContext::createInstance($configuration)->dispatch();

0 comments on commit 3b29e6f

Please sign in to comment.