PageRenderTime 26ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/classes/Extension/Controller.php

https://github.com/volcanicpixels/Lava
PHP | 179 lines | 135 code | 32 blank | 12 comment | 23 complexity | 0c7157a6dcdb3ce6a43cdd9f14af8d2a MD5 | raw file
  1. <?php
  2. /**
  3. * @package Lava
  4. * @subpackage Extensions
  5. * @author Daniel Chatfield
  6. *
  7. * @since 1.0.0
  8. */
  9. class Lava_Extension_Controller extends Lava_Setting_Controller {
  10. public $_extensions = array();
  11. public $_extension_meta = array();
  12. public $_extension_paths = array();
  13. public $_controller_namespace = 'extension';
  14. public $_extension_dropins = array();
  15. function _init_extension( $class_name ) {
  16. $args = $this->_recall( 'extension_args' );
  17. $args[0]->_extensions[ $args[2] ] = $this->_construct_class( $class_name, $args );
  18. }
  19. function _parent__get_extension_dirname( $extension_id ) {
  20. $extension = explode( '.', $extension_id );
  21. unset( $extension[0] );
  22. return implode('.', $extension);
  23. }
  24. function _parent__get_extension_path( $extension_id, $append = '' ) {
  25. if( !array_key_exists( $extension_id, $this->_extension_paths ) ) {
  26. $extension_debris = explode( '.', $extension_id );
  27. $append_ = '/' . $this->_get_controller_namespace( true ) . '/' . $this->_get_extension_dirname( $extension_id );
  28. if( $extension_debris[0] == 'plugin' ) {
  29. $this->_extension_paths[ $extension_id ] = $this->_get_plugin_path( $append_ );
  30. } else {
  31. $this->_extension_paths[ $extension_id ] = $this->_get_customisations_path( $append_ );
  32. }
  33. }
  34. return $this->_extension_paths[ $extension_id ] . $append;
  35. }
  36. function _get_extension_url( $extension_id, $append = '' ) {
  37. $extension_id_debris = explode( '.', $extension_id );
  38. $append = '/' . $this->_get_controller_namespace( true ) . '/' . $this->_get_extension_dirname( $extension_id ) . $append;
  39. if( $extension_id_debris[0] == 'plugin' ) {
  40. return $this->_get_plugin_url( $append );
  41. } else {
  42. return $this->_get_customisations_url( $append );
  43. }
  44. }
  45. /*
  46. */
  47. function _load_extensions() {
  48. //actually loads the extensions
  49. if( $this->_get_controller_namespace() == 'extension' and $this->_the_plugin->_load_vendor ) {
  50. $this->_load_extension( 'plugin.vendor' );
  51. }
  52. $extensions = $this->_get_option();
  53. foreach( $extensions as $extension_id => $active ) {
  54. if( $active == 'on' ) {
  55. $this->_load_extension( $extension_id );
  56. }
  57. }
  58. }
  59. function _load_extension( $extension_id ) {
  60. $path = $this->_get_extension_path( $extension_id );
  61. //check whether an extension.php file exists
  62. $args = array(
  63. $this,
  64. $path,
  65. $extension_id
  66. );
  67. $extension_path = $this->_get_extension_path( $extension_id, '/' . $this->_get_controller_namespace() . '.php' );
  68. if( file_exists( $extension_path ) ) {
  69. $this->_extensions()->_remember( 'extension_args', $args );
  70. require_once( $extension_path );
  71. }
  72. if( !array_key_exists( $extension_id, $this->_extensions ) ) {
  73. $class_name = $this->_class( $this->_get_controller_namespace() );
  74. $this->_extensions[ $extension_id ] = $this->_construct_class( $class_name, $args );
  75. }
  76. }
  77. function _get_extension( $extension_id ) {
  78. if( !array_key_exists( $extension_id, $this->_extensions ) ) {
  79. $this->_load_extension( $extension_id );
  80. }
  81. return $this->_extensions[ $extension_id ];
  82. }
  83. function _get_extension_meta( $extension_id, $filter = true ) {
  84. if( !array_key_exists( $extension_id, $this->_extension_meta ) ) {
  85. $meta_path = $this->_parent__get_extension_path( $extension_id, '/' . $this->_get_controller_namespace() . '.yaml' );
  86. $this->_extension_meta[ $extension_id ] = $this->_functions()->_load_yaml( $meta_path, true );
  87. }
  88. $meta = $this->_extension_meta[ $extension_id ];
  89. $default_meta = array(
  90. 'name' => $extension_id,
  91. 'auto_enable' => 'off',
  92. 'version' => '1.0.0',
  93. 'description' => ''
  94. );
  95. if( $filter ) {
  96. $meta = array_merge( $default_meta, $meta );
  97. if( !array_key_exists( 'title', $meta ) ) {
  98. $meta['title'] = $meta['name'];
  99. }
  100. }
  101. return $meta;
  102. }
  103. function _register_extensions() {
  104. $append = '/' . $this->_get_controller_namespace( true ) . '/*';
  105. $plugin_extension_paths = glob( $this->_get_plugin_path( $append ), GLOB_ONLYDIR );
  106. $custom_extension_paths = glob( $this->_get_customisations_path( $append ), GLOB_ONLYDIR );
  107. foreach( $plugin_extension_paths as $path ) {
  108. if( file_exists( $path . '/' . $this->_get_controller_namespace() . '.yaml' ) ) {
  109. $path_debris = explode( '/', $this->_path( $path ) );
  110. $extension_dir_name = end( $path_debris );
  111. if( substr( $extension_dir_name, 0, 1) != '_') {
  112. $extension_id = 'plugin.' . $extension_dir_name;
  113. $this->_extension_paths[ $extension_id ] = $path;
  114. if( $extension_id != 'plugin.vendor' ) {
  115. $this->_register_extension( $extension_id );
  116. }
  117. }
  118. }
  119. }
  120. if( !is_array( $custom_extension_paths ) ) {
  121. $custom_extension_paths = array($custom_extension_paths);
  122. }
  123. foreach( $custom_extension_paths as $path ) {
  124. $path = explode( '/', $this->_path( $path ) );
  125. $extension_id = 'custom.' . end( $path );
  126. $this->_register_extension( $extension_id );
  127. }
  128. }
  129. function _register_extension( $extension_id ) {
  130. $meta = $this->_get_extension_meta( $extension_id );
  131. $args = array(
  132. 'title' => $meta['title'],
  133. 'default' => $meta['auto_enable'],
  134. 'scene' => 'Settings_Extensions',
  135. 'page' => 'extensions'
  136. );
  137. $this->_add_setting( $extension_id, 'extension' )->_parse_vars( $args );
  138. }
  139. function _add_dropin( $dropin ) {
  140. $this->_extension_dropins[ $dropin ] = true;
  141. }
  142. function _dropin_exists( $dropin ) {
  143. return array_key_exists( $dropin, $this->_extension_dropins );
  144. }
  145. }
  146. ?>