Add Horde_Controller_UrlWriter
authorChuck Hagenbuch <chuck@horde.org>
Mon, 9 Aug 2010 04:37:05 +0000 (00:37 -0400)
committerChuck Hagenbuch <chuck@horde.org>
Mon, 9 Aug 2010 04:37:05 +0000 (00:37 -0400)
framework/Controller/lib/Horde/Controller/UrlWriter.php [new file with mode: 0644]
framework/Controller/package.xml

diff --git a/framework/Controller/lib/Horde/Controller/UrlWriter.php b/framework/Controller/lib/Horde/Controller/UrlWriter.php
new file mode 100644 (file)
index 0000000..6220a5b
--- /dev/null
@@ -0,0 +1,82 @@
+<?php
+/**
+ * URL generation utility for controllers
+ *
+ * @category Horde
+ * @package  Horde_Controller
+ * @author   Mike Naberezny <mike@maintainable.com>
+ * @author   Derek DeVries <derek@maintainable.com>
+ * @author   Chuck Hagenbuch <chuck@horde.org>
+ * @license  http://opensource.org/licenses/bsd-license.php BSD
+ */
+class Horde_Controller_UrlWriter
+{
+    /**
+     * Defaults to merge into route parameters when not using named routes.
+     * @var array
+     */
+    protected $_defaults;
+
+    /**
+     * @var Horde_Routes_Util
+     */
+    protected $_utils;
+
+    /**
+     * Class constructor
+     *
+     * @param  Horde_Routes_Utils  $utils     Route utilities
+     * @param  array               $defaults  Defaults to merge for urlFor()
+     */
+    public function __construct(Horde_Routes_Utils $utils, $defaults = array())
+    {
+        $this->_utils = $utils;
+        $this->_defaults = $defaults;
+    }
+
+    /**
+     * Generate a URL.  Same signature as Horde_Routes_Utils->urlFor().
+     *
+     * @param  $first   mixed
+     * @param  $second  mixed
+     * @return string
+     */
+    public function urlFor($first, $second = array())
+    {
+        // anonymous route: serialize to params & merge defaults
+        //   urlFor(array('controller' => 'books'))
+        if (is_array($first)) {
+            $first = array_merge($this->_defaults,
+                                 $this->_serializeToParams($first));
+        }
+
+        // named route: serialize to params only (no merge)
+        //   urlFor('notes', array('action' => 'show', 'id' => 1))
+        if (is_array($second)) {
+            $second = $this->_serializeToParams($second);
+        }
+
+        // url generation "route memory" is not useful here
+        $this->_utils->mapperDict = array();
+
+        // generate url
+        return $this->_utils->urlFor($first, $second);
+    }
+
+    /**
+     * Serialize any objects in the collection supporting toParam() before
+     * passing the collection to Horde_Routes.
+     *
+     * @param  array  $collection
+     * @param  array
+     */
+    protected function _serializeToParams($collection)
+    {
+        foreach ($collection as &$value) {
+            if (is_object($value) && method_exists($value, 'toParam')) {
+                $value = $value->toParam();
+            }
+        }
+        return $collection;
+    }
+}
index c068860..9151af8 100644 (file)
@@ -63,6 +63,7 @@ http://pear.php.net/dtd/package-2.0.xsd">
       <file name="ResponseWriter.php" role="php" />
       <file name="Runner.php" role="php" />
       <file name="SettingsExporter.php" role="php" />
+      <file name="UrlWriter.php" role="php" />
      </dir> <!-- /lib/Horde/Controller -->
      <file name="Controller.php" role="php" />
     </dir> <!-- /lib/Horde -->
@@ -104,6 +105,7 @@ http://pear.php.net/dtd/package-2.0.xsd">
    <install name="lib/Horde/Controller/Runner.php" as="Horde/Controller/Runner.php" />
    <install name="lib/Horde/Controller/SettingsExporter/Default.php" as="Horde/Controller/SettingsExporter/Default.php" />
    <install name="lib/Horde/Controller/SettingsExporter.php" as="Horde/Controller/SettingsExporter.php" />
+   <install name="lib/Horde/Controller/UrlWriter.php" as="Horde/Controller/UrlWriter.php" />
    <install name="lib/Horde/Controller.php" as="Horde/Controller.php" />
   </filelist>
  </phprelease>