ظاهر
ظاهر رابط بین کنترلر و قالب است.
در فریمورک برای ظاهر، کلاس 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(['ظاهر', 'مستندات', 'جالنو']);
}
}
گرفتن نام صفحه
پس از تنظیم کردن نام صفحه میتوانید با فراخوانی متد getTitle
نام تنظیم شده را دریافت کنید.
اگر متد setTitle مقدار ورودی آرایه دریافت کرده باشد، آرایه به رشته تبدیل شده و عناصر با "|" از هم جدا میشوند.
اگر بخواهید از کارکتر دیگری به عنوان جدا کننده استفاده کنید باید کارکتر مورد نظر به عنوان ورودی به متد getTitle
داده شود.
1 مثال
/**
* $this->setTitle('تماس با ما');
*/
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>
<?php echo $this->getTitle();?>
/**
* output:
* تماس با ما
*/
</title>
</head>
2 مثال
/**
* $this->setTitle(
* ['ظاهر', 'مستندات', 'جالنو']
* );
*/
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>
<?php echo $this->getTitle();?>
/**
* output:
* ظاهر | مستندات | جالنو
*/
</title>
</head>
3 مثال
/**
* $this->setTitle(
* ['ظاهر', 'مستندات', 'جالنو']
* );
*/
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>
<?php echo $this->getTitle("-");?>
/**
* output:
* ظاهر - مستندات - جالنو
*/
</title>
</head>
تنظیم توضیحات
برای تنظیم توضیحات مربوط به صفحه که در تگ meta قرار میگیرد از متد setDescription
استفاده میشود. این توضیحات میتواند در جستجوی موتورهای جستجوگر اهمیت بسیاری داشته باشد.
متد setDescription در متد __beforeLoad فراخوانی میشود.
1 مثال
<?php
namespace themes\themename\views\packagename;
use packages\base\View;
class Index extends View {
public function __beforeLoad() {
$this->setDescription("آموزش ها و مقالات کاربردی برای وبمستران");
}
}
برای بهبود کدنویس ی میتوانید از مترجم ها و فایلهای ذخیره نوشته استفاده کنید. با استفاده از فایل های ذخیره نوشته مجبور به نوشتن متنها در بین کدها نخواهید بود
برای اطلاعات بیشتر به صفحه ی مترجم مراجعه کنید.
2 مثال : استفاده از مترجم
<?php
namespace themes\themename\views\packagename;
use packages\base\View;
class Index extends View {
public function __beforeLoad() {
$this->setDescription(t("site.decription"));
}
}
گرفتن توضیحات
پس از تنظیم توضیحات صفحه با فراخوانی متد getDescription()
میتوانید متن توضیحات را دریافت کنید.
مثال
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width، initial-scale=1.0">
<?php
$description = $this->getDescription();
if ($description) {
echo("<meta content=\"{$description}\" name=\"description\" />");
}
?>
</head>
اضافه و حذف کردن کد css
فایل مربوط به کدهایی css در فایل theme.json پوشه frontend معرفی میشود. اما گاها لازم است برخی از کدها بصورت inline تعریف شود و یا صرفا برای یکی از صفحات تعریف شود در این موارد میتوانید متدهای addCSS
و addCSSFile
را فراخوانی کنید.
توجه : متدهای addCSS
و addCSSFile
باید در متد __beforeLoad فراخوانی شوند.
برای هر استایلی که تعریف میشود میتوانید نام مشخص کنید در این صورت اگر در شرایطی خاص لازم به حذف استایل داشته باشید، میتوانید نام استایل را به آرگومان ورودی متد removeCSS
ارسال کنید.
همچنین با فراخوانی متد clearCSSAssets
میتوانید تمامی استایلها را حذف کنید. این متد آرگومان ورودی ندارد.
با فراخوانی متد clearAssets
علاوه بر کدهای css کدهای js نیز حذف میشوند.
همچنین با فراخوانی متد getCSSAssets
فایلهای css .اضافه شده به صفحه در دسترس میباشند
<?php
namespace themes\themename\views\packagename;
use packages\base\View;
class Index extends View {
public function __beforeLoad() {
if (isset($this->getData('bg'))) {
$this->removeCSS("bodyStyle");
}
/**
* $this->clearCSSAssets();
* $this->clearAssets();
*/
}
}
متد addCSS
دو آرگومان ورودی میگیرد. آرگومان اول کد استایل و آرگومان دوم نام برای استایل میباشد. آرگومان دوم اختیاری میباشد.
<?php
namespace themes\themename\views\packagename;
use packages\base\View;
class Index extends View {
public function __beforeLoad() {
$this->addCSS("body{background: antiquewhite}", "bodyStyle");
}
}
متد addCSSFile
فایل جدید برای استایل اضافه میکند. متد سه آرگومان ورودی میگیرد.
آرگومان اول آدرس فایل را بصورت رشته میگیرد، آرگومان دوم نام استایل و آرگومان سوم لود شدن و یا نشدن فایل را مشخص میکند; درصورتی که آرگومان سوم true باشد فایل معرفی شده در صفحه لود نمیشود. مقدار پیشفرض این متد false است.
آرگومان دوم و سوم اختیاری هستند.
<?php
namespace themes\themename\views\packagename;
use packages\base\View;
class Index extends View {
public function __beforeLoad() {
$this->addCSSFile("assets/css/style.css", 'newStyle');
}
}
اضافه و حذف کردن کد js
فایل مربوط به کدهای js در فایل theme.json پوشه frontend معرفی میشود. اما گاها لازم است برخی از کدها بصورت inline تعریف شود و یا صرفا برای یکی از صفحات تعریف شود در این موارد میتوانید متدهای addJS
و addJSFile
را فراخوانی کنید.
توجه : متدهای addJS
و addJSFile
باید در متد __beforeLoad فراخوانی شوند.
برای هر کد جاوااسکریپت که تعریف میشود میتوانید نام مشخص کنید در این صورت اگر در شرایطی خاص لازم به حذف کد داشته باشید، میتوانید نام کد را به آرگومان ورودی متد removeJS
ارسال کنید.
همچنین با فراخوانی متد clearJSAssets
میتوانید تمامی کدهای جاوااسکریپت را حذف کنید. این متد آرگومان ورودی ندارد.
با فراخوانی متد clearAssets
علاوه بر کدهای js کدهای css نیز حذف میشوند.
همچنین با فراخوانی متد getJSAssets
فایلهای js اضافه شده به صفحه در دسترس میباشند
<?php
namespace themes\themename\views\packagename;
use packages\base\View;
class Index extends View {
public function __beforeLoad() {
$this->removeJS("indexJS");
/**
* $this->clearJSAssets();
* $this->clearAssets();
*/
}
}