Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Extended plugin for Webasyst framework
<?php
/**
* Extended plugin for Webasyst framework.
*/
class waExtendedPlugin extends waPlugin
{
/**
* @var string
*/
protected $pluginUrl;
/**
* @var string
*/
protected $dataPath;
/**
* @var string
*/
protected $dataUrl;
/**
* @var string
*/
protected $themePath;
/**
* Create plugin object.
* @param array $info
* @return void
*/
public function __construct($info)
{
parent::__construct($info);
$this->pluginUrl = '?plugin=' . $this->id . '&';
}
/**
* Get plugin ID.
* @return string
*/
public function getId()
{
return $this->id;
}
/**
* Get path to plugin folder.
* @param string $path
* @return string
*/
public function getPath($path = '')
{
if ($path) {
$path = '/'. ltrim($path, '\/');
}
return $this->path . $path;
}
/**
* Get path to data folder of plugin.
* @param string $path
* @param bool $create
* @return string
*/
public function getDataPath($path = '', $create = false)
{
if (!$this->dataPath) {
$this->dataPath = wa($this->app_id)->getDataPath('plugins/' . $this->id, true);
}
if ($path) {
$path = '/' . ltrim($path, '\/');
}
if ($create) {
return wa($this->app_id)->getDataPath('plugins/' . $this->id . $path, true);
}
return $this->dataPath . $path;
}
/**
* Get image URL.
* @param string $path
* @param string $size
* @return string
*/
public function getDataUrl($path = '')
{
if (!$this->dataUrl) {
$this->dataUrl = wa()->getDataUrl('plugins/' . $this->id . '/', true, $this->app_id, true);
}
if ($path) {
$path = ltrim($path, '/');
}
return $this->dataUrl . $path;
}
/**
* Get URL for plugin action in backend.
* @param string $action
* @param array $params
* @return string
*/
public function getActionUrl($action, array $params = array())
{
return $this->pluginUrl . http_build_query(array('action' => $action) + $params);
}
/**
* Get rendered view.
* @param string $template path to template or template as string
* @param array $data variables
* @param bool $themeCopy Load template from theme?
* @return string
*/
public function renderTemplate($template, array $data = array(), $themeCopy = false)
{
$view = wa($this->app_id)->getView();
$data[$this->id] = $this;
$view->assign($data);
if (strpos($template, 'string:') === false && !file_exists($template)) {
$extension = $view->getPostfix();
if (pathinfo($template, PATHINFO_EXTENSION) !== ltrim($extension, '.')) {
$template .= $extension;
}
if ($themeCopy) {
$theme = new waTheme(waRequest::getTheme(), $this->app_id);
// Plugin templates in theme contains at "appId_pluginId" folder.
$dir = $this->app_id . '/' . $this->id . '/' . pathinfo($template, PATHINFO_DIRNAME);
$dir = rtrim($dir, '/');
$filename = pathinfo($template, PATHINFO_BASENAME);
$themeTemplate = $dir . '/' . $filename;
// If template not exists in theme, copy from plugin.
if (!$view->setThemeTemplate($theme, $themeTemplate)) {
waFiles::copy($this->getPath('templates/' . $template), $theme->getPath() . '/' . $dir);
$theme->addFile($themeTemplate, $this->getName())->save();
}
$template = $themeTemplate;
} else {
$view->setTemplateDir($this->getPath('templates'));
}
}
return $view->fetch($template);
}
}
@genasyst

This comment has been minimized.

Copy link

genasyst commented Feb 21, 2018

Все плагины приложений, должны быть наследованы от класса плагигов приложения (shopPlugin,crmPlugin), которые наследованы от waPlugin. И куда ты эту абстракцию всунешь? единственный вариант брать такой класс в файлы плагина и там уже собирать его, а сам класс плагина наследовать от него, но это костыли!

@WinterSilence

This comment has been minimized.

Copy link
Owner Author

WinterSilence commented Feb 21, 2018

@genasyst

Все плагины приложений, должны быть наследованы от класса плагигов приложения (shopPlugin,crmPlugin), которые наследованы от waPlugin

Я в курсе, это просто пример.

И куда ты эту абстракцию всунешь?

На деле же имеется аналог плагина dummy, в котором класс плагина выглядит как в данном примере и я оставляю те методы которые нужны в конкретном плагине (хотя в большинстве "больших" плагинов нужны все).

Данный класс решает намного больше задач, непосредственно к шаблонам относятся только 3 метода.

@genasyst

This comment has been minimized.

Copy link

genasyst commented Feb 21, 2018

Концепция сборки нужных методов тоже хороша, но собирать лень, да и в один класс не уложиться

@WinterSilence

This comment has been minimized.

Copy link
Owner Author

WinterSilence commented Feb 21, 2018

@genasyst

да и в один класс не уложиться

А этого и не нужно, класс плагина по сути реализует паттерн Facade. Все методы waExtendedPlugin (кроме getThemeTemplate, я добавил его только для твоего случая) относятся непосредственно к плагину и поэтому находятся в классе плагина.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.