/** * Runs the phpOpenTracker API call. * * @param array $parameters * @return mixed * @access public */ function run($parameters) { $visitors = array(); $this->db->query(sprintf("SELECT visitors.accesslog_id AS accesslog_id,\r\n visitors.visitor_id AS visitor_id,\r\n visitors.timestamp AS timestamp\r\n FROM %s accesslog,\r\n %s visitors\r\n WHERE visitors.client_id = '%d'\r\n AND visitors.accesslog_id = accesslog.accesslog_id\r\n %s\r\n %s\r\n ORDER BY visitors.visitor_id,\r\n visitors.timestamp", $this->config['accesslog_table'], $this->config['visitors_table'], $parameters['client_id'], $this->_constraint($parameters['constraints']), $this->_whereTimerange($parameters['start'], $parameters['end']))); while ($row = $this->db->fetchRow()) { $visitors[$row['visitor_id']]['accesslog_ids'][] = $row['accesslog_id']; $visitors[$row['visitor_id']]['timestamps'][] = $row['timestamp']; } if (!empty($visitors)) { $keys = array_keys($visitors); $numKeys = sizeof($keys); for ($i = 0; $i < $numKeys; $i++) { $visitors[$keys[$i]]['num_visits'] = sizeof($visitors[$keys[$i]]['accesslog_ids']); $visitors[$keys[$i]]['visitor_id'] = $keys[$i]; if ($visitors[$keys[$i]]['num_visits'] > 1) { $time = 0; for ($j = 0; $j < $visitors[$keys[$i]]['num_visits'] - 1; $j++) { $time += $visitors[$keys[$i]]['timestamps'][$j + 1] - $visitors[$keys[$i]]['timestamps'][$j]; } $visitors[$keys[$i]]['average_time_between_visits'] = floor($time / ($visitors[$keys[$i]]['num_visits'] - 1)); } else { unset($visitors[$keys[$i]]); } } if (!empty($visitors)) { foreach ($visitors as $visitor) { $tmp[] = $visitor['num_visits']; } array_multisort($tmp, SORT_DESC, $visitors); } } switch ($parameters['result_format']) { case 'xml': case 'xml_object': $tree = new XML_Tree(); $root =& $tree->addRoot('returningVisitors'); $numVisitors = sizeof($visitors); for ($i = 0; $i < $numVisitors; $i++) { $visitorChild =& $root->addChild('visitor'); $visitsChild =& $visitorChild->addChild('visits'); $numVisits = sizeof($visitors[$i]['accesslog_ids']); for ($j = 0; $j < $numVisits; $j++) { $visitChild =& $visitsChild->addChild('visit'); $visitChild->addChild('accesslogID', $visitors[$i]['accesslog_ids'][$j]); $visitChild->addChild('timestamp', $visitors[$i]['timestamps'][$j]); } $visitorChild->addChild('numVisits', $visitors[$i]['num_visits']); $visitorChild->addChild('visitorID', $visitors[$i]['visitor_id']); } if ($parameters['result_format'] == 'xml') { return $root->get(); } else { return $root; } break; default: return $visitors; } }
/** * @brief Build a DiGIR search query. * * Given an institutional code (such as a museum abbreviation) and a specimen * number we construct a DiGIR query to retrieve the corresponding record. * * This is a bit of an undertaking as there is not an easy means to discover the * DiGIR provider corresponding to a given specimen code, and the DiGIR providers * themselves vary in what version of the DarwinCore schema they support. * See The Big Dig (http://bigdig.ecoforge.net/wiki) for details. * Here I use the value of <b>Revision</b> in the <version> tag in the header field of * the DiGIR provider response as a flag to use different code to make the query. * * By default I assume we have an original specimen code such as <b>FMNH 14734</b>, * and this has been parsed into the institution code (FMNH), a namespace (where needed), * and the specimen number * (14734). Namespaces are needed for two reasons: * - Different taxon collections may have different providers (e.g., FMNH) * - The same institution and specimen code may occur in different collections * served by the same provider (e.g., MVZ) * * An example of an identifier is <b>FMNH:Mammals:14734</b>. * In some cases, we need some further fussing. For example, the KU and Calacademy DiGIR * providers expects specimen numbers to include the institutional or collection prefix. * * I hard code the mapping between museum codes and DiGIR providers. * If I was clever we'd do this via GBIF's UDDI interface, but that * looks like a world of pain. Typically the DiGIR provider's URL is found by browsing * GBIF's web site. * * The DiGIR query is a XML tree, which is then encoded as a URL. The tree varies depending * on whether the provider is serving schema 1.2 or 1.4. * * @param institution Institutional code * @param id Specimen number */ function buildDIGIRQuery($institution, $id) { //echo $institution, "<br/>"; // Kansas expects specimen codes to have KU at the start // if (strcasecmp($institution,'KU-Herps') == 0) { $id = 'KU' . $id; } // Calacademy is similar to KU if (strcasecmp($institution, 'CASENT') == 0) { $id = strtolower($institution) . $id; $institution = 'CASENT'; } if (strcasecmp($institution, 'inbiocri') == 0) { $id = strtolower($institution) . $id; $institution = 'CASENT'; } if (strcasecmp($institution, 'lacment') == 0) { $id = 'lacm ent ' . $id; $institution = 'CASENT'; } if (strcasecmp($institution, 'jtlc') == 0) { $id = strtolower($institution) . $id; $institution = 'CASENT'; } $server = $this->serverURL[$institution]; $resource = $this->resourceCode[$institution]; // Build request message $tree = new XML_Tree(); $root =& $tree->addRoot("request", '', array("xmlns" => 'http://digir.net/schema/protocol/2003/1.0', "xmlns:xsd" => 'http://www.w3.org/2001/XMLSchema', "xmlns:xsi" => 'http://www.w3.org/2001/XMLSchema-instance', "xmlns:digir" => 'http://digir.net/schema/protocol/2003/1.0', "xmlns:dwc" => 'http://digir.net/schema/conceptual/darwin/2003/1.0', "xmlns:darwin" => 'http://digir.net/schema/conceptual/darwin/2003/1.0', "xsi:schemaLocation" => 'http://digir.net/schema/protocol/2003/1.0', "xsi:schemaLocation" => 'http://digir.net/schema/protocol/2003/1.0 http://digir.sourceforge.net/schema/protocol/2003/1.0/digir.xsd http://digir.net/schema/conceptual/darwin/2003/1.0 http://digir.sourceforge.net/schema/conceptual/darwin/2003/1.0/darwin2.xsd')); $header =& $root->addChild("header"); $header->addChild("version", "1.0.0"); $header->addChild("sendTime", date("Ymd \\TG:i:s")); $header->addChild("source", $_SERVER['SERVER_ADDR']); $header->addChild("destination", $server, array("resource" => $resource)); $header->addChild("type", "search"); $search =& $root->addChild("search"); $filter =& $search->addChild("filter"); // Australian stuff served by Ozcam may have more than one provider switch ($institution) { case 'SAMA': case 'ANWC': case 'AMS': case 'WAM': case 'NT': $and =& $filter->addChild("and"); $equals =& $and->addChild("equals"); $equals->addChild("darwin:CatalogNumberText", $id); $equals2 =& $and->addChild("equals"); $equals2->addChild("darwin:InstitutionCode", $institution); break; default: if (preg_match('/^MVZ/', $institution)) { //echo $institution; list($inst, $coll) = explode("-", $institution); //echo $coll; $and =& $filter->addChild("and"); $equals =& $and->addChild("equals"); $equals->addChild("darwin:CatalogNumberText", $id); $equals2 =& $and->addChild("equals"); switch ($coll) { case 'Herps': $equals2->addChild("darwin:CollectionCode", 'Herp'); break; case 'Mammals': $equals2->addChild("darwin:CollectionCode", 'Mamm'); break; case 'Birds': $equals2->addChild("darwin:CollectionCode", 'Bird'); break; default: $equals2->addChild("darwin:CollectionCode", $coll); break; } } else { $equals =& $filter->addChild("equals"); switch ($this->schema[$institution]) { case "1.14": $equals->addChild("darwin:CatalogNumber", $id); break; default: $equals->addChild("darwin:CatalogNumberText", $id); break; } } break; } $records =& $search->addChild("records", "", array("limit" => 10, "start" => 0)); if ($this->schema[$institution] == '1.12') { $records->addChild("structure", "", array("schemaLocation" => "http://digir.sourceforge.net/schema/conceptual/darwin/result/full/2003/darwin2resultfull.xsd")); } else { $structure =& $records->addChild("structure", ""); $element =& $structure->addChild("xsd:element", "", array("name" => "record")); $complexType =& $element->addChild("xsd:complexType", ""); $sequence =& $complexType->addChild("xsd:sequence", ""); $sequence->addChild("xsd:element", "", array("ref" => "darwin:InstitutionCode")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:CollectionCode")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:CatalogNumber")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:ScientificName")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:VerbatimCollectingDate")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:DateLastModified")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:YearCollected")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:MonthCollected")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:DayCollected")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:TimeCollected")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:Kingdom")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:Phylum")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:Class")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:Order")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:Family")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:Genus")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:Species")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:Subspecies")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:Country")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:StateProvince")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:County")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:Island")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:IslandGroup")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:ContinentOcean")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:Locality")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:HorizontalDatum")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:Collector")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:Remarks")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:TypeStatus")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:OtherCatalogNumbers")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:CollectorNumber")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:FieldNumber")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:GenBankNum")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:Latitude")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:Longitude")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:Sex")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:Notes")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:IdentifiedBy")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:YearIdentified")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:MonthIdentified")); $sequence->addChild("xsd:element", "", array("ref" => "darwin:DayIdentified")); } $xml = $tree->get(); //echo $xml; // Strip XML header $xml = str_replace('<?xml version="1.0"?>', '', $xml); // Remove line breaks $xml = str_replace("\n", '', $xml); // Replace spaces with HEX code $xml = str_replace(" ", '%20', $xml); //echo $xml; $url = "http://{$server}?doc="; $url .= $xml; //echo $url; /* $url = "http://$server?doc=<request%20xmlns='http://digir.net/schema/protocol/2003/1.0'%20xmlns:xsd='http://www.w3.org/2001/XMLSchema'%20xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'%20xmlns:digir='http://digir.net/schema/protocol/2003/1.0'%20xmlns:dwc='http://digir.net/schema/conceptual/darwin/2003/1.0'%20xmlns:darwin='http://digir.net/schema/conceptual/darwin/2003/1.0'%20xsi:schemaLocation='http://digir.net/schema/protocol/2003/1.0%20http://digir.sourceforge.net/schema/protocol/2003/1.0/digir.xsd%20http://digir.net/schema/conceptual/darwin/2003/1.0%20http://digir.sourceforge.net/schema/conceptual/darwin/2003/1.0/darwin2.xsd'><header><version>1.0.0</version><sendTime>20040324T094003+0100</sendTime><source>192.168.1.101</source><destination%20resource='$resource'>$server</destination><type>search</type></header><search><filter><equals><darwin:CatalogNumberText>$id</darwin:CatalogNumberText></equals></filter><records%20limit=\"10\"%20start=\"0\"><structure%20schemaLocation=\"http://bnhm.berkeley.museum/manis/DwC/darwin2resultfull.xsd\"%20/></records></search></request>"; */ return $url; }
/** * Returns XML markup for the graph. * * @param boolean $returnObject * @return mixed * @access public */ function toXML($returnObject = false) { if (!@(include_once 'XML/Tree.php')) { phpOpenTracker::handleError('Could not find PEAR XML_Tree package, exiting.', E_USER_ERROR); } $tree = new XML_Tree(); $root =& $tree->addRoot('clickpath'); for ($i = 0; $i < $this->length; $i++) { $root->addChild('length', $this->length); $node =& $root->addChild('node'); $node->addChild('document', $this->documents[$i]); if (!isset($this->statistics[$i]['count'])) { $node->addChild('timespent', $this->statistics[$i]); } } if (!$returnObject) { return $root->get(); } else { return $root; } }
/** * Runs the phpOpenTracker API call. * * @param array $parameters * @return mixed * @access public */ function run($parameters) { if (!isset($parameters['what'])) { return phpOpenTracker::handleError('Required parameter "what" missing.'); } list($constraint, $selfJoin) = $this->_constraint($parameters['constraints'], true); if ($selfJoin) { $selfJoinConstraint = 'AND accesslog.accesslog_id = accesslog2.accesslog_id'; $selfJoinTable = sprintf('%s accesslog2,', $this->config['accesslog_table']); } else { $selfJoinConstraint = ''; $selfJoinTable = ''; } $timerange = $this->_whereTimerange($parameters['start'], $parameters['end']); switch ($parameters['result_format']) { case 'csv': $csv = "Rank;Item;Count;Percent\n"; break; case 'xml': case 'xml_object': $tree = new XML_Tree(); $root =& $tree->addRoot('top'); break; case 'separate_result_arrays': $names = array(); $values = array(); $percent = array(); break; default: $topItems = array(); } switch ($parameters['what']) { case 'document': case 'exit_target': case 'host': case 'operating_system': case 'referer': case 'user_agent': case 'entry_document': case 'exit_document': $dataConstraint = ''; switch ($parameters['what']) { case 'document': $column = 'accesslog.document_id'; $dataTable = $this->config['documents_table']; break; case 'entry_document': $column = 'accesslog.document_id'; $dataConstraint = "AND accesslog.entry_document = '1'"; $dataTable = $this->config['documents_table']; break; case 'exit_document': $column = 'accesslog.document_id'; $dataConstraint = "AND accesslog.exit_target_id <> '0'"; $dataTable = $this->config['documents_table']; break; case 'exit_target': $column = 'accesslog.exit_target_id'; $dataConstraint = "AND accesslog.exit_target_id <> '0'"; $dataTable = $this->config['exit_targets_table']; break; case 'host': $column = 'visitors.host_id'; $dataTable = $this->config['hostnames_table']; break; case 'operating_system': $column = 'visitors.operating_system_id'; $dataTable = $this->config['operating_systems_table']; break; case 'referer': $column = 'visitors.referer_id'; $dataTable = $this->config['referers_table']; break; case 'user_agent': $column = 'visitors.user_agent_id'; $dataTable = $this->config['user_agents_table']; break; } $nestedQuery = sprintf("SELECT data_table.string AS item\n FROM %s accesslog,\n %s\n %s visitors,\n %s data_table\n WHERE visitors.client_id = '%d'\n AND visitors.accesslog_id = accesslog.accesslog_id\n AND data_table.data_id = %s\n %s\n %s\n %s\n %s\n GROUP BY visitors.accesslog_id,\n data_table.string", $this->config['accesslog_table'], $selfJoinTable, $this->config['visitors_table'], $dataTable, $parameters['client_id'], $column, $selfJoinConstraint, $dataConstraint, $constraint, $timerange); break; default: $nestedQuery = sprintf("SELECT add_data.data_value AS item\n FROM %s accesslog,\n %s\n %s visitors,\n %s add_data\n WHERE visitors.client_id = '%d'\n AND visitors.accesslog_id = accesslog.accesslog_id\n AND accesslog.accesslog_id = add_data.accesslog_id\n AND add_data.data_field = '%s'\n %s\n %s\n %s\n GROUP BY visitors.accesslog_id,\n add_data.data_value", $this->config['accesslog_table'], $selfJoinTable, $this->config['visitors_table'], $this->config['additional_data_table'], $parameters['client_id'], $parameters['what'], $selfJoinConstraint, $constraint, $timerange); } if ($this->db->supportsNestedQueries()) { $queryTotalUnique = sprintf('SELECT COUNT(item) AS total_items, COUNT(DISTINCT(item)) AS unique_items FROM (%s) items', $nestedQuery); $queryItems = sprintf('SELECT COUNT(item) AS item_count, item FROM (%s) items GROUP BY item ORDER BY item_count %s, item', $nestedQuery, $parameters['order']); if ($parameters['result_format'] == 'sql') { return $queryItems; } } else { if ($this->config['db_type'] == 'mysql' || $this->config['db_type'] == 'mysql_merge') { $queryCreateTemporaryTable = sprintf('CREATE TEMPORARY TABLE pot_temporary_table %s', $nestedQuery); $queryTotalUnique = sprintf('SELECT COUNT(item) AS total_items, COUNT(DISTINCT(item)) AS unique_items FROM pot_temporary_table', $nestedQuery); $queryItems = sprintf('SELECT COUNT(item) AS item_count, item FROM pot_temporary_table GROUP BY item ORDER BY item_count %s, item', $parameters['order']); if ($parameters['result_format'] != 'sql') { $dropTemporaryTable = true; $this->db->query($queryCreateTemporaryTable); } else { return $queryCreateTemporaryTable . ';' . $queryItems; } } else { return phpOpenTracker::handleError('You need a database system capable of nested queries.', E_USER_ERROR); } } $this->db->query($queryTotalUnique); if ($row = $this->db->fetchRow()) { $totalItems = intval($row['total_items']); $uniqueItems = intval($row['unique_items']); } else { return phpOpenTracker::handleError('Database query failed.'); } if ($totalItems > 0) { $this->db->query($queryItems, $parameters['limit']); $i = 0; while ($row = $this->db->fetchRow()) { $percentValue = doubleval(number_format(100 * $row['item_count'] / $totalItems, 2)); switch ($parameters['result_format']) { case 'csv': $csv .= sprintf("%d;%s;%d;%d\n", $i + 1, $row['item'], intval($row['item_count']), $percentValue); break; case 'xml': case 'xml_object': $itemChild =& $root->addChild('item'); $itemChild->addChild('rank', $i + 1); $itemChild->addChild('string', $row['item']); $itemChild->addChild('count', intval($row['item_count'])); $itemChild->addChild('percent', $percentValue); if (isset($row['document_url'])) { $itemChild->addChild('url', $row['document_url']); } break; case 'separate_result_arrays': $names[$i] = $row['item']; $values[$i] = intval($row['item_count']); $percent[$i] = $percentValue; break; default: $topItems[$i]['count'] = intval($row['item_count']); $topItems[$i]['string'] = $row['item']; $topItems[$i]['percent'] = $percentValue; if (isset($row['document_url'])) { $topItems[$i]['url'] = $row['document_url']; } } $i++; } } if (isset($dropTemporaryTable)) { $this->db->query('DROP TABLE pot_temporary_table'); } switch ($parameters['result_format']) { case 'csv': return $csv; break; case 'xml': case 'xml_object': $root->addChild('total', $totalItems); $root->addChild('unique', $uniqueItems); switch ($parameters['result_format']) { case 'xml': return $root->get(); break; case 'xml_object': return $root; break; } break; case 'separate_result_arrays': return array($names, $values, $percent, $uniqueItems); break; default: return array('top_items' => $topItems, 'unique_items' => $uniqueItems); } }
/** * Returns information for the returning visitors. * * @param array $parameters * @return array * @access private */ function _returningVisitors($parameters) { $visitors = $this->_queryReturningVisitors($parameters); if (!empty($visitors)) { $keys = array_keys($visitors); $numKeys = sizeof($keys); for ($i = 0; $i < $numKeys; $i++) { $visitors[$keys[$i]]['num_visits'] = sizeof($visitors[$keys[$i]]['accesslog_ids']); $visitors[$keys[$i]]['visitor_id'] = $keys[$i]; if ($visitors[$keys[$i]]['num_visits'] > 1) { $time = 0; for ($j = 0; $j < $visitors[$keys[$i]]['num_visits'] - 1; $j++) { $time += $visitors[$keys[$i]]['timestamps'][$j + 1] - $visitors[$keys[$i]]['timestamps'][$j]; } $visitors[$keys[$i]]['average_time_between_visits'] = floor($time / ($visitors[$keys[$i]]['num_visits'] - 1)); } else { unset($visitors[$keys[$i]]); } } if (!empty($visitors)) { foreach ($visitors as $visitor) { $tmp[] = $visitor['num_visits']; } array_multisort($tmp, SORT_DESC, $visitors); } } switch ($parameters['result_format']) { case 'xml': case 'xml_object': $tree = new XML_Tree(); $root =& $tree->addRoot('returningVisitors'); $numVisitors = sizeof($visitors); for ($i = 0; $i < $numVisitors; $i++) { $visitorChild =& $root->addChild('visitor'); $visitsChild =& $visitorChild->addChild('visits'); $numVisits = sizeof($visitors[$i]['accesslog_ids']); for ($j = 0; $j < $numVisits; $j++) { $visitChild =& $visitsChild->addChild('visit'); $visitChild->addChild('accesslogID', $visitors[$i]['accesslog_ids'][$j]); $visitChild->addChild('timestamp', $visitors[$i]['timestamps'][$j]); } $visitorChild->addChild('numVisits', $visitors[$i]['num_visits']); $visitorChild->addChild('visitorID', $visitors[$i]['visitor_id']); } if ($parameters['result_format'] == 'xml') { return $root->get(); } else { return $root; } break; default: return $visitors; } }
function _nxvisitors($parameters) { $parameters['interval'] = isset($parameters['interval']) ? $parameters['interval'] : false; $intervalStrings = array(); $timestamps = array(); $values = array(); switch ($parameters['result_format']) { case 'csv': if ($parameters['api_call'] == 'page_impressions') { $csv = "Interval;Page Impressions\n"; } else { $csv = "Interval;Visitors\n"; } break; case 'xml': case 'xml_object': $tree = new XML_Tree(); if ($parameters['api_call'] == 'page_impressions') { $root =& $tree->addRoot('pageimpressions'); } else { $root =& $tree->addRoot('visitors'); } break; default: $result = array(); } if ($parameters['interval'] != false) { $start = $parameters['start'] ? $parameters['start'] : 0; $end = $parameters['end'] ? $parameters['end'] : time(); for ($i = $parameters['start']; $i < $parameters['end']; $i += $parameters['interval']) { $correct = (mktime(0, 0, 0, date('m', $i), date('d', $i) + 1, date('Y', $i)) - mktime(0, 0, 0, date('m', $i), date('d', $i), date('Y', $i))) * ($parameters['interval'] / 86400) - $parameters['interval']; // Correct weeks $j = $i; if ($parameters['interval'] == 604800) { $j = $i + 86400; } $intervalStrings[] = sprintf('%s - %s', date('d-m-Y', $j), date('d-m-Y', $j + $parameters['interval'] + $correct)); $values[] = phpOpenTracker::get(array('client_id' => $parameters['client_id'], 'api_call' => $parameters['api_call'], 'start' => $j, 'end' => $j + $parameters['interval'] + $correct, 'constraints' => $parameters['constraints'])); $timestamps[] = $i; $i += $correct; } } else { $this->db->query(sprintf("SELECT %s AS result\r\n FROM %s accesslog,\r\n %s visitors\r\n WHERE visitors.client_id = '%d'\r\n AND visitors.accesslog_id = accesslog.accesslog_id\r\n %s\r\n %s", $parameters['api_call'] == 'page_impressions' ? 'COUNT(*)' : 'COUNT(DISTINCT(visitors.accesslog_id))', $this->config['accesslog_table'], $this->config['visitors_table'], $parameters['client_id'], $this->_constraint($parameters['constraints']), $this->_whereTimerange($parameters['start'], $parameters['end'], 'accesslog'))); if ($row = $this->db->fetchRow()) { $values = array(intval($row['result'])); } else { $values = array(0); } if ($parameters['start'] != false && $parameters['end'] != false) { $intervalStrings = array(sprintf('%s - %s', date('d-m-Y', $parameters['start']), date('d-m-Y', $parameters['end']))); } else { $intervalStrings = array(''); } } switch ($parameters['result_format']) { case 'csv': for ($i = 0; $i < sizeof($values); $i++) { $csv .= sprintf("%s;%d\n", $intervalStrings[$i], $values[$i]); } return $csv; break; case 'xml': case 'xml_object': for ($i = 0; $i < sizeof($values); $i++) { $intervalChild =& $root->addChild('interval'); $intervalChild->addChild('interval', $intervalStrings[$i]); $intervalChild->addChild('value', $values[$i]); } if ($parameters['result_format'] == 'xml') { return $root->get(); } else { return $root; } break; default: if (sizeof($values) == 1) { return $values[0]; } else { $result = array(); for ($i = 0; $i < sizeof($values); $i++) { $result[] = array('timestamp' => $timestamps[$i], 'value' => $values[$i]); } } return $result; } }
/** * Runs the phpOpenTracker API call. * * @param array $parameters * @return mixed * @access public */ function run($parameters) { $parameters['session_lifetime'] = isset($parameters['session_lifetime']) ? $parameters['session_lifetime'] : 3; switch ($parameters['result_format']) { case 'xml': case 'xml_object': $tree = new XML_Tree(); $root =& $tree->addRoot('visitorsonline'); $children = array(); break; default: $result = array(); } $accesslogIDs = array(); $this->db->query(sprintf("SELECT DISTINCT(accesslog.accesslog_id) AS accesslog_id\r\n FROM %s accesslog,\r\n %s visitors\r\n WHERE visitors.client_id = '%d'\r\n AND visitors.accesslog_id = accesslog.accesslog_id\r\n AND accesslog.timestamp >= '%d'", $this->config['accesslog_table'], $this->config['visitors_table'], $parameters['client_id'], time() - $parameters['session_lifetime'] * 60)); while ($row = $this->db->fetchRow()) { $accesslogIDs[] = $row['accesslog_id']; } for ($i = 0, $max = sizeof($accesslogIDs); $i < $max; $i++) { switch ($parameters['result_format']) { case 'xml': case 'xml_object': $visitorNode =& $root->addChild('visitor'); $visitorNode->addChild(phpOpenTracker::get(array('client_id' => $parameters['client_id'], 'api_call' => 'individual_clickpath', 'accesslog_id' => $accesslogIDs[$i], 'result_format' => 'xml_object'))); break; default: $result[$i]['clickpath'] = phpOpenTracker::get(array('client_id' => $parameters['client_id'], 'api_call' => 'individual_clickpath', 'accesslog_id' => $accesslogIDs[$i])); } $this->db->query(sprintf("SELECT MAX(timestamp) as last_access\r\n FROM %s\r\n WHERE accesslog_id = '%s'", $this->config['accesslog_table'], $accesslogIDs[$i])); if ($row = $this->db->fetchRow()) { switch ($parameters['result_format']) { case 'xml': case 'xml_object': $visitorNode->addChild('last_access', $row['last_access']); break; default: $result[$i]['last_access'] = $row['last_access']; } } else { return phpOpenTracker::handleError('Database query failed.'); } $this->db->query(sprintf("SELECT hosts.string AS host,\r\n user_agents.string AS user_agent\r\n FROM %s visitors,\r\n %s hosts,\r\n %s user_agents\r\n WHERE visitors.accesslog_id = '%d'\r\n AND visitors.host_id = hosts.data_id\r\n AND visitors.user_agent_id = user_agents.data_id", $this->config['visitors_table'], $this->config['hostnames_table'], $this->config['user_agents_table'], $accesslogIDs[$i])); if ($row = $this->db->fetchRow()) { switch ($parameters['result_format']) { case 'xml': case 'xml_object': $visitorNode->addChild('host', $row['host']); $visitorNode->addChild('user_agent', $row['user_agent']); break; default: $result[$i]['host'] = $row['host']; $result[$i]['user_agent'] = $row['user_agent']; } } else { return phpOpenTracker::handleError('Database query failed.'); } $this->db->query(sprintf("SELECT referers.string AS referer\r\n FROM %s visitors,\r\n %s referers\r\n WHERE visitors.accesslog_id = '%d'\r\n AND visitors.referer_id = referers.data_id", $this->config['visitors_table'], $this->config['referers_table'], $accesslogIDs[$i])); if ($row = $this->db->fetchRow()) { $referer = $row['referer']; } else { $referer = ''; } switch ($parameters['result_format']) { case 'xml': case 'xml_object': $visitorNode->addChild('referer', $referer); break; default: $result[$i]['referer'] = $referer; } } switch ($parameters['result_format']) { case 'xml': return $root->get(); break; case 'xml_object': return $root; break; default: return $result; } }
/** * Shows the value amd number of conversions aggregated by source. * * @param array $parameters * @return mixed * @access private * @since phpOpenTracker 1.3.0 */ function _conversionsBySource($parameters) { $timerange = $this->_whereTimerange($parameters['start'], $parameters['end']); switch ($parameters['result_format']) { case 'xml': case 'xml_object': $tree = new XML_Tree(); $root =& $tree->addRoot('visitorsonline'); $children = array(); break; default: $result = array(); } $accesslogIDs = array(); // get a list of all accesslogIDs where there was a conversion $this->db->query(sprintf("SELECT DISTINCT(accesslog.accesslog_id) AS accesslog_id\n FROM %s accesslog,\n %s conversions\n WHERE conversions.client_id = '%d'\n AND conversions.accesslog_id = accesslog.accesslog_id\n %s", $this->config['accesslog_table'], $this->config['plugins']['conversions']['table'], $parameters['client_id'], $timerange)); while ($row = $this->db->fetchRow()) { $accesslogIDs[] = $row['accesslog_id']; } // for each conversion, get details for ($i = 0, $max = sizeof($accesslogIDs); $i < $max; $i++) { unset($source); // to determine source, first look for a record of // the use of a search engine on the first visit, // then a referrer on the first visit, then // the use of a search engine on the most recent visit, // then a referrer on the most recent visit // get visitor_id and number of visits $this->db->query(sprintf("SELECT visitors.visitor_id AS visitor_id\n FROM %s visitors\n WHERE visitors.accesslog_id = '%d'", $this->config['visitors_table'], $accesslogIDs[$i])); if ($row = $this->db->fetchRow()) { $visitor_id = intval($row['visitor_id']); } else { $visitor_id = 0; } $this->db->query(sprintf("SELECT COUNT(visitors.visitor_id) AS num_visits\n FROM %s visitors\n WHERE visitors.visitor_id = '%d'", $this->config['visitors_table'], $visitor_id)); if ($row = $this->db->fetchRow()) { $num_visits = intval($row['num_visits']); } else { $num_visits = 0; } // end query for visitor_id and number of visits // get accesslog_id of first visit $this->db->query(sprintf("SELECT visitors.accesslog_id AS first_access\n FROM %s visitors\n WHERE visitors.visitor_id = '%d'\n ORDER BY visitors.timestamp", $this->config['visitors_table'], $visitor_id)); if ($row = $this->db->fetchRow()) { $first_access = $row['first_access']; } // end query for accesslog_id of first visit // get first search engine and search engine keywords if ($num_visits > 1) { $this->db->query(sprintf("SELECT search_engines.search_engine AS search_engine,\n search_engines.keywords AS keywords\n FROM %s search_engines\n WHERE search_engines.accesslog_id = '%d'", $this->config['plugins']['search_engines']['table'], $first_access)); if ($row = $this->db->fetchRow()) { $source = $row['search_engine'] . ': "' . $row['keywords'] . '"'; } } // end query for first search engine and search engine keywords // get first referrer if (!isset($source)) { if ($num_visits > 1) { $this->db->query(sprintf("SELECT referers.string AS first_referer\n FROM %s visitors,\n %s referers\n WHERE visitors.accesslog_id = '%d'\n AND visitors.referer_id = referers.data_id\n ORDER BY visitors.timestamp", $this->config['visitors_table'], $this->config['referers_table'], $first_access)); if ($row = $this->db->fetchRow()) { $source = $row['first_referer']; } } } // end query for first referrer // get most recent search engine and search engine keywords if (!isset($source)) { $this->db->query(sprintf("SELECT search_engines.search_engine AS search_engine,\n search_engines.keywords AS keywords\n FROM %s search_engines,\n %s visitors\n WHERE visitors.visitor_id = '%d'\n AND visitors.accesslog_id = search_engines.accesslog_id\n ORDER BY visitors.timestamp", $this->config['plugins']['search_engines']['table'], $this->config['visitors_table'], $visitor_id)); if ($row = $this->db->fetchRow()) { $source = $row['search_engine'] . ': "' . $row['keywords'] . '"'; } } // end query for most recent search engines and search engine keywords // get most recent referrer if (!isset($source)) { $this->db->query(sprintf("SELECT referers.string AS referer\n FROM %s visitors,\n %s referers\n WHERE visitors.accesslog_id = '%d'\n AND visitors.referer_id = referers.data_id", $this->config['visitors_table'], $this->config['referers_table'], $accesslogIDs[$i])); if ($row = $this->db->fetchRow()) { $source = $row['referer']; } else { $source = 'unknown'; } } // end query for most recent referrer // store source as a result switch ($parameters['result_format']) { case 'xml': case 'xml_object': // ?? break; default: $result[$source]['source'] = $source; } // done storing source // query for conversions type, amount, and details $this->db->query(sprintf("SELECT conversions.sale AS sale,\n conversions.inquiry AS inquiry,\n conversions.signup AS signup\n FROM %s conversions,\n %s visitors\n WHERE visitors.accesslog_id = '%d'\n AND visitors.accesslog_id = conversions.accesslog_id", $this->config['plugins']['conversions']['table'], $this->config['visitors_table'], $accesslogIDs[$i])); if ($row = $this->db->fetchRow()) { $sale = $row['sale']; $inquiry = $row['inquiry']; $signup = $row['signup']; } else { $sale = ''; $inquiry = ''; $signup = ''; } switch ($parameters['result_format']) { case 'xml': case 'xml_object': // ?? break; default: $result[$source]['sale'] = $result[$source]['sale'] + $sale; $result[$source]['inquiry'] = $result[$source]['inquiry'] + $inquiry; $result[$source]['signup'] = $result[$source]['signup'] + $signup; } // end query for conversions type, amount, etc. } // end loop // return results switch ($parameters['result_format']) { case 'xml': return $root->get(); break; case 'xml_object': return $root; break; default: return $result; } }
ob_end_flush(); exit('HTTP-Header wurden bereits gesendet von der Datei ' . $filename . ' Zeile ' . $linenum . ".\nEs muss ein Fehler aufgetreten sein, der erst zu beheben ist, bevor dieses Affiliate-Skript ordnungsgemaess laeuft.\n" . '(Abbruch in Datei ' . __FILE__ . ' Zeile ' . __LINE__ . '.)'); } if (defined('POWEREDBY')) { header('X-Powered-By: ' . POWEREDBY, FALSE); } header('Content-Type: text/xml'); // Alle Includes hier, wegen der Pfadangabe. Reihenfolge ist relevant! require ELMAR_PATH . 'tools/pear.php'; require ELMAR_PATH . 'tools/node.php'; require ELMAR_PATH . 'tools/parser.php'; require ELMAR_PATH . 'tools/tree.php'; $attributes = '1.0" encoding="ISO-8859-1'; $tree = new XML_Tree(NULL, $attributes); $XMLarray = array('xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', 'xmlns' => 'http://elektronischer-markt.de/schema/affiliate-1.0', 'xsi:schemaLocation' => 'http://elektronischer-markt.de/schema/affiliate-1.0 ' . ELMAR_SCHEMA_BASE_URL . 'affiliate-1.0.xsd', 'version' => '1.0'); $root =& $tree->addRoot("affiliate", NULL, $XMLarray); if (!isset($_REQUEST['name']) || trim($_REQUEST['name']) == '') { $xml_error =& $root->addChild('error', '100'); if (defined('AFFILIATES_CONTACT_EMAIL')) { $email =& $root->addChild('email', AFFILIATES_CONTACT_EMAIL); } if (defined('AFFILIATES_CONTACT_URL')) { $url =& $root->addChild('url', htmlentities(AFFILIATES_CONTACT_URL)); } $description_de =& $root->addChild('description', 'Der Parameter name fehlt oder ist leer. Bitte geben Sie Ihren Domainnamen an.', array('lang' => 'de')); $description_en =& $root->addChild('description', 'Parameter name is missing or empty. Please specify your domain name.', array('lang' => 'en')); } else { $name = $_REQUEST['name']; // Partner-ID zum Namen bestimmen $id = false; if (defined('TABLE_AFFILIATES')) {
date_default_timezone_set('America/Chicago'); // figure out what the user is requesting $x = $_REQUEST["x"]; $y = $_REQUEST["y"]; $format = $_REQUEST["format"]; if ($format == "") { $format = "xml"; } if ($format != "xml") { echo "Only XML format is supported right now."; die; } // instantiate object $tree = new XML_Tree(); // add the root element $root =& $tree->addRoot("POICollection"); $root->setAttribute("x", $x); $root->setAttribute("y", $y); $root->setAttribute("timestamp", time()); // fetch poi child elements $terms = array(array("quadrant_x", "=", $x), array("quadrant_y", "=", $y)); $handle = new POI(); $pois = $handle->GetList($terms, '', true, 1000); foreach ($pois as $poi) { $node =& $root->addChild("POI"); $node->setAttribute("name", $poi->title); $node->setAttribute("lat", $poi->lat); $node->setAttribute("lon", $poi->lon); $node->addChild("description", $poi->description); $node->addChild("url", $poi->url); }
<?php require_once 'XML/Tree.php'; $tree = new XML_Tree(); $root =& $tree->addRoot('_#:A'); /* Check for error on the Root node */ if (PEAR::isError($root->error)) { var_dump($root->error); } $child =& $root->addChild('abc:def', 'bar'); if (PEAR::isError($child)) { var_dump($child); } $root->registerName('abc', 'http://some_name_space'); $child->registerName('abc', 'http://some_other_name_space'); echo $tree->getNodeNamespace($child); if (PEAR::isError($child)) { var_dump($child); } echo $tree->get();
<?php require_once 'XML/Tree.php'; $tree = new XML_Tree(); $root =& $tree->addRoot('slide', '', array('title' => 'A simple slide')); $root->addChild('blurb', 'A blurb element', array('align' => 'center')); $root->addChild('example', '', array('type' => 'xml', 'filename' => 'data/sdphp_talks.xml')); $list =& $root->addChild('list', '', array('type' => 'arrow')); $list->addChild('bullet', 'first bullet'); $list->addChild('bullet', 'second bullet'); $out = $tree->get(); echo nl2br(htmlspecialchars($out));
function xml_header($complete = 'yes') { global $currency, $language_code; $attributes = '1.0" encoding="ISO-8859-1'; $tree = new XML_Tree(NULL, $attributes); if (ELMAR_NEW_SHOPINFO_XML) { $array = array('xmlns' => 'http://elektronischer-markt.de/schema/products-2.0', 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', 'xsi:schemaLocation' => 'http://elektronischer-markt.de/schema/products-2.0 ' . ELMAR_SCHEMA_BASE_URL . 'products-2.0.xsd', 'version' => '2.0'); $root =& $tree->addRoot('ProductList', NULL, $array); } else { $array = array('xmlns:osp' => 'http://elektronischer-markt.de/schema', 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', 'xsi:schemaLocation' => 'http://elektronischer-markt.de/schema ' . ELMAR_SCHEMA_BASE_URL . 'products.xsd'); $root =& $tree->addRoot('osp:ProductList', NULL, $array); } $common =& $root->addChild('Common'); $xml_version =& $common->addChild('Version', ELMAR_NEW_SHOPINFO_XML ? '2.0' : '1.1'); $xml_language =& $common->addChild('Language', $language_code); $xml_currency =& $common->addChild('Currency', $currency); if (ELMAR_NEW_SHOPINFO_XML) { $xml_generator =& $common->addChild('Generator', 'Elm@r-Modul osCommerce/' . MODUL_VERSION . '.' . MODUL_SUBVERSION . ' (http://projekt.wifo.uni-mannheim.de/elmar/nav/osCommerce)'); } return $tree; }
/** * @param optional string $file * @access public */ public function __construct($file = 'phpunit-log.xml') { $this->file = $file; $this->tree = new XML_Tree(); $this->root = $this->tree->addRoot('run'); }
<?php require_once 'XML/Tree.php'; $tree = new XML_Tree(); $root =& $tree->addRoot('root'); //$tree->useCdataSections(); $root->addChild('foo', 'bar'); $baz =& $root->addChild('baz'); $baz->addChild('bat', 'qux', array(), null, true); $baz->addChild('bat', 'quux', array(), null, false); $tree->dump();
/** * @param array $parameters * @return mixed * @access public */ function run($parameters) { if (!isset($parameters['what'])) { return phpOpenTracker::handleError('Required parameter "what" missing.'); } $constraint = $this->_constraint($parameters['constraints']); $timerange = $this->_whereTimerange($parameters['start'], $parameters['end']); switch ($parameters['what']) { case 'combined_statistics': $_parameters = $parameters; $_parameters['what'] = 'top_search_engines'; $searchEngines = phpOpenTracker::get($_parameters); $_parameters['what'] = 'top_search_keywords'; for ($i = 0; $i < sizeof($searchEngines['top_items']); $i++) { $_parameters['search_engine'] = $searchEngines['top_items'][$i]['string']; $searchKeywords = phpOpenTracker::get($_parameters); $searchEngines['top_items'][$i]['search_keywords'] = $searchKeywords['top_items']; } return $searchEngines['top_items']; break; case 'top_search_engines': case 'top_search_keywords': switch ($parameters['result_format']) { case 'csv': $csv = "Rank;Item;Count;Percent\n"; break; case 'xml': case 'xml_object': $tree = new XML_Tree(); $root = $tree->addRoot('top'); break; case 'separate_result_arrays': $names = array(); $values = array(); $percent = array(); break; default: $topItems = array(); } if (isset($parameters['search_engine'])) { $searchEngineConstraint = sprintf("AND search_engines.search_engine = '%s'", $parameters['search_engine']); } else { $searchEngineConstraint = ''; } $field = $parameters['what'] == 'top_search_engines' ? 'search_engine' : 'keywords'; $nestedQuery = sprintf("SELECT search_engines.%s AS item\r\n FROM %s accesslog,\r\n %s visitors,\r\n %s search_engines\r\n WHERE visitors.client_id = '%d'\r\n AND visitors.accesslog_id = accesslog.accesslog_id\r\n AND visitors.accesslog_id = search_engines.accesslog_id\r\n %s\r\n %s\r\n %s\r\n GROUP BY visitors.accesslog_id,\r\n search_engines.%s", $field, $this->config['accesslog_table'], $this->config['visitors_table'], $this->config['plugins']['search_engines']['table'], $parameters['client_id'], $searchEngineConstraint, $constraint, $timerange, $field); if ($this->db->supportsNestedQueries()) { $queryTotalUnique = sprintf('SELECT COUNT(item) AS total_items, COUNT(DISTINCT(item)) AS unique_items FROM (%s) items', $nestedQuery); $queryItems = sprintf('SELECT COUNT(item) AS item_count, item FROM (%s) items GROUP BY item ORDER BY item_count %s, item', $nestedQuery, $parameters['order']); } else { if ($this->config['db_type'] == 'mysql' || $this->config['db_type'] == 'mysql_merge') { $dropTemporaryTable = true; $this->db->query(sprintf('CREATE TEMPORARY TABLE pot_temporary_table %s', $nestedQuery)); $queryTotalUnique = sprintf('SELECT COUNT(item) AS total_items, COUNT(DISTINCT(item)) AS unique_items FROM pot_temporary_table', $nestedQuery); $queryItems = sprintf('SELECT COUNT(item) AS item_count, item FROM pot_temporary_table GROUP BY item ORDER BY item_count %s, item', $parameters['order']); } else { return phpOpenTracker::handleError('You need a database system capable of nested ' . 'queries to use the "search_engines" API calls.', E_USER_ERROR); } } $this->db->query($queryTotalUnique); if ($row = $this->db->fetchRow()) { $totalItems = intval($row['total_items']); $uniqueItems = intval($row['unique_items']); } else { return phpOpenTracker::handleError('Database query failed.'); } if ($totalItems > 0) { $this->db->query($queryItems, $parameters['limit']); $i = 0; while ($row = $this->db->fetchRow()) { $percentValue = doubleval(number_format(100 * $row['item_count'] / $totalItems, 2)); switch ($parameters['result_format']) { case 'csv': $csv = sprintf("%d;%s;%d;%d\n", $i + 1, $row['item'], intval($row['item_count']), $percentValue); break; case 'xml': case 'xml_object': $itemChild =& $root->addChild('item'); $itemChild->addChild('rank', $i + 1); $itemChild->addChild('string', $row['item']); $itemChild->addChild('count', intval($row['item_count'])); $itemChild->addChild('percent', $percentValue); break; case 'separate_result_arrays': $names[$i] = $row['item']; $values[$i] = intval($row['item_count']); $percent[$i] = $percentValue; break; default: $topItems[$i]['count'] = intval($row['item_count']); $topItems[$i]['string'] = $row['item']; $topItems[$i]['percent'] = $percentValue; } $i++; } } if (isset($dropTemporaryTable)) { $this->db->query('DROP TABLE pot_temporary_table'); } switch ($parameters['result_format']) { case 'csv': return $csv; break; case 'xml': case 'xml_object': $root->addChild('total', $totalItems); $root->addChild('unique', $uniqueItems); switch ($parameters['result_format']) { case 'xml': return $root->get(); break; case 'xml_object': return $root; break; } break; case 'separate_result_arrays': return array($names, $values, $percent, $uniqueItems); break; default: return array('top_items' => $topItems, 'unique_items' => $uniqueItems); } break; } }
function generate_shopinfo() { global $languages_id, $language_code, $currency, $currency_rate; // Alle Includes hier, wegen der Pfadangabe. Reihenfolge ist relevant! require ELMAR_PATH . 'tools/pear.php'; require ELMAR_PATH . 'tools/node.php'; require ELMAR_PATH . 'tools/parser.php'; require ELMAR_PATH . 'tools/tree.php'; $attributes = '1.0" encoding="ISO-8859-1'; $tree = new XML_Tree(NULL, $attributes); if (ELMAR_NEW_SHOPINFO_XML) { $XMLarray = array('xmlns' => 'http://elektronischer-markt.de/schema/shopinfo-2.0', 'xmlns:c' => 'http://elektronischer-markt.de/schema/categories-2.0', 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', 'xsi:schemaLocation' => 'http://elektronischer-markt.de/schema/shopinfo-2.0 ' . ELMAR_SCHEMA_BASE_URL . 'shopinfo-2.0.xsd', 'version' => '2.0'); $root =& $tree->addRoot('Shop', NULL, $XMLarray); } else { $XMLarray = array('xmlns:osp' => 'http://elektronischer-markt.de/schema', 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', 'xsi:schemaLocation' => 'http://elektronischer-markt.de/schema ' . ELMAR_SCHEMA_BASE_URL . 'shop.xsd'); $root =& $tree->addRoot('osp:Shop', NULL, $XMLarray); } $common =& $root->addChild("Common"); $xml_version =& $common->addChild("Version", ELMAR_NEW_SHOPINFO_XML ? '2.0' : '1.1'); $xml_language =& $common->addChild("Language", $language_code); $xml_currency =& $common->addChild("Currency", $currency); if (ELMAR_NEW_SHOPINFO_XML) { $xml_generator =& $common->addChild('Generator', 'Elm@r-Modul osCommerce/' . MODUL_VERSION . '.' . MODUL_SUBVERSION . ' (http://projekt.wifo.uni-mannheim.de/elmar/nav/osCommerce)'); } $name =& $root->addChild("Name", shopNameOrHost()); $shopUrl = ELMAR_SHOP_ROOT_DIR; //tep_href_link('index.php', '', 'NONSSL', false); $url =& $root->addChild("Url", $shopUrl); $requests =& $root->addChild("Requests"); // Die Parameter fuer die Echtzeitanfrage, siehe elmar_request.php $requestUrl = ELMAR_SHOP_ROOT_DIR . 'elmar_request.php'; // Url zur Echtzeitabfrage $onlineRequest =& $requests->addChild("OnlineRequest", Null, array("method" => "GET POST TRACE")); $processor =& $onlineRequest->addChild("Processor", $requestUrl); $paramBrand =& $onlineRequest->addChild("ParamBrand", 'p_brand'); $paramProduct =& $onlineRequest->addChild("ParamProduct", 'p_product'); $paramDescription =& $onlineRequest->addChild("ParamDescription", 'p_desc'); if (defined('ELMAR_PRODUCTS_EAN_FIELD')) { $paramEan =& $onlineRequest->addChild("ParamID", 'p_ean', array("type" => "EAN")); } if (defined('ELMAR_PRODUCTS_ISBN_FIELD')) { $paramIsbn =& $onlineRequest->addChild("ParamID", 'p_isbn', array("type" => "ISBN")); } if (ELMAR_NEW_SHOPINFO_XML) { $paramId =& $onlineRequest->addChild("ParamID", 'p_id', array("type" => "ID")); } $paramQuickSearch =& $onlineRequest->addChild("ParamQuickSearch", 'p_qs'); $paramPriceBounds =& $onlineRequest->addChild("ParamPriceBounds"); $lowerPrice =& $paramPriceBounds->addChild("LowerPrice", 'p_low'); $upperPrice =& $paramPriceBounds->addChild("UpperPrice", 'p_high'); $paramSize =& $onlineRequest->addChild("ParamSize", 'p_size'); $paramIP =& $onlineRequest->addChild("ParamIP", 'p_ip'); $offlineRequest =& offlineRequest($requests); if (ELMAR_NEW_SHOPINFO_XML) { $affiliateRequest =& $requests->addChild('AffiliateRequest', NULL, array('method' => 'GET POST TRACE')); $processor =& $affiliateRequest->addChild('Processor', ELMAR_SHOP_ROOT_DIR . 'elmar_affiliate.php'); $paramName =& $affiliateRequest->addChild('ParamName', 'name'); } /* $interface = & $root->addChild("Interface"); $positionLimit = & $interface->addChild("PositionLimit"); */ if (defined('STORE_LOGO') && file_exists(DIR_FS_CATALOG . DIR_WS_IMAGES . STORE_LOGO)) { $logo =& $root->addChild("Logo", IMAGE_PATH . STORE_LOGO); } /* $address = & $root->addChild("Adress"); $company= & $address->addChild("Company"); $street = & $address->addChild("Street"); $city = & $address->addChild("City"); */ if (emailOk()) { $contact =& $root->addChild("Contact"); $publicMailAddress =& $contact->addChild("PublicMailAddress", STORE_OWNER_EMAIL_ADDRESS); $privateMailAddress =& $contact->addChild("PrivateMailAddress", STORE_OWNER_EMAIL_ADDRESS); } /* $orderPhone = & $contact->addChild("OrderPhone"); $number= & $orderPhone->addChild("Number"); $costPerMinute= & $orderPhone->addChild("CostPerMinute"); $orderFax= & $contact->addChild("OrderFax"); $number = & $orderFax->addChild("Number"); $costPerMinute= & $orderFax->addChild("CostPerMinute"); $hotline = & $contact->addChild("Hotline"); */ $prodSum = productAnz(); $categories =& $root->addChild("Categories"); if ($prodSum > 0) { $totalProductCount =& $categories->addChild("TotalProductCount", $prodSum); } $ns = ELMAR_NEW_SHOPINFO_XML ? 'c:' : ''; $attrib = ELMAR_NEW_SHOPINFO_XML ? array('lang' => $language_code) : NULL; $mapOther = $language_code == 'de' ? 'Sonstiges' : 'Other'; // Die Produktkategorien der ersten Ebene schreiben. Durch "group by" Doppelte herauswerfen. $categories_query = tep_db_query('select c.categories_id, cd.categories_name from ' . TABLE_CATEGORIES . ' c left join ' . TABLE_CATEGORIES_DESCRIPTION . ' cd using(categories_id) where c.parent_id=0 and cd.language_id=' . (int) $languages_id . ' group by cd.categories_name'); if (tep_db_num_rows($categories_query)) { while ($category = tep_db_fetch_array($categories_query)) { $categories_name = trim($category['categories_name']); if ($categories_name != '') { $item =& $categories->addChild("Item", NULL, $attrib); $name =& $item->addChild($ns . "Name", $categories_name); if (function_exists('tep_count_products_in_category') && ($cpic = tep_count_products_in_category($category['categories_id']))) { $productCount =& $item->addChild($ns . "ProductCount", $cpic); } $mapping =& $item->addChild($ns . "Mapping", KategorieAnpassen($category['categories_name'], $mapOther)); } } } else { $item =& $categories->addChild("Item", NULL, $attrib); $name =& $item->addChild($ns . "Name", $mapOther); if ($prodSum > 0) { $productCount =& $item->addChild($ns . "ProductCount", $prodSum); } $mapping =& $item->addChild($ns . "Mapping", $mapOther); } $lastschriftverfahren = defined('MODULE_PAYMENT_BANKTRANSFER_STATUS') && MODULE_PAYMENT_BANKTRANSFER_STATUS == 'True' ? true : false; $nachnahme = defined('MODULE_PAYMENT_COD_STATUS') && MODULE_PAYMENT_COD_STATUS == 'True' ? true : false; $paypal = defined('MODULE_PAYMENT_PAYPAL_STATUS') && MODULE_PAYMENT_PAYPAL_STATUS == 'True' ? true : false; $rechnung = defined('MODULE_PAYMENT_INVOICE_STATUS') && MODULE_PAYMENT_INVOICE_STATUS == 'True' ? true : false; $vorkasse = defined('MODULE_PAYMENT_MONEYORDER_STATUS') && MODULE_PAYMENT_MONEYORDER_STATUS == 'True' ? true : false; #$barzahlung = (defined('MODULE_PAYMENT_CASH_STATUS') && (MODULE_PAYMENT_CASH_STATUS == 'True')) ? true : false; #e-cash (elektronisches Zahlungsmittel); money transfer (Ueberweisung); cheque (Scheck) if ($nachnahme || $paypal || $lastschriftverfahren || $rechnung || $vorkasse) { $payment =& $root->addChild("Payment"); if ($nachnahme) { $item =& $payment->addChild("Item"); $name =& $item->addChild("Name", 'on delivery'); // Nachnahme //$surcharge = & $item->addChild("Surcharge"); //$maxSurcharge = & $item->addChild("MaxSurcharge"); //$relativeSurcharge = & $item->addChild("RelativeSurcharge"); } if ($paypal) { $item =& $payment->addChild("Item"); $name =& $item->addChild("Name", 'paypal'); // PayPal } if ($lastschriftverfahren) { $item =& $payment->addChild("Item"); $name =& $item->addChild("Name", 'debit'); // Bankeinzug/Lastschrift } if ($rechnung) { $item =& $payment->addChild("Item"); $name =& $item->addChild("Name", 'invoice'); // Rechnung } if ($vorkasse) { $item =& $payment->addChild("Item"); $name =& $item->addChild("Name", 'pre-payment'); // Vorauszahlung } } $free_shipping = defined('MODULE_ORDER_TOTAL_SHIPPING_FREE_SHIPPING') && MODULE_ORDER_TOTAL_SHIPPING_FREE_SHIPPING == 'true' ? true : false; $shipping_flat_status = defined('MODULE_SHIPPING_FLAT_STATUS') && MODULE_SHIPPING_FLAT_STATUS == 'True' ? true : false; if ($free_shipping || $shipping_flat_status) { $forwardExpenses =& $root->addChild("ForwardExpenses"); if ($shipping_flat_status) { if (DISPLAY_PRICE_WITH_TAX == 'true') { $shipping_flat_cost = tep_add_tax(MODULE_SHIPPING_FLAT_COST, tep_get_tax_rate(MODULE_SHIPPING_FLAT_TAX_CLASS, STORE_COUNTRY, MODULE_SHIPPING_FLAT_ZONE)); } else { $shipping_flat_cost = MODULE_SHIPPING_FLAT_COST; } $flatRate =& $forwardExpenses->addChild("FlatRate", number_format($shipping_flat_cost * $currency_rate, 2)); } if ($free_shipping) { $upperBound =& $forwardExpenses->addChild("UpperBound", number_format(MODULE_ORDER_TOTAL_SHIPPING_FREE_SHIPPING_OVER * $currency_rate, 2)); } } /* $features = & $root->addChild("Features"); $installment = & $features->addChild("Installment"); $orderTracking = & $features->addChild("OrderTracking"); $deliverTracking = & $features->addChild("DeliverTRacking"); $installationAssistance = & $features->addChild("InstallationAssistance"); $repairService = & $features->addChild("RepairService"); $careAfterPurchase = & $features->addChild("CareAfterPurchase"); $giftService = & $features->addChild("GiftService"); */ $technology =& $root->addChild("Technology"); if (ENABLE_SSL) { $ssl =& $technology->addChild("SSL"); } $search =& $technology->addChild("Search"); // $set = & $technology->addChild("SET"); if (defined('FILENAME_CONDITIONS')) { $termAndConditions =& $root->addChild("TermsAndConditions"); $url =& $termAndConditions->addChild("Url", tep_href_link(FILENAME_CONDITIONS, '', 'NONSSL', false)); // $return = & $termAndConditions->addChild("Return"); } /* $specialDiscount = & $root->addChild("SpecialDiscount"); $description = & $specialDiscount->addChild("Description"); $url = & $specialDiscount->addChild("Url"); $certifications= & $root->addChild("Certifications"); $item = & $certifications->addChild("Item"); $self_Discription = & $root->addChild("Self-Discription"); */ $content = $tree->get(); $content = str_replace(''', '\'', $content); // ersetzen von ' $content = str_replace('|', '|', $content); // ersetzen von | return $content; }