داده‌های پویا

در برنامه همواره لازم است داده و یا اطلاعات پایه ای وب سایت در سمت قالب و توسط جاوااسکریپت استفاده شوند. مانند تنظیماتی که در Options انجام شده و یا اطلاعاتی که باید در این صفحه استفاده شوند و ... . فرمورک این اطلاعات را بصورت خودکار از پکیج های مختلف جمع آوری کرده به اطلاعات قابل خواندن توسط جاوااسکریپت تبدیل و قبل از بارگذاری فایل های اصلی در صفحه قرار میدهد.

برای ذخیره و مدیریت این دسته از اطلاعات در فرمورک کلاس packages\base\frontend\events\ThrowDynamicData ایجاد شده است.

برای سهولت در دسترسی به کلاس ThrowDynamicData در کلاس packages\base\View متد dynamicData() ایجاد شده است که به راحتی با فراخوانی این متد روی شئ کلاس View به کلاس ThrowDynamicData دسترسی خواهید داشت.

برای اطلاعات بیشتر از ظاهر به صفحه ظاهر View مراجعه کنید.

تنظیمات

برای اطلاعات بیشتر از تنظیمات به صفحه تنظیمات و پیکربندی مراجعه کنید.

تنظیمات اصلی سایت از جمله تنظیمات مربوط به زبان سایت مانند زبان اصلی، نوع قرار گیری زبان در آدرس و اطلاعات پایه سایت مانند اینکه سایت با www باز میشود و یا بدون آن را در صفحه و در متغیر جاوااسکریپتی var options قرار میدهد. از این پارامتر ها میتوان در تولید آدرس ها توسط جاوااسکریپت استفاده کرد.

توجه : تنظیماتی که به صورت خودکار توسط فرمورک اضافه شده با کلید های packages.base.translator.defaultlang ، packages.base.translator.changelang ، packages.base.translator.changelang.type ، packages.base.routing.www هستند.

میتوانید تنظیمات دیگر و یا حتی تنظیماتی که جدید اضافه کردید را نیز اضافه کنید تا در هنگام باز شدن صفحه قرار بگیرند. در کلاس ThrowDynamicData با استفاده از متد‌های زیر میتوانید تنظیمات نمایش داده شده را مدیریت کنید.

تعریف تنظیم

با استفاده از متد setOption میتوانید تنظیمات جدیدی که اضافه کرده‌اید در صفحه اضافه کرده و از آن استفاده کنید. ورودی این متد نام تنظیم است.

مثال

<?php
namespace themes\themename\views\packagename\posts;

use packages\base\{Options, views\Form};

class Prioritize extends Form {

    private $hasAccessToDelete = false;

    public function __beforeLoad() {

        $this->setTitle(t("posts.prioritize"));
        $this->addBodyClass("posts-prioritize");

        Options::set("packages.packagename.has_access_to_delete_service", $this->hasAccessToDelete);
        $this->dynamicData()->setOption("packages.packagename.has_access_to_delete_service");
    }

    public function hasAccessToDelete(bool $permission) {
        $this->hasAccessToDelete = $permission;
    }
}

خروجی کد فوق در صفحه html بصورت زیر میباشد

<script>
var options = {"packages.base.translator.defaultlang":"fa_IR","packages.base.translator.changelang":"uri","packages.base.translator.changelang.type":"short","packages.base.routing.www":"nowww","packages.packagename.has_access_to_delete_service":false};var translator = {"lang":"fa_IR"};
</script>

بررسی تنظیم

با فراخوانی متد hasOption میتوانید وجود یا عدم وجود تنظیمات ذخیره شده را بررسی کنید. خروجی متد boolean میباشد. با فراخوانی متد getData با ورودی options میتوانید به تمامی options های ذخیره شده در این کلاس (بصورت آرایه) دسترسی داشته باشید.

مثال

<?php
namespace themes\themename\views\packagename\posts;

use packages\base\{Options, views\Form};

class Prioritize extends Form {

    public function __beforeLoad() {

        $this->setTitle(t("posts.prioritize"));
        $this->addBodyClass("posts-prioritize");

        Options::load("packages.packagename.has_access_to_delete_service");

        $dynamicData = $this->dynamicData();

        if (!$dynamicData->hasOption("packages.packagename.has_access_to_delete_service")) {
            $dynamicData->setOption("packages.packagename.has_access_to_delete_service");
        }
    }
}

در مثال فوق تنظیم ذخیره شده با متد load در از پایگاه داده دریافت شده و سپس با متد hasOption بررسی می‌شود اگر این تنظیم در این رویداد اضافه نشده است، با فراخوانی متد setOption اضافه می‌شود.

حذف تنظیم

با فراخوانی متد deleteOption میتوانید تنظیم اضافه شده را حذف کنید. آرگومان ورودی متد نام تنظیم میباشد.

مثال

<?php
namespace themes\themename\views;

use packages\base\{Options, views\Form};

class Prioritize extends Form {

    public function __beforeLoad() {

        $this->setTitle(t("posts.prioritize"));
        $this->addBodyClass("posts-prioritize");

        $this->dynamicData()->deleteOption("packages.base.translator.defaultlang");
    }
}

تعریف داده

متد setData برای تعریف اطلاعات، ایجاد شده است. این متد دو آرگومان ورودی میگیرد که در آرگومان اول یک رشته برای کلید داده و در آرگومان دوم مقدار داده مقداردهی می‌شود.

مثال

<?php
namespace themes\themename\views;
use packages\base\{Options, views\Form};

class Edit extends Form {

    function __beforeLoad() {
        $this->setTitle(array(
            t("settings"),
            t("usertype.edit")
        ));
        $this->addBodyClass("edit-usertype");

        $this->dynamicData()->setData("permissions", $this->buildPermissionsArray());
    }

    protected function buildPermissionsArray(): array {
        $item;
        foreach ($this->getData('permissions') as $permission) {
            $item[] = ["key" => $permission];
        }
        return $item;
    }
}

در مثال فوق در متد buildPermissionsArray مجوزها که با کلید permissions در کنترلر مقداردهی شده‌اند و با فراخوانی متد getData در دسترس می‌باشند. (متد getData در کلاس packages\base\view تعریف شده است.) با فراخوانی متد buildPermissionsArray در متد setData آرایه‌ای از مجوز‌ها تحت عنوان کلید permissions در داده های صفحه اضافه میشود.

خروجی کد فوق در صفحه html بصورت زیر می‌باشد

<script>
var options = {"packages.base.translator.defaultlang":"fa_IR","packages.base.translator.changelang":"uri","packages.base.translator.changelang.type":"short","packages.base.routing.www":"nowww"};var translator = {"lang":"fa_IR"}; var permissions = [{"key":"userpanel_users_list"},{"key":"userpanel_users_add"},{"key":"userpanel_users_view"},{"key":"userpanel_users_view_invisibles"}]
</script>

بررسی وجود داده

متد hasData برای بررسی وجود و یا عدم وجود یک کلید در داده ها تعریف شده است. آرگومان ورودی متد کلید داده‌ای است که میخواهید وجود آن را بررسی کنید. خروجی متد boolean است.

حذف داده

متد deleteData برای حذف داده اضافه شده استفاده می‌شود. ورودی متد کلید تعریف شده برای داده میباشد.

مثال

<?php
namespace themes\themename\views;
use packages\base\{Options, View};

class Delete extends View {

    function __beforeLoad() {
        $this->setTitle(array(
            t("settings"),
            t("usertype.delete")
        ));

        $dynamicData = $this->dynamicData();

        if ($dynamicData->hasData("permissions")) {
            $dynamicData->deleteData("permissions")
        }
    }
}

خواندن داده

متد getData برای دریافت داده‌های اضافه شده استفاده میشود. آرگومان ورودی متد کلید تعریف شده برای داده میباشد. اگر به متد آرگومانی ارسال نشود آرایه‌ای از تمامی داده‌های تعریف شده را برمیگرداند.

نحوه استفاده از داده های ذخیره شده در جاوااسکریپت

داده های ذخیره شده در DynamicData در جاوااسکریپت مورد استفاده قرار میگیرد.

بطور مثال میخواهیم دکمه‌های حذف و ویرایش را فقط به کاربرانی که مجوز دسترسی دارند نمایش دهیم که مطابق کدهای زیر عمل میکنیم.

فایل view

<?php
namespace themes\themename\views;

use packages\base\views\Form;

class UsersList extends Form {
    public function __beforeLoad() {

        $permissions = $this->getData('permissions');

        $this->dynamicData()->setData("permissions", array(
            "users_edit" => $permissions['users_edit'],
            "users_delete" => $permissions['users_delete']
        ));
    }
}

خروجی داده‌ها در تگ script

<script>
var options = {"packages.base.translator.defaultlang":"fa_IR","packages.base.translator.changelang":"uri","packages.base.translator.changelang.type":"short","packages.base.routing.www":"nowww"};var translator = {"lang":"fa_IR"};var permissions = {"users_edit":true,"users_delete":false};
</script>

نحوه ی استفاده در فایل جاوااسکریپت

$(() => {
    if (!permissions["users_edit"]) {
        $(".btn_users_edit").css("display", "none");
    } 
    if (!permissions["users_delete"]) {
        $(".btn_users_delete").css("display", "none");
    }
});