typemill/plugins/demo/demo.php
2024-02-29 12:46:18 +01:00

400 lines
No EOL
11 KiB
PHP

<?php
namespace Plugins\demo;
use Typemill\Plugin;
use Typemill\Models\Validation;
use Plugins\demo\demoController;
use Plugins\Demo\Text;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
class demo extends Plugin
{
# you can add a licence check here
public static function setPremiumLicense()
{
# return false;
return 'MAKER';
# return 'BUSINESS';
}
# you can subscribe to the following events
public static function getSubscribedEvents()
{
return [
# all pages fired from system file
'onSettingsLoaded' => ['onSettingsLoaded', 0],
'onPluginsLoaded' => ['onPluginsLoaded', 0],
'onSessionSegmentsLoaded' => ['onSessionSegmentsLoaded', 0],
'onRolesPermissionsLoaded' => ['onRolesPermissionsLoaded', 0],
'onResourcesLoaded' => ['onResourcesLoaded', 0],
# admin area fired from navigation model
'onSystemnaviLoaded' => ['onSystemnaviLoaded', 0],
# all pages fired from controller
'onTwigLoaded' => ['onTwigLoaded', 0],
# only content pages fired from parsedown extension and controllerApiShortcode????
'onShortcodeFound' => ['onShortcodeFound', 0],
# frontend pages fired from ControllerWebFrontend
'onPagetreeLoaded' => ['onPagetreeLoaded', 0],
'onBreadcrumbLoaded' => ['onBreadcrumbLoaded', 0],
'onItemLoaded' => ['onItemLoaded', 0],
'onMarkdownLoaded' => ['onMarkdownLoaded', 0],
'onMetaLoaded' => ['onMetaLoaded', 0],
'onRestrictionsLoaded' => ['onRestrictionsLoaded', 0],
'onContentArrayLoaded' => ['onContentArrayLoaded', 0],
'onHtmlLoaded' => ['onHtmlLoaded', 0],
'onPageReady' => ['onPageReady', 0]
];
}
# you can add new routes for public, api, or admin-area
public static function addNewRoutes()
{
return [
# add a frontend route with a form
[
'httpMethod' => 'get',
'route' => '/demo',
'name' => 'demo.frontend',
'class' => 'Plugins\demo\DemoController:index',
# optionallly restrict page:
# 'resource' => 'account',
# 'privilege' => 'view'
],
# add a frontend route to receive form data
[
'httpMethod' => 'post',
'route' => '/demo',
'name' => 'demo.send',
'class' => 'Plugins\demo\DemoController:formdata',
# optionallly restrict page:
# 'resource' => 'account',
# 'privilege' => 'view'
],
# add an admin route
[
'httpMethod' => 'get',
'route' => '/tm/demo',
'name' => 'demo.admin',
'class' => 'Typemill\Controllers\ControllerWebSystem:blankSystemPage',
'resource' => 'system',
'privilege' => 'view'
],
# add an api route
[
'httpMethod' => 'get',
'route' => '/api/v1/demo',
'name' => 'demo.api',
'class' => 'Plugins\demo\demo:getDemoData',
'resource' => 'system',
'privilege' => 'view'
],
# add an api route
[
'httpMethod' => 'post',
'route' => '/api/v1/demo',
'name' => 'demo.api',
'class' => 'Plugins\demo\demo:storeDemoData',
'resource' => 'system',
'privilege' => 'view'
],
];
}
# you can add new middleware function, for example
public static function addNewMiddleware()
{
}
# settings are read only, you do not need to return anything
public function onSettingsLoaded($settings)
{
$data = $settings->getData();
# you also have access to settings from container through
# $this->getSettings()
# or access to the plugin settings (optionally with pluginname)
# $this->getPluginSettings()
}
# use this if you have any dependencies with other plugins and want to check if they are active
public function onPluginsLoaded($plugins)
{
$pluginnames = $plugins->getData();
$plugins->setData($pluginnames);
}
# you can add a new session segment in frontend, for example if you add frontend fomrs
public function onSessionSegmentsLoaded($segments)
{
$arrayOfSegments = $segments->getData();
$segments->setData($arrayOfSegments);
}
# add new roles and permission
public function onRolesPermissionsLoaded($rolespermissions)
{
$data = $rolespermissions->getData();
$rolespermissions->setData($data);
}
# add new resources for roles and permissions
public function onResourcesLoaded($resources)
{
$data = $resources->getData();
$resources->setData($data);
}
# add new navi-items into the system area
public function onSystemnaviLoaded($navidata)
{
$this->addSvgSymbol('<symbol id="icon-download" viewBox="0 0 24 24"><path d="M20 15v4c0 0.276-0.111 0.525-0.293 0.707s-0.431 0.293-0.707 0.293h-14c-0.276 0-0.525-0.111-0.707-0.293s-0.293-0.431-0.293-0.707v-4c0-0.552-0.448-1-1-1s-1 0.448-1 1v4c0 0.828 0.337 1.58 0.879 2.121s1.293 0.879 2.121 0.879h14c0.828 0 1.58-0.337 2.121-0.879s0.879-1.293 0.879-2.121v-4c0-0.552-0.448-1-1-1s-1 0.448-1 1zM13 12.586v-9.586c0-0.552-0.448-1-1-1s-1 0.448-1 1v9.586l-3.293-3.293c-0.391-0.391-1.024-0.391-1.414 0s-0.391 1.024 0 1.414l5 5c0.092 0.092 0.202 0.166 0.324 0.217s0.253 0.076 0.383 0.076c0.256 0 0.512-0.098 0.707-0.293l5-5c0.391-0.391 0.391-1.024 0-1.414s-1.024-0.391-1.414 0z"></path></symbol>');
$navi = $navidata->getData();
$navi['Demo'] = ['title' => 'Demo','routename' => 'demo.admin', 'icon' => 'icon-download', 'aclresource' => 'system', 'aclprivilege' => 'view'];
# if the use visits the system page of the plugin
if(trim($this->route,"/") == 'tm/demo')
{
# set the navigation item active
$navi['Demo']['active'] = true;
# add the system application
$this->addJS('/demo/js/systemdemo.js');
}
$navidata->setData($navi);
}
# the twig function is for everything you want to add and render in frontend
public function onTwigLoaded()
{
if($this->editorroute)
{
$this->addJS('/demo/js/editordemo.js');
}
# get the twig-object
# $twig = $this->getTwig();
# get the twig-template-loader
# $loader = $twig->getLoader();
# $loader->addPath(__DIR__ . '/templates');
# return $twig->render($this->container['response'], '/demo.twig', ['data' => 'data']);
# you can add assets to all twig-views
# $this->addInlineJS("console.info('my inline script;')");
# $this->addJS('/demo/js/script.js');
# you can add styles to all twig-views
# $this->addInlineCSS('h1{color:red;}');
# $this->addCSS('/demo/css/demo.css');
# you can add your own global variables to all twig-views.
# $this->addTwigGlobal('text', new Text());
# you can add your own filter function to twig.
# $this->addTwigFilter('rot13', function ($string) {
# return str_rot13($string);
# });
# you can add your own function to a twig-views *
# $this->addTwigFunction('myName', function(){
# return 'My name is ';
# });
}
# add a shortcode function to enhance the content area with new features
public function onShortcodeFound($shortcode)
{
# read the data of the shortcode
$shortcodeArray = $shortcode->getData();
# register your shortcode
if(is_array($shortcodeArray) && $shortcodeArray['name'] == 'registershortcode')
{
$shortcodeArray['data']['contactform'] = [];
$shortcode->setData($shortcodeArray);
}
# check if it is the shortcode name that we where looking for
if(is_array($shortcodeArray) && $shortcodeArray['name'] == 'contactform')
{
# we found our shortcode, so stop firing the event to other plugins
$shortcode->stopPropagation();
# get the public forms for the plugin
$contactform = $this->generateForm('demo.send');
# add to a page
# add as shortcode
# create new page
# and return a html-snippet that replaces the shortcode on the page.
$shortcode->setData($contactform);
}
}
# returns an array of item-objects, that represents the neavigation
public function onPagetreeLoaded($pagetree)
{
$data = $pagetree->getData();
$pagetree->setData($data);
}
# returns array of item objects that represent the breadcrumb
public function onBreadcrumbLoaded($breadcrumb)
{
$data = $breadcrumb->getData();
$breadcrumb->setData($data);
}
# returns the item of the current page
public function onItemLoaded($item)
{
$data = $item->getData();
$item->setData($data);
}
# returns the markdown of the current page
public function onMarkdownLoaded($markdown)
{
$data = $markdown->getData();
$markdown->setData($data);
}
# returns the metadata (array) of the current page
public function onMetaLoaded($meta)
{
$data = $meta->getData();
$meta->setData($data);
}
# returns array with restriced role, defaultcontent and full markdown array
public function onRestrictionsLoaded($restrictions)
{
$data = $restrictions->getData();
$restrictions->setData($data);
}
# returns the full content with ormats as an array
public function onContentArrayLoaded($contentArray)
{
$data = $contentArray->getData();
$contentArray->setData($data);
}
# returns the full content as html
public function onHtmlLoaded($html)
{
$data = $html->getData();
$html->setData($data);
}
# add a new page into the system area
public function onPageReady($data)
{
/*
# admin stuff
if($this->adminroute && $this->route == 'tm/demo')
{
$this->addJS('/ebookproducts/js/vue-ebookproducts.js');
$pagedata = $data->getData();
$twig = $this->getTwig();
$loader = $twig->getLoader();
$loader->addPath(__DIR__ . '/templates');
# fetch the template and render it with twig
$content = $twig->fetch('/ebookproducts.twig', []);
$pagedata['content'] = $content;
$data->setData($pagedata);
}
*/
}
#########################################
# Add methods for new routes #
#########################################
# gets the centrally stored ebook-data for ebook-plugin in settings-area
public function getDemoData(Request $request, Response $response, $args)
{
# gets file from /data/demo automatically, use getPluginData or getPluginYamlData
$formdata = $this->getPluginYamlData('demotest.yaml');
$response->getBody()->write(json_encode([
'formdata' => $formdata
]));
return $response->withHeader('Content-Type', 'application/json');
}
# gets the centrally stored ebook-data for ebook-plugin in settings-area
public function storeDemoData(Request $request, Response $response, $args)
{
$params = $request->getParsedBody();
# gets file from /data/demo automatically, use getPluginData or getPluginYamlData
$result = $this->storePluginYamlData('demotest.yaml', $params['formdata']);
if($result !== true)
{
$response->getBody()->write(json_encode([
'errors' => $result,
'message' => 'please correct the errors in the form.'
]));
return $response->withHeader('Content-Type', 'application/json')->withStatus(422);
}
$response->getBody()->write(json_encode([
'data' => $result,
'message' => 'data stored successfully.'
]));
return $response->withHeader('Content-Type', 'application/json');
}
}