35.4. مساعدات الـ View

داحل أكواد الـ view خاصتك, أحياناً تحتاج إلى تنفيذ بعض العمليات المعقدة بشكل متكرر, مثل : ضبط هيئة التواريخ أو إنشاء عناصر الـ forms أو عرض وصلات تنفيذية, فى مثل هذه الحالات يمكنك أن تستخدم الـ helper classes أو "الـ classes المساعدة" لتنفيذ مثل هذه الأشياء.

لتستخدم مساعد "helper" داخل كود الـ view , إستدعيه بإستخدام ()this->helperName$ (بحيث helperName هو إسم المساعد) , خلف الكواليس سيقوم Zend_View بتحميل الـ class المسمى Zend_View_Helper_HelperName و ينشئ نسخة منه, ثم يقوم بإستدعاء الـ method المسمى ()helperName الخاص به , و ستكون نسخة هذا الكائن مثابرة داخل نسخة الـ Zend_View , و سيتم إعادة إستخدامها فى كل الأستدعائات المستقبلية لـ ()this->helperName$ .

35.4.1. المساعدات الأساسية

يأتى Zend_View مع مجموعة أساسية من الـ classes المساعدة , كلهم لهم علاقة بعملية إنشاء عناصر الـ forms , و كل منهم يقوم بعملية تجاهل المخرجات تلقائياً, و هم :

  •                     formButton($name, $value, $attribs)
                    

    ينشئ input من النوع button.

  •                     formCheckbox($name, $value, $attribs, $options)
                    

    ينشئ عنصر input من النوع checkbox , و البراميتر options$ هو عبارة عن مصفوفة بحيث أن أول قيمة فيها هى التى سيتم وضع علامة الأختيار عندها "checked", و الثانية هى القيمة التى لم يتم اختيارها "unchecked" (القيم الأساسية هى '1' و '0' ) , إن كانت value$ تتطابق مع القيمة الـ checked , سيتم وضع علامة الأختيار لك.

  •                     formFile($name, $value, $attribs)
                    

    ينشى عنصر input من النوع file .

  •                     formHidden($name, $value, $attribs)
                    

    ينشى عنصر input من النوع hidden .

  •                     formPassword($name, $value, $attribs)
                    

    ينشى عنصر input من النوع password .

  •                     formRadio($name, $value, $attribs, $options)
                    

    ينشئ سلسلة من عناصر input من النوع radio , واحد لكل عنصر فى options$, فى المصفوفة options$ , الـ key لكل عنصر سيكون قيمة عنصر الـ radio , و الـ value للعنصر ستكون الـ label (الأسم الذى سيظهر للمستخدم) الخاص بالـ radio.

  •                     formReset($name, $value, $attribs)
                    

    ينشى عنصر input من النوع reset .

  •                     formSelect($name, $value, $attribs, $options)
                    

    ينشئ بلوك من العنصر select , مع إنشاء عنصر option واحد لكل عنصر فى البراميتر options$ , فى المصفوفة options$ , الـ key الخاص بالعنصر هو قيمة عنصر الـ option , أما الـ value ستكون الـ label (الأسم الذى سيظهر للمستخدم) الخاص بعنصر الـ option .

  •                     formSubmit($name, $value, $attribs)
                    

    ينشى عنصر input من النوع submit .

  •                     formText($name, $value, $attribs)
                    

    ينشى عنصر input من النوع text .

  •                     formTextarea($name, $value, $attribs)
                    

    ينشئ عنصر textarea .

إستخدام هذه الأشياء داخل كود الـ view خاصتك سهل جداً, و هنا مثال على ذلك, لاحظ أن كل ما تحتاج أن تقوم به هو أن تستدعيهم, و هم سيتم تحميلهم و سيقوموا بإنشاء نسخ من انفسهم كلما ظهرت حاجة إليهم.

<?php
// inside your view script, $this refers to the Zend_View instance.
// 
// say that you have already assigned a series of select options under
// the name $countries as array('us' => 'United States', 'eg' =>
// 'Egypt', 'de' => 'Germany').
?>
<form action="action.php" method="post">
    <p><label>Your Email:
        <?php echo $this->formText('email', 'you@example.com', array('size' => 32)) ?>
    </label></p>
    <p><label>Your Country:
        <?php echo $this->formSelect('country', 'eg', null, $this->countries) ?>
    </label></p>
    <p><label>Would you like to opt in?
        <?php echo $this->formCheckbox('opt_in', 'yes', null, array('yes', 'no')) ?>
    </label></p>
</form>
        

الخرج الذى سينتج من كود الـ view هذا , ربما سيبدوا بهذا الشكل:

<form action="action.php" method="post">
    <p><label>Your Email:
        <input type="text" name="email" value="you@example.com" size="32" />
    </label></p>
    <p><label>Your Country:
        <select name="country">
            <option value="us" selected="selected">United States</option>
            <option value="eg">Egypt</option>
            <option value="de">Germany</option>
        </select>
    </label></p>
    <p><label>Would you like to opt in?
        <input type="hidden" name="opt_in" value="no" />
        <input type="checkbox" name="opt_in" value="yes" checked="checked" />
    </label></p>
</form>
        

35.4.2. مسارات المساعدات

مثل ملفات الـ view , يمكن للـ controller أن يحدد مرصوصة من المسارات لـ Zend_View لتبحث فيها عن الـ helper classes , الأعدادات الأساسية لـ Zend_View تبحث فى "*/Zend/View/Helper" عن الـ helper classes , يمكنك إخبار Zend_View أن تبحث فى أماكن أخرى بإستخدام ()setHelperPath أو ()addHelperPath .

<?php
$view = new Zend_View();
$view->setHelperPath('/path/to/more/helpers');
?>
        

فى الحقيقة, يمكنك عمل مرصوصة من المسارات بإستخدام الـ method المسمى ()addScriptPath , كلما قمت بإضافة مسار جديد إلى المرصوصة , سيقوم Zend_View بالبحث فى المسارات التى تم إضافتها إلى المرصوصة من أخر واحد تم إضافته إلى المرصوصة صعوداً إلى أول من تم إضافته لجلب الـ helper classes . هذا يسمح لك بأن تضيف (أو حتى أن تقوم بالتغطية ) على مجموعة المساعدات الأساسية بـ helpers جديدة.

<?php
$view = new Zend_View();
$view->addHelperPath('/path/to/some/helpers');
$view->addHelperPath('/other/path/to/helpers');

// now when you call $this->helperName(), Zend_View will look first for
// "/other/path/to/helpers/HelperName.php", then for
// "/path/to/some/helpers/HelperName", and finally for
// "Zend/View/Helpers/HelperName.php".
?>
        

35.4.3. كتابة مساعداتك الخاصة

عملية كتابة مساعد خاص تعتبر سهلة جدا, فقط أتبع هذه القواعد:

  • أسم الـ class يجب أن يكون *_Zend_View_Helper , بحيث أن * هى أسم الـ helper نفسه, على سبيل المثال : إن كنت تكتب helper يسمى "specialPurpose" , أسم الـ class يجب أن يكون Zend_View_Helper_SpecialPurpose . (لاحظ عملية تكبير الحروف "capitalization")

  • هذا الـ class يجب أن يملك public method يتطابق مع أسم الـ helper , هذا الـ method سيتم إستدعائه عندما سيقوم الـ view بإستدعاء ()this->specialPurpose$ , فى مثالنا هذا لإنشاء المساعد "specialPurpose", الـ method الذى نحتاج إلى التصريح به سيكون "()public function specialPurpose".

  • عامتاً , الـ class يجب ألا يقوم بطباعة أو إخراج أى شئ إلى المتصفح , بل يجب أن يعيد "return" البيانات التى بحاجة إلى الطباعة , و هذه البيانات المرجعة يجب أن يكون قد تم تنفيذ تجاهل "escaping" للقيم الأتية من متغيرات بها .

  • الـ class يجب أن يكون فى ملف مسمى تبعاً لأسم الـ method , أى كما فى مثالنا السابق , المساعد "specialPurpose" يجب أن يكون فى ملف يسمى "SpecialPurpose.php".

ضع ملف الـ helper class تحت أى من المسارات الموجودة فى مرصوصة المسارات خاصتك, و سيقوم Zend_View تلقائياً بتحميله و إنشاء نسخة منه و مثابرته و تنفيذه لك.

هنا مثال على كود المساعد SpecialPurpose خاصتنا :

<?php
class Zend_View_Helper_SpecialPurpose {
    protected $_count = 0;
    public function specialPurpose()
    {
        $this->_count++;
        $output = "I have seen 'The Jerk' {$this->_count} time(s).";
        return htmlspecialchars($output);
    }
}
?>
        

بعدها فى كود الـ view , يمكنك أن تستدعى المساعد SpecialPurpose أى عدد من المرات تريده, حيث سيتم إنشاء نسخة منه مرة واحدة فقط , و بعدها سيثابر طوال فترة حياة هذه النسخة من Zend_View.

<?php
// remember, in a view script, $this refers to the Zend_View instance.
echo $this->specialPurpose();
echo $this->specialPurpose();
echo $this->specialPurpose();
?>
        

الخرج سيكون مثل هذا :

I have seen 'The Jerk' 1 time(s).
I have seen 'The Jerk' 2 time(s).
I have seen 'The Jerk' 3 time(s).