[prev in list] [next in list] [prev in thread] [next in thread] 

List:       smarty-dev
Subject:    Re: [SMARTY-DEV] another way to handle objects
From:       M Mohr <messju () lammfellpuschen ! de>
Date:       2002-12-25 12:43:21
[Download RAW message or body]

Hello,

On Tue, Dec 24, 2002 at 09:41:00AM -0600, Monte Ohrt wrote:
> This had to have been thought of already, so I'll throw it out there
> (again?) and see what reaction we get...
> 
> Currently, we are looking at supporting this kind of syntax for objects:
> 
> {$myobj->get_headline($foo,$smarty.const._MY_CONST)}
> 
> Instead of supporting a new syntax, why not use the exisiting template
> syntax and access them through a template function?
> 
> example:
> 
> {object name="myobj" method="get_headline" p1=$foo
> p2=$smarty.const._MY_CONST}
> 
> This way we aren't polluting Smarty with new syntax support, we don't
> have to make special parsing logic for the parameters, and we are only
> adding a plugin. The only downside I see is that the syntax is a little
> wordier to work with, but it works all the same. I'm not sure of the
> best way to handle parameters since you have to name them. I just used
> p1, p2, etc. There are probably other ways to simplify the syntax, maybe
> something like:
> 
> {object name="myobj->get_headline" parameters="\$foo, \$bar,
> \$smarty.const._MY_CONST"}
> 
> The CVS version of Smarty supports applying modifiers to function output
> so you can do this:
> 
> {object|upper name="myobj" ...}
> 
> 
> Thoughts?

What about something like this?

---
<?php

/* $Id$ */
/*
 * Smarty plugin
 * -------------------------------------------------------------
 * File:        compiler.object.php
 * Type:        compiler
 * Name:        object
 * Purpose:     generate code that calls an object-method with
 *              additional params
 * Limitations: methods have to be defined as 
 *              method(array $params, object &$smarty)
 *              just like plugin-functions
 * Example:     {object $myobj->get_header foo=$foo bar="bar"}
 * -------------------------------------------------------------
 */
function smarty_compiler_object($tag_arg, &$smarty) {
   list($call_str, $params_str) = split(' ', $tag_arg, 2);
   if (isset($params_str)) {
      $params = '';
      foreach ($smarty->_parse_attrs($params_str) as $key=>$value) {
         if (strlen($params)>0) $params .= ', ';
         $params .= '"'.$key.'"=>'.$value;
      }
   }

   if (preg_match('[(.*)->(.*)]', $call_str, $match)) {
      $code = $smarty->_parse_var($match[1]).'->'.$match[2].'(';
      $code .= 'array('.$params.'), $this);';
   }
   return $code;

}


/*
 * Local variables:
 * c-indentation-style: bsd
 * c-basic-offset: 3
 * indent-tabs-mode: nil
 * End:
 *
 * vim: expandtab shiftwidth=3:
 */

?>
---

it is just a test and needs robust error-handling.

and okay, you cannot call arbitrary methods, but this could be done
with slight modifications. i don't think it would be right to do this,
since it gives a little bit too much power to the template and makes
it very easy to wire application-logic into the template. but that is
just my opinion

btw: merry christmas to everybody on the list, and thank you for such
a great tool smarty is. i love to use it for private purposes and at
work. go on with it ! :)

messju

> Monte
> 
> 
> -- 
> Monte Ohrt <monte@ispi.net>

-- 
Smarty Development Mailing List (http://smarty.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic