• Subscribe to the RSS feed! RSS icon
  • Subscribe by Email
  • home
  • blog
  • dev
  • Recent Posts

    • Automatically upload screenshots in XFCE4
    • Zend Framework full page cache tips
    • No more Wordpress
    • Xdebug is full of awesome
    • Creating a chat bot with PHP and Dbus
    • A year in review: 2011
    • Notes on shell scripting
    • Listening to Dbus signals with PHP
    • Configuring 2 monitors with xrandr
    • A quick note on Dojo's data grids and dojox.data.HtmlStore
  • Recent Comments

    • Robert on Zend Framework full page cache tips
    • Stephen S. Musoke on Zend Framework full page cache tips
    • David on Zend Framework full page cache tips
    • Anon on A quick note on Dojo's data grids and dojox.data.HtmlStore
    • James on Communicating with Pidgin from PHP via D-Bus
    • Robert on A Zend Framework 2 EventManager use case
    • Jowee on A Zend Framework 2 EventManager use case
    • Jurian Sluiman on A Zend Framework 2 EventManager use case
    • Jurian Sluiman on A Zend Framework 2 EventManager use case
    • djozsef on Webkonf 2011 recap
  • Tags

    php, about, random, framework, zend, example, ubuntu, blog, site, zend framework, book, conference, me, python, wordpress, apache, introduction, lamp, linux, open source, review, script, setup, signals, ape, community, contributing, dbus, dojo, events, hack, mysql, netbeans, pidgin, plugin, pyqt, security, shell, svn, talk
  • Categories

    • Blablabla
    • Development
    • Free time
    • Places on the web
    • Programming
    • Software
    • Uncategorized
  • Archives

    • February, 2012
    • January, 2012
    • December, 2011
    • November, 2011
    • October, 2011
    • September, 2011
    • August, 2011
    • July, 2011
    • May, 2011
    • April, 2011
    • March, 2011
    • January, 2011
    • December, 2010
    • November, 2010
    • October, 2010
    • July, 2010
    • June, 2010
    • April, 2010
    • February, 2010
    • January, 2010
    • December, 2009
    • November, 2009
    • October, 2009
    • August, 2009
    • May, 2009
    • March, 2009
    • February, 2009
    • January, 2009
    • December, 2008
    • November, 2008
    • October, 2008
    • September, 2008

MyUrl view helper for Zend Framework

by Robert Basic on December 2nd, 2008

I started writing some boring introduction but I'll just skip to the point.

The problem

Zend Framework's built in URL view helper — Zend_View_Helper_Url — is discarding the query string of the URL, thus breaking some links.

Example: If I'm on a page like:
http://project/foo/bar/?param1=value1
and in the bar.phtml I use the Url helper like this:

<?= $this->url(array('param2' => 'value2')); ?>

I expect this:
http://project/foo/bar/param2/value2/?param1=value1
or something similar to this. This would be just perfect:
http://project/foo/bar/param1/value1/param2/value2
But no, it gives:
http://project/foo/bar/param2/value2/

The solution

After working on several workarounds, currently this is the best one I can think of — take the link that is created by the built-in Url helper and add the query string on that link:

<?php

// Usage:
// <?= $this->myUrl($this->url(array('param2' => 'value2'))); ?>
// Output:
// http://project/controller/action/param2/value2/?param1=value1
class Zend_View_Helper_MyUrl
{
    public function myUrl(&$url, &$toAdd = array())
    {
        $requestUri = Zend_Controller_Front::getInstance()->getRequest()->getRequestUri();
        $query = parse_url($requestUri, PHP_URL_QUERY);
        if($query == '')
        {
            return $url;
        }
        else if(empty($toAdd))
        {
            return $url . '/?' . $query;
        }
        else
        {
            $toAdd = (array)$toAdd;
            $query = explode("&", $query);

            $add = '/?';

            foreach($toAdd as $addPart)
            {
                foreach($query as $queryPart)
                {
                    if(strpos($queryPart, $addPart) !== False)
                    {
                        $add .= '&' . $queryPart;
                    }
                }
            }
            return $url . $add;
        }
    }
}

The second parameter, $toAdd, should be an array of parameters that we want to add to the URL. Say, if I have a query string like:
?param1=value1&someotherparam=anditsvalue
but want only to add the param1=value1 to the URL, I would pass “param1” as the second parameter. Not passing anything as the second parameter will result in adding the complete query string to the URL.

This is an ugly hack to make ugly links work, but it works. Thoughts?

Cheers!

Tags: example, framework, helper, link, php, url, view, zend.
Categories: Development, Programming.
Comments: 6 comments.

Comments: 6

  • buck lay

  • December 2nd, 2008
A whole class to add a query string seems a bit absurd. CakePHP does all of this for you and does it right. Is there are reason why you have to use Zend Framework? I think even Symfony can do these kinds of things without any trouble. Best of luck.
  • Jasper

  • December 2nd, 2008
You say that it's absurd to have a class that is a visual representation of a query string, but enough abstraction and need for that level of control over the query string does warrant it. Swapping frameworks just because treatment of URLs is easier isn't really decent enough justification, either, unless that's the sole function of your project. Glad you managed to get it sorted, Robert - maybe now you can shut up about it on twitter :p
  • Robert

  • December 2nd, 2008
@buck lay: ZF is my choice. Live with it. It has it's upsides and downsides and a few WTF?!'s along the way, but that's how it goes with everything in life. @Jasper: I'll shut up for a while, until something new comes up :P Cheers!
  • Andrew

  • February 10th, 2009
Try to use something like this: $this-&gt;url('param2' =&gt; 'value2', 'default', false), and be happy
  • umpirsky

  • July 31st, 2009
Small improvement: class Umpirsky_View_Helper_Qurl extends Zend_View_Helper_Abstract { /** * Generates an url given the name of a route, honors query string. * * @param array $urlOptions Options passed to the assemble method of the Route object. * @param mixed $name The name of a Route to use. If null it will use the current Route * @param bool $reset Whether or not to reset the route defaults with those provided * @return string Url for the link href attribute. */ public function qurl(array $urlOptions = array(), $name = null, $reset = false, $encode = true) { $url = $this-&gt;view-&gt;url($urlOptions, $name, $reset, $encode); $requestUri = Zend_Controller_Front::getInstance()-&gt;getRequest()-&gt;getRequestUri(); $query = parse_url($requestUri, PHP_URL_QUERY); if($query != '') { $url .= '/'; $pairs = explode('&amp;', $query); foreach ($pairs as $pair) { $url.= str_replace('=', '/', $pair) . '/'; } } return $url; } } You use it same way as Zend_View_Helper_Url, just one letter diference : qurl(array('param2' =&gt; 'value2')); ?&gt;
  • Jobinma

  • August 6th, 2009
What about the solution I proposed on ZF Forums : http://www.zfforums.com/zend-framework-components-13/core-infrastructure-19/how-can-i-pass-variable-while-using-zend_paginator-2589.html#post11796 Sounds a lot easier!

Leave a Reply

Robert Basic © 2008 — 2012
Design & graphics by: Livia Radvanski
Coded by: Robert Basic
Home page last updated on November 30th, 2009.
Frameworks used: Zend Framework, Dojo, 960 Grid System