ظاهر
ظاهر رابط بین کنترلر و قالب است.
در فریمورک برای ظاهر، کلاس packages\base\view ایجاد شده است. باید در قسمت frontend کلاس هایی برای ظاهر ایجاد کنید. این کلاسها باید از کلاس packages\base\view ارث بری کنند.
توجه : میتوانید مطابق ورژن قبل ظاهر را در دو قسمت backend و frontend تعریف کنید. این دو قسمت از طریق رابطه ی پدر-فرزندی به یکدیگر متصل میشوند.
برای منظم بودن فایل ها، بهتر است تا در هر قسمت یک پوشه با نام views ایجاد شود و فایل های مرتبط با آن قسمت در آن تعریف شود. اگر ظاهر را در دوقسمت تعریف کنید، باید در فایل theme.json پوشه قالب در کلید views ارتباط بین ظاهر backend و frontend را مشخص کنید.
<?php
namespace themes\themename\views\packagename;
use packages\base\View;
class index extends View {
public function __beforeLoad() {}
}
اگر صفحه مورد نظر دارای فرم باشد باید کلاس view از کلاس packages\base\views\form ارث بری کند .
برای اطلاعات بیشتر به صفحه فرم مراجعه کنید.
<?php
namespace themes\themename\views\packagename\users;
use packages\base\views\Form;
class add extends Form {
public function __beforeLoad() {}
}
اگر صفحه دارای لیست باشد که لازم به صفحهبندی دارد، باید کلاس view از کلاس packages\base\views\listview ارث بری کند.
برای اطلاعات بیشتر به صفحه صفحهبندی مراجعه کنید.
<?php
namespace themes\themename\views\packagename\users;
use packages\base\views\Listview;
class Search extends Listview {
public function __beforeLoad() {}
}
قسمت frontend
برای اطلاعات بیشتر به صفحه ی قالب مراجعه کنید.
این فایل در پوشهی معرفی شده به عنوان بخش قالب ایجاد می شود (بهتر است یک پوشه با نام views برای فایل های ظاهر این قسمت ایجاد کنید).
برای ارتباط قسمت ظاهری و قسمت قالب (قسمتی که HTML را شامل می شود) نیاز است تا در پوشهای به نام html فایلی متناظر با فایل کلاس view ایجاد شود.
همچنین لازم است تا در فایل theme.json که در پوشهی frontend قرار دارد، نام پوشه کلاسهای ظاهر (views) تحت عنوان کلید autoload معرفی شود.
در ظاهر میتوانید متد __beforeLoad() را تعریف کنید. این متد به صورت خودکار قبل از بارگذاری قسمت قالب برنامه صدا زده خواهد شد.
برای اطلاعات بیشتر به صفحه ی بارگذاری خودکار مراجعه کنید.
نمونه فایل theme.json
{
"name": "themename",
"title": "Site Frontend",
"version": "1.0.0",
"autoload": {
"directories": ["views"]
}
}
توجه : در namespace کلاس ظاهر باید از نامی که در فایل theme.json تعیین شده است استفاده شود.
<?php
namespace themes\themename\views\packagename\news;
use packages\packagename\Post;
use packages\base\View as ParentView;
class Show extends ParentView {
protected $post;
public function __beforeLoad() {}
public function setPost(Post $post): void {
$this->post = $post;
}
}
قسمت backend
برای ظاهر قسمت backend، فایلی در پوشهی اصلی پکیج تعریف می شود(بهتر است یک پوشه با نام views برای فایلهای این قسمت ایجاد کنید
). این فایل به وسیله ی رابطه ی پدر-فرزندی به فایل packages\base\view متصل است .
برای اینکه این فایل توسط فرم ورک به صورت خودکار شناسایی و بارگذاری شود باید این فایل را در فایل تنظیمات پکیج یعنی package.json تحت عنوان کلید autoload معرفی شود.
نمونه فایل package.json
{
"routing": "routing.json",
"frontend": ["frontend"],
"autoload": {
"directories": ["controllers", "Models", "views"]
}
}
نمونه فایل ظاهر در backend
<?php
namespace packages\packagename\views\news;
use packages\base\View;
use packages\packagename\Post;
class Show extends View {
public function setPost(Post $post) {
$this->setData($post, "post");
}
public function getPost(): Post {
return $this->getData("post");
}
}
نمونه فایل قالب
<?php
namespace themes\themename\views\packagename\news;
use packages\packagename\Post;
use packages\packagename\views\news\Show as ParentView;
class Show extends ParentView {
protected $post;
public function __beforeLoad() {
$this->post = $this->getPost();
}
}
نکته : میتوانید قسمت backend را ایجاد نکنید و در کنترلر بخش ظاهر را مستقیما از قالب فراخوانی کنید.
فراخوانی ظاهر
برای اطلاعات بیشتر به صفحه ی کنترلر مراجعه کنید.
هر کنترلر با استفاده از کلاس packages\base\view و متد byName یک ظاهر و در نتیجه یک قالب را فراخوانی میکند. اگر namespace داده شده به متد byName نادرست باشد
این کلاس با پرتاب یک استثناء از جنس کلاس packages\base\NoViewException از ادامه ی روند برنامه جلوگیری خواهد کرد.
فرواخوانی ظاهر قالب در کنترلر
برای فراخوانی ظاهر قالب در کنترلر باید از namespace قالب استفاده شود.
<?php
namespace packages\packagename\controllers;
use packages\packagename\Post as Model;
use themes\themename\views\packagename\news as views;
use packages\base\{Controller, Response, View, NotFound};
class News extends Controller {
public function view(array $data): Response {
$model = new Model();
$model->where("id", $data["post"]);
$model->where("status", Post::PUBLISHED);
$post = $model->getOne();
if (!$post) {
throw new NotFound();
}
$view = View::byName(views\Show::class);
$this->response->setView($view);
$view->setPost($post);
$this->response->setStatus(true);
return $this->response;
}
}
فرواخوانی ظاهر پکیج در کنترلر
برای فراخوانی ظاهر پکیج در کنترلر باید از namespace پکیج استفاده شود.
<?php
namespace packages\packagename\controllers;
use packages\base\{Controller, Response, View, NotFound}
use packages\packagename\{Post as Model, views\news as views};
class News extends Controller {
public function view(array $data): Response {
$model = new Model();
$model->where("id", $data["post"]);
$model->where("status", Post::PUBLISHED);
$post = $model->getOne();
if (!$post) {
throw new NotFound();
}
$view = View::byName(views\Show::class);
$this->response->setView($view);
$view->setPost($post);
$this->response->setStatus(true);
return $this->response;
}
}
تنظیم نام صفحه
برای هر صفحه وب لازم است عنوان ( Title ) مشخص شود. در فریمورک برای تنظیم عنوان متد setTitle تعریف شده است .
آرگومان ورودی این متد رشته میباشد. همچنین میتوانید آرایهای از رشته ها نیز به متد بدهید، بطور خودکار عناصر آرایه به رشته تبدیل میشود.
متد setTitle در متد __beforeLoad فراخوانی میشود.
تنظیم نام در ظاهر به شما این امکان را میدهد تا قسمت ابتدایی و مشترک صفحات HTML را یکبار نوشته و در تمامی صفحات استفاده کنید. برای بهبود کدنویسی میتوانید از مترجم ها و فایلهای ذخیره نوشته استفاده کنید. با استفاده از فایل های ذخیره نوشته مجبور به نوشتن متنها در بین کدها نخواهید بود
برای اطلاعات بیشتر به صفحه ی مترجم مراجعه کنید.
1 مثال
<?php
namespace themes\themename\views\packagename;
use packages\base\views\Form;
class ContactUs extends Form {
public function __beforeLoad() {
$this->setTitle('تماس با ما');
/**
* استفاده از مترجم
*
* $this->setTitle(t("title.contactUs"));
*/
}
}
2 مثال
<?php
namespace themes\themename\views\packagename;
use packages\base\View;
class Index extends View {
public function __beforeLoad() {
$this->setTitle(['ظاهر', 'مستندات', 'جالنو']);
}
}