diff --git a/src/BuildDirector/LegacyBuildDirector.php b/src/BuildDirector/LegacyBuildDirector.php new file mode 100644 index 0000000000000000000000000000000000000000..90e01620403535ff1d204cb9222cbc4be5e97177 --- /dev/null +++ b/src/BuildDirector/LegacyBuildDirector.php @@ -0,0 +1,37 @@ +<?php + +namespace WPDesk\PluginBuilder\BuildDirector; + +use WPDesk\PluginBuilder\Builder\AbstractBuilder; +use WPDesk\PluginBuilder\Plugin\AbstractPlugin; +use WPDesk\PluginBuilder\Storage\StorageFactory; + +class LegacyBuildDirector { + + /** @var AbstractBuilder */ + private $builder; + + public function __construct( AbstractBuilder $builder ) { + $this->builder = $builder; + } + + /** + * Builds plugin + */ + public function build_plugin() { + $this->builder->build_plugin(); + $this->builder->init_plugin(); + + $storage = new StorageFactory(); + $this->builder->store_plugin( $storage->create_storage() ); + } + + /** + * Returns built plugin + * + * @return AbstractPlugin + */ + public function get_plugin() { + return $this->builder->get_plugin(); + } +} \ No newline at end of file diff --git a/src/Builder/AbstractBuilder.php b/src/Builder/AbstractBuilder.php index 296089c714749a62a3d0aa3ae3f6a820a975661b..592c969e1c31e68243ade2e929314424866be3dc 100644 --- a/src/Builder/AbstractBuilder.php +++ b/src/Builder/AbstractBuilder.php @@ -3,31 +3,62 @@ namespace WPDesk\PluginBuilder\Builder; use WPDesk\PluginBuilder\Plugin\AbstractPlugin; +use WPDesk\PluginBuilder\Storage\PluginStorage; -class AbstractBuilder { - protected static $instances = []; +abstract class AbstractBuilder { + /** + * Create plugin class + */ + public function build_plugin() { + } /** - * @param string $class - * @param AbstractPlugin $object + * Store plugin class in some kind of storage */ - protected function addToStorage( $class, $object ) { - if ( isset( self::$instances[ $class ] ) ) { - throw new Exception\ClassAlreadyExists( "Class {$class} already exists" ); - } - self::$instances[ $class ] = $object; + public function store_plugin( PluginStorage $storage ) { } /** - * @param string $class - * + * Init plugin internal structure + */ + public function init_plugin() { + } + + /** + * Return built plugin * @return AbstractPlugin */ - protected function getFromStorage( $class ) { - if ( isset( self::$instances[ $class ] ) ) { - return self::$instances[ $class ]; - } else { - throw new Exception\ClassNotExists( "Class {$class} not exists in storage" ); - } + abstract function get_plugin(); + + /** + * Set settings class in plugin + * + * @param $settings + */ + public function set_settings( $settings ) { + } + + /** + * Set view class in plugin + * + * @param $view + */ + public function set_view( $view ) { + } + + /** + * Set tracker class in plugin + * + * @param $tracker + */ + public function set_tracker( $tracker ) { + } + + /** + * Set helper class in plugin + * + * @param $helper + */ + public function set_helper( $helper ) { } } \ No newline at end of file diff --git a/src/Builder/InfoBuilder.php b/src/Builder/InfoBuilder.php index c3e75f379ad4b562582f099861155da7bfc38198..7afa279fc239574d0f17720b1c1412becc3aa2d2 100644 --- a/src/Builder/InfoBuilder.php +++ b/src/Builder/InfoBuilder.php @@ -3,40 +3,51 @@ namespace WPDesk\PluginBuilder\Builder; use WPDesk\PluginBuilder\Plugin\AbstractPlugin; +use WPDesk\PluginBuilder\Storage\PluginStorage; class InfoBuilder extends AbstractBuilder { const FILTER_PLUGIN_CLASS = 'wp_builder_plugin_class'; const HOOK_BEFORE_PLUGIN_INIT = 'wp_builder_before_plugin_init'; const HOOK_AFTER_PLUGIN_INIT = 'wp_builder_before_init'; + /** @var AbstractPlugin */ + private $plugin; + + /** @var \WPDesk_Buildable */ + private $info; + + /** @var string */ + protected $storage_id; + + public function __construct( \WPDesk_Buildable $info ) { + $this->info = $info; + $this->storage_id = $info->get_class_name(); + } + /** * Builds instance of plugin - * - * @param \WPDesk_Plugin_Info $info - * @return AbstractPlugin - * - * @return AbstractPlugin */ - public function build_from_info( \WPDesk_Buildable $info ) { - $class_name = apply_filters( self::FILTER_PLUGIN_CLASS, $info->get_class_name() ); + public function build_plugin() { + $class_name = apply_filters( self::FILTER_PLUGIN_CLASS, $this->info->get_class_name() ); /** @var AbstractPlugin $plugin */ - $plugin = new $class_name( $info ); - $this->addToStorage( $info->get_class_name(), $plugin ); + $this->plugin = new $class_name( $this->info ); + } - do_action( self::HOOK_BEFORE_PLUGIN_INIT, $plugin ); - $plugin->init(); - do_action( self::HOOK_AFTER_PLUGIN_INIT, $plugin ); + public function store_plugin( PluginStorage $storage ) { + $storage->add_to_storage( $this->storage_id, $this->plugin ); + } - return $plugin; + public function init_plugin() { + do_action( self::HOOK_BEFORE_PLUGIN_INIT, $this->plugin ); + $this->plugin->init(); + do_action( self::HOOK_AFTER_PLUGIN_INIT, $this->plugin ); } /** - * @param string $class - * * @return AbstractPlugin */ - public function get_plugin_instance( $class ) { - return $this->getFromStorage( $class ); + public function get_plugin() { + return $this->plugin; } } \ No newline at end of file diff --git a/src/Plugin/AbstractPlugin.php b/src/Plugin/AbstractPlugin.php index 709e5d6402caea8159b8103f519752673b29e684..ca5824b3cb1114f2c0bb86fd3a3f56de7f59d142 100644 --- a/src/Plugin/AbstractPlugin.php +++ b/src/Plugin/AbstractPlugin.php @@ -11,9 +11,9 @@ namespace WPDesk\PluginBuilder\Plugin; abstract class AbstractPlugin implements \WPDesk_Translable { /** @var \WPDesk_Plugin_Info */ - protected $plugin_info; + protected $plugin_info; - /** @var string */ + /** @var string */ protected $plugin_namespace; /** @var string */ @@ -24,128 +24,128 @@ abstract class AbstractPlugin implements \WPDesk_Translable { /** @var string */ protected $settings_url; - + /** * AbstractPlugin constructor. * * @param \WPDesk_Plugin_Info $plugin_info */ - public function __construct( $plugin_info ) { - $this->plugin_info = $plugin_info; - $this->plugin_namespace = strtolower($plugin_info->get_plugin_dir()); - } - - public function init() { - $this->init_base_variables(); - $this->hooks(); - } - - /** - * @return $this - */ - public function get_plugin() { - return $this; - } - - /** - * @return string - */ - public function get_text_domain() { - return $this->plugin_info->get_text_domain(); - } - - /** - * @return void - */ - public function load_plugin_text_domain() { - load_plugin_textdomain( $this->get_text_domain(), false, $this->get_namespace() . '/lang/' ); - } - - public function init_base_variables( ) { - $this->plugin_url = plugin_dir_url( $this->plugin_info->get_plugin_dir() ); - } - - /** - * @return void - */ - protected function hooks() { - add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) ); - - add_action( 'wp_enqueue_scripts', array( $this, 'wp_enqueue_scripts' ) ); - - add_action( 'plugins_loaded', array( $this, 'load_plugin_text_domain' ) ); - add_filter( 'plugin_action_links_' . plugin_basename( $this->get_plugin_file_path() ), array( - $this, - 'links_filter' - ) ); - - } - - /** - * - * @return string - */ - public function get_plugin_url() { - return esc_url( trailingslashit( $this->plugin_url ) ); - } - - public function get_plugin_assets_url() { - return esc_url( trailingslashit( $this->get_plugin_url() . 'assets' ) ); - } - - /** - * @return string - */ - public function get_plugin_file_path() { - return $this->plugin_info->get_plugin_dir(); - } - - /** - * @return string - */ - public function get_namespace() { - return $this->plugin_namespace; - } - - public function admin_enqueue_scripts( ) { - } - - public function wp_enqueue_scripts() { - } - - /** - * action_links function. - * - * @access public - * - * @param mixed $links - * - * @return array - */ - public function links_filter( $links ) { - $support_link = get_locale() === 'pl_PL' ? 'https://www.wpdesk.pl/support/' : 'https://www.wpdesk.net/support'; - - $plugin_links = array( - '<a href="' . $support_link . '">' . __( 'Support', $this->get_text_domain() ) . '</a>', - ); - $links = array_merge( $plugin_links, $links ); - - if ( $this->docs_url ) { - $plugin_links = array( - '<a href="' . $this->docs_url . '">' . __( 'Docs', $this->get_text_domain() ) . '</a>', - ); - $links = array_merge( $plugin_links, $links ); - } - - if ( $this->settings_url ) { - $plugin_links = array( - '<a href="' . $this->settings_url . '">' . __( 'Settings', $this->get_text_domain() ) . '</a>', - ); - $links = array_merge( $plugin_links, $links ); - } - - return $links; - } + public function __construct( $plugin_info ) { + $this->plugin_info = $plugin_info; + $this->plugin_namespace = strtolower( $plugin_info->get_plugin_dir() ); + } + + public function init() { + $this->init_base_variables(); + $this->hooks(); + } + + public function init_base_variables() { + $this->plugin_url = plugin_dir_url( $this->plugin_info->get_plugin_dir() ); + } + + /** + * @return void + */ + protected function hooks() { + add_action( 'admin_enqueue_scripts', [ $this, 'admin_enqueue_scripts' ] ); + + add_action( 'wp_enqueue_scripts', [ $this, 'wp_enqueue_scripts' ] ); + + add_action( 'plugins_loaded', [ $this, 'load_plugin_text_domain' ] ); + add_filter( 'plugin_action_links_' . plugin_basename( $this->get_plugin_file_path() ), [ + $this, + 'links_filter' + ] ); + + } + + /** + * @return string + */ + public function get_plugin_file_path() { + return $this->plugin_info->get_plugin_dir(); + } + + /** + * @return $this + */ + public function get_plugin() { + return $this; + } + + /** + * @return void + */ + public function load_plugin_text_domain() { + load_plugin_textdomain( $this->get_text_domain(), false, $this->get_namespace() . '/lang/' ); + } + + /** + * @return string + */ + public function get_text_domain() { + return $this->plugin_info->get_text_domain(); + } + + /** + * @return string + */ + public function get_namespace() { + return $this->plugin_namespace; + } + + public function get_plugin_assets_url() { + return esc_url( trailingslashit( $this->get_plugin_url() . 'assets' ) ); + } + + /** + * + * @return string + */ + public function get_plugin_url() { + return esc_url( trailingslashit( $this->plugin_url ) ); + } + + public function admin_enqueue_scripts() { + } + + public function wp_enqueue_scripts() { + } + + /** + * action_links function. + * + * @access public + * + * @param mixed $links + * + * @return array + */ + public function links_filter( $links ) { + $support_link = get_locale() === 'pl_PL' ? 'https://www.wpdesk.pl/support/' : 'https://www.wpdesk.net/support'; + + $plugin_links = [ + '<a href="' . $support_link . '">' . __( 'Support', $this->get_text_domain() ) . '</a>', + ]; + $links = array_merge( $plugin_links, $links ); + + if ( $this->docs_url ) { + $plugin_links = [ + '<a href="' . $this->docs_url . '">' . __( 'Docs', $this->get_text_domain() ) . '</a>', + ]; + $links = array_merge( $plugin_links, $links ); + } + + if ( $this->settings_url ) { + $plugin_links = [ + '<a href="' . $this->settings_url . '">' . __( 'Settings', $this->get_text_domain() ) . '</a>', + ]; + $links = array_merge( $plugin_links, $links ); + } + + return $links; + } } diff --git a/src/Builder/Exception/ClassAlreadyExists.php b/src/Storage/Exception/ClassAlreadyExists.php similarity index 55% rename from src/Builder/Exception/ClassAlreadyExists.php rename to src/Storage/Exception/ClassAlreadyExists.php index 2b69111bc281e6f2882ea2a0f1d2570d3867f500..7fb8a0b7116e9548c0b4899b4ea95090abe478c4 100644 --- a/src/Builder/Exception/ClassAlreadyExists.php +++ b/src/Storage/Exception/ClassAlreadyExists.php @@ -1,6 +1,6 @@ <?php -namespace WPDesk\PluginBuilder\Builder\Exception; +namespace WPDesk\PluginBuilder\Storage\Exception; class ClassAlreadyExists extends \RuntimeException { diff --git a/src/Builder/Exception/ClassNotExists.php b/src/Storage/Exception/ClassNotExists.php similarity index 54% rename from src/Builder/Exception/ClassNotExists.php rename to src/Storage/Exception/ClassNotExists.php index bbcfe32efed7b4946626d581d5844f25e6bfae20..d873f70655c0b76fcf0b1b89d232d3cdc564e38d 100644 --- a/src/Builder/Exception/ClassNotExists.php +++ b/src/Storage/Exception/ClassNotExists.php @@ -1,6 +1,6 @@ <?php -namespace WPDesk\PluginBuilder\Builder\Exception; +namespace WPDesk\PluginBuilder\Storage\Exception; class ClassNotExists extends \RuntimeException { diff --git a/src/Storage/PluginStorage.php b/src/Storage/PluginStorage.php new file mode 100644 index 0000000000000000000000000000000000000000..e8a5fce580aaf5bd7acf53ef131fdad9f7ceacb9 --- /dev/null +++ b/src/Storage/PluginStorage.php @@ -0,0 +1,22 @@ +<?php + +namespace WPDesk\PluginBuilder\Storage; + +use WPDesk\PluginBuilder\Plugin\AbstractPlugin; + +interface PluginStorage { + + /** + * @param string $class + * @param AbstractPlugin $object + */ + public function add_to_storage( $class, $object ); + + /** + * @param string $class + * + * @return AbstractPlugin + */ + public function get_from_storage( $class ); +} + diff --git a/src/Storage/StaticStorage.php b/src/Storage/StaticStorage.php new file mode 100644 index 0000000000000000000000000000000000000000..bae150dd37e7a1c6784801c22f50da95539a27dd --- /dev/null +++ b/src/Storage/StaticStorage.php @@ -0,0 +1,34 @@ +<?php + +namespace WPDesk\PluginBuilder\Storage; + +use WPDesk\PluginBuilder\Plugin\AbstractPlugin; + +class StaticStorage implements PluginStorage { + protected static $instances = []; + + /** + * @param string $class + * @param AbstractPlugin $object + */ + public function add_to_storage( $class, $object ) { + if ( isset( self::$instances[ $class ] ) ) { + throw new Exception\ClassAlreadyExists( "Class {$class} already exists" ); + } + self::$instances[ $class ] = $object; + } + + /** + * @param string $class + * + * @return AbstractPlugin + */ + public function get_from_storage( $class ) { + if ( isset( self::$instances[ $class ] ) ) { + return self::$instances[ $class ]; + } else { + throw new Exception\ClassNotExists( "Class {$class} not exists in storage" ); + } + } +} + diff --git a/src/Storage/StorageFactory.php b/src/Storage/StorageFactory.php new file mode 100644 index 0000000000000000000000000000000000000000..8a1422f53e033dc1fc3b1da9cf1dee71a302f23a --- /dev/null +++ b/src/Storage/StorageFactory.php @@ -0,0 +1,14 @@ +<?php + +namespace WPDesk\PluginBuilder\Storage; + +class StorageFactory { + + /** + * @return PluginStorage + */ + public function create_storage() { + return new StaticStorage(); + } +} +