پکیجها
در جالنو برای مدیریت و کاربا پکیجهای پروژه کلاس 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;
}
}