2016-01-30 20:28:43 +00:00
< ? php
/*--------------------------------------------------------------------------------------------------------| www . vdm . io |------/
__ __ _ _____ _ _ __ __ _ _ _
\ \ / / | | | __ \ | | | | | \ / | | | | | | |
\ \ / / _ _ ___ | | _ | | | | _____ _____ | | ___ _ __ _ __ ___ ___ _ __ | | _ | \ / | ___ | | _ | | __ ___ __ | |
\ \ / / _ ` / __| __| | | | |/ _ \ \ / / _ \ |/ _ \| '_ \| '_ ` _ \ / _ \ '_ \| __| | |\/| |/ _ \ __| ' _ \ / _ \ / _ ` |
\ / ( _ | \__ \ | _ | | __ | | __ / \ V / __ / | ( _ ) | | _ ) | | | | | | __ / | | | | _ | | | | __ / | _ | | | | ( _ ) | ( _ | |
\ / \__ , _ | ___ / \__ | | _____ / \___ | \_ / \___ | _ | \___ /| . __ /| _ | | _ | | _ | \___ | _ | | _ | \__ | | _ | | _ | \___ | \__ | _ | | _ | \___ / \__ , _ |
| |
| _ |
/-------------------------------------------------------------------------------------------------------------------------------/
2017-10-06 14:53:22 +00:00
@ version @ update number 385 of this MVC
@ build 6 th October , 2017
2017-02-01 13:17:04 +00:00
@ created 6 th May , 2015
2016-01-30 20:28:43 +00:00
@ package Component Builder
2017-02-16 14:02:23 +00:00
@ subpackage joomla_components . php
2016-12-22 21:32:13 +00:00
@ author Llewellyn van der Merwe < http :// vdm . bz / component - builder >
2016-01-30 20:28:43 +00:00
@ copyright Copyright ( C ) 2015. All Rights Reserved
@ license GNU / GPL Version 2 or later - http :// www . gnu . org / licenses / gpl - 2.0 . html
Builds Complex Joomla Components
/-----------------------------------------------------------------------------------------------------------------------------*/
// No direct access to this file
defined ( '_JEXEC' ) or die ( 'Restricted access' );
// import the Joomla modellist library
jimport ( 'joomla.application.component.modellist' );
/**
2017-02-16 14:02:23 +00:00
* Joomla_components Model
2016-01-30 20:28:43 +00:00
*/
2017-02-16 14:02:23 +00:00
class ComponentbuilderModelJoomla_components extends JModelList
2016-01-30 20:28:43 +00:00
{
public function __construct ( $config = array ())
{
if ( empty ( $config [ 'filter_fields' ]))
{
$config [ 'filter_fields' ] = array (
'a.id' , 'id' ,
'a.published' , 'published' ,
'a.ordering' , 'ordering' ,
'a.created_by' , 'created_by' ,
'a.modified_by' , 'modified_by' ,
'a.system_name' , 'system_name' ,
'a.name_code' , 'name_code' ,
'a.component_version' , 'component_version' ,
'a.short_description' , 'short_description' ,
'a.companyname' , 'companyname' ,
'a.author' , 'author'
);
}
parent :: __construct ( $config );
2017-03-18 11:16:07 +00:00
}
2017-08-20 17:52:35 +00:00
public $user ;
2017-03-28 14:57:59 +00:00
public $packagePath = false ;
2017-08-20 17:52:35 +00:00
public $packageName = false ;
2017-03-28 14:57:59 +00:00
public $zipPath = false ;
public $key = array ();
2017-08-20 17:52:35 +00:00
public $exportBuyLinks = array ();
public $exportPackageLinks = array ();
2017-03-30 21:19:12 +00:00
public $info = array (
'name' => array (),
'short_description' => array (),
'component_version' => array (),
'companyname' => array (),
'author' => array (),
'email' => array (),
'website' => array (),
'license' => array (),
'copyright' => array (),
'getKeyFrom' => null
);
2017-08-20 17:52:35 +00:00
public $activeType = 'export' ;
2017-03-18 22:55:34 +00:00
2017-03-20 22:07:14 +00:00
protected $params ;
protected $tempPath ;
protected $customPath ;
2017-08-20 17:52:35 +00:00
protected $smartExport = array ();
protected $templateIds = array ();
2017-03-18 22:55:34 +00:00
protected $layoutIds = array ();
protected $customCodeIds = array ();
2017-08-20 17:52:35 +00:00
protected $customCodeM = array ();
2017-03-31 21:28:16 +00:00
protected $fieldTypes = array ();
2017-09-18 02:20:50 +00:00
protected $isMultiple = array ();
2017-03-18 20:17:15 +00:00
2017-03-18 11:16:07 +00:00
/**
2017-03-20 22:07:14 +00:00
* Method to build the export package
2017-03-18 11:16:07 +00:00
*
2017-03-20 22:07:14 +00:00
* @ return bool on success .
2017-03-18 11:16:07 +00:00
*/
public function getSmartExport ( $pks )
{
// setup the query
if ( ComponentbuilderHelper :: checkArray ( $pks ))
{
// Get the user object.
2017-08-20 17:52:35 +00:00
if ( ! ComponentbuilderHelper :: checkObject ( $this -> user ))
{
$this -> user = JFactory :: getUser ();
}
2017-03-18 11:16:07 +00:00
// Create a new query object.
2017-08-20 17:52:35 +00:00
if ( ! ComponentbuilderHelper :: checkObject ( $this -> _db ))
{
$this -> _db = JFactory :: getDBO ();
}
$query = $this -> _db -> getQuery ( true );
2017-03-18 11:16:07 +00:00
// Select some fields
2017-04-05 13:21:10 +00:00
$query -> select ( array ( 'a.*' ));
2017-03-18 11:16:07 +00:00
2017-03-18 22:55:34 +00:00
// From the componentbuilder_joomla_component table
2017-08-20 17:52:35 +00:00
$query -> from ( $this -> _db -> quoteName ( '#__componentbuilder_joomla_component' , 'a' ));
2017-03-18 11:16:07 +00:00
$query -> where ( 'a.id IN (' . implode ( ',' , $pks ) . ')' );
// Implement View Level Access
2017-08-20 17:52:35 +00:00
if ( ! $this -> user -> authorise ( 'core.options' , 'com_componentbuilder' ))
2017-03-18 11:16:07 +00:00
{
2017-08-20 17:52:35 +00:00
$groups = implode ( ',' , $this -> user -> getAuthorisedViewLevels ());
2017-03-18 11:16:07 +00:00
$query -> where ( 'a.access IN (' . $groups . ')' );
}
// Order the results by ordering
$query -> order ( 'a.ordering ASC' );
// Load the items
2017-08-20 17:52:35 +00:00
$this -> _db -> setQuery ( $query );
$this -> _db -> execute ();
if ( $this -> _db -> getNumRows ())
2017-03-18 11:16:07 +00:00
{
2017-03-20 22:07:14 +00:00
// load the items from db
2017-08-20 17:52:35 +00:00
$items = $this -> _db -> loadObjectList ();
2017-03-18 20:17:15 +00:00
// check if we have items
2017-03-18 11:16:07 +00:00
if ( ComponentbuilderHelper :: checkArray ( $items ))
{
2017-03-30 21:19:12 +00:00
// set params
$this -> params = JComponentHelper :: getParams ( 'com_componentbuilder' );
// set custom folder path
$this -> customPath = $this -> params -> get ( 'custom_folder_path' , JPATH_COMPONENT_ADMINISTRATOR . '/custom' );
2017-08-20 17:52:35 +00:00
// check what type of export or backup this is
if ( 'backup' === $this -> activeType || 'manualBackup' === $this -> activeType )
2017-03-30 21:19:12 +00:00
{
2017-08-20 17:52:35 +00:00
// set the paths
if ( ! $this -> backupPath = $this -> params -> get ( 'cronjob_backup_folder_path' , null ))
{
// set the paths
$comConfig = JFactory :: getConfig ();
$this -> backupPath = $comConfig -> get ( 'tmp_path' );
}
// set the date array
$date = JFactory :: getDate ();
$placeholderDate = array ();
$placeholderDate [ '[YEAR]' ] = $date -> format ( 'Y' );
$placeholderDate [ '[MONTH]' ] = $date -> format ( 'm' );
$placeholderDate [ '[DAY]' ] = $date -> format ( 'd' );
$placeholderDate [ '[HOUR]' ] = $date -> format ( 'H' );
$placeholderDate [ '[MINUTE]' ] = $date -> format ( 'i' );
// get the package name
$packageName = $this -> params -> get ( 'backup_package_name' , 'JCB_Backup_[YEAR]_[MONTH]_[DAY]' );
$this -> packageName = str_replace ( array_keys ( $placeholderDate ), array_values ( $placeholderDate ), $packageName );
2017-03-30 21:19:12 +00:00
}
else
{
2017-08-20 17:52:35 +00:00
// set the paths
$comConfig = JFactory :: getConfig ();
$this -> backupPath = $comConfig -> get ( 'tmp_path' );
// set the package name
if ( count ( $items ) == 1 )
{
$this -> packageName = 'JCB_' . $this -> getPackageName ( $items );
}
else
{
$this -> packageName = 'JCB_smartPackage' ;
}
2017-03-30 21:19:12 +00:00
}
2017-08-20 17:52:35 +00:00
// set the package path
$this -> packagePath = rtrim ( $this -> backupPath , '/' ) . '/' . $this -> packageName ;
2017-03-20 22:07:14 +00:00
$this -> zipPath = $this -> packagePath . '.zip' ;
if ( JFolder :: exists ( $this -> packagePath ))
{
// remove if old folder is found
ComponentbuilderHelper :: removeFolder ( $this -> packagePath );
}
// create the folders
JFolder :: create ( $this -> packagePath );
2017-03-28 14:57:59 +00:00
// Get the basic encription.
$basickey = ComponentbuilderHelper :: getCryptKey ( 'basic' );
// Get the encription object.
if ( $basickey )
{
$basic = new FOFEncryptAes ( $basickey , 128 );
}
2017-03-18 22:55:34 +00:00
// add custom code
2017-08-20 17:52:35 +00:00
$this -> setData ( 'custom_code' , $pks , 'component' );
2017-03-18 20:17:15 +00:00
// start loading the components
2017-03-27 12:38:51 +00:00
$this -> smartExport [ 'joomla_component' ] = array ();
2017-03-18 11:16:07 +00:00
foreach ( $items as $nr => & $item )
{
2017-03-30 21:19:12 +00:00
// check if user has access
2017-08-20 17:52:35 +00:00
$access = ( $this -> user -> authorise ( 'joomla_component.access' , 'com_componentbuilder.joomla_component.' . ( int ) $item -> id ) && $this -> user -> authorise ( 'joomla_component.access' , 'com_componentbuilder' ));
2017-03-18 11:16:07 +00:00
if ( ! $access )
{
unset ( $items [ $nr ]);
continue ;
2017-03-20 22:07:14 +00:00
}
2017-03-30 21:19:12 +00:00
// build information data set
$this -> info [ 'name' ][ $item -> id ] = $item -> name ;
$this -> info [ 'short_description' ][ $item -> id ] = $item -> short_description ;
$this -> info [ 'component_version' ][ $item -> id ] = $item -> component_version ;
$this -> info [ 'companyname' ][ $item -> id ] = $item -> companyname ;
$this -> info [ 'author' ][ $item -> id ] = $item -> author ;
$this -> info [ 'email' ][ $item -> id ] = $item -> email ;
$this -> info [ 'website' ][ $item -> id ] = $item -> website ;
$this -> info [ 'license' ][ $item -> id ] = $item -> license ;
$this -> info [ 'copyright' ][ $item -> id ] = $item -> copyright ;
2017-03-28 14:57:59 +00:00
// set the keys
if ( isset ( $item -> export_key ) && ComponentbuilderHelper :: checkString ( $item -> export_key ))
{
2017-03-30 21:19:12 +00:00
// keep the key locked for exported data set
$export_key = $item -> export_key ;
2017-03-28 14:57:59 +00:00
if ( $basickey && ! is_numeric ( $item -> export_key ) && $item -> export_key === base64_encode ( base64_decode ( $item -> export_key , true )))
{
2017-03-30 21:19:12 +00:00
$export_key = rtrim ( $basic -> decryptString ( $item -> export_key ), " \0 " );
}
// make sure we have a string
if ( strlen ( $export_key ) > 4 )
{
$this -> key [ $item -> id ] = $export_key ;
2017-03-28 14:57:59 +00:00
}
}
2017-04-26 08:55:02 +00:00
// get name of this item key_name
if ( isset ( $item -> system_name ))
{
$keyName = ComponentbuilderHelper :: safeString ( $item -> system_name , 'cAmel' );
}
else
{
$keyName = ComponentbuilderHelper :: safeString ( $item -> name_code );
}
// set the export buy links
if ( isset ( $item -> export_buy_link ) && ComponentbuilderHelper :: checkString ( $item -> export_buy_link ))
{
// keep the key locked for exported data set
$this -> exportBuyLinks [ $keyName ] = $item -> export_buy_link ;
}
// set the export buy links
if ( isset ( $item -> export_package_link ) && ComponentbuilderHelper :: checkString ( $item -> export_package_link ))
{
// keep the key locked for exported data set
$this -> exportPackageLinks [ $keyName ] = $item -> export_package_link ;
}
2017-03-20 22:07:14 +00:00
// build files
$this -> moveIt ( $item -> addfiles , 'file' );
// build folders
$this -> moveIt ( $item -> addfolders , 'folder' );
2017-03-27 12:38:51 +00:00
// component image
$this -> moveIt ( array ( 'image' => array ( $item -> image )), 'image' );
2017-03-18 20:17:15 +00:00
// add config fields
2017-08-20 17:52:35 +00:00
$this -> setData ( 'field' , $item -> addconfig , 'field' );
2017-03-18 20:17:15 +00:00
// add admin views
2017-08-20 17:52:35 +00:00
$this -> setData ( 'admin_view' , $item -> addadmin_views , 'adminview' );
2017-03-18 20:17:15 +00:00
// add custom admin views
2017-08-20 17:52:35 +00:00
$this -> setData ( 'custom_admin_view' , $item -> addcustom_admin_views , 'customadminview' );
2017-03-18 20:17:15 +00:00
// add site views
2017-08-20 17:52:35 +00:00
$this -> setData ( 'site_view' , $item -> addsite_views , 'siteview' );
2017-03-18 22:55:34 +00:00
// set the custom code ID's
$this -> setCustomCodeIds ( $item , 'joomla_component' );
2017-04-06 21:40:22 +00:00
// set the language strings for this component
2017-08-20 17:52:35 +00:00
$this -> setLanguageTranslation ( $item -> id );
2017-03-18 20:17:15 +00:00
// load to global object
2017-03-27 12:38:51 +00:00
$this -> smartExport [ 'joomla_component' ][ $item -> id ] = $item ;
2017-03-18 20:17:15 +00:00
}
// add templates
if ( ComponentbuilderHelper :: checkArray ( $this -> templateIds ))
{
2017-08-20 17:52:35 +00:00
$this -> setData ( 'template' , array ( 'template' => $this -> templateIds ), 'template' );
2017-03-18 20:17:15 +00:00
}
// add layouts
if ( ComponentbuilderHelper :: checkArray ( $this -> layoutIds ))
{
2017-08-20 17:52:35 +00:00
$this -> setData ( 'layout' , array ( 'layout' => $this -> layoutIds ), 'layout' );
2017-03-18 20:17:15 +00:00
}
2017-03-18 22:55:34 +00:00
// add custom code
if ( ComponentbuilderHelper :: checkArray ( $this -> customCodeIds ))
{
2017-08-20 17:52:35 +00:00
$this -> setData ( 'custom_code' , array ( 'custom_code' => $this -> customCodeIds ), 'custom_code' );
2017-03-18 22:55:34 +00:00
}
2017-03-18 20:17:15 +00:00
// has any data been set
2017-03-27 12:38:51 +00:00
if ( ComponentbuilderHelper :: checkArray ( $this -> smartExport [ 'joomla_component' ]))
2017-03-18 20:17:15 +00:00
{
2017-03-20 22:07:14 +00:00
// set the folder and move the files of each component to the folder
return $this -> smartExportBuilder ();
2017-03-18 20:17:15 +00:00
}
}
}
}
return false ;
}
2017-03-20 22:07:14 +00:00
/**
* Method to build the package to export
*
* @ return void
*/
protected function smartExportBuilder ()
{
2017-03-30 21:19:12 +00:00
// set db data
2017-03-28 14:57:59 +00:00
$data = serialize ( $this -> smartExport );
// lock the data if set
if ( ComponentbuilderHelper :: checkArray ( $this -> key ))
{
2017-03-30 21:19:12 +00:00
// lock the data
2017-03-28 14:57:59 +00:00
$this -> key = md5 ( implode ( '' , $this -> key ));
$locker = new FOFEncryptAes ( $this -> key , 128 );
2017-03-30 21:19:12 +00:00
$data = $locker -> encryptString ( $data );
// Set the key owner information
$this -> info [ 'getKeyFrom' ] = array ();
$this -> info [ 'getKeyFrom' ][ 'company' ] = $this -> params -> get ( 'export_company' , null );
$this -> info [ 'getKeyFrom' ][ 'owner' ] = $this -> params -> get ( 'export_owner' , null );
$this -> info [ 'getKeyFrom' ][ 'email' ] = $this -> params -> get ( 'export_email' , null );
$this -> info [ 'getKeyFrom' ][ 'website' ] = $this -> params -> get ( 'export_website' , null );
$this -> info [ 'getKeyFrom' ][ 'license' ] = $this -> params -> get ( 'export_license' , null );
$this -> info [ 'getKeyFrom' ][ 'copyright' ] = $this -> params -> get ( 'export_copyright' , null );
2017-04-26 08:55:02 +00:00
// making provision for future changes
if ( count ( $this -> exportBuyLinks ) == 1 )
{
$this -> info [ 'getKeyFrom' ][ 'buy_links' ] = $this -> exportBuyLinks ;
}
else
{
// use global if more then one component is exported, or if none has a buy link
$this -> info [ 'getKeyFrom' ][ 'buy_link' ] = $this -> params -> get ( 'export_buy_link' , null );
}
$this -> info [ 'getKeyFrom' ][ 'package_links' ] = $this -> exportPackageLinks ;
2017-03-28 14:57:59 +00:00
}
else
{
2017-03-30 21:19:12 +00:00
// Set the owner information
2017-03-28 14:57:59 +00:00
$data = base64_encode ( $data );
}
// set the path
2017-03-20 22:07:14 +00:00
$dbPath = $this -> packagePath . '/db.vdm' ;
// write the db data to file in package
2017-03-28 14:57:59 +00:00
if ( ! ComponentbuilderHelper :: writeFile ( $dbPath , wordwrap ( $data , 128 , " \n " , true )))
2017-03-20 22:07:14 +00:00
{
return false ;
}
2017-03-30 21:19:12 +00:00
// set info data
$locker = new FOFEncryptAes ( 'V4stD3vel0pmEntMethOd@YoUrS3rv!s' , 128 );
$info = $locker -> encryptString ( json_encode ( $this -> info ));
// set the path
$infoPath = $this -> packagePath . '/info.vdm' ;
// write the db data to file in package
if ( ! ComponentbuilderHelper :: writeFile ( $infoPath , wordwrap ( $info , 128 , " \n " , true )))
{
return false ;
}
2017-04-01 13:59:54 +00:00
// lock all files
$this -> lockFiles ();
2017-03-30 21:19:12 +00:00
// remove old zip files with the same name
2017-03-20 22:07:14 +00:00
if ( JFile :: exists ( $this -> zipPath ))
{
// remove file if found
JFile :: delete ( $this -> zipPath );
}
// zip the folder
if ( ! ComponentbuilderHelper :: zip ( $this -> packagePath , $this -> zipPath ))
{
return false ;
}
// remove the folder
if ( ! ComponentbuilderHelper :: removeFolder ( $this -> packagePath ))
{
return false ;
}
return true ;
}
2017-04-01 13:59:54 +00:00
/**
* Method to lock all files
*
* @ return void
*/
protected function lockFiles ()
{
// lock the data if set
if ( ComponentbuilderHelper :: checkString ( $this -> key ) && strlen ( $this -> key ) == 32 )
{
$locker = new FOFEncryptAes ( $this -> key , 128 );
// we must first store the current working directory
$joomla = getcwd ();
// setup the type path
$customPath = $this -> packagePath . '/custom' ;
// go to the custom folder if found
if ( JFolder :: exists ( $customPath ))
{
$this -> lock ( $customPath , $locker );
}
// setup the type path
$imagesPath = $this -> packagePath . '/images' ;
// go to the custom folder if found
if ( JFolder :: exists ( $imagesPath ))
{
$this -> lock ( $imagesPath , $locker );
}
// change back to working dir
chdir ( $joomla );
}
}
/**
* The Locker
*
* @ return void
*/
protected function lock ( & $tmpPath , & $locker )
{
// we are changing the working directory to the tmp path (important)
chdir ( $tmpPath );
// get a list of files in the current directory tree (all)
$files = JFolder :: files ( '.' , '.' , true , true );
// read in the file content
foreach ( $files as $file )
{
// write the encrypted string back to file
if ( ! ComponentbuilderHelper :: writeFile ( $file , wordwrap ( $locker -> encryptString ( file_get_contents ( $file )), 128 , " \n " , true )))
{
// we should add error handler here in case file could not be locked
}
}
}
2017-03-20 22:07:14 +00:00
/**
* Method to move the files and folder to the package folder
*
* @ return bool
*/
protected function moveIt ( $data , $type )
{
// if json convert to array
if ( ComponentbuilderHelper :: checkJson ( $data ))
{
$data = json_decode ( $data , true );
}
// make sure we have an array
if ( ! ComponentbuilderHelper :: checkArray ( $data ) || ! isset ( $data [ $type ]) || ! ComponentbuilderHelper :: checkArray ( $data [ $type ]))
{
return false ;
}
// set the name of the folder
if ( 'file' === $type || 'folder' === $type )
{
$name = 'custom' ;
}
if ( 'image' === $type )
{
$name = 'images' ;
}
// setup the type path
2017-04-08 20:52:51 +00:00
$tmpPath = str_replace ( '//' , '/' , $this -> packagePath . '/' . $name );
2017-03-20 22:07:14 +00:00
// create type path if not set
if ( ! JFolder :: exists ( $tmpPath ))
{
// create the folders if not found
JFolder :: create ( $tmpPath );
}
// now move it
foreach ( $data [ $type ] as $item )
{
2017-03-27 12:38:51 +00:00
if ( ComponentbuilderHelper :: checkString ( $item ))
2017-03-20 22:07:14 +00:00
{
2017-03-27 12:38:51 +00:00
if ( 'file' === $type )
2017-03-20 22:07:14 +00:00
{
2017-04-08 20:52:51 +00:00
$tmpFilePath = str_replace ( '//' , '/' , $tmpPath . '/' . $item );
$customFilePath = str_replace ( '//' , '/' , $this -> customPath . '/' . $item );
if ( ! JFile :: exists ( $tmpFilePath ) && JFile :: exists ( $customFilePath ))
2017-03-27 12:38:51 +00:00
{
// move the file to its place
2017-08-20 17:52:35 +00:00
JFile :: copy ( $customFilePath , $tmpFilePath );
2017-03-27 12:38:51 +00:00
}
2017-03-20 22:07:14 +00:00
}
2017-03-27 12:38:51 +00:00
if ( 'image' === $type )
2017-03-20 22:07:14 +00:00
{
2017-08-20 17:52:35 +00:00
$imageName = basename ( $item );
$imagePath = str_replace ( $imageName , '' , $item );
$imageFolderPath = str_replace ( '//' , '/' , $this -> packagePath . '/' . $imagePath );
// check if image folder exist
if ( ! JFolder :: exists ( $imageFolderPath ))
{
// create the folders if not found
JFolder :: create ( $imageFolderPath );
}
2017-04-08 20:52:51 +00:00
$tmpImagePath = str_replace ( '//' , '/' , $this -> packagePath . '/' . $item );
$customImagePath = str_replace ( '//' , '/' , JPATH_ROOT . '/' . $item );
if ( ! JFile :: exists ( $tmpImagePath ) && JFile :: exists ( $customImagePath ))
2017-03-27 12:38:51 +00:00
{
// move the file to its place
2017-08-20 17:52:35 +00:00
JFile :: copy ( $customImagePath , $tmpImagePath );
2017-03-27 12:38:51 +00:00
}
}
if ( 'folder' === $type )
{
2017-04-08 20:52:51 +00:00
$tmpFolderPath = str_replace ( '//' , '/' , $tmpPath . '/' . $item );
$customFolderPath = str_replace ( '//' , '/' , $this -> customPath . '/' . $item );
if ( ! JFolder :: exists ( $tmpFolderPath ) && JFolder :: exists ( $customFolderPath ))
2017-03-27 12:38:51 +00:00
{
// move the folder to its place
2017-04-08 20:52:51 +00:00
JFolder :: copy ( $customFolderPath , $tmpFolderPath , '' , true );
2017-03-27 12:38:51 +00:00
}
2017-03-20 22:07:14 +00:00
}
}
}
return true ;
}
2017-03-18 20:17:15 +00:00
/**
* Method to get data of a given table .
*
* @ return mixed An array of data items on success , false on failure .
*/
2017-08-20 17:52:35 +00:00
protected function setData ( $table , $values , $key )
2017-03-18 20:17:15 +00:00
{
// if json convert to array
if ( ComponentbuilderHelper :: checkJson ( $values ))
{
$values = json_decode ( $values , true );
}
2017-09-18 00:18:23 +00:00
// check if the key is an array (targeting subform)
if ( ComponentbuilderHelper :: checkArray ( $key ) && isset ( $key [ 'subform' ]) && ComponentbuilderHelper :: checkArray ( $values ))
{
$subform = $key [ 'subform' ];
$key = $key [ 'key' ];
$tmpBucket = array ( $key => array ());
foreach ( $values as $value )
{
if ( isset ( $value [ $subform ]))
{
if ( 'language' === $subform )
{
$tmpBucket [ $key ][] = ( int ) ComponentbuilderHelper :: getVar ( 'language' , $value [ $subform ], 'langtag' , 'id' );
}
else
{
$tmpBucket [ $key ][] = $value [ $subform ];
}
}
}
if ( ComponentbuilderHelper :: checkArray ( $tmpBucket [ $key ]))
{
// now set the values back
$values = $tmpBucket ;
}
else
{
return false ;
}
}
elseif ( ComponentbuilderHelper :: checkArray ( $key ))
{
return false ;
}
2017-03-18 20:17:15 +00:00
// make sure we have an array
2017-03-31 21:28:16 +00:00
if (( 'custom_code' !== $table && 'component' !== $key && 'custom_get' !== $key ) && ( ! ComponentbuilderHelper :: checkArray ( $values ) || ! isset ( $values [ $key ]) || ! ComponentbuilderHelper :: checkArray ( $values [ $key ])))
2017-03-18 22:55:34 +00:00
{
return false ;
}
elseif ( ! ComponentbuilderHelper :: checkArray ( $values ))
2017-03-18 20:17:15 +00:00
{
return false ;
}
2017-08-20 17:52:35 +00:00
$query = $this -> _db -> getQuery ( true );
2017-03-18 20:17:15 +00:00
// Select some fields
2017-04-05 13:21:10 +00:00
$query -> select ( array ( 'a.*' ));
2017-03-18 20:17:15 +00:00
// From the componentbuilder_ANY table
2017-08-20 17:52:35 +00:00
$query -> from ( $this -> _db -> quoteName ( '#__componentbuilder_' . $table , 'a' ));
2017-03-18 22:55:34 +00:00
if ( 'custom_code' === $table && 'component' === $key )
{
$query -> where ( 'a.component IN (' . implode ( ',' , $values ) . ')' );
}
2017-03-31 21:28:16 +00:00
elseif ( 'custom_get' === $key )
{
$query -> where ( 'a.id IN (' . implode ( ',' , $values ) . ')' );
}
2017-03-18 22:55:34 +00:00
else
{
$query -> where ( 'a.id IN (' . implode ( ',' , $values [ $key ]) . ')' );
}
2017-03-18 20:17:15 +00:00
// Implement View Level Access
2017-08-20 17:52:35 +00:00
if ( ! $this -> user -> authorise ( 'core.options' , 'com_componentbuilder' ))
2017-03-18 20:17:15 +00:00
{
2017-08-20 17:52:35 +00:00
$groups = implode ( ',' , $this -> user -> getAuthorisedViewLevels ());
2017-03-18 20:17:15 +00:00
$query -> where ( 'a.access IN (' . $groups . ')' );
}
// Order the results by ordering
$query -> order ( 'a.ordering ASC' );
// Load the items
2017-08-20 17:52:35 +00:00
$this -> _db -> setQuery ( $query );
$this -> _db -> execute ();
if ( $this -> _db -> getNumRows ())
2017-03-18 20:17:15 +00:00
{
2017-08-20 17:52:35 +00:00
$items = $this -> _db -> loadObjectList ();
2017-03-18 20:17:15 +00:00
// check if we have items
if ( ComponentbuilderHelper :: checkArray ( $items ))
{
// set search array
if ( 'site_view' === $table || 'custom_admin_view' === $table )
{
$searchArray = array ( 'php_view' , 'php_jview' , 'php_jview_display' , 'php_document' , 'js_document' , 'css_document' , 'css' );
}
2017-03-31 21:28:16 +00:00
// reset the global array
if ( 'template' === $table )
{
$this -> templateIds = array ();
}
elseif ( 'layout' === $table )
{
$this -> layoutIds = array ();
}
2017-03-18 20:17:15 +00:00
// start loading the data
if ( ! isset ( $this -> smartExport [ $table ]))
{
$this -> smartExport [ $table ] = array ();
}
foreach ( $items as $nr => & $item )
{
2017-03-31 21:28:16 +00:00
// set the data per id only once
2017-03-18 20:17:15 +00:00
if ( isset ( $this -> smartExport [ $table ][ $item -> id ]))
{
continue ;
}
2017-03-31 21:28:16 +00:00
// load to global object
$this -> smartExport [ $table ][ $item -> id ] = $item ;
// set the custom code ID's
$this -> setCustomCodeIds ( $item , $table );
2017-03-18 20:17:15 +00:00
// actions to take if table is admin_view
if ( 'admin_view' === $table )
{
// add fields
2017-08-20 17:52:35 +00:00
$this -> setData ( 'field' , $item -> addfields , 'field' );
2017-03-27 12:38:51 +00:00
// admin icon
$this -> moveIt ( array ( 'image' => array ( $item -> icon )), 'image' );
// admin icon_add
$this -> moveIt ( array ( 'image' => array ( $item -> icon_add )), 'image' );
// admin icon_category
$this -> moveIt ( array ( 'image' => array ( $item -> icon_category )), 'image' );
2017-03-18 20:17:15 +00:00
}
// actions to take if table is field
if ( 'field' === $table )
{
// add field types
2017-08-20 17:52:35 +00:00
$this -> setData ( 'fieldtype' , array ( 'fieldtype' => array ( $item -> fieldtype )), 'fieldtype' );
2017-09-18 02:20:50 +00:00
// check if this field has multiple fields
if ( $this -> checkMultiFields ( $item -> fieldtype ))
2017-03-31 21:28:16 +00:00
{
$fields = ComponentbuilderHelper :: getBetween ( json_decode ( $item -> xml ), 'fields="' , '"' );
$fieldsSets = array ();
if ( strpos ( $fields , ',' ) !== false )
{
// multiple fields
$fieldsSets = ( array ) explode ( ',' , $fields );
}
elseif ( is_numeric ( $fields ))
{
// single field
$fieldsSets [] = ( int ) $fields ;
}
// get fields
if ( ComponentbuilderHelper :: checkArray ( $fieldsSets ))
{
2017-08-20 17:52:35 +00:00
$this -> setData ( 'field' , array ( 'field' => $fieldsSets ), 'field' );
2017-03-31 21:28:16 +00:00
}
}
2017-03-18 20:17:15 +00:00
}
// actions to take if table is site_view and custom_admin_view
if ( 'site_view' === $table || 'custom_admin_view' === $table )
{
// search for templates & layouts
2017-08-20 17:52:35 +00:00
$this -> getTemplateLayout ( base64_decode ( $item -> default ));
2017-03-18 20:17:15 +00:00
// add search array templates and layouts
foreach ( $searchArray as $scripter )
{
2017-03-31 21:28:16 +00:00
if ( isset ( $item -> { 'add_' . $scripter }) && $item -> { 'add_' . $scripter } == 1 )
2017-03-18 20:17:15 +00:00
{
2017-08-20 17:52:35 +00:00
$this -> getTemplateLayout ( $item -> $scripter );
2017-03-18 20:17:15 +00:00
}
2017-03-18 11:16:07 +00:00
}
2017-03-18 20:17:15 +00:00
// add dynamic gets
2017-08-20 17:52:35 +00:00
$this -> setData ( 'dynamic_get' , array ( 'dynamic_get' => array ( $item -> main_get )), 'dynamic_get' );
$this -> setData ( 'dynamic_get' , $item -> custom_get , 'custom_get' );
2017-03-27 12:38:51 +00:00
if ( 'custom_admin_view' === $table && isset ( $item -> icon ))
{
// view icon
$this -> moveIt ( array ( 'image' => array ( $item -> icon )), 'image' );
}
2017-03-31 21:28:16 +00:00
// add snippets
2017-08-20 17:52:35 +00:00
$this -> setData ( 'snippet' , array ( 'snippet' => array ( $item -> snippet )), 'snippet' );
2017-03-31 21:28:16 +00:00
}
// actions to take if table is template and layout
if ( 'layout' === $table || 'template' === $table )
{
// search for templates & layouts
2017-08-20 17:52:35 +00:00
$this -> getTemplateLayout ( base64_decode ( $item -> $table ), $this -> user );
2017-03-31 21:28:16 +00:00
// add search array templates and layouts
if ( isset ( $item -> add_php_view ) && $item -> add_php_view == 1 )
{
2017-08-20 17:52:35 +00:00
$this -> getTemplateLayout ( $item -> php_view , $this -> user );
2017-03-31 21:28:16 +00:00
}
// add dynamic gets
2017-08-20 17:52:35 +00:00
$this -> setData ( 'dynamic_get' , array ( 'dynamic_get' => $item -> dynamic_get ), 'dynamic_get' );
2017-03-31 21:28:16 +00:00
// add snippets
2017-08-20 17:52:35 +00:00
$this -> setData ( 'snippet' , array ( 'snippet' => array ( $item -> snippet )), 'snippet' );
2017-03-18 20:17:15 +00:00
}
}
}
}
}
2017-03-31 21:28:16 +00:00
/**
2017-09-18 02:20:50 +00:00
* Check if a field has multiple fields
2017-03-31 21:28:16 +00:00
*
* @ param string $typeID The type ID
*
* @ return bool true on success
*
*/
2017-09-18 02:20:50 +00:00
protected function checkMultiFields ( $typeID )
2017-03-31 21:28:16 +00:00
{
2017-09-18 02:20:50 +00:00
if ( isset ( $this -> isMultiple [ $typeID ]))
2017-03-31 21:28:16 +00:00
{
2017-09-18 02:20:50 +00:00
return $this -> isMultiple [ $typeID ];
2017-03-31 21:28:16 +00:00
}
elseif ( $type = $this -> getFieldType ( $typeID ))
{
2017-09-18 02:20:50 +00:00
if ( 'repeatable' === $type || 'subform' === $type )
{
$this -> isMultiple [ $typeID ] = true ;
}
else
2017-03-31 21:28:16 +00:00
{
2017-09-18 02:20:50 +00:00
$this -> isMultiple [ $typeID ] = false ;
2017-03-31 21:28:16 +00:00
}
2017-09-18 02:20:50 +00:00
return $this -> isMultiple [ $typeID ];
2017-03-31 21:28:16 +00:00
}
return false ;
}
/**
* Get the field type
*
* @ param string $id The field type id
*
* @ return string field type
*
*/
protected function getFieldType ( $id )
{
if ( ! isset ( $this -> fieldTypes [ $id ]))
{
$properties = ComponentbuilderHelper :: getVar ( 'fieldtype' , $id , 'id' , 'properties' );
if ( ComponentbuilderHelper :: checkJson ( $properties ))
{
$properties = json_decode ( $properties , true );
2017-09-18 02:20:50 +00:00
foreach ( $properties as $property )
2017-03-31 21:28:16 +00:00
{
2017-09-18 02:20:50 +00:00
if ( 'type' === $property [ 'name' ])
2017-03-31 21:28:16 +00:00
{
2017-09-18 02:20:50 +00:00
if ( isset ( $property [ 'example' ]) && ComponentbuilderHelper :: checkString ( $property [ 'example' ]))
2017-03-31 21:28:16 +00:00
{
2017-09-18 02:20:50 +00:00
$this -> fieldTypes [ $id ] = $property [ 'example' ];
break ;
2017-03-31 21:28:16 +00:00
}
}
}
}
// if not found
if ( ! isset ( $this -> fieldTypes [ $id ]) && $name = ComponentbuilderHelper :: getVar ( 'fieldtype' , $id , 'id' , 'name' ))
{
$this -> fieldTypes [ $id ] = ComponentbuilderHelper :: safeString ( $name );
}
}
// return the type
if ( isset ( $this -> fieldTypes [ $id ]))
{
return $this -> fieldTypes [ $id ];
}
return false ;
}
2017-03-18 20:17:15 +00:00
/**
* Set Template and Layout Data
*
* @ param string $default The content to check
*
* @ return void
*
*/
2017-08-20 17:52:35 +00:00
protected function getTemplateLayout ( $default , $user = false )
2017-03-18 20:17:15 +00:00
{
// set the Template data
$temp1 = ComponentbuilderHelper :: getAllBetween ( $default , " \$ this->loadTemplate(' " , " ') " );
$temp2 = ComponentbuilderHelper :: getAllBetween ( $default , '$this->loadTemplate("' , '")' );
$templates = array ();
$again = array ();
if ( ComponentbuilderHelper :: checkArray ( $temp1 ) && ComponentbuilderHelper :: checkArray ( $temp2 ))
{
$templates = array_merge ( $temp1 , $temp2 );
}
else
{
if ( ComponentbuilderHelper :: checkArray ( $temp1 ))
{
$templates = $temp1 ;
}
elseif ( ComponentbuilderHelper :: checkArray ( $temp2 ))
{
$templates = $temp2 ;
}
}
if ( ComponentbuilderHelper :: checkArray ( $templates ))
{
foreach ( $templates as $template )
{
2017-08-20 17:52:35 +00:00
$data = $this -> getDataWithAlias ( $template , 'template' );
2017-03-18 20:17:15 +00:00
if ( ComponentbuilderHelper :: checkArray ( $data ))
{
if ( ! isset ( $this -> templateIds [ $data [ 'id' ]]))
{
$this -> templateIds [ $data [ 'id' ]] = $data [ 'id' ];
// call self to get child data
$again [] = $data [ 'html' ];
$again [] = $data [ 'php_view' ];
}
}
}
}
// set the layout data
$lay1 = ComponentbuilderHelper :: getAllBetween ( $default , " JLayoutHelper::render(' " , " ', " );
2017-03-18 22:55:34 +00:00
$lay2 = ComponentbuilderHelper :: getAllBetween ( $default , 'JLayoutHelper::render("' , '",' );
2017-03-18 20:17:15 +00:00
if ( ComponentbuilderHelper :: checkArray ( $lay1 ) && ComponentbuilderHelper :: checkArray ( $lay2 ))
{
$layouts = array_merge ( $lay1 , $lay2 );
}
else
{
if ( ComponentbuilderHelper :: checkArray ( $lay1 ))
{
$layouts = $lay1 ;
}
elseif ( ComponentbuilderHelper :: checkArray ( $lay2 ))
{
$layouts = $lay2 ;
}
}
if ( isset ( $layouts ) && ComponentbuilderHelper :: checkArray ( $layouts ))
{
foreach ( $layouts as $layout )
{
2017-08-20 17:52:35 +00:00
$data = $this -> getDataWithAlias ( $layout , 'layout' );
2017-03-18 20:17:15 +00:00
if ( ComponentbuilderHelper :: checkArray ( $data ))
{
if ( ! isset ( $this -> layoutIds [ $data [ 'id' ]]))
{
$this -> layoutIds [ $data [ 'id' ]] = $data [ 'id' ];
// call self to get child data
$again [] = $data [ 'html' ];
$again [] = $data [ 'php_view' ];
2017-03-18 11:16:07 +00:00
}
}
2017-03-18 20:17:15 +00:00
}
}
if ( ComponentbuilderHelper :: checkArray ( $again ))
{
foreach ( $again as $get )
{
2017-08-20 17:52:35 +00:00
$this -> getTemplateLayout ( $get );
2017-03-18 20:17:15 +00:00
}
}
2017-03-31 21:28:16 +00:00
// Set the Data
if ( $user )
{
// add templates
if ( ComponentbuilderHelper :: checkArray ( $this -> templateIds ))
{
2017-08-20 17:52:35 +00:00
$this -> setData ( 'template' , array ( 'template' => $this -> templateIds ), 'template' );
2017-03-31 21:28:16 +00:00
}
// add layouts
if ( ComponentbuilderHelper :: checkArray ( $this -> layoutIds ))
{
2017-08-20 17:52:35 +00:00
$this -> setData ( 'layout' , array ( 'layout' => $this -> layoutIds ), 'layout' );
2017-03-31 21:28:16 +00:00
}
}
2017-03-18 20:17:15 +00:00
}
/**
* Get Data With Alias
*
* @ param string $n_ame The alias name
* @ param string $table The table where to find the alias
* @ param string $view The view code name
*
* @ return array The data found with the alias
*
*/
2017-08-20 17:52:35 +00:00
protected function getDataWithAlias ( $n_ame , $table )
2017-03-18 20:17:15 +00:00
{
// Create a new query object.
2017-08-20 17:52:35 +00:00
$query = $this -> _db -> getQuery ( true );
$query -> select ( $this -> _db -> quoteName ( array ( 'a.id' , 'a.alias' , 'a.' . $table , 'a.php_view' , 'a.add_php_view' )));
2017-03-18 20:17:15 +00:00
$query -> from ( '#__componentbuilder_' . $table . ' AS a' );
2017-08-20 17:52:35 +00:00
$this -> _db -> setQuery ( $query );
$rows = $this -> _db -> loadObjectList ();
2017-03-18 20:17:15 +00:00
foreach ( $rows as $row )
{
$k_ey = ComponentbuilderHelper :: safeString ( $row -> alias );
$key = preg_replace ( " /[^A-Za-z]/ " , '' , $k_ey );
$name = preg_replace ( " /[^A-Za-z]/ " , '' , $n_ame );
if ( $k_ey == $n_ame || $key == $name )
{
$php_view = '' ;
if ( $row -> add_php_view == 1 )
{
$php_view = base64_decode ( $row -> php_view );
}
$contnent = base64_decode ( $row -> { $table });
// return to continue the search
return array ( 'id' => $row -> id , 'html' => $contnent , 'php_view' => $php_view );
2017-03-18 11:16:07 +00:00
}
}
return false ;
2016-01-30 20:28:43 +00:00
}
2017-03-18 22:55:34 +00:00
/**
* Set the ids of the found custom code
*
* @ param object $item The item being searched
* @ param string $target The target table
*
* @ return void
*
*/
protected function setCustomCodeIds ( $item , $target )
{
if ( $keys = $this -> getCodeSearchKeys ( $target ))
{
foreach ( $keys [ 'search' ] as $key )
{
if ( ! isset ( $keys [ 'not_base64' ][ $key ]))
{
$value = base64_decode ( $item -> { $key });
}
else
{
$value = $item -> { $key };
}
// search the value to see if it has custom code
$codeArray = ComponentbuilderHelper :: getAllBetween ( $value , '[CUSTOMC' . 'ODE=' , ']' );
if ( ComponentbuilderHelper :: checkArray ( $codeArray ))
{
foreach ( $codeArray as $func )
{
// first make sure we have only the function key
if ( strpos ( $func , '+' ) !== false )
{
$funcArray = explode ( '+' , $func );
$func = $funcArray [ 0 ];
}
if ( ! isset ( $this -> customCodeM [ $func ]))
{
$this -> customCodeM [ $func ] = $func ;
// if numeric add to ids
if ( is_numeric ( $func ))
{
$this -> customCodeIds [ $func ] = ( int ) $func ;
}
elseif ( ComponentbuilderHelper :: checkString ( $func ))
{
if ( $funcID = ComponentbuilderHelper :: getVar ( 'custom_code' , $func , 'function_name' , 'id' ))
{
$this -> customCodeIds [ $funcID ] = ( int ) $funcID ;
}
}
}
}
}
}
}
}
2017-04-06 21:40:22 +00:00
/**
* Set the language strings for this component
*
* @ param int $id The component id
*
* @ return void
*
*/
2017-08-20 17:52:35 +00:00
protected function setLanguageTranslation ( & $id )
2017-04-06 21:40:22 +00:00
{
// Create a new query object.
2017-08-20 17:52:35 +00:00
$query = $this -> _db -> getQuery ( true );
2017-04-06 21:40:22 +00:00
$query -> select ( array ( 'a.*' ));
$query -> from ( '#__componentbuilder_language_translation AS a' );
// Implement View Level Access
2017-08-20 17:52:35 +00:00
if ( ! $this -> user -> authorise ( 'core.options' , 'com_componentbuilder' ))
2017-04-06 21:40:22 +00:00
{
2017-08-20 17:52:35 +00:00
$groups = implode ( ',' , $this -> user -> getAuthorisedViewLevels ());
2017-04-06 21:40:22 +00:00
$query -> where ( 'a.access IN (' . $groups . ')' );
}
// Order the results by ordering
$query -> order ( 'a.ordering ASC' );
// Load the items
2017-08-20 17:52:35 +00:00
$this -> _db -> setQuery ( $query );
$this -> _db -> execute ();
if ( $this -> _db -> getNumRows ())
2017-04-06 21:40:22 +00:00
{
2017-08-20 17:52:35 +00:00
$items = $this -> _db -> loadObjectList ();
2017-04-06 21:40:22 +00:00
// check if we have items
if ( ComponentbuilderHelper :: checkArray ( $items ))
{
if ( ! isset ( $this -> smartExport [ 'language_translation' ]))
{
$this -> smartExport [ 'language_translation' ] = array ();
}
foreach ( $items as $item )
{
if ( ! isset ( $this -> smartExport [ 'language_translation' ][ $item -> id ]) && ComponentbuilderHelper :: checkJson ( $item -> components ))
{
$components = json_decode ( $item -> components , true );
if ( in_array ( $id , $components ))
{
// load to global object
$this -> smartExport [ 'language_translation' ][ $item -> id ] = $item ;
// add languages
if ( isset ( $item -> translation ))
2017-09-18 00:18:23 +00:00
{
$this -> setData ( 'language' , $item -> translation , array ( 'key' => 'language' , 'subform' => 'language' ));
2017-04-06 21:40:22 +00:00
}
}
}
}
}
}
}
2017-03-30 21:19:12 +00:00
/**
* Get the package name
*
* @ param array $items of all components
*
* @ return string The package name
*
*/
protected function getPackageName ( & $items )
{
foreach ( $items as $item )
{
2017-04-01 13:59:54 +00:00
if ( isset ( $item -> system_name ))
{
return ComponentbuilderHelper :: safeString ( $item -> system_name , 'cAmel' );
}
else
{
return ComponentbuilderHelper :: safeString ( $item -> name_code );
}
2017-03-30 21:19:12 +00:00
}
}
2017-03-18 22:55:34 +00:00
/**
* Get the keys of the values to search custom code in
*
* @ param string $targe The table targeted
*
* @ return array The query options
*
*/
protected function getCodeSearchKeys ( $target )
{
$targets = array ();
// #__componentbuilder_joomla_component as a
$targets [ 'joomla_component' ] = array ();
$targets [ 'joomla_component' ][ 'search' ] = array ( 'php_preflight_install' , 'php_postflight_install' ,
'php_preflight_update' , 'php_postflight_update' , 'php_method_uninstall' ,
'php_helper_admin' , 'php_admin_event' , 'php_helper_both' , 'php_helper_site' ,
'php_site_event' , 'php_dashboard_methods' , 'dashboard_tab' );
$targets [ 'joomla_component' ][ 'not_base64' ] = array ( 'dashboard_tab' => 'json' );
// #__componentbuilder_admin_view as b
$targets [ 'admin_view' ] = array ();
$targets [ 'admin_view' ][ 'search' ] = array ( 'javascript_view_file' , 'javascript_view_footer' , 'javascript_views_file' ,
'javascript_views_footer' , 'php_getitem' , 'php_save' , 'php_postsavehook' , 'php_getitems' ,
'php_getitems_after_all' , 'php_getlistquery' , 'php_allowedit' , 'php_before_delete' ,
'php_after_delete' , 'php_before_publish' , 'php_after_publish' , 'php_batchcopy' ,
'php_batchmove' , 'php_document' , 'php_model' , 'php_controller' , 'php_import_display' ,
'php_import' , 'php_import_setdata' , 'php_import_save' , 'html_import_view' , 'php_ajaxmethod' );
$targets [ 'admin_view' ][ 'not_base64' ] = array ();
// #__componentbuilder_custom_admin_view as c
$targets [ 'custom_admin_view' ] = array ();
$targets [ 'custom_admin_view' ][ 'search' ] = array ( 'default' , 'php_view' , 'php_jview' , 'php_jview_display' , 'php_document' ,
'js_document' , 'css_document' , 'css' , 'php_model' , 'php_controller' );
$targets [ 'custom_admin_view' ][ 'not_base64' ] = array ();
// #__componentbuilder_site_view as d
$targets [ 'site_view' ] = array ();
$targets [ 'site_view' ][ 'search' ] = array ( 'default' , 'php_view' , 'php_jview' , 'php_jview_display' , 'php_document' ,
'js_document' , 'css_document' , 'css' , 'php_ajaxmethod' , 'php_model' , 'php_controller' );
$targets [ 'site_view' ][ 'not_base64' ] = array ();
// #__componentbuilder_field as e
$targets [ 'field' ] = array ();
$targets [ 'field' ][ 'search' ] = array ( 'xml' , 'javascript_view_footer' , 'javascript_views_footer' );
$targets [ 'field' ][ 'not_base64' ] = array ( 'xml' => 'json' );
// #__componentbuilder_dynamic_get as f
$targets [ 'dynamic_get' ] = array ();
$targets [ 'dynamic_get' ][ 'search' ] = array ( 'php_before_getitem' , 'php_after_getitem' , 'php_before_getitems' , 'php_after_getitems' ,
'php_getlistquery' );
$targets [ 'dynamic_get' ][ 'not_base64' ] = array ();
// #__componentbuilder_template as g
$targets [ 'template' ] = array ();
$targets [ 'template' ][ 'search' ] = array ( 'php_view' , 'template' );
$targets [ 'template' ][ 'not_base64' ] = array ();
// #__componentbuilder_layout as h
$targets [ 'layout' ] = array ();
$targets [ 'layout' ][ 'search' ] = array ( 'php_view' , 'layout' );
$targets [ 'layout' ][ 'not_base64' ] = array ();
// return the query string to search
if ( isset ( $targets [ $target ]))
{
return $targets [ $target ];
}
return false ;
}
2016-01-30 20:28:43 +00:00
/**
* Method to auto - populate the model state .
*
* @ return void
*/
protected function populateState ( $ordering = null , $direction = null )
{
$app = JFactory :: getApplication ();
// Adjust the context to support modal layouts.
if ( $layout = $app -> input -> get ( 'layout' ))
{
$this -> context .= '.' . $layout ;
}
$system_name = $this -> getUserStateFromRequest ( $this -> context . '.filter.system_name' , 'filter_system_name' );
$this -> setState ( 'filter.system_name' , $system_name );
$name_code = $this -> getUserStateFromRequest ( $this -> context . '.filter.name_code' , 'filter_name_code' );
$this -> setState ( 'filter.name_code' , $name_code );
$component_version = $this -> getUserStateFromRequest ( $this -> context . '.filter.component_version' , 'filter_component_version' );
$this -> setState ( 'filter.component_version' , $component_version );
$short_description = $this -> getUserStateFromRequest ( $this -> context . '.filter.short_description' , 'filter_short_description' );
$this -> setState ( 'filter.short_description' , $short_description );
$companyname = $this -> getUserStateFromRequest ( $this -> context . '.filter.companyname' , 'filter_companyname' );
$this -> setState ( 'filter.companyname' , $companyname );
$author = $this -> getUserStateFromRequest ( $this -> context . '.filter.author' , 'filter_author' );
$this -> setState ( 'filter.author' , $author );
$sorting = $this -> getUserStateFromRequest ( $this -> context . '.filter.sorting' , 'filter_sorting' , 0 , 'int' );
$this -> setState ( 'filter.sorting' , $sorting );
$access = $this -> getUserStateFromRequest ( $this -> context . '.filter.access' , 'filter_access' , 0 , 'int' );
$this -> setState ( 'filter.access' , $access );
$search = $this -> getUserStateFromRequest ( $this -> context . '.filter.search' , 'filter_search' );
$this -> setState ( 'filter.search' , $search );
$published = $this -> getUserStateFromRequest ( $this -> context . '.filter.published' , 'filter_published' , '' );
$this -> setState ( 'filter.published' , $published );
$created_by = $this -> getUserStateFromRequest ( $this -> context . '.filter.created_by' , 'filter_created_by' , '' );
$this -> setState ( 'filter.created_by' , $created_by );
$created = $this -> getUserStateFromRequest ( $this -> context . '.filter.created' , 'filter_created' );
$this -> setState ( 'filter.created' , $created );
// List state information.
parent :: populateState ( $ordering , $direction );
}
/**
* Method to get an array of data items .
*
* @ return mixed An array of data items on success , false on failure .
*/
public function getItems ()
{
// check in items
$this -> checkInNow ();
// load parent items
2016-09-03 21:44:47 +00:00
$items = parent :: getItems ();
2016-01-30 20:28:43 +00:00
// return items
return $items ;
}
/**
* Method to build an SQL query to load the list data .
*
* @ return string An SQL query
*/
protected function getListQuery ()
{
// Get the user object.
$user = JFactory :: getUser ();
// Create a new query object.
$db = JFactory :: getDBO ();
$query = $db -> getQuery ( true );
// Select some fields
$query -> select ( 'a.*' );
// From the componentbuilder_item table
2017-02-16 14:02:23 +00:00
$query -> from ( $db -> quoteName ( '#__componentbuilder_joomla_component' , 'a' ));
2016-01-30 20:28:43 +00:00
// Filter by published state
$published = $this -> getState ( 'filter.published' );
if ( is_numeric ( $published ))
{
$query -> where ( 'a.published = ' . ( int ) $published );
}
elseif ( $published === '' )
{
$query -> where ( '(a.published = 0 OR a.published = 1)' );
}
// Join over the asset groups.
$query -> select ( 'ag.title AS access_level' );
$query -> join ( 'LEFT' , '#__viewlevels AS ag ON ag.id = a.access' );
// Filter by access level.
if ( $access = $this -> getState ( 'filter.access' ))
{
$query -> where ( 'a.access = ' . ( int ) $access );
}
// Implement View Level Access
if ( ! $user -> authorise ( 'core.options' , 'com_componentbuilder' ))
{
$groups = implode ( ',' , $user -> getAuthorisedViewLevels ());
$query -> where ( 'a.access IN (' . $groups . ')' );
}
// Filter by search.
$search = $this -> getState ( 'filter.search' );
if ( ! empty ( $search ))
{
if ( stripos ( $search , 'id:' ) === 0 )
{
$query -> where ( 'a.id = ' . ( int ) substr ( $search , 3 ));
}
else
{
2016-10-23 22:48:26 +00:00
$search = $db -> quote ( '%' . $db -> escape ( $search ) . '%' );
2016-01-30 20:28:43 +00:00
$query -> where ( '(a.system_name LIKE ' . $search . ' OR a.name_code LIKE ' . $search . ' OR a.short_description LIKE ' . $search . ' OR a.companyname LIKE ' . $search . ' OR a.author LIKE ' . $search . ' OR a.name LIKE ' . $search . ')' );
}
}
// Filter by Companyname.
if ( $companyname = $this -> getState ( 'filter.companyname' ))
{
2016-10-23 22:48:26 +00:00
$query -> where ( 'a.companyname = ' . $db -> quote ( $db -> escape ( $companyname )));
2016-01-30 20:28:43 +00:00
}
// Filter by Author.
if ( $author = $this -> getState ( 'filter.author' ))
{
2016-10-23 22:48:26 +00:00
$query -> where ( 'a.author = ' . $db -> quote ( $db -> escape ( $author )));
2016-01-30 20:28:43 +00:00
}
// Add the list ordering clause.
$orderCol = $this -> state -> get ( 'list.ordering' , 'a.id' );
$orderDirn = $this -> state -> get ( 'list.direction' , 'asc' );
if ( $orderCol != '' )
{
$query -> order ( $db -> escape ( $orderCol . ' ' . $orderDirn ));
}
return $query ;
}
/**
* Method to get list export data .
*
* @ return mixed An array of data items on success , false on failure .
*/
public function getExportData ( $pks )
{
// setup the query
if ( ComponentbuilderHelper :: checkArray ( $pks ))
{
2016-06-03 06:28:32 +00:00
// Set a value to know this is exporting method.
$_export = true ;
2016-01-30 20:28:43 +00:00
// Get the user object.
$user = JFactory :: getUser ();
// Create a new query object.
$db = JFactory :: getDBO ();
$query = $db -> getQuery ( true );
// Select some fields
$query -> select ( 'a.*' );
2017-02-16 14:02:23 +00:00
// From the componentbuilder_joomla_component table
$query -> from ( $db -> quoteName ( '#__componentbuilder_joomla_component' , 'a' ));
2016-01-30 20:28:43 +00:00
$query -> where ( 'a.id IN (' . implode ( ',' , $pks ) . ')' );
// Implement View Level Access
if ( ! $user -> authorise ( 'core.options' , 'com_componentbuilder' ))
{
$groups = implode ( ',' , $user -> getAuthorisedViewLevels ());
$query -> where ( 'a.access IN (' . $groups . ')' );
}
// Order the results by ordering
$query -> order ( 'a.ordering ASC' );
// Load the items
$db -> setQuery ( $query );
$db -> execute ();
if ( $db -> getNumRows ())
{
$items = $db -> loadObjectList ();
2017-09-13 00:37:43 +00:00
// Get the basic encryption key.
2016-01-30 20:28:43 +00:00
$basickey = ComponentbuilderHelper :: getCryptKey ( 'basic' );
2017-09-13 00:37:43 +00:00
// Get the encryption object.
2016-01-30 20:28:43 +00:00
$basic = new FOFEncryptAes ( $basickey , 128 );
// set values to display correctly.
if ( ComponentbuilderHelper :: checkArray ( $items ))
{
foreach ( $items as $nr => & $item )
{
2017-10-06 14:53:22 +00:00
// decode sql
$item -> sql = base64_decode ( $item -> sql );
// decode php_preflight_update
$item -> php_preflight_update = base64_decode ( $item -> php_preflight_update );
// decode php_postflight_update
$item -> php_postflight_update = base64_decode ( $item -> php_postflight_update );
2017-03-18 11:16:07 +00:00
if ( $basickey && ! is_numeric ( $item -> whmcs_key ) && $item -> whmcs_key === base64_encode ( base64_decode ( $item -> whmcs_key , true )))
{
// decrypt whmcs_key
$item -> whmcs_key = $basic -> decryptString ( $item -> whmcs_key );
}
2017-10-06 14:53:22 +00:00
// decode php_preflight_install
$item -> php_preflight_install = base64_decode ( $item -> php_preflight_install );
// decode php_postflight_install
$item -> php_postflight_install = base64_decode ( $item -> php_postflight_install );
// decode php_method_uninstall
$item -> php_method_uninstall = base64_decode ( $item -> php_method_uninstall );
// decode readme
$item -> readme = base64_decode ( $item -> readme );
2017-03-28 14:57:59 +00:00
if ( $basickey && ! is_numeric ( $item -> export_key ) && $item -> export_key === base64_encode ( base64_decode ( $item -> export_key , true )))
{
// decrypt export_key
$item -> export_key = $basic -> decryptString ( $item -> export_key );
}
2017-03-03 21:53:18 +00:00
// decode php_helper_both
$item -> php_helper_both = base64_decode ( $item -> php_helper_both );
// decode php_helper_admin
$item -> php_helper_admin = base64_decode ( $item -> php_helper_admin );
// decode php_admin_event
$item -> php_admin_event = base64_decode ( $item -> php_admin_event );
2016-12-30 10:47:19 +00:00
// decode php_helper_site
$item -> php_helper_site = base64_decode ( $item -> php_helper_site );
// decode php_site_event
$item -> php_site_event = base64_decode ( $item -> php_site_event );
2017-10-06 14:53:22 +00:00
// decode javascript
$item -> javascript = base64_decode ( $item -> javascript );
// decode css
$item -> css = base64_decode ( $item -> css );
2016-12-30 10:47:19 +00:00
// decode php_dashboard_methods
$item -> php_dashboard_methods = base64_decode ( $item -> php_dashboard_methods );
2017-03-18 11:16:07 +00:00
// decode buildcompsql
$item -> buildcompsql = base64_decode ( $item -> buildcompsql );
2016-01-30 20:28:43 +00:00
// unset the values we don't want exported.
unset ( $item -> asset_id );
unset ( $item -> checked_out );
unset ( $item -> checked_out_time );
}
}
// Add headers to items array.
$headers = $this -> getExImPortHeaders ();
if ( ComponentbuilderHelper :: checkObject ( $headers ))
{
array_unshift ( $items , $headers );
}
return $items ;
}
}
return false ;
}
/**
* Method to get header .
*
* @ return mixed An array of data items on success , false on failure .
*/
public function getExImPortHeaders ()
{
// Get a db connection.
$db = JFactory :: getDbo ();
// get the columns
2017-02-16 14:02:23 +00:00
$columns = $db -> getTableColumns ( " #__componentbuilder_joomla_component " );
2016-01-30 20:28:43 +00:00
if ( ComponentbuilderHelper :: checkArray ( $columns ))
{
// remove the headers you don't import/export.
unset ( $columns [ 'asset_id' ]);
unset ( $columns [ 'checked_out' ]);
unset ( $columns [ 'checked_out_time' ]);
$headers = new stdClass ();
foreach ( $columns as $column => $type )
{
$headers -> { $column } = $column ;
}
return $headers ;
}
return false ;
}
/**
* Method to get a store id based on model configuration state .
*
* @ return string A store id .
*
*/
protected function getStoreId ( $id = '' )
{
// Compile the store id.
$id .= ':' . $this -> getState ( 'filter.id' );
$id .= ':' . $this -> getState ( 'filter.search' );
$id .= ':' . $this -> getState ( 'filter.published' );
$id .= ':' . $this -> getState ( 'filter.ordering' );
$id .= ':' . $this -> getState ( 'filter.created_by' );
$id .= ':' . $this -> getState ( 'filter.modified_by' );
$id .= ':' . $this -> getState ( 'filter.system_name' );
$id .= ':' . $this -> getState ( 'filter.name_code' );
$id .= ':' . $this -> getState ( 'filter.component_version' );
$id .= ':' . $this -> getState ( 'filter.short_description' );
$id .= ':' . $this -> getState ( 'filter.companyname' );
$id .= ':' . $this -> getState ( 'filter.author' );
return parent :: getStoreId ( $id );
}
/**
* Build an SQL query to checkin all items left checked out longer then a set time .
*
* @ return a bool
*
*/
2016-02-26 12:46:15 +00:00
protected function checkInNow ()
2016-01-30 20:28:43 +00:00
{
// Get set check in time
$time = JComponentHelper :: getParams ( 'com_componentbuilder' ) -> get ( 'check_in' );
if ( $time )
{
// Get a db connection.
$db = JFactory :: getDbo ();
// reset query
$query = $db -> getQuery ( true );
$query -> select ( '*' );
2017-02-16 14:02:23 +00:00
$query -> from ( $db -> quoteName ( '#__componentbuilder_joomla_component' ));
2016-01-30 20:28:43 +00:00
$db -> setQuery ( $query );
$db -> execute ();
if ( $db -> getNumRows ())
{
// Get Yesterdays date
$date = JFactory :: getDate () -> modify ( $time ) -> toSql ();
// reset query
$query = $db -> getQuery ( true );
// Fields to update.
$fields = array (
$db -> quoteName ( 'checked_out_time' ) . '=\'0000-00-00 00:00:00\'' ,
$db -> quoteName ( 'checked_out' ) . '=0'
);
// Conditions for which records should be updated.
$conditions = array (
$db -> quoteName ( 'checked_out' ) . '!=0' ,
$db -> quoteName ( 'checked_out_time' ) . '<\'' . $date . '\''
);
// Check table
2017-02-16 14:02:23 +00:00
$query -> update ( $db -> quoteName ( '#__componentbuilder_joomla_component' )) -> set ( $fields ) -> where ( $conditions );
2016-01-30 20:28:43 +00:00
$db -> setQuery ( $query );
$db -> execute ();
}
}
return false ;
}
}