Source for file module_ctrl_xml_importer.class.php
Documentation is available at module_ctrl_xml_importer.class.php
* Contains class Module_CTRL_XML_Importer
* @subpackage modules_manager
require_once(TANGRA_MAIN_DIR. 'modules_manager/tangra_module_dbc.class.php');
require_once(TANGRA_MAIN_DIR. 'modules_manager/tangra_module_release_dbc.class.php');
require_once(TANGRA_MAIN_DIR. 'modules_manager/tangra_module_release_param_dbc.class.php');
require_once(TANGRA_MAIN_DIR. 'modules_manager/tangra_module_release_relation_dbc.class.php');
require_once(TANGRA_MAIN_DIR. 'modules_manager/tangra_module_category_dbc.class.php');
require_once(TANGRA_MAIN_DIR. 'modules_manager/tangra_module_release_category_dbc.class.php');
require_once(TANGRA_MAIN_DIR. 'modules_manager/tangra_module_license_dbc.class.php');
* Module_CTRL_XML_Importer is used to import module.ctrl.xml files
* @subpackage modules_manager
* Location type "online repository"
* Imports module information parsed from $xml_str which have to contain valid XML
* @param DB_Connection $dbc
public static function import(DB_Connection $dbc, $xml_str) {
$ret = array('status' => 'error', 'module_release_hid' => '', 'module_release_id' => 0);
if (!$module->load_by_hid($dbc, $hid)) {
$ret['status'] = 'imported';
$ret['module_hid'] = $module->get_hid();
$ret['module_release_id'] = $module_release->get_id();
$ret['module_release_hid'] = $module->get_hid(). '-'. $module_release->get_version();
$current_release_version = trim($xml->version);
if ($last_available_release) {
if ($module_release->load_by_module_and_version($dbc, $module->get_id(), $current_release_version)) {
$ret['status'] = 'updated';
$ret['status'] = 'imported';
$ret['module_release_hid'] = $module->get_hid(). '-'. $module_release->get_version();
$ret['module_release_id'] = $module_release->get_id();
// no releases are found so we are importing
$ret['module_release_id'] = $module_release->get_id();
$ret['status'] = 'updated';
$ret['module_hid'] = $module->get_hid();
$ret['module_release_hid'] = $module->get_hid(). '-'. $module_release->get_version();
$ret['status'] = 'error';
* Captures basic module details as hid, description, maintainer, url and license
* @param DB_Connection $dbc
* @param SimpleXMLElement $xml SimpleXMLElement instance usualy returned by simplexml_load_string
$ret = array('module' => array(), 'rez' => false, 'errors' => array());
$description = trim($xml->description);
$maintainer = trim($xml->maintainer);
$license_hid = trim($xml->licensehid);
if ($license->load_by_hid($dbc, $license_hid)) {
$ret['module']['hid'] = $hid;
$ret['module']['description'] = $description;
$ret['module']['maintainer'] = $maintainer;
$ret['module']['url'] = $url;
$ret['module']['license'] = $license->get_id();
$ret['errors'][] = 'Cannot find license with HID = '. $license_hid;
$ret['errors'][] = 'Cannot find maintainer';
$ret['errors'][] = 'Cannot find description';
$ret['errors'][] = 'Cannot find module by HID';
* Populates Tangra_Module_DBC object and saves it in DB
* @param DB_Connection $dbc
* @param SimpleXMLElement $xml
* @return Tangra_Module_DBC On success returns Tangra_Module_DBC, on failure false
private static function create_module(DB_Connection $dbc, $xml) {
if ($mod_details['rez']) {
$module->set_hid($mod_details['module']['hid']);
$module->set_description($mod_details['module']['description']);
$module->set_maintainer($mod_details['module']['maintainer']);
$module->set_url($mod_details['module']['url']);
$module->set_license($mod_details['module']['license']);
* Extracts module release details from SimpleXMLElement object
* @param SimpleXMLElement $xml
$ret = array('mod_release' => array(),
'category_hids' => array(),
$version = trim($xml->version);
$description = trim($xml->description);
$maintainer = trim($xml->maintainer);
$requiresphpversion = trim($xml->requiresphpversion);
if ($requiresphpversion) {
$requirestangralib = trim($xml->requirestangralib);
if ($requirestangralib) {
$ret['mod_release']['hid'] = $hid;
$ret['mod_release']['version'] = $version;
$ret['mod_release']['description'] = $description;
$ret['mod_release']['maintainer'] = $maintainer;
$ret['mod_release']['url'] = $url;
$ret['mod_release']['requiresphpversion'] = $requiresphpversion;
$ret['mod_release']['requirestangralib'] = $requirestangralib;
$ret['params'] = $params;
$ret['relations'] = $relations;
foreach($xml->categoryhid as $chid) {
$ret['category_hids'][] = trim($chid);
$ret['errors'][] = 'Cannot find requirestangralib';
$ret['errors'][] = 'Cannot find requiresphpversion';
$ret['errors'][] = 'Cannot find maintainer';
$ret['errors'][] = 'Cannot find description';
$ret['errors'][] = 'Cannot find version';
$ret['errors'][] = 'Cannot find hid';
* Extracts parameters from SimpleXMLElement object
* @param SimpleXMLElement $xml
$ret = array('req' => array(), 'hard' => array(), 'soft' => array());
if ($xml->param_required) {
foreach($xml->param_required as $param) {
$ret['req'][] = trim($param);
if ($xml->param_optional_hard) {
foreach($xml->param_optional_hard as $param) {
$ret['hard'][] = trim($param);
if ($xml->param_optional_soft) {
foreach($xml->param_optional_soft as $param) {
$ret['soft'][] = trim($param);
* Extracts relations from SimpleXMLElement object
* @param SimpleXMLElement $xml
$ret = array('depends' => array(),
foreach($xml->depends as $dep) {
$ret['depends'][trim($dep->module)] = trim($dep->versionrequirement);
foreach($xml->provides as $prov) {
// TODO - this bellow is nonsense. Tag for "provides" must be "version", not "versionrequirement" (if any at all)
// The problem is that too many modules contain "provides" tag and shall be chanded and released
// May be here we need compatability fix which can parse both "version" and "versionrequirement"?
$ret['provides'][trim($prov->module)] = trim($prov->versionrequirement);
foreach($xml->conflicts as $confl) {
$ret['conflicts'][trim($confl->module)] = trim($confl->versionrequirement);
foreach($xml->recommends as $rec) {
$ret['recommends'][trim($rec->module)] = trim($rec->versionrequirement);
foreach($xml->suggests as $sug) {
$ret['suggests'][trim($sug->module)] = trim($sug->versionrequirement);
foreach($xml->enhances as $enh) {
$ret['enhances'][trim($enh->module)] = trim($enh->versionrequirement);
foreach($xml->predepends as $pred) {
$ret['predepends'][trim($pred->module)] = trim($pred->versionrequirement);
* Creates instance of Tangra_Module_Release_DBC, populates it and saves in DB
* @param DB_Connection $dbc
* @param SimpleXMLElement $xml
* @param integer $module_id
* @return Tangra_Module_Release_DBC on success returns Tangra_Module_Release_DBC object, on failure - false
if ($mod_release_details['rez']) {
$mod_release->set_module($module_id);
$mod_release->set_version($mod_release_details['mod_release']['version']);
$mod_release->set_description($mod_release_details['mod_release']['description']);
$mod_release->set_maintainer($mod_release_details['mod_release']['maintainer']);
$mod_release->set_url($mod_release_details['mod_release']['url']);
$mod_release->set_requires_tangra_lib_version($mod_release_details['mod_release']['requiresphpversion']);
$mod_release->set_requires_php_version($mod_release_details['mod_release']['requirestangralib']);
$mod_release->set_online(true);
$mod_release->save($dbc);
* Creates release parameters and relations (Tangra_Module_Release_Param_DBC and Tangra_Module_Release_Relation_DBC)
* @param DB_Connection $dbc
* @param array $mod_release_details Array returned by Module_CTRL_XML_Importer::capture_module_release_details()
* @param integer $mod_release_id ID of module release
foreach($mod_release_details['params']['req'] as $param_name) {
$param->set_name($param_name);
$param->set_module_release($mod_release_id);
foreach($mod_release_details['params']['hard'] as $param_name) {
$param->set_name($param_name);
$param->set_module_release($mod_release_id);
foreach($mod_release_details['params']['soft'] as $param_name) {
$param->set_name($param_name);
$param->set_module_release($mod_release_id);
foreach($mod_release_details['relations']['depends'] as $module_hid => $version_req) {
$rel->set_module_release($mod_release_id);
$rel->set_relation_to($module_hid);
$rel->set_version_requirement($version_req);
foreach($mod_release_details['relations']['provides'] as $module_hid => $version_req) {
$rel->set_module_release($mod_release_id);
$rel->set_relation_to($module_hid);
$rel->set_version_requirement($version_req);
foreach($mod_release_details['relations']['conflicts'] as $module_hid => $version_req) {
$rel->set_module_release($mod_release_id);
$rel->set_relation_to($module_hid);
$rel->set_version_requirement($version_req);
foreach($mod_release_details['relations']['recommends'] as $module_hid => $version_req) {
$rel->set_module_release($mod_release_id);
$rel->set_relation_to($module_hid);
$rel->set_version_requirement($version_req);
foreach($mod_release_details['relations']['suggests'] as $module_hid => $version_req) {
$rel->set_module_release($mod_release_id);
$rel->set_relation_to($module_hid);
$rel->set_version_requirement($version_req);
foreach($mod_release_details['relations']['enhances'] as $module_hid => $version_req) {
$rel->set_module_release($mod_release_id);
$rel->set_relation_to($module_hid);
$rel->set_version_requirement($version_req);
$rel->set_type(TANGRA_MODULE_RELEASE_RELATION_DBC::TYPE_ENHANCES);
foreach($mod_release_details['relations']['predepends'] as $module_hid => $version_req) {
$rel->set_module_release($mod_release_id);
$rel->set_relation_to($module_hid);
$rel->set_version_requirement($version_req);
* Creates links (Tangra_Module_Release_Category_DBC) to module categories
* @param DB_Connection $dbc
* @param array $mod_release_details Array returned by Module_CTRL_XML_Importer::capture_module_release_details()
* @param integer $mod_release_id ID of module release
foreach($mod_release_details['category_hids'] as $chid) {
if ($category->load_by_hid($dbc, $chid)) {
$cat_link->set_category($category->get_id());
$cat_link->set_module_release($mod_release_id);
* Updates Module_CTRL_XML_Importer object and saves it in DB
* @param DB_Connection $dbc
* @param SimpleXMLElement $xml
* @param Tangra_Module_DBC $module
* @return Tangra_Module_DBC On success returns Tangra_Module_DBC object, on failure - false
private static function update_module(DB_Connection $dbc, $xml, Tangra_Module_DBC $module) {
if ($mod_details['rez']) {
$module->set_description($mod_details['module']['description']);
$module->set_maintainer($mod_details['module']['maintainer']);
$module->set_url($mod_details['module']['url']);
$module->set_license($mod_details['module']['license']);
* Updates Tangra_Module_Release_DBC object and saves it in DB
* @param DB_Connection $dbc
* @param SimpleXMLElement $xml
* @param Tangra_Module_Release_DBC $mod_release
* @return boolean On success returns true, on failure - false
private static function update_module_release(DB_Connection $dbc, $xml, Tangra_Module_Release_DBC $mod_release) {
if ($mod_release_details) {
$mod_release->set_version($mod_release_details['mod_release']['version']);
$mod_release->set_description($mod_release_details['mod_release']['description']);
$mod_release->set_maintainer($mod_release_details['mod_release']['maintainer']);
$mod_release->set_url($mod_release_details['mod_release']['url']);
$mod_release->set_requires_tangra_lib_version($mod_release_details['mod_release']['requiresphpversion']);
$mod_release->set_requires_php_version($mod_release_details['mod_release']['requirestangralib']);
$mod_release->set_online(true);
$mod_release->save($dbc);
|