2009年6月13日星期六

Re: [fw-db] architect help needed

On Sat, Jun 13, 2009 at 8:32 PM, lcf<lcfsoft@gmail.com> wrote:
>
> Hello.
>
> I'm currently developing an extension for zend framework that helps to
> manage with tree structures in databases. I need a couple advices about my
> architecture. All additional thoughts and ideas are welcome as well.
>
> I have already done an extension that helps to work with Nested Sets trees.
>
> Here are my classes (just to let you imagine my structure):
>
> System_Db_Tree_Nested – main class, that returns Zend_Db_Select objects that
> can be joined with data tables to get data.
>
> System_Db_Tree_Nested_Adapter_Abstract – abstract adapter (adapters are used
> for making db queries)
>
> System_Db_Tree_Nested_Adapter_Interface – interface for adapters (I made it
> public, just in case, you see it here: http://pastie.org/510819
>
> System_Db_Tree_Nested_Adapter_Pdo_Abstract – abstract adapter for pdo
>
> System_Db_Tree_Nested_Adapter_Pdo_Mysql – adapter for pdo_mysql
>
> System_Db_Tree_Nested_Table – descendant of Zend_Db_Table_Abstract
>
> System_Db_Tree_Nested_Table_Row – special row class for usage in tables with
> tree structure. (I made it public too, check it here:
> http://pastie.org/private/lidc63k81n7toscnioog)
>
> System_Db_Tree_Nested_Exception just exception
>
> ***
>
> That's it. The most common way of usage my extension is to create a table
> like this:
>
> <?php
> class System_DbTable_Menu extends System_Db_Tree_Nested_Table
> {
>    /**
>     * Name of the table
>     *
>     * $var string
>     */
>    protected $_name = 'menu_items';
>
>    /**
>     * Nested tree id for the table
>     *
>     * @var integer
>     */
>    protected $_nestedTreeId = null;
>
> }
>
>
> And you can use it like usual Zend_Db_Table object:
>
> $menu = new Menu();
> $menuItem = $menu->fetchRow('id=2');
>
> or use special methods provided by my System_Db_Tree_Nested_Table:
>
> $menuItems = $menu->fetchTree();
> $menuItem = $menu->fetchRow('id=2');
> $menuItem->moveToNext();
> $childrenMenuItems = $menu->fetchDescendants($menuItem);
> $menu->insertChildLast(array('title'=>'text'), $menuItem);
>
> and so on and so on.
>
> That was an introducation.
>
> My question is about returning data. Now, rowset can be like this:
>
> id, title, level
> ================
> 7   text   1
> 3   label  1
> 6   item   2
> 4   check  3
> 5   test   1
>
> i.e we have levels and can build our structure (on the page or somewhere
> else, may be menu or categories tree) with these levels. Like this:
>
> text
> label
> ** item
> **** check
> test
>
> And everything is fine and it works. But I think that it is not very
> universal and fits only for nested sets algorithm. I'm planning to create
> also implementations for adjacent list and materialized path algorithms. And
> I think it is a good idea to universalize returning data. How would you do
> that?
>
> For instance, I was thinking about nested array format alike to one that is
> used in zend navigator.
>
> i.e. :
>
> array (
>        'data' => (some data, may be an array or zend_db_row object)
>        'elements' => 'an array (or may be rowset... o_O) with descendants of this
> element)'
>
> ...
>
> )
>
> What do you think about that approach? I think that usage of
> Zend_Db_Table_Rowset and Zend_Db_Table_Row like descendants to work with my
> tree  items is very comfortable, because I still have all advantages of
> these classes. But I'm not sure that they can be easily used with tree
> structured data.
>
> I have also implemented a function to convert my data (with levels yet) to
> zend_navigator object and I'm finding it very useful. But I'm not sure where
> to put this function. May be, I could make an action helper or something
> like that? How do you think?
>
>
> Thanks.

This is really interesting stuff, and thanks for sharing your progress
with the list. You should most def. sign a CLA and open proposals for
those. :-)

If you don't want to contribute officially, I'd suggest you setup a
repository on github.com or code.google.com. I don't think pastie
keeps these things for forever and it would be a bummer if your work
is lost/not available.

For the Zend_Navigation stuff -- you could offer a method that returns
a ready-made Zend_Navigation object. But I'm not sure, an Action
Helper might be just a nice.

Till

没有评论: