العرض

webman默认 تستخدم لغة php الأصلية كقالب، وبتفعيل opcache تحقق أفضل أداء. بالإضافة إلى قالب php الأصلي، يوفر webman أيضًا محركات القوالب Twig، Blade، و think-template.

تفعيل opcache

عند استخدام العرض، يُوصى بشدة بتفعيل خياري opcache.enable و opcache.enable_cli في ملف php.ini لضمان تحقيق أفضل أداء لمحركات القوالب.

تثبيت Twig

  1. تثبيت عبر composer

composer require twig/twig

  1. تعديل الإعدادات config/view.php لتصبح
    
    <?php
    use support\view\Twig;

return [
'handler' => Twig::class
];

> **تنبيه**
> يمكن تمرير خيارات إعداد أخرى عبر `options`، مثل

```php
return [
    'handler' => Twig::class,
    'options' => [
        'debug' => false,
        'charset' => 'utf-8'
    ]
];

تثبيت Blade

  1. تثبيت عبر composer
composer require psr/container ^1.1.1 webman/blade
  1. تعديل الإعدادات config/view.php لتصبح
    
    <?php
    use support\view\Blade;

return [
'handler' => Blade::class
];


## تثبيت think-template
1. تثبيت عبر composer

`composer require topthink/think-template`

2. تعديل الإعدادات `config/view.php` لتصبح
```php
<?php
use support\view\ThinkPHP;

return [
    'handler' => ThinkPHP::class,
];

تنبيه
يمكن تمرير خيارات إعداد أخرى عبر options، مثل

return [
    'handler' => ThinkPHP::class,
    'options' => [
        'view_suffix' => 'html',
        'tpl_begin' => '{',
        'tpl_end' => '}'
    ]
];

مثال على محرك القوالب PHP الأصلي

إنشاء ملف app/controller/UserController.php كما يلي

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        return view('user/hello', ['name' => 'webman']);
    }
}

إنشاء ملف app/view/user/hello.html كما يلي

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>webman</title>
</head>
<body>
hello <?=htmlspecialchars($name)?>
</body>
</html>

مثال على محرك قوالب Twig

تعديل الإعدادات config/view.php لتصبح

<?php
use support\view\Twig;

return [
    'handler' => Twig::class
];

app/controller/UserController.php كما يلي

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        return view('user/hello', ['name' => 'webman']);
    }
}

ملف app/view/user/hello.html كما يلي

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>webman</title>
</head>
<body>
hello {{name}}
</body>
</html>

لمزيد من الوثائق، انظر Twig

مثال على قوالب Blade

تعديل الإعدادات config/view.php لتصبح

<?php
use support\view\Blade;

return [
    'handler' => Blade::class
];

app/controller/UserController.php كما يلي

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        return view('user/hello', ['name' => 'webman']);
    }
}

ملف app/view/user/hello.blade.php كما يلي

ملاحظة: لاحظ أن امتداد قالب Blade هو .blade.php

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>webman</title>
</head>
<body>
hello {{$name}}
</body>
</html>

لمزيد من الوثائق، انظر Blade

مثال على قوالب ThinkPHP

تعديل الإعدادات config/view.php لتصبح

<?php
use support\view\ThinkPHP;

return [
    'handler' => ThinkPHP::class
];

app/controller/UserController.php كما يلي

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        return view('user/hello', ['name' => 'webman']);
    }
}

ملف app/view/user/hello.html كما يلي

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>webman</title>
</head>
<body>
hello {$name}
</body>
</html>

لمزيد من الوثائق، انظر think-template

تعيين القيم للقالب

بدلاً من استخدام view(القالب، مصفوفة المتغيرات) لتعيين القيم للقالب، يمكننا أيضًا في أي مكان استدعاء View::assign() لتعيين القيم للقالب. على سبيل المثال:

<?php
namespace app\controller;

use support\Request;
use support\View;

class UserController
{
    public function hello(Request $request)
    {
        View::assign([
            'name1' => 'value1',
            'name2'=> 'value2',
        ]);
        View::assign('name3', 'value3');
        return view('user/test', ['name' => 'webman']);
    }
}

View::assign() مفيدة في بعض السيناريوهات، مثل إذا كان يتعين عرض معلومات المستخدم الحالي في رأس كل صفحة، سيكون من المزعج تعيين هذه المعلومات في كل صفحة باستخدام view('القالب', ['user_info' => 'معلومات المستخدم']);. الحل هو الحصول على معلومات المستخدم في البرنامج الوسيط، ثم استخدام View::assign() لتعيين معلومات المستخدم للقالب.

عن مسار ملفات العرض

التحكم

عند استدعاء التحكم لـ view('اسم القالب',[]);، يتم البحث عن ملفات العرض وفقًا للقاعدة التالية:

  1. يبدأ بـ /، فيتم استخدام المسار مباشرةً للبحث عن ملف العرض
  2. لا يبدأ بـ / وغير تطبيق متعدد، فيتم استخدام ملف العرض المقابل في app/view/
  3. لا يبدأ بـ / وهو تطبيق متعدد، فيتم استخدام ملف العرض المقابل في app/اسم_التطبيق/view/
  4. إذا لم يتم تمرير معاملات القالب، يتم البحث تلقائيًا عن ملفات القالب بناءً على القاعدة 2 و3

مثال:

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        // تعادل return view('user/hello', ['name' => 'webman']);
        // تعادل return view('/app/view/user/hello', ['name' => 'webman']);
        return view(['name' => 'webman']);
    }
}

دالة الـ Closure

تكون $request->app فارغة ضمن دالة الـ Closure، ولا تنتمي لأي تطبيق، لذلك تستخدم دالة الـ Closure ملفات العرض في app/view/، مثل تعريف المسار في config/route.php

Route::any('/admin/user/get', function (Reqeust $reqeust) {
    return view('user', []);
});

سيتم استخدام app/view/user.html كملف القالب (عند استخدام قالب Blade سيكون ملف القالب هو app/view/user.blade.php).

تحديد التطبيق

لتسهيل إعادة استخدام القوالب في وضع التطبيقات المتعددة، يوفر view($template, $data, $app = null) المعامل الثالث $app، والذي يمكن استخدامه لتحديد أي دليل تطبيق يجب استخدامه للقالب. على سبيل المثال، view('user', [], 'admin'); سيستخدم ملفات العرض في app/admin/view/.

اختصار معاملات القالب

يمكن اختصار معاملات القالب في وحدة التحكم، مثل

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        // تعادل return view('user/hello', ['name' => 'webman']);
        // تعادل return view('/app/view/user/hello', ['name' => 'webman']);
        return view(['name' => 'webman']);
    }
}

توسيع Twig

يمكننا توسيع مثيل عرض Twig من خلال توفير رد نداء view.extension، مثل config/view.php كالتالي

<?php
use support\view\Twig;
return [
    'handler' => Twig::class,
    'extension' => function (\Twig\Environment $twig) {
        $twig->addExtension(new your\namespace\YourExtension()); // إضافة Extension
        $twig->addFilter(new \Twig\TwigFilter('rot13', 'str_rot13')); // إضافة Filter
        $twig->addFunction(new \Twig\TwigFunction('function_name', function () {})); // إضافة دالة
    }
];

توسيع Blade

بنفس الطريقة، يمكننا توسيع مثيل عرض Blade من خلال توفير رد نداء view.extension، مثل config/view.php كالتالي

<?php
use support\view\Blade;
return [
    'handler' => Blade::class,
    'extension' => function (Jenssegers\Blade\Blade $blade) {
        // إضافة تعليمات لـ Blade
        $blade->directive('mydate', function ($timestamp) {
            return "<?php echo date('Y-m-d H:i:s', $timestamp); ?>";
        });
    }
];

استخدام مكونات component في Blade

لنفترض أننا بحاجة إلى إضافة مكون Alert

إنشاء app/view/components/Alert.php

<?php

namespace app\view\components;

use Illuminate\View\Component;

class Alert extends Component
{

    public function __construct()
    {

    }

    public function render()
    {
        return view('components/alert')->rawBody();
    }
}

إنشاء app/view/components/alert.blade.php

<div>
    <b style="color: red">hello blade component</b>
</div>

تكون /config/view.php كالتالي

<?php
use support\view\Blade;
return [
    'handler' => Blade::class,
    'extension' => function (Jenssegers\Blade\Blade $blade) {
        $blade->component('alert', app\view\components\Alert::class);
    }
];

وبذلك، يكون مكون Blade Alert قد تم إعداده. عند استخدامه في القالب سيكون كالتالي

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>webman</title>
</head>
<body>

<x-alert/>

</body>
</html>

توسيع think-template

تستخدم think-template view.options.taglib_pre_load لتوسيع مكتبة العلامات، مثل

<?php
use support\view\ThinkPHP;
return [
    'handler' => ThinkPHP::class,
    'options' => [
        'taglib_pre_load' => your\namspace\Taglib::class,
    ]
];

للمزيد من التفاصيل، يُرجى مراجعة توسيع علامات think-template