'install',
);
$oTpl= $this->getView('menu');
$oTpl->tLink=$tLink;
return $oTpl;
}
public function _index(){
$sAction=_root::getParam('saction','install');
if($sAction=='install'){
return $this->getActionPackages();
}else if($sAction=='installExtModule'){
return $this->getActionInstallExtModule();
}else if($sAction=='installExtPlugin'){
return $this->getActionInstallExtPlugin();
}
return $this->getView('accueil');
}
private function copyTo($sUrl,$sTarget){
$sDir=dirname($sTarget);
if(is_writable($sDir)==false){
$this->errorZip=trR('repertoireNonWritable',array('#repertoire#'=>$sDir));
return false;
}
try{
file_put_contents($sTarget,file_get_contents($sUrl.'.down'));
return true;
}
catch(Exception $e){
$this->errorZip=trR('urlNonDispo',array('#url#'=>$sUrl)).$e->getMessage();
return false;
}
}
private function unzipTo($sUrl,$sTarget){
$sDir=dirname($sTarget);
if(is_writable($sDir)==false){
$this->errorZip=trR('repertoireNonWritable',array('#repertoire#'=>$sDir));
return false;
}
try{
file_put_contents($sTarget.'.zip',file_get_contents($sUrl));
}
catch(Exception $e){
$this->errorZip=trR('urlNonDispo',array('#url#'=>$sUrl)).$e->getMessage();
return false;
}
list($foo,$sTargetDirZip)=explode('.',$sTarget);
$sTargetDir=$sDir.'/'.$sTargetDirZip;
$zip = new ZipArchive;
if ($zip->open($sTarget.'.zip')){
$zip->extractTo($sTargetDir);
$zip->close();
try{
chmod($sTargetDir,0777);
}catch(Exception $e){
}
//menage
unlink($sTarget.'.zip');
}
return true;
}
/*
pages/fr/index.xml
content
test
toto
pages/fr/bootstrap_list_1.xml
list
test
presentation bootstrap
couche model
mods_all_model
module crud
mods_bootstrap_
*/
private function getActionPackages(){
$tLocalIni=$this->getListIni();
$sPage=_root::getParam('market','index');
$oXml=$this->getRemoteMarketPage($sPage);
$tType=array('content','list','detail_module','detail_plugin');
$sType=(string)$oXml->type;
if(!in_array($sType,$tType)){
return $this->getView('error');
}
$oViewHead=$this->getView('market_head');
$oViewHead->tNav=$this->getNav($oXml->nav->link);
$sViewHead=$oViewHead->show();
$oView=$this->getView('market_'.$sType);
$oView->sHead=$sViewHead;
$oView->title=(string)$oXml->title;
$oView->content=(string)$oXml->content;
if($sType=='list'){
$oView->tBloc=$this->getBlocs($oXml->data->bloc);
}else if(in_array($sType,array('detail','detail_module','detail_plugin'))){
$oView->id=(string)$oXml->id;
$oView->version=(string)$oXml->version;
$oView->author=(string)$oXml->author;
$oView->presentation=(string)$oXml->presentation;
$oView->utilisation=(string)$oXml->utilisation;
$oView->actualites=(string)$oXml->actualites;
}
$oView->tLocalIni=$tLocalIni;
return $oView;
}
//install
private function getActionInstallExtModule(){
$sError= $this->installExtModuleInProject(_root::getParam('sid'),_root::getParam('version'));
$oView=$this->getView('market_install');
$oView->error=$sError;
return $oView;
}
private function installExtModuleInProject($sModule,$sVersion){
$sRootUrl=_root::getConfigVar('market.builder.url');
$sRootUrl=str_replace('Builder','Application',$sRootUrl);
$sPathModule=$sModule;
$sRootPathModule=module_builder::getTools()->getRootWebsite().'module';
$sRootPathApplication=module_builder::getTools()->getRootWebsite();
if(!$this->unzipTo($sRootUrl.'/module/'.$sModule.$sVersion.'.zip',$sRootPathModule.'/'.$sPathModule) ){
return $this->errorZip;
}
list($foo,$sModuleDir)=explode('.',$sPathModule);
if(file_exists($sRootPathModule.'/'.$sModuleDir.'/install.ini')){
$tInstallIni= parse_ini_file($sRootPathModule.'/'.$sModuleDir.'/install.ini',true);
foreach($tInstallIni as $tCopy){
$sFrom=$sRootPathModule.'/'.$sModuleDir.'/'.$tCopy['from'];
$sTo=$sRootPathApplication.'/'.$tCopy['to'];
$sDir=dirname($sTo);
if(!is_writable($sDir) ){
return trR('repertoireNonWritable',array('#repertoire#'=>$sDir));
}
if(file_exists($sTo)){
return trR('fichierExisteDeja',array('#fichier#'=>$sTo));
}
rename($sFrom,$sTo);
}
}
}
//install
private function getActionInstallExtPlugin(){
$sError= $this->installExtPluginInProject(_root::getParam('sid'),_root::getParam('version'));
$oView=$this->getView('market_install');
$oView->error=$sError;
return $oView;
}
private function installExtPluginInProject($sPlugin,$sVersion){
$sRootUrl=_root::getConfigVar('market.builder.url');
$sRootUrl=str_replace('Builder','Application',$sRootUrl);
$sRootPathPlugin=module_builder::getTools()->getRootWebsite().'plugin/';
if(!$this->copyTo($sRootUrl.'/plugin/'.$sPlugin,$sRootPathPlugin.'/'.$sPlugin) ){
return $this->errorZip;
}
if(!$this->copyTo($sRootUrl.'/plugin/'.$sPlugin.'.ini',$sRootPathPlugin.'/'.$sPlugin.'.ini') ){
return $this->errorZip;
}
}
private function getNav($tXmlNav){
$tNav=array();
foreach($tXmlNav as $oXml){
$tNav[ (string)$oXml['href'] ]=(string)$oXml;
}
return $tNav;
}
private function getBlocs($tXmlBlocs){
$tBlocs=array();
if($tXmlBlocs){
foreach($tXmlBlocs as $oXmlBloc){
$tBlocs[]=array(
'title'=>(string)$oXmlBloc->title,
'id'=>(string)$oXmlBloc->id,
'author'=>(string)$oXmlBloc->author,
'version'=>(string)$oXmlBloc->version,
);
}
}
return $tBlocs;
}
public function getRemoteMarketPage($sPage){
$sRootUrl=_root::getConfigVar('market.builder.url');
$sRootUrl=str_replace('Builder','Application',$sRootUrl);
$sRootUrl.='pages/';
$sRootUrl.=_root::getConfigVar('language.default');
$sXml=file_get_contents($sRootUrl.'/'.$sPage.'.xml');
$oXml=simplexml_load_string($sXml);
return $oXml;
}
public static function getMarketLink($sAction){
return _root::getLink('builder::edit',array('id'=>_root::getParam('id'),'action'=>'mods_all_market::index','saction'=>'install','market'=>$sAction));
}
public static function getInstallLinkModule($sId,$sVersion){
return _root::getLink('builder::edit',array('id'=>_root::getParam('id'),'action'=>'mods_all_market::index','saction'=>'installExtModule','sid'=>$sId,'version'=>$sVersion));
}
public static function getInstallLinkPlugin($sId,$sVersion){
return _root::getLink('builder::edit',array('id'=>_root::getParam('id'),'action'=>'mods_all_market::index','saction'=>'installExtPlugin','sid'=>$sId,'version'=>$sVersion));
}
public function getListIni(){
$tLinkModule=array();
$tLocalIni=array();
$sPathModule=module_builder::getTools()->getRootWebsite().'module';
$tModulesAll=scandir($sPathModule);
foreach($tModulesAll as $sModule){
if(file_exists($sPathModule.'/'.$sModule.'/info.ini')){
$tIni=parse_ini_file($sPathModule.'/'.$sModule.'/info.ini');
$tLocalIni[$tIni['id'] ]=$tIni['version'];
}
}
return $tLocalIni;
}
}