ConLite/conlite/plugins/pluginmanager/classes/setup/class.pim.setup.plugin.inst...

428 Zeilen
18 KiB
PHP

<?php
if (!defined('CON_FRAMEWORK')) {
die('Illegal call');
}
class pimSetupPluginInstall extends pimSetupBase {
const SQL_FILE = "plugin_install.sql";
/**
*
* @var pimPlugin
*/
private $_oPlugin;
//helper arrays
private $_aAreas = array();
private $_aInstalledAreas;
private $_aInstalledNavMain;
private $_aInstalledNavSub;
public function __construct() {
parent::__construct();
$this->_initInstalledAreasArray();
}
public function installPlugin() {
if (is_null($this->_oXml)) {
cWarning(__FILE__, __LINE__, "installPlugin: No plugin xml loaded!");
return 0;
}
$this->_installCheckUuid();
$this->_installCheckRequirements();
$oPiColl = new pimPluginCollection();
$this->_oPlugin = $oPiColl->createNewItem();
if ($this->_oPlugin->isLoaded()) {
$this->_iPiId = $this->_oPlugin->get('idplugin');
$this->_insertDbEntries();
$this->_getPluginSql();
if ($this->doQueries()) {
$this->_oPlugin->set('idclient', $this->_iClient, FALSE);
$this->_oPlugin->set('name', Contenido_Security::escapeDB(self::$XmlGeneral->plugin_name));
$this->_oPlugin->set('description', Contenido_Security::escapeDB(self::$XmlGeneral->description));
$this->_oPlugin->set('author', Contenido_Security::escapeDB(self::$XmlGeneral->author));
$this->_oPlugin->set('copyright', Contenido_Security::escapeDB(self::$XmlGeneral->copyright));
$this->_oPlugin->set('mail', Contenido_Security::escapeDB(self::$XmlGeneral->mail));
$this->_oPlugin->set('website', Contenido_Security::escapeDB(self::$XmlGeneral->website));
$this->_oPlugin->set('version', Contenido_Security::escapeDB(self::$XmlGeneral->version));
$this->_oPlugin->set('folder', Contenido_Security::escapeDB(self::$XmlGeneral->plugin_foldername));
$this->_oPlugin->set('uuid', Contenido_Security::escapeDB(self::$XmlGeneral->uuid));
$this->_oPlugin->set('executionorder', $this->_updateSortOrder(), FALSE);
$this->_oPlugin->set('installed', date('Y-m-d H:i:s'), FALSE);
$this->_oPlugin->set('active', (int) self::$XmlGeneral['active'], FALSE);
if ($this->_oPlugin->store()) {
//echo "stored: ".$this->_iPiId;
return $this->_iPiId;
}
} else {
$this->_removeEmptyPlugin();
}
}
// something went wrong, return 0
return 0;
}
protected function _insertDbEntries() {
$this->_addAreas();
$this->_addActions();
$this->_addFrames();
$this->_addNavMain();
$this->_addNavSub();
}
protected function _addRelation($iIdItem, $sType) {
$oPluginRelation = $this->_PimPluginRelationCollection->createNewItem();
$oPluginRelation->set('iditem', $iIdItem, FALSE);
$oPluginRelation->set('idplugin', $this->_iPiId, FALSE);
$oPluginRelation->set('type', $sType);
$oPluginRelation->store();
unset($oPluginRelation);
}
private function _addAreas() {
$aAttributes = array();
$aDefaultAttr = array(
'menuless' => 0,
'parent' => 0,
'relevant' => 1
);
$iCountAreas = count(self::$XmlArea->area);
if ($iCountAreas > 0) {
$oAreaColl = new cApiAreaCollection();
for ($i = 0; $i < $iCountAreas; $i++) {
$sName = Contenido_Security::escapeDB(self::$XmlArea->area[$i], $this->oDb);
// build attributes
foreach (self::$XmlArea->area[$i]->attributes() as $sKey => $sValue) {
$aAttributes[$sKey] = (string) $sValue;
}
$aAttributes = array_merge($aDefaultAttr, $aAttributes);
/* @var $oArea cApiArea */
$oArea = $oAreaColl->createNewItem($this->_getNextId("area"));
$oArea->set('parent_id', Contenido_Security::escapeDB($aAttributes['parent'], $this->oDb));
$oArea->set('name', $sName);
$oArea->set('menuless', Contenido_Security::toInteger($aAttributes['menuless']));
$oArea->set('relevant', 1, FALSE);
$oArea->set('online', 1, FALSE);
if ($oArea->store()) {
$iIdItem = $oArea->get($oArea->primaryKey);
$this->_aAreas[$sName] = $iIdItem;
$this->_aInstalledAreas[] = $sName;
$this->_addRelation($iIdItem, 'area');
}
}
}
}
private function _addActions() {
$aAttributes = array();
$aDefaultAttr = array(
'relevant' => 1
);
$iCountActions = count(self::$XmlActions->action);
if ($iCountActions > 0) {
$oActionColl = new cApiActionCollection();
for ($i = 0; $i < $iCountActions; $i++) {
$sName = Contenido_Security::escapeDB(self::$XmlActions->action[$i], $this->_oDb);
foreach (self::$XmlActions->action[$i]->attributes() as $sKey => $sValue) {
$aAttributes[$sKey] = cSecurity::escapeString($sValue);
}
$aAttributes = array_merge($aDefaultAttr, array_filter($aAttributes));
if (!in_array($aAttributes['area'], $this->_aInstalledAreas)) {
parent::error(sprintf(i18n('Defined area <strong>%s</strong> are not found on your ConLite installation. Please contact your plugin author.', 'pluginmanager'), $aAttributes['area']));
}
/* @var $oAction cApiAction */
$oAction = $oActionColl->createNewItem($this->_getNextId("actions"));
if ($oAction->isLoaded()) {
$oAction->set("idarea", $this->_getIdForArea($aAttributes['area']));
$oAction->set("name", $sName);
$oAction->set("code", '');
$oAction->set("location", '');
$oAction->set("relevant", (int) $aAttributes['relevant']);
if ($oAction->store()) {
$this->_addRelation($oAction->get('idaction'), 'actions');
}
}
//$oAction = $oActionColl->create($aAttributes['area'], $sName, '', '', $aAttributes['relevant']);
//$this->_addRelation($oAction->get('idaction'), 'actions');
}
unset($oActionColl);
unset($oAction);
}
}
private function _addFrames() {
$aAttributes = array();
$aDefaultAttr = array();
$iCountFrames = count(self::$XmlFrames->frame);
if ($iCountFrames > 0) {
$oFrameFileColl = new cApiFrameFileCollection();
$oFileColl = new cApiFileCollection();
for ($i = 0; $i < $iCountFrames; $i++) {
// Build attributes with security checks
foreach (self::$XmlFrames->frame[$i]->attributes() as $sKey => $sValue) {
$aAttributes[$sKey] = cSecurity::escapeString($sValue);
}
$aAttributes = array_merge($aDefaultAttr, array_filter($aAttributes));
// Check for valid area
if (!array_key_exists($aAttributes['area'], $this->_aAreas) && !in_array($aAttributes['area'], $this->_aInstalledAreas)) {
parent::error(sprintf(i18n('Defined area <strong>%s</strong> are not found on your ConLite installation. Please contact your plugin author.', 'pluginmanager'), $aAttributes['area']));
}
/* @var $oFile cApiFile */
$oFile = $oFileColl->createNewItem($this->_getNextId("files"));
if ($oFile->isLoaded()) {
$this->_addRelation($oFile->get('idfile'), 'files');
$oFile->set("idarea", $this->_getIdForArea($aAttributes['area']));
$oFile->set("filename", $aAttributes['name']);
$oFile->set("filetype", cSecurity::escapeString($aAttributes['filetype']));
if ($oFile->store()) {
if (!empty($aAttributes['frameId'])) {
/* @var $oFrameFile cApiFrameFile */
$oFrameFile = $oFrameFileColl->createNewItem($this->_getNextId("framefiles"));
if ($oFrameFile->isLoaded()) {
$this->_addRelation($oFrameFile->get('idframefile'), 'framefiles');
$oFrameFile->set("idarea", $this->_getIdForArea($aAttributes['area']));
$oFrameFile->set("idframe", (int) $aAttributes['frameId'], FALSE);
$oFrameFile->set("idfile", (int) $oFile->get('idfile'), FALSE);
$oFrameFile->store();
}
}
}
}
}
unset($oFrameFileColl);
unset($oFileColl);
unset($oFile);
unset($oFrameFile);
}
}
private function _addNavMain() {
$aAttributes = array();
$iCountNavMain = count(self::$XmlNavMain->nav);
if ($iCountNavMain > 0) {
$oNavMainColl = new cApiNavMainCollection();
for ($i = 0; $i < $iCountNavMain; $i++) {
$sLocation = cSecurity::escapeString(self::$XmlNavMain->nav[$i]);
if (empty($sLocation)) {
parent::error(i18n('There seem to be an empty main navigation entry in plugin.xml. Please contact your plugin author.', 'pluginmanager'), $this->_iPiId);
}
// Build attributes with security checks
foreach (self::$XmlNavMain->nav[$i]->attributes() as $sKey => $sValue) {
$aAttributes[$sKey] = cSecurity::escapeString($sValue);
}
/* @var $oNavMain cApiNavMain */
$oNavMain = $oNavMainColl->createNewItem($this->_getNextId("nav_main"));
if($oNavMain->isLoaded()) {
$this->_addRelation($oNavMain->get('idnavm'), 'nav_main');
$oNavMain->set("location", $sLocation, FALSE);
$oNavMain->set("name", cSecurity::escapeString($aAttributes['name']));
$oNavMain->store();
}
}
unset($oNavMainColl);
unset($oNavMain);
}
}
private function _addNavSub() {
$aAttributes = array();
$this->_initInstalledNavMainArray();
$iCountNavSub = count(self::$XmlNavSub->nav);
if ($iCountNavSub > 0) {
$oNavSubColl = new cApiNavSubCollection();
for ($i = 0; $i < $iCountNavSub; $i++) {
$sLocation = cSecurity::escapeString(self::$XmlNavSub->nav[$i]);
if (empty($sLocation)) {
parent::error(i18n('There seem to be an empty sub navigation entry in plugin.xml. Please contact your plugin author.', 'pluginmanager'), $this->_iPiId);
}
// Build attributes with security checks
foreach (self::$XmlNavSub->nav[$i]->attributes() as $sKey => $sValue) {
$aAttributes[$sKey] = cSecurity::escapeString($sValue);
}
/* @var $oNavSub cApiNavSub */
$oNavSub = $oNavSubColl->createNewItem($this->_getNextId("nav_sub"));
if ($oNavSub->isLoaded()) {
$this->_addRelation($oNavSub->get('idnavs'), 'nav_sub');
$oNavSub->set("idnavm", $this->_getIdForNavMain($aAttributes['navm']));
$oNavSub->set("idarea", $this->_getIdForArea($aAttributes['area']));
$oNavSub->set("level", (int) $aAttributes['level']);
$oNavSub->set("location", $sLocation, FALSE);
$oNavSub->set("online", 1, FALSE);
$oNavSub->store();
}
}
unset($oNavSubColl);
unset($oNavSub);
}
}
private function _removeEmptyPlugin() {
if (empty($this->_iPiId)) {
return FALSE;
}
$this->_getRelations();
if (count($this->_aRelations) > 0) {
$this->_deleteRelationEntries();
$this->_deleteRelations();
}
$this->_PimPluginCollection->delete($this->_iPiId);
}
/**
* Check uuId: You can install a plugin only for one time
*/
private function _installCheckUuid() {
$this->_PimPluginCollection->setWhere('uuid', self::$XmlGeneral->uuid);
$this->_PimPluginCollection->query();
if ($this->_PimPluginCollection->count() > 0) {
parent::error(i18n('You can install this plugin only for one time.', 'pluginmanager'));
}
}
private function _installCheckRequirements() {
// Check min ConLite version
if (version_compare(CL_VERSION, self::$XmlRequirements->conlite->attributes()->minversion, '<')) {
parent::error(sprintf(i18n('You have to install ConLite <strong>%s</strong> or higher to install this plugin!', 'pluginmanager'), self::$XmlRequirements->conlite->attributes()->minversion));
}
// Check max ConLite version
if (self::$XmlRequirements->conlite->attributes()->maxversion) {
if (version_compare(CL_VERSION, self::$XmlRequirements->conlite->attributes()->maxversion, '>')) {
parent::error(sprintf(i18n('Your current ConLite version is to new - max ConLite version %s', 'pluginmanager'), self::$XmlRequirements->conlite->attributes()->maxversion));
}
}
// Check PHP version
if (version_compare(phpversion(), self::$XmlRequirements->attributes()->php, '<')) {
parent::error(sprintf(i18n('You have to install PHP <strong>%s</strong> or higher to install this plugin!', 'pluginmanager'), self::$XmlRequirements->attributes()->php));
}
/* @todo check and implement other requirement checks
// Check extensions
if (count(parent::$XmlRequirements->extension) != 0) {
for ($i = 0; $i < count(parent::$XmlRequirements->extension); $i++) {
if (!extension_loaded(parent::$XmlRequirements->extension[$i]->attributes()->name)) {
parent::error(sprintf(i18n('The plugin could not find the PHP extension <strong>%s</strong>. Because this is required by the plugin, it can not be installed.', 'pim'), parent::$XmlRequirements->extension[$i]->attributes()->name));
}
}
}
// Check classes
if (count(parent::$XmlRequirements->class) != 0) {
for ($i = 0; $i < count(parent::$XmlRequirements->class); $i++) {
if (!class_exists(parent::$XmlRequirements->class[$i]->attributes()->name)) {
parent::error(sprintf(i18n('The plugin could not find the class <strong>%s</strong>. Because this is required by the plugin, it can not be installed.', 'pim'), parent::$XmlRequirements->class[$i]->attributes()->name));
}
}
}
// Check functions
if (count(parent::$XmlRequirements->function) != 0) {
for ($i = 0; $i < count(parent::$XmlRequirements->function); $i++) {
if (!function_exists(parent::$XmlRequirements->function[$i]->attributes()->name)) {
parent::error(sprintf(i18n('The plugin could not find the function <strong>%s</strong>. Because this is required by the plugin, it can not be installed.', 'pim'), parent::$XmlRequirements->function[$i]->attributes()->name));
}
}
}
*
*/
}
private function _initInstalledAreasArray() {
$this->_aInstalledAreas = array();
$oAreaColl = new cApiAreaCollection();
$oAreaColl->select();
//$oAreaColl->query();
/* @var $oArea cApiArea */
while ($oArea = $oAreaColl->next()) {
$this->_aInstalledAreas[] = $oArea->get('name');
}
//print_r($this->_aInstalledAreas);
}
private function _initInstalledNavMainArray() {
$this->_aInstalledNavMain = array();
$oNavMainColl = new cApiNavMainCollection();
$oNavMainColl->select();
//$oNavMainColl->query();
/* @var $oArea cApiArea */
while ($oNavMain = $oNavMainColl->next()) {
$this->_aInstalledNavMain[$oNavMain->get('name')] = $oNavMain->get('idnavm');
}
}
private function _initInstalledNavSubArray() {
$this->_aInstalledNavSub = array();
$oNavSubColl = new cApiNavSubCollection();
$oNavMainColl->select();
//$oNavSubColl->query();
/* @var $oArea cApiArea */
while ($oNavSub = $oNavSubColl->next()) {
$this->_aInstalledNavMain[$oNavSub->get('idnavsub')] = $oNavSub->get('name');
}
}
private function _getIdForArea($sArea) {
if (array_key_exists($sArea, $this->_aAreas)) {
return $this->_aAreas[$sArea];
}
if (in_array($sArea, $this->_aInstalledAreas)) {
$oArea = new cApiArea();
$oArea->loadBy("name", $sArea);
if ($oArea->isLoaded()) {
return $oArea->get($oArea->primaryKey);
}
}
parent::error(sprintf(i18n('Defined area <strong>%s</strong> not found on your ConLite installation. Please contact your plugin author.', "pluginmanager"), $sArea), $this->_iPiId);
}
private function _getIdForNavMain($sNavMain) {
if($sNavMain == "0") {
return $sNavMain;
}
if (array_key_exists($sNavMain, $this->_aInstalledNavMain)) {
return $this->_aInstalledNavMain[$sNavMain];
}
parent::error(sprintf(i18n('Defined nav main <strong>%s</strong> not found on your ConLite installation. Please contact your plugin author.', "pluginmanager"), $sNavMain), $this->_iPiId);
}
public function __destruct() {
//echo "<pre>";
//print_r($this->_aAreas);
}
}