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