Hi Sascha,

No problem, and just as a further note, you showed some authorisation code in your example and therefore might be interested in this "Zend_Acl / Zend_Auth example scenario" by Simon Mundy:

http://www.nabble.com/Zend_Acl---Zend_Auth-example-scenario- tf3165728s16154.html

Nick

Hi Nick,

thanks for your quick response!

It looks like I was on the right way for most of my questions but I'm
pretty sure the tutorial you mentioned will give me some additional
insights :-)

Extending the ActionController looks like a good way to manage most
initialization stuff and having the content template should work out
pretty good also. If I encounter any working way to deal with the
dynamic subparts, I'll drop a note of course.

As for the model I'll have a deeper look at Zend_Db_Table because I
simply wasn't aware of this class and the functionality it has. The same applies for the MVC mailinglist by the way. I registered for the general list long time ago and checked only the mails, not the page since then.
Shame on me ;-)

Well then I've got to read and implement a lot of new stuff now :-)

Thanks again and until next time,
yours Sascha

Nick Lo schrieb:
Hi Sascha,

First I create an instance of Zend_View in the FrontController /
Bootstrap file and initialize and register it as follows:

$view = new Zend_View();
$view->setScriptPath(PATH_VIEW);
Zend::register('view', $view);

Then, in the ActionController I use the view via

$view = Zend::registry('view') ;
$view->baseUrl = $this->getRequest()->getBaseUrl();
$this->getResponse()->appendBody($view->render('index.php'));

This works pretty well, but every time I look at the code I have to
think "there must be a better way of doing this". I think the main
problem is the setScriptPath call which has to be made in each
ActionController otherwise.

So far for the first problem: Do you know any better way to use the
Zend_View class? How do you render your content?

Funnily enough I was just discussing many of the things you are asking
in this post on the Zend MVC list and I'll use a few examples here:

http://www.nabble.com/Making-module-dispatcher-a-real-module- dispatcher-tf3160098s16154.html


One thing you could consider that myself and others are doing is to
extend Zend_Controller_Action...

class ApplicationMainController extends Zend_Controller_Action
{
     Gather all your general tools, main view template, auth,
whatever, etc stuff here
}

class SpecificController extends ApplicationMainController
{
     Do your specific stuff here
}

Next is a topic also dealing with Zend_View. As we all know a page
doesn't simply consist of a static frame and some dynamic main content only. So, I'd need a way to render several "blocks" with Zend_View and
compose these into a base template. I had two different approaches:

- Render everything into a big $view->content variable and output
$this->content in the template.

- Setup a $view->contentTemplate variable which indicates which
sub-template to use and set all required data in the main template.

I hope you know what I'm talking about because the code examples for
these points could get pretty long.

Also these approaches don't deal with additional content like dynamic navigation or login/logout in the margins (say non-main-content- area).

Again the question is: How do you handle such rendering in your
applications?

In my main/base controller I have a single method to render what you
call a "static frame"...

public function renderLayout( $layout='layouts/base.html' )
{
    $this->getResponse()
        ->setHeader('Content-Type', 'text/html')
        ->setBody( $this->_view->render( $layout ) );
}

...then in specific controllers that extend the main controller I can
just...

public function someAction()
{
    ...gather all view stuff...
    $this->_view->content = 'directory.html';
    $this->renderLayout( '/layouts/base_directory.html' );
}

...which allows me to have a default layout template and override it
where necessary.

My layout templates look a bit like...

<body>
<div id="container">
    <?php echo $this->render( '/library/header.html') ?>
    <div id="container2">
            <?php echo $this->render( $this->content ); ?>
        <div class="clearboth"></div>
        <?php echo $this->render( '/library/footer.html' ); ?>
    </div>
</div>
</body>

However you are quite right about the widget type bits like dynamic
navigation, e.g. a breadcrumb or login/logout and I've not yet found a
satisfying solution to these. As I see it they are the kind of thing
Zend View Helpers should be there to deal with however if you read this
wishlist post by Ralph Schindler...

http://www.nabble.com/Zend_Controller-wishlist-tf3176985s16154.html

...you'll notice he suggests a need for Zend_Controller_Action_Helper. I don't have an answer here however you'll find that you can cover quite a
few things like getting data for login/logout bits from the base/main
controller I suggest.

Last but not least there's a topic I don't have any idea for: The model.
...

$db->query("SELECT Id FROM User WHERE Password = '$password' AND
Username = '$username'");
...
$db->query("UPDATE Online SET LastAction = NOW() WHERE UserId = $id");

or

$user = $userFactory->getUser($username, $password);
$onlineFactory->getRecord($user->getId())->setLastAction(time())- >save();

Up to the point where it get's really dirty, I'd favor speed for clean
code.

You are kind of asking a bunch of questions in there and I think your
main question is about organising the code. In short I'd put code like the above, eg for simplicity using Zend_Db_Table, into something like...

class User extends Zend_Db_Table
{
}

which would live in models/user.php

...and I'd use it in a controller like so...

$where = $db->quoteInto('age <= ?', '20');
$order = 'first_name';
$count = 10;
$offset = 20;

$user_table = new User;
$users = $user_table->fetchAll($where, $order, $count, $offset);

I'm not specifically suggesting you use Zend_Db_Table or put what looks like authorisation code into a user class but hopefully you can see how
the code can be divided up.

Are there any tutorials or documentations available on how to handle
the model part in a somehow abstract but not completely slow way?

Rob Allen's tutorial is one of the most recent and thorough ZF tutorials
that does include the model part...

http://akrabat.com/zend-framework-tutorial/

At last I'd like to apologize because I'm pretty sure these or similar
questions were already asked and answered in the past, but I simply
can't find some matching documentation. In case you know of any
tutorials or links on the mentioned topics, I'd be glad to hear from
you :-)

No need to apologise, there are plenty of us asking the same questions
including myself. I've only described my perspective on it and am
equally interested in other approaches.

Nick



Reply via email to