marc-leopold/server/plugins/rainlab/builder/formwidgets/ControllerBuilder.php

117 lines
2.7 KiB
PHP

<?php namespace RainLab\Builder\FormWidgets;
use Backend\Classes\FormWidgetBase;
use RainLab\Builder\Classes\ControllerBehaviorLibrary;
use ApplicationException;
/**
* Controller builder widget.
*
* @package october\backend
* @author Alexey Bobkov, Samuel Georges
*/
class ControllerBuilder extends FormWidgetBase
{
/**
* {@inheritDoc}
*/
protected $defaultAlias = 'controllerbuilder';
protected $designTimeProviders = [];
protected $behaviorInfoCache = [];
/**
* {@inheritDoc}
*/
public function init()
{
}
/**
* {@inheritDoc}
*/
public function render()
{
$this->prepareVars();
return $this->makePartial('body');
}
/**
* Prepares the list data
*/
public function prepareVars()
{
$this->vars['model'] = $this->model;
}
/**
* {@inheritDoc}
*/
public function loadAssets()
{
$this->addJs('js/controllerbuilder.js', 'builder');
}
/*
* Event handlers
*/
//
// Methods for the internal use
//
protected function getBehaviorDesignTimeProvider($providerClass)
{
if (array_key_exists($providerClass, $this->designTimeProviders)) {
return $this->designTimeProviders[$providerClass];
}
return $this->designTimeProviders[$providerClass] = new $providerClass($this->controller);
}
protected function getPropertyValue($properties, $property)
{
if (array_key_exists($property, $properties)) {
return $properties[$property];
}
return null;
}
protected function propertiesToInspectorSchema($propertyConfiguration)
{
$result = [];
foreach ($propertyConfiguration as $property=>$propertyData) {
$propertyData['property'] = $property;
$result[] = $propertyData;
}
return $result;
}
protected function getBehaviorInfo($class)
{
if (array_key_exists($class, $this->behaviorInfoCache)) {
return $this->behaviorInfoCache[$class];
}
$library = ControllerBehaviorLibrary::instance();
$behaviorInfo = $library->getBehaviorInfo($class);
if (!$behaviorInfo) {
throw new ApplicationException('The requested behavior class information is not found.');
}
return $this->behaviorInfoCache[$class] = $behaviorInfo;
}
protected function renderBehaviorBody($behaviorClass, $behaviorInfo, $behaviorConfig)
{
$provider = $this->getBehaviorDesignTimeProvider($behaviorInfo['designTimeProvider']);
return $provider->renderBehaviorBody($behaviorClass, $behaviorConfig, $this);
}
}