PageRenderTime 42ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 1ms

/administrator/components/com_virtuemart/classes/ps_module.php

https://github.com/Shigaru/shigaru
PHP | 387 lines | 251 code | 52 blank | 84 comment | 64 complexity | 73ced4d9363df634f0a56e39d6786d17 MD5 | raw file
  1. <?php
  2. if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' );
  3. /**
  4. *
  5. * @version $Id: ps_module.php 1660 2009-02-22 17:05:02Z tkahl $
  6. * @package VirtueMart
  7. * @subpackage classes
  8. * @copyright Copyright (C) 2004-2007 soeren - All rights reserved.
  9. * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php
  10. * VirtueMart is free software. This version may have been modified pursuant
  11. * to the GNU General Public License, and as distributed it includes or
  12. * is derivative of works licensed under the GNU General Public License or
  13. * other free or open source software licenses.
  14. * See /administrator/components/com_virtuemart/COPYRIGHT.php for copyright notices and details.
  15. *
  16. * http://virtuemart.net
  17. */
  18. /**
  19. * VirtueMart "Core Module" Management
  20. *
  21. */
  22. class vm_ps_module {
  23. /**
  24. * Validates the Input Parameters onBeforeModuleAdd
  25. *
  26. * @param array $d
  27. * @return boolean
  28. */
  29. function validate_add(&$d) {
  30. global $db, $vmLogger, $VM_LANG;
  31. if ( empty($d[ 'module_name' ] )) {
  32. $vmLogger->err ( $VM_LANG->_('VM_MODULE_ERR_NAME') );
  33. return False;
  34. }
  35. else {
  36. $q = "SELECT count(*) as rowcnt from #__{vm}_module where module_name='" . $db->getEscaped( $d[ 'module_name' ] ) . "'";
  37. $db->query($q);
  38. $db->next_record();
  39. if ($db->f("rowcnt") > 0) {
  40. $vmLogger->err( $VM_LANG->_('VM_MODULE_ERR_EXISTS') );
  41. return False;
  42. }
  43. }
  44. if ( empty($d[ 'module_perms' ]) ) {
  45. $vmLogger->err( $VM_LANG->_('VM_MODULE_ERR_PERMS') );
  46. return false;
  47. }
  48. if (empty( $d[ 'list_order' ] ) ) {
  49. $d[ 'list_order' ] = "99";
  50. }
  51. return True;
  52. }
  53. /**
  54. * Validates the Input Parameters onBeforeModuleUpdate
  55. *
  56. * @param array $d
  57. * @return boolean
  58. */
  59. function validate_update(&$d) {
  60. global $vmLogger, $VM_LANG;
  61. if ( empty($d[ 'module_name' ] )) {
  62. $vmLogger->err ( $VM_LANG->_('VM_MODULE_ERR_NAME') );
  63. return False;
  64. }
  65. else {
  66. $db = new ps_DB();
  67. $q = "SELECT COUNT(*) AS rowcnt FROM #__{vm}_module WHERE module_name='" . $db->getEscaped( $d[ 'module_name' ] ) . "' AND module_id <> ".(int)$d['module_id'];
  68. $db->query($q);
  69. $db->next_record();
  70. if ($db->f("rowcnt") > 0) {
  71. $vmLogger->err( $VM_LANG->_('VM_MODULE_ERR_EXISTS') );
  72. return False;
  73. }
  74. }
  75. if ( empty($d[ 'module_perms' ]) ) {
  76. $vmLogger->err( $VM_LANG->_('VM_MODULE_ERR_PERMS') );
  77. return false;
  78. }
  79. if (empty( $d[ 'list_order' ] ) ) {
  80. $d[ 'list_order' ] = "99";
  81. }
  82. return True;
  83. }
  84. /**
  85. * Validates the Input Parameters onBeforeModuleDelete
  86. *
  87. * @param array $d
  88. * @return boolean
  89. */
  90. function validate_delete($module_id) {
  91. global $db, $vmLogger, $VM_LANG;
  92. if (empty($module_id)) {
  93. $vmLogger->err( $VM_LANG->_('VM_MODULE_ERR_DELETE_SELECT') );
  94. return False;
  95. }
  96. $db->query( 'SELECT module_name FROM #__{vm}_module WHERE module_id='.(int)$module_id );
  97. $db->next_record();
  98. $name = $db->f("module_name");
  99. if( $this->is_core( $name ) ) {
  100. $vmLogger->err( str_replace('{name}',$name,$VM_LANG->_('VM_MODULE_ERR_DELETE_CORE')) );
  101. return false;
  102. }
  103. return True;
  104. }
  105. /**
  106. * Adds a new module into the core module register
  107. *
  108. * @param array $d
  109. * @return boolean
  110. */
  111. function add(&$d) {
  112. global $db, $VM_LANG;
  113. $timestamp = time();
  114. if (!$this->validate_add($d)) {
  115. $d[ 'error' ] = $this->error;
  116. return False;
  117. }
  118. if( is_array( $d[ 'module_perms' ] )) {
  119. $d[ 'module_perms' ] = implode( ',', $d[ 'module_perms' ] );
  120. }
  121. $fields = array( 'module_name' => vmGet( $d, 'module_name' ),
  122. 'module_perms' => vmGet( $d, 'module_perms' ),
  123. 'module_description' => vmGet( $d, 'module_description' ),
  124. 'module_publish' => vmGet( $d, 'module_publish'),
  125. 'list_order' => vmRequest::getInt('list_order')
  126. );
  127. $db->buildQuery( 'INSERT', '#__{vm}_module', $fields );
  128. if( $db->query() !== false ) {
  129. $_REQUEST['module_id'] = $db->last_insert_id();
  130. $GLOBALS['vmLogger']->info( $VM_LANG->_('VM_MODULE_ADDED') );
  131. return True;
  132. }
  133. return false;
  134. }
  135. /**
  136. * Updates information about a core module
  137. *
  138. * @param array $d
  139. * @return boolean
  140. */
  141. function update(&$d) {
  142. global $db, $VM_LANG;
  143. $timestamp = time();
  144. if (!$this->validate_update($d)) {
  145. $d[ 'error' ] = $this->error;
  146. return False;
  147. }
  148. if( is_array( $d[ 'module_perms' ] )) {
  149. $d[ 'module_perms' ] = implode( ',', $d[ 'module_perms' ] );
  150. }
  151. $fields = array( 'module_name' => vmGet( $d, 'module_name' ),
  152. 'module_perms' => vmGet( $d, 'module_perms' ),
  153. 'module_description' => vmGet( $d, 'module_description' ),
  154. 'module_publish' => vmGet( $d, 'module_publish'),
  155. 'list_order' => vmRequest::getInt('list_order')
  156. );
  157. $db->buildQuery( 'UPDATE', '#__{vm}_module', $fields, ' WHERE module_id='.intval( $d[ 'module_id' ] ) );
  158. if( $db->query() !== false ) {
  159. $GLOBALS['vmLogger']->info( $VM_LANG->_('VM_MODULE_UPDATED') );
  160. return True;
  161. }
  162. return false;
  163. }
  164. /**
  165. * Controller for Deleting Records.
  166. */
  167. function delete(&$d) {
  168. $record_id = $d["module_id"];
  169. if( is_array( $record_id)) {
  170. foreach( $record_id as $record) {
  171. if( !$this->delete_record( $record, $d ))
  172. return false;
  173. }
  174. return true;
  175. }
  176. else {
  177. return $this->delete_record( $record_id, $d );
  178. }
  179. }
  180. /**
  181. * Deletes one Record.
  182. */
  183. function delete_record( $record_id, &$d ) {
  184. global $db;
  185. if (!$this->validate_delete($record_id)) {
  186. $d[ 'error' ]=$this->error;
  187. return False;
  188. }
  189. $q = 'DELETE from #__{vm}_function WHERE module_id='.(int)$record_id;
  190. $db->query($q);
  191. $q = 'DELETE FROM #__{vm}_module WHERE module_id='.(int)$record_id;
  192. $db->query($q);
  193. return true;
  194. }
  195. function update_permissions( &$d ) {
  196. $db = new ps_DB;
  197. $i = 0;
  198. foreach( $d['module_perms'] as $module ) {
  199. $modules = implode(',', array_keys($module) );
  200. $module_id=(int)$d['module_id'][$i];
  201. $db->buildQuery('UPDATE', '#__{vm}_module', array('module_perms' => $modules ), 'WHERE module_id='.$module_id );
  202. $db->query();
  203. $i++;
  204. }
  205. return true;
  206. }
  207. function is_core( $module ) {
  208. return( $module == "shop" || $module == "vendor" || $module == "product" || $module == "store" || $module == "order" || $module == "admin"
  209. || $module == "checkout" || $module == "account" );
  210. }
  211. /**
  212. * Returns the permissions for a module
  213. *
  214. * @param string $basename
  215. * @return mixed
  216. */
  217. function get_dir($basename) {
  218. $datab = new ps_DB;
  219. $results = array();
  220. $q = "SELECT module_perms FROM #__{vm}_module where module_name='".$basename."'";
  221. $datab->query($q);
  222. if ($datab->next_record()) {
  223. $results[ 'perms' ] = $datab->f("module_perms");
  224. return $results;
  225. }
  226. else {
  227. return false;
  228. }
  229. }
  230. function get_modules( $order_by='module_name' ) {
  231. switch ($order_by) {
  232. case'module_name':
  233. case'module_id':
  234. case'list_order':
  235. break;
  236. default:
  237. $order_by = 'module_name';
  238. }
  239. $db = new ps_DB();
  240. $db->query('SELECT module_id, module_name FROM #__{vm}_module ORDER BY '.$order_by);
  241. return $db;
  242. }
  243. /**
  244. * This function returns a drop down list of all available core modules in VirtueMart
  245. * @since 1.1.0
  246. * @param string $list_name
  247. * @param mixed $module
  248. * @param boolean $multiple
  249. * @return string
  250. */
  251. function list_modules( $list_name, $module='', $multiple=false ) {
  252. $db = ps_module::get_modules();
  253. $array = array();
  254. while( $db->next_record() ) {
  255. $array[$db->f('module_name')] = $db->f('module_name');
  256. }
  257. if( $multiple ) {
  258. return ps_html::selectList( $list_name, $module, $array, 4, 'multiple="multiple"' );
  259. } else {
  260. return ps_html::selectList( $list_name, $module, $array );
  261. }
  262. }
  263. /**
  264. * Lists all available files from the /classes directory
  265. *
  266. * @param string $name
  267. * @param string $preselected
  268. * @return string
  269. */
  270. function list_classes( $name, $preselected ) {
  271. global $mosConfig_absolute_path;
  272. $classes = vmReadDirectory( CLASSPATH, '\.php$', false, true );
  273. $array = array();
  274. foreach ($classes as $class ) {
  275. if( is_dir( $class ) || $class[0] == '.' ) continue;
  276. $classname = basename( $class, '.php' );
  277. if( $classname != 'ps_main' && $classname != 'ps_ini' ) {
  278. $array[$classname] = $classname;
  279. }
  280. }
  281. return ps_html::selectList( $name, $preselected, $array, 1, '', 'id="'.$name.'"' );
  282. }
  283. function checkModulePermissions( $calledPage ) {
  284. global $page, $VM_LANG, $error_type, $vmLogger, $perm;
  285. // "shop.browse" => module: shop, page: browse
  286. $my_page= explode ( '.', $page );
  287. if( empty( $my_page[1] )) {
  288. return false;
  289. }
  290. $modulename = $my_page[0];
  291. $pagename = $my_page[1];
  292. $dir_list = $this->get_dir($modulename);
  293. if ($dir_list) {
  294. // Load MODULE-specific CLASS-FILES
  295. include_class( $modulename );
  296. if ($perm->check( $dir_list[ 'perms' ]) ) {
  297. if ( !file_exists(PAGEPATH.$modulename.".".$pagename.".php") ) {
  298. define( '_VM_PAGE_NOT_FOUND', 1 );
  299. $error = $VM_LANG->_('PHPSHOP_PAGE_404_1');
  300. $error .= ' '.$VM_LANG->_('PHPSHOP_PAGE_404_2') ;
  301. $error .= ' "'.$modulename.".".$pagename.'.php"';
  302. $vmLogger->err( $error );
  303. return false;
  304. }
  305. return true;
  306. }
  307. else {
  308. define( '_VM_PAGE_NOT_AUTH', 1 );
  309. $vmLogger->err( $VM_LANG->_('PHPSHOP_MOD_NO_AUTH') );
  310. return false;
  311. }
  312. }
  313. else {
  314. $error = $VM_LANG->_('PHPSHOP_MOD_NOT_REG');
  315. $error .= '"'.$modulename .'" '. $VM_LANG->_('PHPSHOP_MOD_ISNO_REG');
  316. $vmLogger->err( $error );
  317. return false;
  318. }
  319. }
  320. }
  321. // Check if there is an extended class in the Themes and if it is allowed to use them
  322. // If the class is called outside Virtuemart, we have to make sure to load the settings
  323. // Thomas Kahl - Feb. 2009
  324. if (!defined('VM_ALLOW_EXTENDED_CLASSES') && file_exists(dirname(__FILE__).'/../virtuemart.cfg.php')) {
  325. include_once(dirname(__FILE__).'/../virtuemart.cfg.php');
  326. }
  327. // If settings are loaded, extended Classes are allowed and the class exisits...
  328. if (defined('VM_ALLOW_EXTENDED_CLASSES') && defined('VM_THEMEPATH') && VM_ALLOW_EXTENDED_CLASSES && file_exists(VM_THEMEPATH.'user_class/'.basename(__FILE__))) {
  329. // Load the theme-user_class as extended
  330. include_once(VM_THEMEPATH.'user_class/'.basename(__FILE__));
  331. } else {
  332. // Otherwise we have to use the original classname to extend the core-class
  333. class ps_module extends vm_ps_module {}
  334. }
  335. ?>