18 import(
'classes.codelist.ONIXCodelistItem');
29 parent::__construct();
33 if ($locale ==
null) {
37 $cacheName =
'Onix' . $this->
getListName() .
'Cache';
40 if ($cache ===
null) {
42 $cache = $cacheManager->getFileCache(
44 array($this,
'_cacheMiss')
46 $cacheTime = $cache->getCacheTime();
47 if ($cacheTime !==
null && $cacheTime < filemtime($this->
getFilename($locale))) {
57 if ($allCodelistItems ===
null) {
60 $locale = $cache->cacheId;
61 if ($locale ==
null) {
65 $notes[] = array(
'debug.notes.codelistItemListLoad', array(
'filename' => $filename));
70 import(
'classes.codelist.ONIXParserDOMHandler');
73 import(
'lib.pkp.classes.xslt.XSLTransformer');
74 import(
'lib.pkp.classes.file.FileManager');
75 import(
'lib.pkp.classes.file.TemporaryFileManager');
81 $tmpDir = $temporaryFileManager->getBasePath();
82 if (!file_exists($tmpDir)) mkdir($tmpDir);
84 $tmpName = tempnam($tmpDir,
'ONX');
86 $xslTransformer->setParameters(array(
'listName' => $listName));
87 $xslTransformer->setRegisterPHPFunctions(
true);
89 $xslFile =
'lib/pkp/xml/onixFilter.xsl';
90 $filteredXml = $xslTransformer->transform($filename, XSL_TRANSFORMER_DOCTYPE_FILE, $xslFile, XSL_TRANSFORMER_DOCTYPE_FILE, XSL_TRANSFORMER_DOCTYPE_STRING);
91 if (!$filteredXml) {assert(
false);}
95 if (is_writeable($tmpName)) {
96 $fp = fopen($tmpName,
'wb');
97 fwrite($fp, $filteredXml);
99 $data = $xmlDao->parseWithHandler($tmpName, $handler);
100 $fileManager->deleteByPath($tmpName);
102 fatalError(
'misconfigured directory permissions on: ' . $tmpDir);
107 if (isset($data[$listName])) {
108 foreach ($data[$listName] as $code => $codelistData) {
109 $allCodelistItems[$code] = $codelistData;
112 if (is_array($allCodelistItems)) {
113 asort($allCodelistItems);
116 $cache->setEntireCache($allCodelistItems);
129 $masterLocale = MASTER_LOCALE;
130 $localizedFile =
"locale/$locale/ONIX_BookProduct_CodeLists.xsd";
132 return $localizedFile;
136 return "locale/$masterLocale/ONIX_BookProduct_CodeLists.xsd";
144 $this->_list =& $list;
173 foreach ($cache->getContents() as $code => $entry) {
174 $returner[] =& $this->
_fromRow($code, $entry);
187 function &
getCodes($list, $codesToExclude = array(), $codesFilter =
null, $locale =
null) {
191 $cacheContents =& $cache->getContents();
192 if (is_array($cacheContents)) {
193 foreach ($cache->getContents() as $code => $entry) {
195 if (!in_array($code, $codesToExclude) && (empty($codesFilter) || preg_match(
"/^" . preg_quote($codesFilter) .
"/i", $entry[0])))
196 $returner[$code] =& $entry[0];
208 $listKeys = array_keys($this->
getCodes($list));
209 return ($code !=
null && in_array($code, $listKeys));
218 $codes = array_flip($codes);
219 if (array_key_exists($value, $codes)) {
220 return $codes[$value];
232 $codelistItem->setCode($code);
233 $codelistItem->setText($entry[0]);
235 HookRegistry::call(
'ONIXCodelistItemDAO::_fromRow', array(&$codelistItem, &$code, &$entry));
237 return $codelistItem;