پکیجها
در جالنو برای مدیریت و کاربا پکیجهای پروژه کلاس packages\base\Package تعریف شده است.
از این کلاس زمان کار با فایلها برای دسترسی به فایل موجود در پکیج، آدرس فایل و ... استفاده میشود.
در کلاس Package متدهای زیر تعریف شده است.
| متد | کاربرد |
|---|---|
| fromName(string $name): Package | گرفتن پکیج |
| getName(): string | گرفتن نام پکیج والد |
| getFilePath(string $file): string | گرفتن آدرس فایل |
| url(string $file, bool $absolute): string | گرفتن آدرس فایل |
| getFile(string $path): File\Local | گرفتن یک فایل |
| getHome(): Directory | گرفتن مشخصات پکیج بصورت شئ از کلاس Directory |
| getFileContents(string $file): string | خواندن محتویات فایل |
| getOption(string $name): ?mixed | گرفتن تنظیم تعریف شده برای پکیج |
| setOption(string $name, mixed $value) | افزودن تنظیم جدید برای پکیج |
| bootup() | فراخوانی فایل bootstrap در صورتی که در پکیج تنظیم شده باشد این متد توسط فرم ورک و در زمان بارگذاری پکیج ها فراخوانی میشود |
فرمورک از متدهای getter , setter زیر برای کامل کردن اطلاعات پیکج استفاده میکند.
| متد | کاربرد |
|---|---|
| addDependency(string $dependency) | اضافه کردن پکیج وابسته |
| getDependencies(): array | گرفتن نام پکیجهای وابسته |
| addFrontend(string $source) | افزودن پکیج قالب |
| getFrontends(): array | گرفتن نام پکیجهای معرفی شده برای قالب |
| setBootstrap(string $bootstrap) | افزودن فایل bootstrap |
| setRouting(string $routing) | تنظیم فایل مسیریابی |
| getRouting(): ?File | گرفتن فایل مسیریابی |
| getRoutingRules(): array | گرفتن آدرسهای مسیریابی مشخص شده در فایل routing.json |
| getConfigFile(): File | گرفتن فایل پیکربندی (package.json) پیکج |
دسترسی به پکیج
در کلاس packages\base\Package متد fromName برای دسترسی به پکیجهای پروژه تعریف شده است.
علاوه بر متد fromName با فراخوانی متد package که در کلاس packages\base\Packages ،تعریف شده است نیز میتوانید به پکیجهای پروژه دسترسی داشته باشید. متدهای fromName و package برای سهولت بصورت static تعریف شدهاند.
خروجی متدهای fromName و package درصورتی که پکیج مشخص شده موجود باشد شئ از کلاس packages\base\Package است که حاوی مشخصات پکیج مانند پکیجهای وابسته ، فایل مسیریاب ،فایلهای مترجم و بطور کلی تمامی تنظیماتی که در فایل ساختار پیکج (package.json) تنظیم شده است میباشد.
درصورتی که پکیج مشخص شده موجود نباشد استثناpackages\base\IO\NotFoundException پرتاب میشود.
دسترسی به پکیج از طریق متد package
use packages\base\Packages;
$package = Packages::package("packagename");
دسترسی به پکیج از طریق متد fromName
use packages\base\Package;
$package = Package::fromName("packagename");
آدرس فایل
برای دسترسی به آدرس فایلها دو متد getFilePath و url تعریف شده است.
هر دو متد به عنوان ورودی آدرس و نام فایل را بصورت رشته دریافت میکنند.
فایل معرفی شده میتواند موجود نباشد.
اگر به آرگومان دوم متد url مقدار true داده شود آدرس را بطور کامل (در قالب آدرس url) برمیگرداند.
مقدار پیشفرض این آرگومان false میباشد.
تفاوت متد getFilePath و url
از متد getFilePath برای دریافت آدرس فایل در داخل پکیج و از متد url برای دریافت آدرس اینترنتی فایل استفاده میشود.
مثال 1
<?php
namespace packages\packagename\controllers;
use themes\themename\views;
use packages\base\{Controller, Response, View, Packages, IO\File};
class Albums extends Controller {
public function insertImg(): Response {
$view = view::byName(views\Albums\InsertImg::class);
$this->response->setView($view);
if (Http::is_post()){
$inputs = $this->checkinputs([
'img' =>[
'type' => 'image',
"max-size" => 2097152 // Byte
"obj" => true,
"extension" => array('jpeg', 'jpg']
]
]);
$path = 'storage/public/albums/' . $inputs['img']->getFile()->md5() . '.' . $inputs['img']->getExtension();
$img = new File\Local(Packages::package('packagename')->getFilePath($path));
/**
* Or
* $img = Packages::package('packagename')->getFile($path);
*/
$directory = $img->getDirectory();
if (!$directory->exists()) {
$directory->make(true);
}
$inputs['img']->copyTo($img);
}
$this->response->setStatus(true);
return $this->response;
}
}
در مثال فوق ابتدا در $path آدرس محل ذخیره فایل را ایجاد میکنیم سپس $path را به متد getFilePath داده که آدرس دقیق فایل مطابق package موردنظر ایجاد شود.
خروجی متد getFilePath بصورت زیر میباشد.
packages/packagename/storage/public/albums/0bc27259aae45199b214898a48d0a7bf.jpg
برای اطلاعات بیشتر در رابطه با فایل ها و دایرکتوری ها به صفحات کار با فایلها و پوشهها مراجعه کنید.
مثال 2
<?php
namespace packages\packagename\controllers;
use packages\base\{Controller, Response, Packages, NotFound, ResponseFile};
class Albums extends Controller {
public function download($data): Response {
$file = Packages::package('packagename')->getFile($data["path"]);
if (!$file->exists()) {
throw new NotFound();
}
$responsefile = new ResponseFile();
$responsefile->setLocation(Packages::package('packagename')->getFilePath($file->path));
$responsefile->setSize($file->size);
$responsefile->setName($file->name);
$this->response->setFile($responsefile);
$this->response->setStatus(true);
return $this->response;
}
}
در مثال فوق قصد داریم فایلی را برای دانلود به کاربر بدهیم. ابتدا شئ از کلاس فایل مطابق آدرس دریافت شده دریافت کرده و وجود فایل را بررسی میکنیم.
برای اطلاعات بیشتر به صفحه پاسخ مراجعه کنید.
مثال 3 استفاده از متد url در قالب
<?php
namespace themes\themename\views\profile;
use packages\packagename\User as Model;
use packages\base\{Packages, frontend\Theme, views\Form};
use themes\clipone\{ViewTrait, views\FormTrait, views\TabTrait}; // Clipone is userpanel package theme name
class edit extends Form {
use ViewTrait, FormTrait, TabTrait;
protected $user;
public function __beforeLoad(){
$this->setTitle(t('profile.edit'));
$this->addBodyClass('profile');
$this->addBodyClass('profile_edit');
}
protected function getAvatarURL(): string {
if ($this->user->avatar_path) {
return Packages::package('userpanel')->url($this->user->avatar_path);
}
return Theme::url('assets/images/defaultavatar.jpg');
}
public function setUser(Model $user) {
$this->user = $user;
}
}
<div class="img-profile">
<img class="img-responsive img-circle" src="<?php echo $this->getAvatarURL(); ?>">
<h4 class="user-name">
<i class="fa fa-user"></i>
<?php echo $this->user->name; ?>
</h4>
</div>
خواندن محتویات صفحه
متد getFileContents برای خواندن محتویات فایل تعریف شده است.
این متد به عنوان آرگومان ورودی آدرس و نام فایل موجود در پکیج را بصورت رشته دریافت میکند. در صورتی که فایل موجود نباشد استثنا packages\base\IO\NotFoundException پرتاب میشود.
مثال
<?php
namespace packages\packagename\controllers;
use themes\themename\views;
use packages\base\{View, Controller, Packages, view\Error};
class Main extends Controller {
public function description() {
$view = view::byName(views\main\Description::class);
$this->response->setView($view);
try {
$description = Packages::package('packagename')->getFileContents("storage/public/description.txt");
$view->setData($description, 'description');
} catch(IO\NotFoundException $e) {
throw new Error("file_not_exists");
}
$this->response->setStatus(true);
return $this->response;
}
}
در مثال فوق محت ویات فایل را با متد getFileContents گرفته و در متد setData به view منتقل میشود.
گرفتن فایل
متد getFile آدرس و نام فایل را بصورت رشته گرفته و خروجی آن شئ از کلاس File میباشد.
فایل مشخص شده میتواند موجود نباشد.
مثال
<?php
namespace packages\packagename\controllers;
use themes\themename\views;
use packages\base\{Controller, Response, View, Http, Packages};
class Main extends Controller {
public function addDescription(): Response {
$view = View::byName(views\main\AddDescription::class);
$this->response->setView($view);
if (Http::is_post()) {
$input = $this->checkinputs([
'description' =>[
'type' => 'string'
]
]);
$file = Packages::package('packagename')->getFile("storage/public/description.txt");
$directory = $file->getDirectory();
if (!$directory->exists()) {
$directory->make(true);
}
$file->write($input['description']);
}
$this->response->setStatus(true);
return $this->response;
}
}