<sect1 id="zend.view.scripts">

    <title>جزء الـ View</title>

    <para>
        بمجرد إنتهاء الـ controller خاصتك من عملية نَسب المتغيرات إلى نسخة Zend_View
        و إستدعاء ()render , يقوم Zend_View بجلب محتويات ملف الـ view و ينفذها داخل
        المدى "scope" الخاص بنسخة الـ Zend_View , لذلك داخل أكواد الـ view خاصتك
        تكون this$ تشير إلى نسخة الـ Zend_View نفسها .
    </para>

    <para>
        المتغيرات التى تم نسبها إلى الـ view من قبل الـ controller يتم الإشارة إليها على انها instance properties
        (أى properties تنتمى للنسخة فقط) , على سبيل المثال : إن قام الـ controller بنسب متغير بأسم
        'something' , يمكنك الأشار إليه داخل كود الـ view كـ this->something$ ,
        (هذا يسمح لك بمعرفة أى المتغيرات تم نسبها إلى النسخة و أى المتغيرات داخلية فى كود الـ view نفسه).
    </para>

    <para>
        لنتذكر من جديد, ها هو مثال كود الـ view من فصل "مقدمة الـ Zend_view" .
    </para>

    <programlisting role="php"><![CDATA[<?php if ($this->books): ?>

    <!-- A table of some books. -->
    <table>
        <tr>
            <th>Author</th>
            <th>Title</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>There are no books to display.</p>

<?php endif; ?>]]>
    </programlisting>

    <sect2 id="zend.view.scripts.escaping">

        <title>تجاهل "escaping" المخرجات</title>

        <para>
            واحدة من أهم المهام التى يجب تنفيذها فى كود الـ view هى أن تتأكد من أن المخرجات قد تم
            عمل تجاهل لها أو escaping دائماً , و هذا أهم من أشياء كثيرة أخرى , هذا يساعد فى تجنب
            هجمات الـ cross-site scripting , فإن لم تكن تستخدم دالة أو method أو مساعد "helper"
            يقوم بعملية التجاهل "escaping" بنفسه , فيجب عليك أنت أن تقوم بعمل تجاهل لمحتويات متغيراتك
            قبل إخراجهم دائماً .
        </para>

        <para>
            Zend_View يأتى مع method يسمى ()escape و هو الذى يقوم لك بعملية التجاهل للمخرجات.
        </para>

        <programlisting role="php"><![CDATA[<?php
// bad view-script practice:
echo $this->variable;

// good view-script practice:
echo $this->escape($this->variable);
?>]]>
        </programlisting>

        <para>
            الأعدادات الأساسية للـ method المسمى ()escape هى أن يعتمد على دالة لغة PHP المسمى
            ()htmlspecialchars لعمل تجاهل , لكن إعتماداً على بيئة عمل تطبيقك , ربما تود أن تتم عملية
            التجاهل للمخرجات بطريقة أخرى , إستخدم الـ method المسمى ()setEscape و أنت فى مستوى
            الـ controller لتخبر Zend_View عن ما الذى يجب إستدعائه (callback) عند تنفيذ عملية
             تجاهل المخرجات.
        </para>

        <programlisting role="php"><![CDATA[<?php
// create a Zend_View instance
$view = new Zend_View();

// tell it to use htmlentities as the escaping callback
$view->setEscape('htmlentities');

// or tell it to use a static class method as the callback
$view->setEscape(array('SomeClass', 'methodName'));

// or even an instance method
$obj = new SomeClass();
$view->setEscape(array($obj, 'methodName'));

// and then render your view
echo $view->render(...);
?>]]>
        </programlisting>

        <para>
            الدالة أو الـ method الذى سيتم عمل callback له يجب أن يستلم القيمة التى سيقوم بتجاهلها
            فى البراميتر الأول , و كل البراميترات الأخرى يجب أن تكون أختيارية.
        </para>

    </sect2>

    <sect2 id="zend.view.scripts.templates">

        <title>أنظمة القوالب</title>

        <para>
            أيضاً لغة PHP نفسها عبارة عن نظام قوالب قوى, لكن بعض المطورين يرى
            أنها قوية جدا أو معقدة بالنسبة إلى المصممين الذين سيستخدمون القوالب.
            لذلك , كود الـ view من الممكن إستخدامه لإنشاء نسخ أو معالجة
            كائنات قوالب منفصلة , مثل قوالب PHPLIB-style , كود الـ view
            لهذا النوع من النشاطات من الممكن أن بيدو مثل هذا :
        </para>

        <programlisting role="php"><![CDATA[<?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");
}
?>]]>
        </programlisting>

        <para>
            و هذه هى الملفات الأخرى ذات الصلة المفروض وجودها :
        </para>

        <programlisting role="html"><![CDATA[
<!-- booklist.tpl -->
<table>
    <tr>
        <th>Author</th>
        <th>Title</th>
    </tr>
    {books}
</table>

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

<!-- nobooks.tpl -->
<p>There are no books to display.</p>
]]>
        </programlisting>

    </sect2>

</sect1>
<!--
vim:se ts=4 sw=4 et:
-->