Latest |Kites |Pictures |Programming |Life
?
[filed under Programming]Zend Framework Menus Navigation

Tags: Zend Framework, menus, controller, action, navigation, template, menu.phtml, actionStack, setResponseSegment, renderScript

This is how to put menu logic in your web page.

OK, from the get go, this is hard. You may need to read it a couple of times or do more research.

What we want is a web page with a menu system (a list of items) on the left of the page. The menu will be different for each controller and action.

What usually happens in ZF is the ApplicationController class is created and the method indexAction is called. indexAction then uses the model to get data and passes info to the view (for example using $this->view->data = 99; ). The view is then rendered as a string, which is appended to the Layout content.

It took me a while to figure that out.

To make the menu we need a seperate controller, the MenuController will decide what to show on the menu. The the menu view will render it and we capture the output of the view into a layout variable. The menu HTML is used later in the layout.phtml template.

In our application controller we push the "menu" onto the actionStack which makes ZF run MenuController::applicationAction next.


ApplicationController.php
class ApplicationController extends Zend_Controller_Action
{
    public function __construct(...)
    {
        //...
        // this tells the framework to run the MenuController after this
        $this->_helper->actionStack('application', 'menu');
    }
}

MenuController.php
class MenuController extends Zend_Controller_Action
{
    public function applicationAction
    {

        // we don't want to append the menu to the end
        // of the layout content, so:
        $this->_helper->viewRenderer->setResponseSegment('menu');
        $this->view->menu = array('x', 'y', 'z');
    }

   
    public function anotherAction
    {

        $this->_helper->viewRenderer->setResponseSegment('menu');
        $this->view->menu = array('a', 'b', 'b');
    }

}

layout.phtml (/layouts/)
<html><head></head><body>

<?= $this->layout()->menu; ?>

<?= $this->layout()->content; ?>

</body></html>

application.phtml (in /views/scripts/menu/)
<ul>
<?php foreach( $this->menu as $m ): ?>
  <li><?= $m ?></li>
<?php endforeach; ?>
</ul>


another.phtml (in /views/scripts/menu/)
<ul>
<?php foreach( $this->menu as $m ): ?>
  <li><?= $m ?></li>
<?php endforeach; ?>
</ul>

The MenuController changes the layout response segment to 'menu', all the HTML in the menu view is saved to this variable.

This HTML to make the menu is then merged into the web page in layout.phtml.

More notes on Zend Framework Menu Navigation.

10th of September, 2008@10:08:48 AM
3 comments, permanent link to article
[filed under Programming]Zend Framework actionStack

Further notes on Zend Framework Menu Navigation

This is how you pass variables to another action on the actionStack:

$this->_helper->actionStack('application', 'menu', 'default', array('show_menu'=>$this->getRequest()->action));

Then in your menu controller, ApplicationController::menuAction you can:

$show_menu = $this->_getParam( 'show_menu' );

Then you can use this variable to highlight the correct menu item, e.g:

<ul>
  <li>menu 1</li>
  <li id="selected">menu 2</li>
  <li>menu 3</li>
</ul>

 

10th of September, 2008@10:07:44 AM
add a comment, permanent link to article
[filed under Programming]youtube

best youtube comment so far:

JESUS IM COMING
Right all over your mom

4th of September, 2008@9:55:01 AM
add a comment, permanent link to article
[filed under Programming]AS3 sprintf

Tags: Actionscript flash AS3 flex adobe print format number format date string format float

sprinf

3rd of September, 2008@10:52:35 PM
add a comment, permanent link to article
[filed under Programming]Zend Framework MySQL Out Of Memory Error

Tags: Zend framework, ZF, PHP, MySQL, MySQLi, PDO, SQL, FORMAT, LONGTEXT, FLOAT, floating point, out of memory error

There is a bug in the MySQLi (Note the i) adapter that causes FORMAT() to fail.

For more info see the Zend DB email list. Here is the ZF DB MySQLi bug report.

Hope that helps someone out :-) it's one of the obscure little bugs that are hard to pin down.

29th of August, 2008@9:22:29 AM
1 comments, permanent link to article
[filed under Programming]shotgun blast of functions

Start a side project. <-- This is quite amusing and informative. There is a classic quote:

Naturally, the first thing I did was institutionalize Subversion.
(I've apparently always been a champion of source control, though I
didn't realize it until setting this story to paper.)
 
The second thing I did was start extracting the magic numbers into
configuration files. At the time, it was a pretty common PHP idiom to
use .ini files for configuration. Most of what you'd need was
supported, and I'm pretty sure PHP came with a library (aka a shotgun
blast of functions in the global namespace) that could understand .ini
files.

Haha! Man-o-man. So true. It is impossible to find any related functions. Anyway, we're getting namespaces in PHP6, wow, welcome to the 90s, man.

21st of August, 2008@10:01:16 AM
2 comments, permanent link to article
[filed under Programming]Python memory leak detector

Tags: Python, memory leak, leek, object, garbage collection, garbage collector, __del__, inspect, gc, DEBUG_LEAK

I have a nasty memory leak in my Python script which I can't find. For some random projects my script gobbles up 2gig of memory then quietly dies.

Here is my first attempt at cobbling together a leak detector:

import gc
import inspect

def dump_garbage():
    # force collection
    print "\nCollecting GARBAGE:"
    gc.collect()
    # prove they have been collected
    print "\nCollecting GARBAGE:"
    gc.collect()
   
    print "\nGARBAGE OBJECTS:"
    for x in gc.garbage:
        s = str(x)
        if len(s) > 80: s = "%s..." % s[:80]
       
        print "::", s
        print "        type:", type(x)
        print "   referrers:", len(gc.get_referrers(x))
        try:
            print "    is class:", inspect.isclass(type(x))
            print "      module:", inspect.getmodule(x)
           
            lines, line_num = inspect.getsourcelines(type(x))
            print "    line num:", line_num
            for l in lines:
                print "        line:", l.rstrip("\n")
        except:
            pass

        print

class tmp(object):
    def __init__(self):
        a = 0

if __name__=="__main__":
    import gc
    gc.enable()
    gc.set_debug(gc.DEBUG_LEAK)

    # make a leak
    l = [tmp()]
    l.append(l)
    del l

    dump_garbage()

When run it outputs:

Collecting GARBAGE:
gc: collectable <tmp 00BE1730>
gc: collectable <list 00BED788>

Collecting GARBAGE:

GARBAGE OBJECTS:
:: <__main__.tmp object at 0x00BE1730>
        type: <class '__main__.tmp'>
   referrers: 4
    is class: True
      module: <module '__main__' from 'C:\XXXXXX.py'>
    line num: 33
        line: class tmp(object):
        line:     def __init__(self):
        line:         a = 0

:: [<__main__.tmp object at 0x00BE1730>, [...]]
        type: <type 'list'>
   referrers: 4
    is class: True
      module: None

As you can see it tries to figure out where the object is defined in your code. This should give you some clues as to where the leak is happening. If you are still having problems try adding some debug comments to the classes as you create them, print the debug info in the dump_garbage() function.

This is based on this python memory leak detector at active state. I am learning all this as I go. I guess outputing this as a .csv would help. If you have any comments or improvements drop me a line in the comments below and I'll update the code.

These are some links and stuff to help you get started hunting down your memory leak:

Update:

A simple urllib2 memory leak test.

19th of August, 2008@10:38:37 AM
add a comment, permanent link to article
[filed under Programming]Python chain methods

I don't know why I didn't know this, but you can chain methods in Python. I use this quite a bit in PHP and Zend Framework uses it a little. But here it is in Python:

class table_model:
    def __init__(self):
        pass

    def connect(self):
        print 'connect to DB'
        return self
       
    def run_query(self):
        print 'run query'
        return self

    def get_last_result(self):
        return 'Hello'


table = table_model()
res = table.connect().run_query().get_last_result()
print res

>>>
connect to DB
run query
Hello

 

That's it. Job done.

14th of August, 2008@2:34:47 PM
add a comment, permanent link to article
[filed under Programming]MySQL max of two columns

How to get the MAX or MIN value of two columns: GREATEST( col_1, col_2 )

Or a more interesting example. I have a client who may have some reports. I need to list the clients in 'most recently active' order. So if they have had a recent action they should be near the top of the list, or if they have recently had a report they should be near the top of the list:

SELECT clients.id, clients.name, clients.date, MAX(r.date), GREATEST(clients.date, IFNULL(MAX(r.date), clients.date)) AS date
FROM clients
LEFT JOIN reports r on r.clients_id=clients.id
GROUP BY clients.id
ORDER BY date DESC

So this uses MAX to get the most recent report (this may return NULL if they have no reports) then I use GREATEST to choose the most recent of the two dates (two columns). Job done.

 

11th of August, 2008@4:54:51 PM
add a comment, permanent link to article
[filed under Programming]since I put

Google analytics, page views from Feb 2007 to July 31 2008:

2,405,706

 

31st of July, 2008@11:29:06 PM
add a comment, permanent link to article
Server Grind [0.3144 seconds]