public static function check_structure($xml = "", $force_update = false) { $filemtime = 0; set_time_limit(0); if (!$xml) { $xml = '<structure>'; $handle = opendir(CONTENTPATH); $opts = array('http' => array('method' => "GET", 'header' => "Content-Type: text/html; charset=utf-8")); $context = stream_context_create($opts); while (false !== ($file = readdir($handle))) { if (is_dir(CONTENTPATH . $file) && file_exists(CONTENTPATH . $file . '/structure.xml')) { $current_filemtime = filemtime(CONTENTPATH . $file . '/structure.xml'); try { $structure = new SimpleXMLElement('<structure>' . file_get_contents(CONTENTPATH . $file . '/structure.xml', false, $context) . '</structure>'); } catch (Exception $exception) { die('Fout bij lezen van xml voor ' . $file); } foreach ($structure->xpath('//object|//page') as $child) { $child->addAttribute('contentname', $file); } foreach ($structure->children() as $child) { $xml .= str_replace('&', '&', $child->asXML()); } if ($current_filemtime > $filemtime) { $filemtime = $current_filemtime; } } } closedir($handle); $xml .= '</structure>'; $xml = self::expand_protocols(new SimpleXMLElement($xml))->asXML(); self::$structure_xml = new SimpleXMLElement($xml); if (!$force_update) { $site = current_site(); $last_update = $site->table_check_date; } else { $last_update = 0; } if ($filemtime > $last_update || $force_update) { $structure = new SimpleXMLElement($xml); if (!count($structure->xpath("//site"))) { $structure->addChild('site'); } $expanded_xml = self::expand_node($structure); foreach ($expanded_xml as $type => $data) { if ($type == 'page' || $type == 'object' || $type == 'site') { self::process_searchable_fields($data); } } if (count(self::$searchable_fields)) { $searchable = $expanded_xml->addChild('object'); $searchable->addAttribute('name', '_search_index'); $searchableObject = $searchable->addChild('string'); $searchableObject->addAttribute('name', 'object_name'); $searchableObject->addAttribute('index', 'index'); $searchableLanguage = $searchable->addChild('string'); $searchableLanguage->addAttribute('name', '_language'); $searchableLanguage->addAttribute('index', 'index'); $searchableLanguage->addAttribute('length', '2'); $searchableId = $searchable->addChild('number'); $searchableId->addAttribute('name', 'object_id'); $searchableId->addAttribute('index', 'index'); $searchableVersion = $searchable->addChild('number'); $searchableVersion->addAttribute('name', '_version_id'); $searchableVersion->addAttribute('index', 'index'); foreach (self::$searchable_fields as $searchable_field => $searchable_type) { $searchfield = $searchable->addChild($searchable_type); $searchfield->addAttribute('name', $searchable_field); if ($searchable_type == 'bool') { $searchfield->addAttribute('allownull', 'allownull'); } if (in_array($searchable_type, array('text', 'string'))) { $searchfield->addAttribute('index', 'fulltext'); } } } $db = FW4_Db::get_instance(); foreach ($expanded_xml as $type => $data) { if ($type == 'page' || $type == 'object' || $type == 'site') { self::process_object($data); } } update('site', array('table_check_date' => intval($filemtime), 'structure_xml' => $xml, 'structure_xml_expanded' => $expanded_xml->asXML())); FW4_Site::reload_site(); //self::rebuild_search_index(); return $xml; } } else { $structure = new SimpleXMLElement($xml); foreach ($structure as $type => $data) { if ($type == 'page' || $type == 'object' || $type == 'site') { self::process_object($data); } } } }