41.3. ºä½ºÅ©¸³Æ®

ÄÜÆ®·Ñ·¯°¡ º¯¼ö¸¦ ´ëÀÔÇØ render() (À»)¸¦ ÄÝ Çϸé, ÁöÁ¤µÈ ºä½ºÅ©¸³Æ®¸¦ Zend_View ÇÏÁö¸¸ Àоîµé¿©,Zend_View ÀνºÅϽºÀÇ ½ºÄÚÇÁ·Î ±×°ÍÀ» ½ÇÇàÇÕ´Ï´Ù.µû¶ó¼­, ºä½ºÅ©¸³Æ® Áß(¾È)¿¡¼­ $this (À»)¸¦ ÂüÁ¶Çϸé, ½ÇÁ¦·Î´Â Zend_View ÀÇ ÀνºÅϽº¸¦ °¡¸®Å°°Ô µË´Ï´Ù.

ÄÜÆ®·Ñ·¯·ÎºÎÅÍ ºä¿¡ ´ëÀÔµÈ º¯¼ö´Â, ºäÀνºÅº½ºÀÇ ÇÁ·ÓÆÛƼ·Î¼­ ÂüÁ¶ÇÒ ¼ö ÀÖ½À´Ï´Ù.¿¹¸¦ µé¸é, ÄÜÆ®·Ñ·¯·Î º¯¼ö 'something' (À»)¸¦ ´ëÀÔÇß´Ù°í Çϸé, ºä½ºÅ©¸³Æ®³»¿¡¼­´Â ±×°ÍÀ» $this->something ±×¸®°í ÃëµæÇÒ ¼ö ÀÖ½À´Ï´Ù (À̰Ϳ¡ ÀÇÇØ, ¾î´À °ªÀÌ ÄÜÆ®·Ñ·¯·ÎºÎÅÍ ´ëÀÔµÈ °ÍÀ¸·Î, ¾î´À °ªÀÌ ½ºÅ©¸³Æ® ³»ºÎ¿¡¼­ ÀÛ¼ºµÈ °ÍÀΰ¡¸¦ µÚÂÑÀ» ¼ö ÀÖ°Ô µË´Ï´Ù).

Zend_View ÀÇ µµÀÔÀÇ ºÎºÐ¿¡¼­ ³ªÅ¸³» º¸ÀÎ ºä½ºÅ©¸³Æ®ÀÇ ¿¹¸¦ »ý°¢ÇØ ³» º¾½Ã´Ù.


<?php if ($this->books): ?>

    <!-- Ã¥ÀÇ À϶÷ -->
    <table>
        <tr>
            <th>ÀúÀÚ</th>
            <th>ŸÀÌÆ²</th>
        </tr>

        <?php foreach ($this->books as $key => $val): ?>
        <tr>
            <td><?php echo $this->escape($val['author']) ?></td>
            <td><?php echo $this->escape($val['title']) ?></td>
        </tr>
        <?php endforeach; ?>

    </table>

<?php else: ?>

    <p>Ç¥½ÃÇϴ åÀÌ ¾ø½À´Ï´Ù.</p>

<?php endif;

41.3.1. Ãâ·ÂÀÇ À̽ºÄÉÀÌÇÁ

ºä½ºÅ©¸³Æ®·Î ½Ç½ÃÇØ¾ß ÇÒ ÀÏÀÇ ÃÄ °¡Àå Áß¿äÇÏÁö¸¸ Çϳª´Â, Ãâ·ÂÀ» ÀûÀýÈ÷ À̽ºÄÉÀÌÇÁ ÇÏ´Â °ÍÀÔ´Ï´Ù.À̰ÍÀº, Å©·Î½º »çÀÌÆ® ½ºÅ©¸³ÆÃ °ø°ÝÀ» ¸·´Â °ÍÀ» µ½½À´Ï´Ù. ±×°Í ÀÚ½ÅÀÌ À̽ºÄÉÀÌÇÁ¸¦ ½Ç½ÃÇØ ÁÖ´Â ÇÔ¼ö, ¸Þ¼Òµå, ȤÀº ÇïÆÛ¸¦ »ç¿ëÇϰí ÀÖÀ¸¹Ç·Î ¾ÊÀº ÇÑ, º¯¼ö¸¦ Ãâ·ÂÇÒ ¶§ Ç×»ó ±×°ÍÀ» À̽ºÄÉÀÌÇÁ ÇÏÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù.

Zend_View ÀÇ escape() ±×·¸´Ù°í ÇÏ´Â ¸Þ¼Òµå°¡, ÀÌ À̽ºÄÉÀÌÇÁ¸¦ ½Ç½ÃÇÕ´Ï´Ù.


<?php
// ºä½ºÅ©¸³Æ®°¡ ³ª»Û ¿¹
echo $this->variable;

// ºä½ºÅ©¸³Æ®°¡ ÁÁÀº ¿¹
echo $this->escape($this->variable);

µðÆúÆ®¿¡¼­´Â,escape() ¸Þ¼Òµå´Â PHP ÀÇ htmlspecialchars() ÇÔ¼ö·Î À̽ºÄÉÀÌÇÁ¸¦ ½Ç½ÃÇÕ´Ï´Ù.±×·¯³ª ȯ°æ¿¡ µû¶ó¼­´Â, ´Ù¸¥ ¹æ¹ýÀ¸·Î À̽ºÄÉÀÌÇÁ ÇÏ°í ½Í¾îÁö±âµµ ÇϰÚÁö¿ä. ÄÜÆ®·Ñ·¯·ÎºÎÅÍ setEscape() ¸Þ¼Òµå¸¦ ½ÇÇàÇÏ´Â °ÍÀ¸·Î, À̽ºÄÉÀÌÇÁ¿¡ »ç¿ëÇÏ´Â ÄݹéÀ» Zend_View ¿¡ ÅëÁöÇÒ ¼ö ÀÖ½À´Ï´Ù.


<?php
// Zend_View ÀÇ ÀνºÅϽº¸¦ ÀÛ¼ºÇÕ´Ï´Ù
$view = new Zend_View();

// À̽ºÄÉÀÌÇÁ¿¡ htmlentities (À»)¸¦ »ç¿ëÇϵµ·Ï(µíÀÌ) ÅëÁöÇÕ´Ï´Ù
$view->setEscape('htmlentities');

// È¤Àº, Ŭ·¡½ºÀÇ Á¤Àû ¸Þ¼Òµå¸¦ »ç¿ëÇϵµ·Ï(µíÀÌ) ÅëÁöÇÕ´Ï´Ù
$view->setEscape(array('SomeClass''methodName'));

// È¤Àº, ÀνºÅϽº ¸Þ¼Òµå¸¦ ÁöÁ¤ÇÒ ¼öµµ ÀÖ½À´Ï´Ù
$obj = new SomeClass();
$view->setEscape(array($obj'methodName'));

// ±×¸®°í, ºä¸¦ ·»´õ¸µ ÇÕ´Ï´Ù
echo $view->render(...);

Äݹé ÇÔ¼ö ȤÀº ¸Þ¼Òµå´Â, À̽ºÄÉÀÌÇÁ ÇÏ´Â °ªÀ» ÃÖÃÊÀÇ ÆÄ¶ó¹ÌÅͷμ­ ¹Þ½À´Ï´Ù. ±× ÀÌ¿ÜÀÇ ÆÄ¶ó¹ÌÅÍ´Â ¿É¼ÇÀÌ µË´Ï´Ù.

41.3.2. ´Ù¸¥ ÅÛÇø´ ½Ã½ºÅÛÀÇ »ç¿ë

PHP Àڽŵµ °­·ÂÇÑ ÅÛÇø´ ½Ã½ºÅÛÀÔ´Ï´Ù¸¸, °³¹ßÀÚÀÇ »ó´ç¼ö´Â, µ¥ÀÚÀ̳ª¿¡ À־´Â °í±â´É Áö³ª´Ù/³Ê¹« º¹ÀâÇÏ´Ù (ÀÌ)¶ó°í ´À³¢°í ÀÖ¾î ´Ù¸¥ ÅÛÇø´ ¿£ÁøÀ» °®°í ½Í¾îÇÏ´Â °Í °°½À´Ï´Ù. Zend_View ±×·³, ±×·¯ÇÑ ¸ñÀûÀ» À§Çؼ­ 2Á¾·ùÀÇ ±¸Á¶¸¦ Á¦°øÇÕ´Ï´Ù. ºä½ºÅ©¸³Æ®¸¦ »ç¿ëÇÏ´Â °Í¿¡ ÀÇÇÏ´Â °Í°ú Zend_View_Interface ½ÇÀåÇÏ´Â °Í¿¡ ÀÇÇÏ´Â °ÍÀÔ´Ï´Ù.

41.3.2.1. ºä½ºÅ©¸³Æ®¸¦ »ç¿ëÇÑ ÅÛÇø´ ½Ã½ºÅÛ

ºä½ºÅ©¸³Æ®¸¦ »ç¿ëÇϰí,PHPLIB Çü½ÄÀÇ ÅÛÇø´°ú °°Àº ´Ù¸¥ ÅÛÇø´ ¿ÀºêÁ§Æ®ÀÇ ÀνºÅϽº¸¦ ÀÛ¼ºÇØ, ±×°ÍÀ» Á¶ÀÛÇÒ ¼ö ÀÖ½À´Ï´Ù.ºä½ºÅ©¸³Æ®¸¦ ÀÌ¿Í °°ÀÌ »ç¿ëÇÏ´Â ¹æ¹ýÀº, ÀÌÇÏ¿Í °°ÀÌ µË´Ï´Ù.


<?php
include_once 'template.inc';
$tpl = new Template();

if (
$this->books) {
    
$tpl->setFile(array(
        
"booklist" => "booklist.tpl",
        
"eachbook" => "eachbook.tpl",
    ));

    foreach (
$this->books as $key => $val) {
        
$tpl->set_var('author'$this->escape($val['author']);
        
$tpl->set_var('title'$this->escape($val['title']);
        
$tpl->parse("books""eachbook"true);
    }

    
$tpl->pparse("output""booklist");
} else {
    
$tpl->setFile("nobooks""nobooks.tpl")
    
$tpl->pparse("output""nobooks");
}

°ü·ÃÇÏ´Â ÅÛÇø´ ÆÄÀÏÀº, ÀÌ¿Í °°ÀÌ µË´Ï´Ù.


<!-- booklist.tpl -->
<table>
    <tr>
        <th>ÀúÀÚ</th>
        <th>ŸÀÌÆ²</th>
    </tr>
    {books}
</table>

<!-- eachbook.tpl -->
    <tr>
        <td>{author}</td>
        <td>{title}</td>
    </tr>

<!-- nobooks.tpl -->
<p>Ç¥½ÃÇϴ åÀÌ ¾ø½À´Ï´Ù.</p>

41.3.2.2. Zend_View_Interface (À»)¸¦ »ç¿ëÇÑ ÅÛÇø´

Zend_View ȣȯÀÇ ÅÛÇø´ ¿£ÁøÀ» »ç¿ëÇÏ´Â ÆíÀÌ °£´ÜÇÏ´Ù°í ÇÏ´Â »ç¶÷µµ ÀÖ°ÚÁö¿ä. Zend_View_Interface ±×·³, ȣȯ¼ºÀ» À¯ÁöÇϱâ À§Çؼ­ ÃÖÀúÇÑ ÇÊ¿äÇÑ ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇϰí ÀÖ½À´Ï´Ù.


/**
 * ÅÛÇø´ ¿£Áø ¿ÀºêÁ§Æ®¸¦ µ¹·ÁÁÝ´Ï´Ù
 */
public function getEngine();

/**
 * ºä½ºÅ©¸³Æ®/ÅÛÇø´¿¡ÀÇ ÆÐ½º¸¦ ¼³Á¤ÇÕ´Ï´Ù
 */
public function setScriptPath($path);

/**
 * ¸ðµç ºä¸®¼Ò½º¿¡ÀÇ º£À̽º ÆÐ½º¸¦ ¼³Á¤ÇÕ´Ï´Ù
 */
public function setBasePath($path, $prefix = 'Zend_View');

/**
 * ºä¸®¼Ò½º¿¡ÀÇ º£À̽º ÆÐ½º¸¦ Ãß°¡ÇÕ´Ï´Ù
 */
public function addBasePath($path, $prefix = 'Zend_View');

/**
 * ÇöÀçÀÇ ½ºÅ©¸³Æ®ÀÇ ÆÐ½º¸¦ ÃëµæÇÕ´Ï´Ù
 */
public function getScriptPaths();

/**
 * ÅÛÇø´ º¯¼ö¸¦ ¿ÀºêÁ§Æ®ÀÇ ÇÁ·ÓÆÛƼ·Î¼­ ´ëÀÔÇϱâ À§ÇÑ overload ¸Þ¼Òµå
 */
public function __set($key, $value);
public function __get($key);
public function __isset($key);
public function __unset($key);

/**
 * ÅÛÇø´ º¯¼ö¸¦ ¼öµ¿À¸·Î ´ëÀÔÇϰųª º¹¼öÀÇ º¯¼ö¸¦
 * Àϰý ¼³Á¤Çϰųª ÇÕ´Ï´Ù
 */
public function assign($spec, $value = null);

/**
 * ´ëÀÔ ³¡³­ ÅÛÇø´ º¯¼ö¸¦ »èÁ¦ÇÕ´Ï´Ù
 */
public function clearVars();

/**
 * $name ±×·¸´Ù°í ÇÏ´Â ÅÛÇø´À» ·»´õ¸µ ÇÕ´Ï´Ù
 */
public function render($name);

ÀÌ ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇϸé, ½áµåÆÄƼÀÇ ÅÛÇø´ ¿£ÁøÀ» ·¦ ÇØ Zend_View ȣȯÀÇ Å¬·¡½º¸¦ ÀÛ¼ºÇÏ´Â °ÍÀÌ °£´ÜÇÏ°Ô µË´Ï´Ù. ¿¹·Î¼­Smarty ¿ë¹«ÀÇ ·¡ÆÛ´Â ÀÌ¿Í °°ÀÌ µË´Ï´Ù.


require_once 'Zend/View/Interface.php';
require_once 'Smarty.class.php';

class Zend_View_Smarty implements Zend_View_Interface
{
    /**
     * Smarty object
     * @var Smarty
     */
    protected $_smarty;

    /**
     * constructor¡¡ ¡¡
     *
     * @param string $tmplPath
     * @param array $extraParams
     * @return void
     */
    public function __construct($tmplPath = null, $extraParams = array())
    {
        $this->_smarty = new Smarty;

        if (null !== $tmplPath) {
            $this->setScriptPath($tmplPath);
        }

        foreach ($extraParams as $key => $value) {
            $this->_smarty->$key = $value;
        }
    }

    /**
     * ÅÛÇø´ ¿£Áø ¿ÀºêÁ§Æ®¸¦ µ¹·ÁÁÝ´Ï´Ù
     *
     * @return Smarty
     */
    public function getEngine()
    {
        return $this->_smarty;
    }

    /**
     * ÅÛÇø´¿¡ÀÇ ÆÐ½º¸¦ ¼³Á¤ÇÕ´Ï´Ù
     *
     * @param string $path ÆÐ½º·Î ÇØ¼­ ¼³Á¤ÇÏ´Â µð·ºÅ丮
     * @return void
     */
    public function setScriptPath($path)
    {
        if (is_readable($path)) {
            $this->_smarty->template_dir = $path;
            return;
        }

        throw new Exception('¹«È¿ÀÎ ÆÐ½º°¡ ÁöÁ¤µÇ¾ú½À´Ï´Ù');
    }

    /**
     * ÇöÀçÀÇ ÅÛÇø´ µð·ºÅ丮¸¦ ÃëµæÇÕ´Ï´Ù
     *
     * @return string
     */
    public function getScriptPaths()
    {
        return array($this->_smarty->template_dir);
    }

    /**
     * setScriptPath ¿¡ÀÇ ¾Ù¸®¾î½º(alias)
     *
     * @param string $path
     * @param string $prefix Unused
     * @return void
     */
    public function setBasePath($path, $prefix = 'Zend_View')
    {
        return $this->setScriptPath($path);
    }

    /**
     * setScriptPath ¿¡ÀÇ ¾Ù¸®¾î½º(alias)
     *
     * @param string $path
     * @param string $prefix Unused
     * @return void
     */
    public function addBasePath($path, $prefix = 'Zend_View')
    {
        return $this->setScriptPath($path);
    }

    /**
     * º¯¼ö¸¦ ÅÛÇø´¿¡ ´ëÀÔÇÕ´Ï´Ù
     *
     * @param string $key º¯¼ö¸í
     * @param mixed $val º¯¼öÀÇ °ª
     * @return void
     */
    public function __set($key, $val)
    {
        $this->_smarty->assign($key, $val);
    }

    /**
     * ´ëÀÔµÈ º¯¼ö¸¦ ÃëµæÇÕ´Ï´Ù
     *
     * @param string $key º¯¼ö¸í
     * @return mixed º¯¼öÀÇ °ª
     */
    public function __get($key)
    {
        return $this->_smarty->get_template_vars($key);
    }

    /**
     * empty() (ÀÌ)³ª isset() ÀÇ Å×½ºÆ®°¡ µ¿ÀÛÇϵµ·Ï(µíÀÌ) ÇÕ´Ï´Ù
     *
     * @param string $key
     * @return boolean
     */
    public function __isset($key)
    {
        return (null !== $this->_smarty->get_template_vars($key));
    }

    /**
     * ¿ÀºêÁ§Æ®ÀÇ ÇÁ·ÓÆÛƼ¿¡ ´ëÇØ¼­ unset() ÇÏÁö¸¸ µ¿ÀÛÇϵµ·Ï(µíÀÌ) ÇÕ´Ï´Ù
     *
     * @param string $key
     * @return void
     */
    public function __unset($key)
    {
        $this->_smarty->clear_assign($key);
    }

    /**
     * º¯¼ö¸¦ ÅÛÇø´¿¡ ´ëÀÔÇÕ´Ï´Ù
     *
     * ÁöÁ¤ÇÑ Å°¸¦ ÁöÁ¤ÇÑ °ªÀ¸·Î ¼³Á¤ÇÕ´Ï´Ù.ȤÀº,
     * Å° => Ä¡ Çü½ÄÀÇ ¹è¿­·Î Àϰý ¼³Á¤ÇÕ´Ï´Ù
     *
     * @see __set()
     * @param string|array $spec »ç¿ëÇÏ´Â ´ëÀÔ ¹æ½Ä (Ű, ȤÀº Å° => Ä¡ ÀÇ ¹è¿­)
     * @param mixed $value (¿É¼Ç) À̸§À» ÁöÁ¤ÇØ ´ëÀÔÇÏ´Â °æ¿ì´Â, ¿©±â¼­ °ªÀ» ÁöÁ¤ÇÕ´Ï´Ù
     * @return void
     */
    public function assign($spec, $value = null)
    {
        if (is_array($spec)) {
            $this->_smarty->assign($spec);
            return;
        }

        $this->_smarty->assign($spec, $value);
    }

    /**
     * ´ëÀÔ ³¡³­ ¸ðµç º¯¼ö¸¦ »èÁ¦ÇÕ´Ï´Ù
     *
     * Zend_View ¿¡ {@link assign()} (ÀÌ)³ª ÇÁ·ÓÆÛƼ
     * ({@link __get()}/{@link __set()}) ±×¸®°í ´ëÀÔµÈ º¯¼ö¸¦ ¸ðµÎ »èÁ¦ÇÕ´Ï´Ù
     *
     * @return void
     */
    public function clearVars()
    {
        $this->_smarty->clear_all_assign();
    }

    /**
     * ÅÛÇø´À» ó¸®ÇØ, °á°ú¸¦ Ãâ·ÂÇÕ´Ï´Ù
     *
     * @param string $name Ã³¸®ÇÏ´Â ÅÛÇø´
     * @return string Ãâ·Â °á°ú
     */
    public function render($name)
    {
        return $this->_smarty->fetch($name);
    }
}

ÀÌ ¿¹¿¡¼­´Â,Zend_View (Àº)´Â ¾Æ´Ï°í Zend_View_Smarty Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ÀÛ¼ºÇØ, ±×°ÍÀ» »ç¿ëÇØ Zend_View (¿Í)°ú °°Àº ÀÏÀ» Çϰí ÀÖ½À´Ï´Ù.


$view = new Zend_View_Smarty();
$view->setScriptPath('/path/to/templates');
$view->book = 'Zend PHP 5 Certification Study Guide';
$view->author = 'Davey Shafik and Ben Ramsey'
$rendered = $view->render('bookinfo.tpl');