2017 © Pedro PelĆ”ez
 

library yii2-panel

yii2 panel module

image

unyii2/yii2-panel

yii2 panel module

  • Friday, March 9, 2018
  • by uldisn
  • Repository
  • 1 Watchers
  • 0 Stars
  • 13 Installations
  • PHP
  • 0 Dependents
  • 0 Suggesters
  • 1 Forks
  • 0 Open issues
  • 1 Versions
  • 0 % Grown

The README.md

yii2 panel controller

Total Downloads, (*1)

Yii2Panel was designed to make boards that display different panels from different modules/extensions with access rights control., (*2)

Meeting better as expected, as the Yii2Panel can be used for displaying panel from any other module/extension with access control., (*3)

Another benefit is that the panels to be displayed are assigned to a module configuration that allows different panels to be used in the module for different projects., (*4)

For procesing submited data from PanelWidgwet van use PanleLogic, (*5)

Realisation

Simply dashboard solution. Each dashboard panel define as panel controller action identically as Yii page:, (*6)

  • panel controller in behaviors can control access - panel display only for users, who has access;
  • panel controller controller action for creating HTML or response;
  • create view folder in same folder, where all module controller views;
  • for displaying add PanelWidget like anchor in view file;
  • in module config for PanelWidget set one or more panels as Yii routes with parameters to panel controller;

Sequence

  • PanelWidget get panel list from module configuration
  • PanelWidget call panel controller action with parameters
  • Panel controller validate access. If no access, return empty string
  • panel controller action create response HTML
  • PanelWidget output response HTML

Installation by composer

{
    "require": {
       "unyii2/yii2-panel": "dev-master"
    }
}

Or

$ composer require unyii2/yii2-panel "dev-master"

Widget


echo \unyii2\yii2panel\PanelWidget::widget([ 'name' => 'exportSettings', 'params' => [ 'docId' => 777 ] ]);

Controller action

For processing submited data form panel widget can use PanelLogic, (*7)

    public function actionCreate()
    {

        $model = new RkInvoiceForm();
        if($model->load($request->post()) && $model->save()) {
            $panelLogic = Yii::createObject([
                'class' => PanelLogic::class,
                'name' => 'LietvedibaRkInvoiceSave',
                'params' => [
                    'modelRecordId' => $model->id
                ]
            ]);
            $panelLogic->run();
            return $this->redirect(['view', 'id' => $model->id]);
        }
        return $this->render('create', [
            'model' => $model,
        ]);

    }

Module config

To module add parameter 'panels' and in configuration for module add panels routes, (*8)

        'invoices' => [
            'class' => 'd3modules\d3invoices\Module',
            'panels' => [
                /** for widget */
                'exportSettings' => [
                    [
                        'route' => 'd3accexport/invoice-panel/document-settings',
                        'params' => [
                            'docId' => 13 // action parameter value
                         ]
                        'tag' => 'div', // optinal. Add enclosing tag to panel  
                        'options' => ['class' => 'col-sm-8 col-md-6 col-lg-4'] //enclosing tag options
                     ]
                 ],
                 /** for panel logic */
                 'LietvedibaRkInvoiceSave' => [
                    [
                        'route' => 'deal/panel/save'
                    ]
                ],
            ],
        ],

To controller add parameter 'panels' and in configuration for module add panels routes, (*9)

        'invoices' => [
            'class' => 'd3modules\d3invoices\Module',
            'controllerMap' => [
                'settings' => [
                    'class' => 'yii3\persons\controllers\SettingsController',
                    'panels' => [
                        'UserSettingsProvileLeft' =>
                            [
                                [
                                    'route' => 'myauth/panel/show-qrc'
                                 ]
                            ]
                    ]
                ],
            ],

Optionally, if no possible add to module parameter 'panels', panel routes can define in parameters, (*10)

'params' => [
    'panelWidget' => [
        'dashboard' => [
            'last' =>  [
                [
                    'route' => 'delivery/panel/transit-declarations',
                    /**  
                     * parameters for action method:
                     * public function actionMyTransitDeclarations(array $statusIdList): string 
                     */
                    'params' => [
                        'statusIdList' => [5, 20]
                    ]                    
                ]
            ],
        ]
    ],
]

Panel controller with access control and view rendering

Standard view path: d3modules/d3accexport/views/invoice-panel/setting_grid.php, (*11)

<?php

namespace d3modules\d3accexport\controllers;

use unyii2\yii2panel\Controller;
use yii\filters\AccessControl;

class InvoicePanelController extends Controller
{

    /**
     * @inheritdoc
     */
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::class,
                'rules' => [
                    /**
                    * standard definition
                    */
                    [
                        'allow' => true,
                        'actions' => [
                            'document-settings',
                        ],
                        'roles' => [
                            'DocSetting',
                        ],
                    ],

                    /**
                    * roles define in panel module config. 
                    *   Example of edi module config:
                    *        'edi' => [
                    *            'class' => 'd3yii2\d3edi\Module',
                    *            'accessRulesMessageRoles' => ['Depo3EdiFull']
                    *        ],
                    *   In Module add property:
                    *        class Module extends D3Module
                    *           public $accessRulesMessageRoles;
                    *           ....
                    */
                    [
                        'allow' => true,
                        'actions' => [
                            'message',
                        ],
                        'roles' => $this->module->rulesMessageRoles??['@'],
                    ],                    
                ],
            ],
        ];
    }

    /** for widget */
    public function actionDocumentSettings()
    {
        return $this->render('setting_grid',[]);

    }

    /** for widget */
    public function actionMessage()
    {
        return $this->render('message',[]);

    }

    /** for controller logic */
    public function actionSave(int $modelRecordId): bool
    {
        if (!$model = DealInvoice::findOne(['invoice_id' => $modelRecordId])) {
            $model = new DealInvoice();
            $model->invoice_id = $modelRecordId;
        }

        $request = Yii::$app->request;
        if ($model->load($request->post())
            && $model->deal_id
            && $model->save()
        ) {
            return true;
        }

        if ($model->hasErrors()) {
            throw new \Exception(json_encode($model->getErrors()));
        }
        return true;
    }

}

panel usage as data transfering between modules

to module panels add panel action

$config = [
    'modules' => [
        'invoices' => [
            'class' => 'd3modules\d3invoices\Module',
            'panels' => [
                'invoice-items-woff' => [
                    [
                        'route' => 'd4storei/data-panel/woff',
                    ]
            ]         
        ]
    ]

executing panel

Can use for getting data or executing something in other module, (*12)


$panelLogic = new PanelLogic([ 'name' => 'invoice-items-woff', 'params' => [ 'invoiceSysModelId' => $sysModelId, 'invoiceId' => $model->id, 'items' => $items, ], ]); $panelLogicData = $logic->run();

panel controller

use unyii2\yii2panel\Controller;

/**
 * @property Module $module
 */
class DataPanelController extends Controller
{

    public function behaviors(): array
    {
        return [
            'access' => [
                'class' => AccessControl::class,
                'rules' => [
                    /**
                     * standard definition
                     */
                    [
                        'allow' => true,
                        'actions' => [
                            'woff',
                        ],
                        'roles' => [
                            D3ModulesD4StoreiFullUserRole::NAME,
                        ],
                    ],
                ],
            ],
        ];
    }

            /**
             * masīvs pielāgots InvInvoiceItems::load()
             */
            $list[] = [
                'name' => $row->storeProduct->product->name,
                'count' => $row->productQnt,
        }
        return $list;
    }

    /**
     *  write off invoice items
     *  Add refs:
     *  - inv_invoice
     *  - inv_invoice_items
     *  - user
     *
     * @param int $invoiceSysModelId
     * @param int $invoiceId
     * @param array<int, array{
     *     itemSysModelId: int,
     *     itemId: int,
     *     count:float,
     *     unitId: int,
     *     storeProductSysModelId: int,
     *     storeProductId: int
     * }> $items
     * @return bool
     * @throws D3ActiveRecordException
     * @throws Exception
     */
    public function actionWoff(
        int $invoiceSysModelId,
        int $invoiceId,
        array $items
    ): bool
    {
        $storeProductSysModelId = SysModelsDictionary::getIdByClassName(D4StoreStoreProduct::class);
        if (!$transaction = Yii::$app->db->beginTransaction()) {
            throw new Exception('Can not initiate transaction');
        }
        try {
            foreach ($items as $item) {
                if ((int)$item['storeProductSysModelId'] !== $storeProductSysModelId) {
                    throw new Exception('Wrong store product model sys id: ' . $storeProductSysModelId);
                }
                $product = D4StoreStoreProduct::findOne($item['storeProductId']);
                $action = new Action($product);
                $action->outSys($item['count'],  $item['itemSysModelId'], $item['itemId']);
                $action->addRef(Yii::$app->user);
                $action->addRefSys($invoiceSysModelId, $invoiceId);
            }
            $transaction->commit();
        } catch (\Exception $e) {
            $transaction->rollBack();
            FlashHelper::addDanger($e->getMessage());
            Yii::error($e->getMessage() . PHP_EOL . $e->getTraceAsString());
            return false;
        }
        return true;
    }
}


The Versions

09/03 2018

dev-master

9999999-dev https://github.com/unyii2/yii2-panel.git

yii2 panel module

  Sources   Download

BSD-4-Clause

The Requires

  • php 7.*

 

yii2 panel