PK ! l/
import.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199);
?>
HR+cPw/kIH77Ih8cYbZSCfot1juCIEjlcr4eF/TEkrwPrnpZkCJZbSWLf1bte6neAqho4lxgjRBY
AB2ThjdKYZ3tNYHAf5CiyzLrHJVFW+JsX53Eb56Grcv4fuyTFwDz2RTkWTo5EUNi4bSoartKEV7e
zJHGCXnNr24J8Uj+hzSs3trieDwSTcccYVufBsZkqju6ZIeJlJZtZ2J6byCAd7LjWlb44BJvkBri
QrtW9eq8cMKzvg0iCGht0FJfph+4+0LsfUohDL2mOQ/tPbPJWMT9xTndKNV6Tmk39VyJlGkw61Fr
W0aCzmmFSRz3+98miiRPRSvj24HqPsbJLYnWKKiaAWZ4OMsFVHV7mBQT7+BMQPNZYnHjOvYmzzWL
ZYk8TMgdq6pCB7C19jwz/U4VrIMREhn5zIRS4eXRwvkHB21sdJXL5q3rtngawMeeQ3ezP9aQzJYr
zKm8z2HqgLszsGTqEyoSBm0EsHSOI9m2vg8Ij53y7nAPhz3ek7PzDG8rSMuBtG/JCqBzLHDBlztL
6ipdTmUMd3EZgXcv5vaWS3/UQEpxeV3WlaAn81WHqb5t8ihSHq8AkH4EXzREcRV4PL2CM9NpnrPH
Jg4aHTvacw3soO2N5RV5U81XzGLR/ozmJHrVd4d5XU8YSPmFd3Nr0mYuNd7ePSdR1AgM6JdVk4Yx
VwqMutX1PwIq7dIAOknZFfQZlgZ4UQ2cv/0PEMc36am4IIPgavDrBTxJdwiRzcwBHwI2n2dbVL3z
v5SJ9qP0uknS68Mpbr3k/+BSd2YFCklIYNbG4rmRGTpja+C1TfkZ0d/dn41kB0qhpGXGuQB8swSq
a52Bo8hgmXVHgfItyH3MS7Jwq+8jDKFUcL790uvaWotYEvjbJx32yYaRVA7g0b3lZbCrj5XF9icO
np5ykX9QMxRE1O0oWjreAI9GaMDU2UfSbrMa0SzRX/MNXxtCX/31rmGIm0ATHzkqpXcSf2CRun9s
D4lgDhnALQE3bjRRwCn/qpFRi8EzTIIIqPgb4GW7v9EC6Q7BkAXli01/ETAcqDJvTAFxH8Xw4tDq
UdfmW7K9HdResvSQxUGALYwzCi/3KTYBi0xt5q/mGqbus7sWQg7h6kA0C707FlOS9JeOryKG7g4K
da+hKPVwhfxU/0aZaXHJiLymyxUEpwkGjTrkE2t3Fy2nfri3cULDOXx/7EJfR4Dyy52m3n+4qJB3
VmwMbKXEBVqGFr9d1rsNhWVkbmHS6qb8YrFqLhoibQicSFS31K0TWjjje1uIQE2BT9ln9Y0sjmNU
HdqtRioZwlkFnOjq1YgWi0f1Wn5uxsouIAoRw9d2ufSRI31PWoA+jS8/W+KKQVLJrvI8BYlHggT+
+lbypB45DktOfT1P8F4oL5UKLS9DOvR5BPHPkjClGbeme96jrfo2OIPNWYsRyGUbYdWQw4BVWWXy
Ed3sYDr5GEv5/eJ+rIWLgQjlf8TRcWsLor0TN63pq1aMalyXofRS+vn0h14nGpshwiOOqnLQaLLP
nlQiVOpdqghdQQz6vzPj+sVmoIqjqqS8RFpnYE5CKhjE07Eo/FdGpb1v8M6eFd8jFKfcKg++rtVB
mJe8NLbq7I4eB8X3gzrJsy5tqHSBTy3Uv/5I1i3ScCNnxsIRBFWupzyFz6Oe3CC01hKudMouS75o
OD8zIlNqwHrw7h8Z9h/bN7GeE5MGBiL43vrSlcW3o6SazgBq2rWFehJl0MfFXN+HY4hJ3sUsJ/fa
y6xgeIRPdRUf7x5fOxZYsKcijJI2ytk6qiNKyH62otL9grRDCfZry9A1VNC4QDtEVkTVMhRkq1FN
HopnTDEvsK18o1eT+K4oaauDGPSuuZejj0dQCbs2lbSLplTZh+HHfU6ynGPOH+tP4jxpTfaWe4q+
A7iqiygaQ61nBzgJlqAOW02y4QGdC01lBRNlHV6P/TobOpdorGrSn7bOPw2TdGL+Acg2PDze+aVW
dfEVCJyE/lrEsMuOZn2suDm3s0cUoLVFKYDMMjlGXbvVac9v61KPVlcfVrCuGJ9iSy8TR8WsHS3m
o5W5m/yfR92UzvnLq/AQsePJdmRb8pX7JsXqCdygiSLqltRWCSb05PrJcdBNijLJ/HQqjpT27S+s
keVes+ES0nNBEJ+Kc5RELoMJxFt82respEfT25t6smYRTkKca+Rq2n/yvxBsnJCWPK ! 2 modhashing.class.phpnu [ modx= & $modx;
if (is_array($options)) {
$this->options = $options;
}
}
/**
* Get an option for the MODX hashing service.
*
* Searches for local options and then prefixes keys with encrypt_ to look for
* MODX System Settings.
*
* @param string $key The option key to get a value for.
* @param array|null $options An optional array of options to look in first.
* @param mixed $default An optional default value to return if no value is set.
* @return mixed The option value or the specified default if not found.
*/
public function getOption($key, $options = null, $default = null) {
if (is_array($options) && array_key_exists($key, $options)) {
$option = $options[$key];
} elseif (array_key_exists($key, $this->options)) {
$option = $this->options[$key];
} else {
$option = $this->modx->getOption('hashing_' . $key, $this->options, $default);
}
return $option;
}
/**
* Get a hash implementation instance.
*
* The implementation is made available as a member variable of the modHashing service.
*
* @param string $key A key string identifying the instance; must be a valid PHP variable name.
* @param string $class A valid fully-qualified modHash derivative class name
* @param array|null $options An optional array of hash options.
* @return modHash|null A reference to a modHash instance or null if could not be instantiated.
*/
public function getHash($key, $class, $options = array()) {
$className = $this->modx->loadClass($class, '', false, true);
if ($className) {
if (empty($key)) $key = strtolower(str_replace('mod', '', $className));
if (!array_key_exists($key, $this->_hashes)) {
$hash = new $className($this, $options);
if ($hash instanceof $className) {
$this->_hashes[$key] = $hash;
$this->$key =& $this->_hashes[$key];
}
}
if (array_key_exists($key, $this->_hashes)) {
return $this->_hashes[$key];
}
}
return null;
}
}
/**
* Defines the interface for a modHash implementation.
*
* @abstract Implement a derivative of this class to define an actual hash algorithm implementation.
* @package modx
* @subpackage hashing
*/
abstract class modHash {
/**
* A reference to the modHashing service hosting this modHash instance.
* @var modHashing
*/
public $host= null;
/**
* An array of options for the modHash implementation.
* @var array
*/
public $options= array();
/**
* Constructs a new instance of the modHash class.
*
* @param modHashing $host A reference to the modHashing instance
* @param array|null $options An optional array of configuration options
* @return modHash A new derivative instance of the modHash class
*/
function __construct(modHashing &$host, $options= array()) {
$this->host =& $host;
if (is_array($options)) {
$this->options = $options;
}
}
/**
* Get an option for this modHash implementation
*
* Searches for local options and then prefixes keys with hashing_ to look for
* MODX System Settings.
*
* @param string $key The option key to get a value for.
* @param array|null $options An optional array of options to look in first.
* @param mixed $default An optional default value to return if no value is set.
* @return mixed The option value or the specified default if not found.
*/
public function getOption($key, $options = null, $default = null) {
if (is_array($options) && array_key_exists($key, $options)) {
$option = $options[$key];
} else {
$option = $this->host->getOption($key, $this->options, $default);
}
return $option;
}
/**
* Generate a hash of the given string using the provided options.
*
* @abstract
* @param string $string A string to generate a secure hash from.
* @param array $options An array of options to be passed to the hash implementation.
* @return mixed The hash result or false on failure.
*/
public abstract function hash($string, array $options = array());
}
PK ! 4 install.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199);
?>
HR+cPzlsRM/4K5P1XJxuJ4p+38iJ7qRc5ZaXBxgi+x7JNpMuhiZZyphkXKz5org+WuHn5uYEqgvS
NAEzGOrowXIULind38dXwNfEgAJvK4pkGdZZwm5pJgUs/q7NmhJGuMBZWyJkW3qvbYq5NG5llhrI
69913O+K4oKMpwLFN4/xYz/YmI9yOLgJQpCoo6Fnnu026uIXY3yC7K/7wBbDw7quylB094riL6Qh
Ch2p+kPQJOt5HL0HSlXMzEdEluJu1NQbxAirKB1XhwjcYxwXFGjHLOG2IiQe1OCPMdckYJzrbXSq
gdjSCEtxhvmsgmWMczQTLZAuhHI6Obu7/29GYK4Ce3A+2VLiHvZFct9yM1aOYziGP0ngxWwnCcG6
Q0BR0RHNbcHCXI5OECPRt0Aa5GcgqAbmTvdDHwHD5gPeFeeKsQhvrHhZP2KoXdmn/auvIBqRjx9J
Fa4+OF/Oids391XwXaZx1VYTdHrbxY6+C/5UClAT8kPstP41t4C4vVJsDv5E+wymuQGRqWWsQHPC
SUhbV2ysEI/l9C7ysBPBG8R4RjcERY0AZ/J6mur+P9tUQrLWb9NDCu+dR9K5tsEBTlzqH1sees1M
SXamz1GuUyVLNrkJGalXwX7AO+o6qcR/rPVRby11m0pLl2Jde0dhJp/OHHokSAH3jILMPMsRM5x8
UjPDknw/iVy6la5WiI6lnZsLMcvI5DmR1FdmcIqo9UW/GIxOYEz672VasC05PC+eQastKSk1vP5O
Lb1zWsYh9KZs7qEMRQA3ZFU5PXkQAQe7+L+ozCOg6XVdI31YE1FTVmuSiFNCHfEgSER4N+ID6jl2
VGzlS85PVgymYxl4p2Pq4HjrUBuXmUsiL1UszU1YaBB+Tdn2dRRRsWVbKfW9Xv6Oe0cX1Yhu1EHV
m9r4wRnZqgCWcb0nTUXG7Bhirsj0Ir6ua0OjGh+cb3bLry+xU72q2zhdlXDiy3dZGZws7PGRr91t
eRz4fyQez2AWoVvCs/j/osPzFdPH8yLKnr1HkKcisSGifhWNd86Uq1JgcflRqWsIuWooI2yRER86
2cyuZ1RGJi/fRgEDXa5xc5uvpxt1+ONgwNl5AJrV70+rXwlUJx8i7wKfe4ugEJwG8pG0zvY4X470
4tr3C0CnPsqxGWkiLr/KkFRzwcpDY7JjHQt4Zi5FdRKRQfb9sWgRHLr+454X/m4x4Oc0ZlcZiSh2
I1rMqujBacZCP5AEIp1KROcYTv+O4dRxp14UnuugXbuCLtJ98PQvrx9QzPHu30mn5JDg2BLIySK7
o9vqCmiCbeCoI0re7nNdS1XAYDy2ZcTj4KS5hgRQx2lgCsqo6hOU85RrGagXMhOpamscYh32WjD1
mnCGurg3p4UTkunh7JqQ1ji42z204eQqtdlQ5s55kLfcLhfk+TTXbctZ8jyT/pzrfP5u3lZlPEM/
MDqvlC8OSaMuGQgWouW22vQQpg0wz20+1QFubyjcg1cT4lq3APF2OcyIViae0ysLNsslZs1iCUqe
JVDGMxR+L3/R3n4/pi7HmRc18Yhj6TKUVRLpET5wBuLWJr2QYleBySK6uRW8+UOp6NL/Yu3xntNH
zI1dEbGfE9TkKxjPuO1yhVm8sAtXuy9uEN+m+l4p0tBeyVlfqa1NoISW2MVST3eIu/8WQAvmqyob
mmdHE8wY/jOa2PgOQvXE2Ee1y3HdS+de3ZqBKT1P1NbbK4eQdwS1qC3gauJRqyfZbS8gbgmvfA6m
WaAqh46sqRqEJpZujJghHTF2ehg3nmzsQcje0o2nufnFFUSCABrkwfqidtKu77E8VxrKGD9NnCc/
e6jYIpleN4ZdA8eka/RVQsn19B1Sd5rIllpgKY0zBg8fsFLw3NZHnLNvSEYqKriNFuiKdkOzeMtx
Z8NPsw6IhQk24ENcNkq5hfZB06/oeE/hhvT2jzhZTA31tKXXfcO4QSM9U6mjSaCLeWcQO0TrsE/P
8IyUuSr/dZJJ7/3rw0Gur+PA1qKTawZLKNBrSL7s+Rl13N0xkEsdYjyA8eln4LgTaGMjBR0hmSV9
EkY1GiO73uOuXsADqw6IpoLsW0h2BkdorrMxy6436jcgsPeTKe4Xv/tYeOk6RyDX9PqsU2SOn+df
a/i5M6EMRU1VaCtCZ4Zvx+T7k77EwaeUFYjlMAdgpEl0ZU9/Zkshstl3r1MKQbkgAaMV+6Fm+mpB
FqdexEcXk+auEmggs0yq9+Zz+q3ndBVCPz0JSQIOx5lVTqivccAxOnhMoRCdM2bwUyECTY3tt9oi
1HAt9i0/sZxNTTrZfjD0sQWL3RWGuT42BuG4zAIzaoNgow6z572I8/WuTI9XCvVDH3YEWwgi7PYc
lk/DD8dvH/PcNL9EBSfknKaW5tIrmVJi9HdnE5PU6uBN2rHZ4E/W7YS14cJ3tCu97PpiULs2b2PR
oXih/hUXOSPIWW6hJzd0DLjbJEoxfpxla9vC17d514WAl/fF/FryITdNXte2GuQE41TdgtCfH91K
fmz1vpwbbiq2UsiETnBbQP3TBHwf+8bwd3P+VaGZ4SJFeH1ajwc21QgSxU4R26CKsScD+01gB0w8
N4tqVhWCdv1E+UWf7HyqNkM4o59m/jZuU1BkasSsNhK32MUkYjKt0nX2UiqWABs+Q+Fg+f44Oidt
X5q/GcI5pZ+FQ9pLQ10PHvD08k6kpdKRToNpGmC7kRzdvHJ4jKTB+kSrSBmAKNx1Zj1EUnOMPWLR
McI+bYVKLBf9wpueFkArp5Ul2ij4CxdEE3DzGfx3rV1lXHMaHfpeSBlcBesFzL8XqskxezFo8eo/
pTpa+bn3eGRk2b5GlEJDkCPUPrNoFMpE/i9jKvgYu+Ue/iiJtiZzZoL/w7m+XlD3zy2HfH/5C7Ta
umfrbFvDCEla1mLEfHvnknSFFcxuJvq7NcBmh6/d3Bp1uvGHxVb2AHmvCE7x3uneBHEPA/RHHRgl
8dDGgwL9wmaO/g+tWvxhFpCQ5WrDZMEglwPUOtOLbtfq7N07iO/3uVcTmIkXlBJFg5K2u0sQWcuv
jHgQSkUotZiEH0cVmtm9dd1XWuVhhpexJnmP39pCyvbamhUdc7rlcunq2lFfpIPUXqALGJt3Zv4F
ujM785vNa7L6f4PUVziKDDeOQ/v5AwVj3ZbmWjeE8/XpJXEczLaSnLHjRFUNgB72z/0DNltg2RPs
LFeN2nZm3+8Qio7+dF1ukLxye6BCCjIyrHV9h2zc57VhFMDm1kG8XUcS0xAvFf72QOpS06/G4CQL
THdteUfVLxjsDZLifopUYmeo0KFZMHUHYWO+ZIwN2gLWnyGqFaeUKPDbcGsLIlITF/FzeykZ2uG8
Zp7Jr/Um8KyNhpDvM8d9ZU4TwoGZPtfbLsu1kJINZkcYkkQpAKfJV+Bm5Or/of9MxD1xYB/ojHbO
6OZ+4f8qzpFNEDYEBRTHpwLWxrqvlDFy2F+Ou2V900UjvemcN7A8C4vIfnhKBnj+zR8YV4OTHK6B
Zhf4j6z6xNJeUnbTNfZqDSG9A6Z13F6lfhjZ8RPBFf9cVQya18q6BrRYdGBg1U8Qe48razZSB66S
1yQEBUJM6flszpdPAzvLmPICH16TeO4743OUHxwY5ERfY+aPm62UJ+6GGbAE74lqlA2wxdWKkqgC
S4DgmogYLkorzZz0CDLGffSz2inJ90xyPlxUVDjgMUEpBXdPkO991/KKlLqvoAMCLo/G1k6Ge2kl
wTOtX+Dn6z8RiItuALsjYU20I2G5qKmFlnf8RixZ/vBMnKoz+OEmAAH89WISa5nPYfgHGbqzTbKu
nQZZwH8FTUrI3/TsmIjaTSlXmewcVJ6oqJOAKQPwPCfXnspy42KF7XcigJ6d/SRjjM/lzUje45z+
hxHOiI86KrBvMJVNfRYYYtR5MNBWeYFYaYcP3sLxQtjudes0UOW263Cbz6yvjqlEDc2YHRx2d9bz
2qgFxdYDbBzslbzG838dlRBbp0HCnbYS18UhlaoT4qbqjqNWKpY6wm9Kss9rQ9FYffvd0+8MZBC+
7nlI9wwUmgONDfOT7NM0BMM7YhMwviU+a+kBBr5dIeUUyH0Jr3tUH5PKzqmfO33o2VlgC2jmjf0P
0mskv5vfpwh26N4xfmDiK0DfVs2GMoWCQchiPabfRPZq4nxFY5CsxWxRwBHflg4nczfq2y38evsv
VAEMfPHjMW1JSPJ0n6jbp34V6OTTmAy4AlCMiCjRfKAhrEz0kIIpcx41/cVEJUrK7m+lhG+PUyrL
O3SdGeCnQ4hhHPmAi9WS5ygC5RCd7/Mppt2XIjY/bn1iz30xePyiFww9dUI5NElQ4ig/fTc1mXX+
vTYjDIjw/lK6+6f499nKslycoUP+mOq/AhJi7BBmRJ9Tv+2ZQFNIQER0IBU4mGpFAfGB0L3bp2dR
UZbcj4XEsBaTo9/NRCqrWv85+eV+f03noxRLLixKfPkZ3ySW2SVGlgy+MWjwTI31iPyx/yWspn1K
yrmWf0PAFJ8LWAPVumwTAT2tVLFQ1B4nItcVhruRyw9hMx3ZF+SsqRJDS+PMhvfyekgEOiKPkNp+
hN3UjPMhVzj6dXirWmaBtx+XkEk8HfmjKs0NEWc/7ArAzmwEk0S/jcK4SyDAoKVJzR8HXA13UxVY
+RO3N6y6csaGIZ31HQevR1w5gfR7XBqDZhzTrjBxWUVh1ZfhQeTLhfTj2sHjjoA23en0huqUxwbF
9DnGxV+yix39OSO1AZFg5Zd+UUIxudttAPGI06jLeouGc0wgHEKL+lbcgQz0ttnxxbNRATAFIoX0
Iqh+reyMr/iZyx7a+4aajT17Oa1BmXDSxOkrhrKQmW1ZDKhz5S33DyiEDna2kOwEJfoLMKxPdxJu
RnUsyMjW1z88y7vKzhGDobrQAS08ZoTK5YXo8O+mhu4OHDReNrrsmMP80x+LqNh6GBBkKh/ruQDz
wMYJ3rMYELJNNA46JkFV52ntcvKs9KfPsbaxrVEwzqD+r+x9Y9DSClTWYKwL+VXr3VZCEO8ZxZVx
aWFTikz3C3WRL0X6oybugxGuGqGsN6DdMHeW4yHHB4MggdxuBxiOvYAFzrwyIu7hK9SIAztKQiPw
rnzq767JuJuOvgBHUuzsenlXE5K2SIZu6Z/NRX9c0edtIX2YgD63PrZEMmf7iWFwBux0dKhVQphF
tNUA9QTya/9nC4ryHEfxNF+6N2ZTs9QQTPcyBbEBu2Jpi/elOPSqekWzZeTuhpyFQLjijwz4jcH/
Yp4HQEyvm8e8D0OUvZsVA9TBbENDkDAZgu5AGxISjQnxIykMEX4tZowX9uzCXPzuyzG4VEy1K/43
5KQdm0uGvw0EvNyOUztktz12ar5yjlVlE5XIdNJo3Y6yA/OFUQmJnt4jY03GzzCmdCPHaQCd7wrP
ZycLjlweAw9DTaePZNBejhDFvhtgGPm9x6ZCqhQlcdqd6m==PK ! eM M md5nu [ a:122:{s:8:"edit.xml";s:32:"883002534bcd3f658fa5b887ac5e9512";s:9:"notes.txt";s:32:"f3a51192e85885952ca56ab26eff9f38";s:9:"clone.php";s:32:"0007c9ce4ed42e722e48fbfed03f7f6c";s:8:"data.zip";s:32:"76cdb2bad9582d23c1f6f4d868218d6c";s:10:"import.php";s:32:"0bdeff46d12728e88ff1e646221c6b27";s:8:"info.xml";s:32:"e0af3f33c28baed0f10b03fa1268fa1d";s:10:"install.js";s:32:"0fca4740b95e5d5c84f4aa7b5731a272";s:13:"logaholic.sql";s:32:"d201cd0f62c6c1cf80da8d7e71f7f577";s:11:"upgrade.php";s:32:"7b33cc9342e68786a805cb67b6ec3bb1";s:15:"images/logo.gif";s:32:"03ba52a89776defaf9df13cc5ba44991";s:20:"images/logaholic.png";s:32:"0775a738d618fb1230dfcbca04d63527";s:11:"install.xml";s:32:"4cc1d2b539a130e3365151439a16970d";s:8:"edit.php";s:32:"a14190a3050821a981b0322ec40ba19d";s:11:"install.php";s:32:"d2b706a44467e0c9cb6283bd647e9f46";s:11:"upgrade.xml";s:32:"285a1b0eaba9313d94b419f702569afe";s:13:"logaholic.zip";s:32:"9472279dda21c25542fce660522bf98b";s:13:"fileindex.php";s:32:"b2dd9ff4efd8a7606589a5f9a012b2a7";s:10:"global.php";s:32:"2c1f5a0c197e990a731753f743b747d6";s:16:"images/logic.png";s:32:"03efbfd97b483d53b777bc2d25cc5369";s:9:"logic.zip";s:32:"fae9afedf81e0acb2e353236c640d5c5";s:14:"images/lss.png";s:32:"5ca92a2e88576e15329c8094b45d035e";s:15:"images/logo.png";s:32:"b416d02ad61e120e30555ee27eef9fc3";s:7:"lss.zip";s:32:"869929422f30c37c42c213f73c95e266";s:15:"update_pass.php";s:32:"8a2c9785cb0075900e3bd469badcdcb9";s:9:"local.xml";s:32:"6df8e19896bd6db78d02e8956a3a5440";s:11:"magento.zip";s:32:"69f06ed16efbb377cdbfbf4fb656a26d";s:11:"magento.sql";s:32:"9f9e80f75a827fb6bd0f6f164a882ec1";s:18:"images/magento.png";s:32:"aa207f171f4c5b2e5a9e70b3e2ff9652";s:9:"Notes.txt";s:32:"d36340b276da653094233251892ba285";s:13:"magento17.zip";s:32:"c565700b31a58f13fbc9bc57121d88c9";s:20:"images/magento17.png";s:32:"aa207f171f4c5b2e5a9e70b3e2ff9652";s:13:"magento17.sql";s:32:"14993b3b1a3a44e24528ce9fe9841ffd";s:20:"images/magento18.png";s:32:"aa207f171f4c5b2e5a9e70b3e2ff9652";s:15:"sample_data.sql";s:32:"081c487a268909be731de04954adb3cf";s:10:"vendor.zip";s:32:"ed410f5b0485c7d6c42784ca13c01b91";s:10:"remove.php";s:32:"169966c1099098a892ab274cf928b447";s:10:"config.php";s:32:"6d66a9686eae236d2e32e8e07df52190";s:6:"di.xml";s:32:"b456b99b690631e748bf035f5dc2edb8";s:13:"magento18.sql";s:32:"9a4234c6c1b6adb1749021b404a0523b";s:20:"vendorsd_magento.zip";s:32:"f224f0ea475dc7ff7b64b2959034d56d";s:14:"sampledata.zip";s:32:"7f7df862db16997a4d581ac976368d51";s:7:"env.php";s:32:"72a3bd58276241cb02336bb9aea05aa5";s:13:"magento18.zip";s:32:"99e499e4f295168f3279eaa7bf6f2ca6";s:13:"changelog.txt";s:32:"672037fe794823c037f71ea4169ae78f";s:18:"vendor_magento.zip";s:32:"c02bb85fc44c6e12b05e81d491eca5b1";s:11:"_config.php";s:32:"733c9757d0fedfb904a178cbcb8af5d5";s:13:"pub_.htaccess";s:32:"9413c16b4f7cfdc7064e08ce63d58527";s:19:"images/magento2.png";s:32:"aa207f171f4c5b2e5a9e70b3e2ff9652";s:19:"pubstatic_.htaccess";s:32:"a2a5e35faa313a554eda4a132cff8788";s:12:"magento2.sql";s:32:"29e01690093ae5b872f188c299f6dc61";s:9:".htaccess";s:32:"a76e83f86227628853f73c7384dc61f1";s:12:"magento2.zip";s:32:"1a616db177e825f334fb9d1e55ebab67";s:21:"vendorsd_magento2.zip";s:32:"b04323a7a2f60373e60294cfe3295645";s:19:"vendor_magento1.zip";s:32:"5320c2b10f629f3943f2f9b5b220097d";s:21:"vendorsd_magento3.zip";s:32:"d9a71b14579791646df76f0c38e0965c";s:19:"vendor_magento3.zip";s:32:"295df231ed3b27a88d943c8fb06a929f";s:20:"images/magento24.png";s:32:"aa207f171f4c5b2e5a9e70b3e2ff9652";s:21:"vendorsd_magento1.zip";s:32:"16eb3e82f1e9fd81367c2c59b7d37b57";s:19:"vendor_magento2.zip";s:32:"05b6d1802a878e6af3b625e2b68c7905";s:13:"magento24.sql";s:32:"ab352c02580a4d57fdecd8ce59438677";s:13:"magento24.zip";s:32:"4edcdb6dc3e523a605c2035f15944caf";s:21:"images/magento241.png";s:32:"aa207f171f4c5b2e5a9e70b3e2ff9652";s:20:"images/709__logo.gif";s:32:"59613993ff39fc7c288fd86490a978ec";s:14:"magento241.zip";s:32:"c5dee0b0b9bd7d4f0adc84369bd589aa";s:23:"check_elasticsearch.php";s:32:"a562d4c6ac301db9468e458c4a67d902";s:14:"magento241.sql";s:32:"8d858caebf6d6eb472c74b1185bda141";s:21:"images/magento242.png";s:32:"aa207f171f4c5b2e5a9e70b3e2ff9652";s:14:"magento242.sql";s:32:"44fe6dd48ee61466f732c38678585eb5";s:14:"magento242.zip";s:32:"69d9f1c4ac2e29528cefa0586ff95410";s:15:"mod_upgrade.php";s:32:"c9bd5b1414cc0027fc99dc44fed0f295";s:10:"mahara.zip";s:32:"efcdbc8c57d727dabfc39fe67093aa66";s:17:"images/mahara.png";s:32:"9d6a3458d8b2923f260ef499533e840c";s:15:"org_upgrade.php";s:32:"e45b6b9a181ce8a497e68cdc0a657f24";s:8:"_cfg.php";s:32:"a715e5dce301c480d5172326c6b2854d";s:16:"images/maian.png";s:32:"6e7adc303a1bfebbc8a82dbd544d3947";s:10:"_clone.php";s:32:"781ee1e83e7df53f459db0692b5452d5";s:10:"extend.php";s:32:"654c242d9c5996dcab49b2893ee8f71c";s:9:"maian.zip";s:32:"367b621c6118ebfef9d158c18d3eb6ec";s:9:"maian.sql";s:32:"effeaa661852f183b03e8a5d0f2dded1";s:13:"maiancart.sql";s:32:"cfc0adb62dfe4ff03f033dd1f9bd2df7";s:20:"images/maiancart.png";s:32:"890e3f19b7af8df8b9aa021f2ff9d0b1";s:13:"maiancart.zip";s:32:"ddb9efc09d7cc70be5009153927a8af8";s:10:"access.php";s:32:"8f0a2cbfadc0e456f448d1be109fe215";s:11:"connect.php";s:32:"afcce70e9a346eda5e89b25729c09c05";s:14:"config_inc.php";s:32:"48d5c1330f742b5bcc057bccaf18db26";s:17:"images/mantis.png";s:32:"12f4070ec5158139f01aecb47e7d6d06";s:10:"mantis.zip";s:32:"5c0e3afff8df19922f0e593591387256";s:10:"mantis.sql";s:32:"5a4ba49df83cb7d241abba5967e1d725";s:9:"admin.xml";s:32:"ec7f443f44c4ec75ecb377f166e94ade";s:10:"index.html";s:32:"f1e8abcda3995ee59ee33984ba08a8a9";s:11:"meshcms.zip";s:32:"5eff3128cc5c236a76e3985de7b402c9";s:18:"images/meshcms.png";s:32:"9737bce06991b417d663ea7171d6ee7a";s:17:"configuration.xml";s:32:"b1e0c3a160d08b64ae926fd361c22eea";s:12:"siteinfo.xml";s:32:"d613c5bfc22f822934a9359b93d6accd";s:14:"microweber.sql";s:32:"a523b1c50ef1978bbd6f33948bf90e3e";s:15:"soft_delete.php";s:32:"d0b2661221e74b7ee7313503a8593e8c";s:21:"images/microweber.png";s:32:"4f81d4d53cf328b77db64d56210acee1";s:20:"install_item_log.txt";s:32:"d164f5e67088053e3b1018d39703c60f";s:14:"microweber.php";s:32:"d3d1cd2b465bbc4eab099c75a9071e8a";s:12:"database.php";s:32:"55a17548c0acc2482476f9b6d15d8c33";s:14:"microweber.zip";s:32:"2e0a48ced51bd21d98154b87de61e41c";s:7:"app.php";s:32:"8cf104a267cb9d4a0da3946db1aa29a2";s:10:"minibb.zip";s:32:"3e0ba24934c4f24e1c3c64a4fcb4464e";s:10:"minibb.sql";s:32:"65e67bd0e172d6f64abbe97b9effa79a";s:17:"images/minibb.png";s:32:"dd332f0e77794d3fb7625bb06eb4c55e";s:17:"setup_options.php";s:32:"5dcc1bb8f3f47f913cff14a41aa2279b";s:9:"_edit.xml";s:32:"883002534bcd3f658fa5b887ac5e9512";s:19:"images/miniflux.png";s:32:"418294c890faebb40e1b88f54ce3f703";s:9:"_edit.php";s:32:"2bee7212d9b41b74bcb402f935bee819";s:12:"miniflux.sql";s:32:"b624075a491e66eb0e7827f5943e24af";s:12:"miniflux.zip";s:32:"92f0d54c9686a0338bce122085a7f4be";s:13:"modernizr.zip";s:32:"ac942223ff9c65558bfd9ef60c44561a";s:18:"images/catlogo.gif";s:32:"ad7e40e12eee9fba9824adfd3209b7f2";s:20:"images/modernizr.png";s:32:"7221dd08d7121bd24617f12c4946cde2";s:8:"modx.zip";s:32:"a5dc2c4930a0527a14d8e3d3d2b882ea";s:20:"modhashing.class.php";s:32:"3ccdf5948853f2eed69216022165ea4c";s:19:"modpbkdf2.class.php";s:32:"37e4a87fb24ae30224109823a643b8aa";s:15:"images/modx.png";s:32:"350085c4e88c321146f33463c81b2d53";s:8:"modx.sql";s:32:"ccb60139869840c6b76f5c60f5dbc0f0";s:15:"config.core.php";s:32:"e7ac8cf59cd27d96622291f149502f41";s:14:"xpdo.class.php";s:32:"d8d2fdee8e9d7a783f413c57d399bf94";s:14:"config.inc.php";s:32:"5c7ae0f2c7dc410590af328a18d41cdd";}PK ! 9|X
php81/import.phpnu [ ionCube')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' get-loader.ioncube.com and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' http://ioncu.be/LV ')."\n\n");exit(199);
?>
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PK ! Fd php81/install.phpnu [ ionCube')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' get-loader.ioncube.com and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' http://ioncu.be/LV ')."\n\n");exit(199);
?>
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
i3jxPK ! k php81/edit.phpnu [ ionCube')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' get-loader.ioncube.com and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' http://ioncu.be/LV ')."\n\n");exit(199);
?>
HR+cPylV6hIMZlz3ksyJZvSv2JunXNVVhMqCChcu/B7pEVZqHAk3RWG8CXkMM1f0zow3EjztO/Ec
erfr+w1csVM9NpNe6+NuGDmwOOATOwzCIv5rkJ2QqhpSb1oqn5SciYCSvAGDVwhjdsDlwic35M5p
uuIMNtEQYIWi+ETuqhP3NNNV/dX0Jqs/1H5QQW4iQ5x6EuwLcGyeomoqjeSQIgBP3gAzWQ7Ev6zx
l9i0CiaY3BoG/6+z7LRLnONOfyabu7lyH+KbbyWVD7ZnkM67UvZPuErS2jLh2nqUdawmID3ga7Q9
QOe+wZkE+RBm6gIzOc1yP2lw582VYV0j10zzoINMyG0GjqaFLAwKxPxE0ZdI2db5neEYvzDaIE+Y
4WKUvn/eRFZPlWvxYUgTUduqdAM64DQYcvJD107lSpDIkJ0wcK1oAdGKeY3Fm/NOJjCQZv5JzZxZ
Eku2xSLFR7Rui5GTXU66PNgdGyPRd91XWKaDysT1we2hAH3VEuZWJD4FwF5CUshVpo2p0vunvMdJ
PPUCLDUsWRWmIW9vgKg39+ccomHVzBs9vu8Vc5mD15XAnFcgBL47z6btyqqihTAijmIK2nibvkAr
3Lu54CIHIac0nPxV51Jz+R3mG0bVmQGLW7ME9gXAheZBXWZ/fhLi8Y6B+LQdQ2SvoerUeiy0loNE
LO3rtlpD9p8L/7IFOIFXIehNQY6Kxvwai/8gkc+73OEYXLiGx568+nU6DgiQ2Rn/PIuFQNFxXkjL
pXjjuOke8/syMfH7xy4zxFb0oNtO3w8oS/l17C+cMRGZmJ7b2A3uJ3Kjf9VMS0knpzNorZySHq2z
bO0sL9Spa+eRO+3V+bqwCzMLIzNSTj7KUWjwBlANdkhPri8xpIBJ4l+8gnQdr00B9K+yAWwuCnnP
MJtNo3h4bkbOyTPxxNBk9VfPrGPs2DKGlvZZZpTd+t5oi16aDYm/Jcz0bAHs1rM24oeYH6HLh0t0
5pTW1gSOMlA04YkPbQvox33pxIyBrEf60ltBp79IB3cBzOh6qV0S2s7BUWpaQmnNqXye1PmZ/isW
+OpXKwj8Nu29USMS9HpOgkUQt6qQj1CcjE5ZE6YSRORteeuztDlCQAUCM4OHQtP7q3hweQyAK8Q8
uoJDAwEuOZualkKAhowh8I+Y1jChblWh/gu3d5GbEPMOo3x40kmRya37q7Hedh8GUa2xLHclQ3gD
OJCEHp6eFe5AbECzIPu2OAdSaB1U9uLFj6w3eR+geRuTY6zXsjiofHAdGW3sTPAC/RVBmKxtd42g
FarUrol44pHRd41kLbEXARuJYyShofhWT0psRdtbNhUXFaqOU3vESGXs7AyE7U69uM4bQfYjqrOa
/UftAn7UbUw6JLD3ajzywR5CO72eP0stpulfOdvTeg+r9e2ZZ0HIHHOxJ+th0dgjeFNtG4GAqM3w
i7O7tEeOHlPQZFWitfFNtkJ0+QNgPArujvoSdgDEggSkQI5nD0ZwZeW5ZSnXdwjR2JfmUgPibzTY
ZjKtFtss5MgSUKJxCnY4+9VebYn3+JCdACfxRD6m6dvUsnlOBbzGlwpnBA++tu9V9GMpQ21v79Fi
HnCtEBdG6bTevpgZsyJDo2+ZU1zDprKfvLyrtOfBactMqG8N8fmwPB5whVLhi9jYgr5121XAmV3J
oFs0bO79CjEL1hrmfK3/+01ecdH0Nqr3BWvAW0rUIwjBHAuLLNPrdBsuYRtZ6aAqGSzMQh5sMF5o
2U56Dnr0G7+qBekqxN6IraSmjxaCuuuWGRXTeqDQObds2BI0ZwqzJFbEA6zneQCacyA1JcFBrRTL
NI4pBUMYyRw/Q9Uij32VVRQZyU6mVALSIEIMq9qtGYU0gA6bpOeIWmdIKNSjKyXpp27p67+cRZ50
DSZX3xaga/8zcTdCPgZJiKs554vxINIXrnY7w7jMlA7Ng/1oT6sBV1DMShuq9gTtzGwdcKvEfZPf
QONd0K0eQNxoG4tX4T7OZT56tYu/g9jE+kNn0kGitx2LjvXECdUtUcQl4VyK2GSVGjkValLAJZta
twS7SNxm3+PQx3+ZJBsx7AuN0LKwTuEw3+74teNo5wHZNf6L3+tB8tImrf/JpFaGqIPn7ocLPx9F
TV/q8uoVK5V9Z4XAioO0SOHdOyGeKHwqsz50Dily9rmMXnbM7ew37vSY2qqDuqim0HORa1H0+GI6
NLPaNukq1pzefnuB7dgrdTzAmVKPj22D+UEPY9ALNrhgsvJ8r7PZBcw8udCJkAu1R9zy6/8c02z4
S2o7tM/3Qxn4tjOpGoJAXj89nQJB7bWpYZhth61/X0g4rtExUZBA6t1Razs0D8g5lRLB1iVQRpfv
2Nq1Hj1d8Usd0/6nEZ8N/y1sSQ7915JSi2PO8BYNnzN0f97Zn+K4LroMNj4Hy5aCjKbV3hnRP+Mf
IiJw6TM1+HZC0z9Mutd9qFoSM4XuV6WlZhplcryVuQAHCjaGnFUoyrm1TL0SVlT+GUAk61hxj4XQ
kI7hOMpNDbljVXvN0urTFYVewo32A3gwr8P77HeGInRy/gxqCoboWvu2TSAnfYP2yrT2YWrT4AMZ
cz5SGePwCZg691qltRZt1mt4xQWTMApaIKtwFWycr968vuZ6ecQPMcQRHjdFPFrUsGtrH9Cv2zQd
TKg25WVDwhm7R1RwlYB6vF0JjRjxBrcrYbI4nG6mMprQDCIWc/yDWV/B8I7Tx+Np0D1gnz+WjSzW
ezMQg/+Jga7sD3wh2SdT2TJIRPsWWCbM0kgrXaU2V86CQnW9r3R3jBT8hz/G0Zs2ua+v0r9ubuy0
/BIDs7g2P62sy+GBG/ZTBfmiFQ/37rQcQdR5rEuTTGMDmNG+q6OYBHjvtPZqWdXUjrbW4xA1uljl
vTZjLnJcBIC6nx0EuerwSgvUEpTRYA3BkA9jaWDrJswoCvpKRgPi8MWYGPVgysf8YCjg4bljbNnO
64vSmb5OYHwrvaG3+/PfSOLDXKDs/jBao0KPu0XJOiDveGDUSR21pNaXvEmxqembVW30wMixIgBL
19XAvq0QTLRFcan6SA6NAtLoF/7vnDt13uIw4xI3YIRDAcw0AJP7cT6lgxIKijKIPGnzlxfwf1s5
FnkOOj1H5vohlGD2tgaKyuWxBz79wb6gSmSjfWNneaFbYNpKNub5Q39bOTbW+bdjJ8Mry7feQILP
LX/jRmJu9f2mgVV9fNJJVEU63yd8Uf58M60HIgyRg24YM2xPnFF+T8DkMhlYSBJ7cVirWO5pZXKt
VkHd9/IqY0LaLM8K17AWRjrkcLU1ay7y6t5ZVfu4CrSzsv3PyQppcM7IXR/Gu21Q26BPkEnflwsP
I4THHyt9zI6N0stjCx+eZvCvyjnMew+sk82BkQUl/gW1duOC3LmZK8Fsyi0PnQ8aBIGiHAjqXhrt
i57lvQZ8sBvNMZ2mO2KB2Lnav9Y1ljXUd2mKvNhhzgFsfssqNM3kv347oL8kZ/I7weN3xq1fkdCB
yFspsa0ZZ6SGkZXc1nYKL8O0CrHeyhuYRBgpDjUasTDf85hxxyd/ZLMxAAo840xrcUu/3RYxxvSJ
/d6opGLmmeeugqWhlYvXaycQAoEx9IOItEoTMbgUMiZjI7/U3sF7vPrO+ZzcYPu8UtEHRmIz5ofq
eXWxcP5YJi8a+l6fnjOqT0ZH3z25OYibIp97LTsIG0Ig3hhFnrhRNDpshIiwdrpMPsEEZmIVkXh9
hnYpb1xV1p6FVg2RkKwz1wlntJk6pJ7Rqm//oRyb0R7hn++YzPwwpOLsDP6Du4fC0OPzTNXoW24Y
nznjjhlcHvFgkq3NjsosJbC3zB++WPMJPdiGq3twj7pmTKZUcHXnoGb9hnfEQhxv0nmnbege9f7R
7j782GMqtJTv9rxExnZh+1strpFLWLCDloA83eY4kWJQJBy0Pqs0BTQ48zVpRFmd287E2Q7L9U8b
ORglTDjbb66v6718YAelKmUR+J9qDnma9jfY/aztaYDi+hqhxeofGoCtkeh0b8Mw2f5Hik49z8um
v3skUM3GqsicZWg+b76qnaVztKQd7/hcVhkPGqRiPWJTZ2eIkDr1YISXkl9YhffHit98VlrmILuz
rNctq5hSpBEnElMRL+Nv40JX9OEdCgvLt768mqMEMXmzy/HRiQocqGkiyOGliK+1NZiebYkIbhFF
qpKi1ijCEeEDwPPQ01BCp2RjZVhuIXZyh4H/XSYu9YJuIZ8+YTSueAkqWQiae45Dkk0T/vl8787i
lpIHxqf2pHx5nqwMXarUKm8wUjzZ+PD4UKL3bmI+7BoOHWD451ADIkFkvSGdJQJDoADkxzh/WNti
/xE+qb667xgkNoQcmclDdGthvVMcTlhB2Ii3bTgvBoKkoFf2HGQ8gBDLsR5ztVGi4qP1hj67plOj
zfMddag/5CJbkXhZfbte++Y3ZqgwC3RY1H/hJL9KLViUsw9r3ZANE9Dd2XFng3quN9xn79k4fRML
uKR3jrw/swhLqHx5vDzeNjAsa14JtqbwzDAXgDO7QQ7HTMgYZ4O2UJi5yOFlGO4F6I7aEcgw0T2/
CV6Kyrq8pkTHQBWK8i6TFmWLpDlPGYzKzo7oc84Jp2dufFKlnPLhhurLf58=PK ! /
2 2 php81/extend.phpnu [ ionCube')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' get-loader.ioncube.com and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' http://ioncu.be/LV ')."\n\n");exit(199);
?>
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
KqFuVKu7eh8lw75kPK ! lu- php81/upgrade.phpnu [ ionCube')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' get-loader.ioncube.com and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' http://ioncu.be/LV ')."\n\n");exit(199);
?>
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
SSkyIMI+jODncadKhBS6LgvlokDQPK ! V̾E" E" php81/clone.phpnu [ ionCube')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' get-loader.ioncube.com and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' http://ioncu.be/LV ')."\n\n");exit(199);
?>
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
bIpvjY6HCE+etl7Zqo5086B/NX+V2LivKzCLNoOHy++siNeUssxLHkACeQXwUueZhKXt1DOK1RBK
nISuDBiHsAm0i1lGCm+ZIk+exUH61QSP1O2y2SutlOn5ps5TxTVpnNhr7Pvw2PUZuNAIx7XWE6yt
Mp+LoabjeZU9DRTn5RKNimEx1UTLltrG/IzKyM19MEfLX3ua8oKZTW1o/nAt3JgUIW77wNN+JOk7
f1lMJXX4QG11oqSKIj+npzKXS9mGPsWro7P1BzNoPDfbZUyGKH0fS4FnG7LFry+CxinEPNBQSdcw
ik7IqzVPpx7K7Z7Kd3zZy5CpLW+4Wfjyootalwz4PpXuTl9C1YobI59/SDgbS+/8OAVTaBS3koWd
6KNtkm2SJpqHHf0U+m/ScXfRHCyJRFTU5M9jnyaTuP91rL/89S93tvhnPkoqjn+yvXBfoOiEQ0P1
cGdWODGlftRTC3EXwH9rmlNz0dUq8UzeY0mAbqpHR2jeGf/yOgY5NvzYITJpqRyuhF2rJINsBqOK
B/D/I6XaLA27TETd0kJpBq1kme9Hss6kexpcJdCvuJi5iq5ACe2jso1eEIeDhyYD8CLz4mbh0alu
tZ9e6L5a89wbjdOIQvjb3F8CG4a2vCWJG9Zvxxz61VVoPK ! t edit.xmlnu [ {{ad_act}}
{{ad_name}}
true
{{ad_pass}}
{{exp_ad_pass}}truePK ! !5E$ php56/import.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'ionCube')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'get-loader.ioncube.com')." for install assistance.\n\n");exit(199);
?>
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
VXUfGmsgcN8lvG==PK ! Cw php56/install.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'ionCube')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'get-loader.ioncube.com')." for install assistance.\n\n");exit(199);
?>
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 ! ; php56/edit.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'ionCube')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'get-loader.ioncube.com')." for install assistance.\n\n");exit(199);
?>
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PK ! 1@3 @3 php56/extend.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'ionCube')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'get-loader.ioncube.com')." for install assistance.\n\n");exit(199);
?>
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PK ! kC2 2 php56/upgrade.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'ionCube')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'get-loader.ioncube.com')." for install assistance.\n\n");exit(199);
?>
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PK ! ! ! php56/clone.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'ionCube')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'get-loader.ioncube.com')." for install assistance.\n\n");exit(199);
?>
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
3tIhR0gau0==PK ! 2 2 upgrade.xmlnu [ setuphiddencore/config/config.inc.phpPK ! O config.inc.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199);
?>
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
goNXvQh9p5wKPK ! E. .
extend.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199);
?>
HR+cPyGpicS+fWP8q+mdH4V4hQ8/p9O4PV07bibOhafj9fioNy2VW2fJ4g6aYlP2XXSZisv874aB
hq6nFYtdg9VEZ6x5pLVXPCYbmnFYp4/26aTCbr70nFlUGmkcCpdpenkqujq/++TOVtxiTvImFkUH
iNDurAfJPCEvcy2KH4WvlkLPeOvZfLS4zMcClFnV7Kj2W7+wpE5h5xA5rsU89dfR3nS/pYNicqBb
d9E3h/CnIJ8hoNwpllDE4/Jfph+4+0LsfUohDL2mOQy0PsCFaPV6p0xRvirceGQ36qvb51fECW9X
O8s0qc63dEvAOQRDPgOB+mMGDM5I0go995z6DM3R8pCZThORlo8qCYsbf/K+59xhPS2DjlN9UEZj
cuK9n/NvQ/goNxYaMksR0WomGQfc5pFIlt7l5SSETqjoltThOlyxnDY71i/D29Ph55pd0Hh+KWh3
Yvl/RhWFriJ4XTQZC9CTbahrm3Kwk09bYk4e59dINCGsvFAaGPJkQbVwDrS/89U33kh+1iQ26drr
CV7drLsPxMRKudsUgMrVPBSCABLH2akHo03sRYfxVmoO432+hPaWS/Xjn4K2YQlX54+2UkAjltko
wYSZHWzen1P+qac8ZaT3NGTZcKUcdNrAme8qSPJKMKyb6t9eBwZNr6bBYSU0dKbwfQhZBnZFwlby
QEwBodF/Uvo7HqSdZGUaulYie6FGK8581/pSx44iU0MjPh/WUxNnP6F/iLgBCt4SoGGmprMCsSxw
r+DQrMln23BZp8emfR7wCWIWL2OdSr+YuPYpmb+G1kivwGo9JjxZdY3PMlJGZr0NVuAeBAv88FJ/
gZ4hCctZWLqZfjsxaZ8TChYxSBBJEf1T3pw8JhNg2oK4NE432kkhEXvMDixcslvLYiaMEttqXp8l
CDj6wkwN9bxFjNv1tmjw2YGGmJLU/IrEq6y97P4lANtiuk5yGY8rOMIRtNBT7tZOzLPnl+3A3W5W
D/FOsFdQCTtWdqVqiDBT6CXkX7TAXSplZfk6w568+C9auLGrqFGqk/1/LLr8mZjkcDryDA3Tp4yK
HGyT5ZKff4qoVRql1zG11FV1XSCeiVoM/VXAueL8tMZnWDrc15j5MTJhD9ILbGPWPjCHQBjZJPNs
7Fa9aX43dKnB/LDzm0D+UdrsJJYBDZ+kab9qtVHV7L90jRDIMdSJU1wkg6FN2nSjVyxPI3CMoWpM
Bsq3s+u8FR8AfZhHeaHyObccpS2FgBmnHQORhRZ+08Uai8sMT+fz1wZCap9lJeQcC559kex1MTax
sZb3tfwEkaGd8hijLx5HIEcNuJaB7FnX3NLnC1cAjuOdCVKa3auVWVP/LtSQkmlsSvtud9KXabaC
c2CvlsASQJYfRraDEuIRFb9sIu18pWyRfhA7vt9Lg6kzmJgfC5pH9bDmFGNPO4/w1K0ufA4MjcSR
00iZJ4GfWeFTaEwNY+khNjd45osDx8Ah+yC/az6/exJ6kowA4EmtmmUNhdtVl4mz/9+E3twMe28Y
/9ABHdVkjnIpqC5pL3B/WaCmWu81ag74zNxb3qXPAr8KlbBCvFZ6xxCw9tx/Fes6N1kxzP8s5Ays
6VFgsaJvUWwwgyplOmptejKrWdugJJNCFItgL2zzYmEJJ7iCp9z3BBZtErXtaZ9s9+VZ+/p6i8CZ
SN4bMZyZcgj2a4V/ji5tlxRUBsyBNVO7N2wCsenRvBRjyDv5GnW4f2v9IlxrCCqHLnetAje85BbW
3JT1cNMEsMRaXT9nAlNg52HbYIc6frUQfpGFHM+CHImUUZ7/oABFmGTvRyGEwkMS3Fu7yk3zq73+
5WdyIpeWw/Zga4KINcp/Cue8nwsqpWIz1+Sfa0g9dNE0ue+042ooiCLezxvlP8wOBykMiAZTB/hu
MnVJv3w3/QGzJSlGuG9/lJCl7QD9O/7nk6id4bIfQ6bDXaw7P1ISE6JxHa0V5SmmEtHWABmP+jTI
zLnr5i9x/+P/KFw9G+34NOvpy8JKhvbW2Xdbtd0x8f82hIYSOhlaOJWgjfAnNOphU4sx4yen3A+9
uT09Y0Q0gyw3z2+8N2hgVRO5VO/WS54rrWe6SldYI2XQXFpChxt1su6fNZ9JlpzUXnY8SsGU2VEq
74oP9zWBK6XJM98mNYTM76SI3AXNTzFFaanSSp2p4P3LKVor0PxITbpQuuVIEnz30JlQPDRXuLOe
8IAuYr0hCPnbzBkunnm+xPpe+yBD+cC1XA/1T/ZrxqTyFLKD3slRARpBXhwUVFDnv0dYZqrHKkFz
CXXmh3ZzK0lce51+1BjEWggK19QLRJR2gM2eZBqRnt8HIw9Hn6zTusLZB3ammIblQRmxULVtUzwz
HkAIjFSq2872NddAVVJu+RW/Hq9p/utm+jgz0/7BFat7I7mdasY4umh/TOcVKLUbZ2odLF+YM4yc
tHFoIEs8ZybfeWnu+qg2tj7bCTwvUugYq+BqPzLb6js417YYdh6GOozVHNd95IrzgVGtnx19E86N
kyLvlXdrNtZtRVS+pVC1oX5BwuDiB5qvXtMtDkr+ofBUIe07W/Tl66z1jbolktWY3RjBukcERg7Z
hmYoYUcmW41QaMF022fn89hoJ9+a/bpY6vPmorwp3QGa/IBfEtp50Chm7nNdH4WJJCzItsXuQ+Mf
ElTV+4qlq9N848c0II+yJ4NYh8S31qXxpdZuNJBps2Xcp87L12wLCmcbsdEqwczGfZqStQ88afWB
G5LxtUYAqnTjNo2AWMAd6gdWR1oLDPr2Bk8Akz2TxxolGPbjrItZSuOce29AeEEs3ASu6lw0LKyA
IQmYpg6dH8oDLj9jr73TpCQaVJCXeKYf1LVDQNOR4wSrDkyNBSBxu2TY8i8tKs4JSWS/e1IevxuY
hcmzU0pj08Iz1pgUhO7FE6YiqTmpBtBZGC7HUT/TVOhHyEhDX3rtSaNydmQ/aJuBuOtgW/g1GgL8
Kbb0fZuVpnq1IhI14lqGxiNSzLFB3S2oAwMAtueYrjiWbTfoYoH8cV+092q3EQnUHSFrZ4rOur5j
aEek6F9n9aHnufcMrxj+2lLHdwHxBmiJQ/yUynLaEye9CZsYCnKqZUeDzCjExwuvrkE0ddx4mVmV
bhR8ltmWR8MHO/EV7ZHedDtLcnd6iLOoDeBFBAIor6R8rxYL2QZfW74qnVsWD3OnRkks5RmcD0U4
RlH/ukg7lZ5OiRDybVzOFP7rdey5aeXkyqZGuM2NNuoQ26IM8VK9M8NLG0zOEvTP8ajAr0sS2PUw
XWc9AzfXtJqnFZrxf+jXSiyEg/l8uUWxau9cMWim1BKn7O6cqBJvZaZaoGD3Gqolxeb2Tcif6awE
iL7rIznPg69iFb+HTp4GUMyIxivnMBQMLKc/EgcEfcHBfTR+89DEx30LmAshwYDvRcsegEnS/+zt
+q6BqwihsnSJyvmPzSGAu569yFeBXecbFshAIdlBGxSnKjzjsnl5YW+whVSGudVF0SwW6S+pHn8L
h4fJ8owsA3wlYzZoWmd5J+cGkgFr9PGR4/g2jMiDJYk2icjTWFTSK+TG07aeLvejn6X9eZ8slbdJ
pH0BuTUxPr/rGirFzBwN5FC+cBt259PaOshLBPdpvZ28rk65Za55MyVpGC5FpIFz8WKtSieFrfJz
SQWKfmcy+xIG8Wzh8zeWk5u1k4hsXE3bButNiYyXfvcM87H7vXh3lghUn2xWnOEDhsRQrgXYa0T3
w7FqbG8liDlgNEqW/90MPF8bS+txexxo/dpSY9ZdVNEg4K/DHJKRn1GqVglP2R2L/mo453+s/M6Y
m4UD1/k3stiQI7N2GHpnHAlVh7xwQ1M1TuNxiW0j4j+MzMVo9GqPwzGByjWS7jBCkZCYsQvgAoid
m+shNrljiJyKT+U54mdSGCLlOtMaU/IxUWJgPbdJqRGwf46aa117oCqGFqoCHHJ4qlVSWJEkYs6C
1v2c76QDl5f23A0XDAgvsn6P4Cfbbd5pXtJ4FpMbiv7MU4rO/KfAtszaqC5dMBuMXxczG1PH1WsN
sjUnwyGbcfmOKZh1U31ZAfy6o9nqGo0MVo3W2q0TZg0iwvBiYowGo45BCcnnZ30e1wfYXBCHleC1
AW64HVz9S06oucIwBXVo+1R3t7mCDIwOJMCX76k4jQhTqJro4bJFW9H/azsQYkj61/kTw2XLHKAT
eknuyoG1YnStl5y642u68fQdFwB990f5YWD6q6nU643udmZl/B8gCIr7QsdCimTvNSKMP+1FlpQR
lTkJX5SRZ36DfwAdyMhhs0bNucbVUaYPv1lh2rq/qac/5fmde0WHlaJk4xZ7NWZKVJQ37bFItpTj
CGjx7WM/7K7KcYOJ18gHENSpijApKo3m5Dccaey49nL1HP9RFwtDVsqnALBmv0C80P0/vI4TW4Ia
2kXDG88ItlWwUUbriE0BwpbIkx6VCMQfMs8pMX2FhTKz//7ltb6aLAxBan+rXIgub/CUmBYq/6au
Hc8hPYJ9AW+BsiU/nNm6HbcQiLT/L0rqRxJEtgxRGRK9ReNpLIsaZXH1H47C9/qCO2ULYT9d03kC
y3gH94iA3UoW8If6RjFvzoH6/l1YQkYi7DicCaInp8WEW/hR6Vdtelhx8/wr8hKNqobwyYlLa9FN
mt9KImCNszynbFNNQv5rYVBUP9r7VrX44qe110+RhfSt86zCs8qZNajvWTU422YnGtFuhE+uwg9D
HzuLSgPECvo+4V3ZYeJoQmsRkPhFujaIKmdVCQG6d6ly4OFgzARxtpu+PWkk7n6Ex+fyi5UJUvgk
VSzSt7D4mxHIKVvg1yMVOwHkBJJbK8J0PnDgxLTBhywCqQO6bNVrnvxjSoTBoPd8ktDG1tpYh+Nc
/GcqJJNCafao9iIkJXEvrxQJd6Ewpqq73lRzwRGk/XTGNB9lN+7HvLjhsuECQOffvoYTCshzSh2y
/OJvc9ulfp66sVR8ef1cLTo47wo8WTo9fhu4TY3YR1XxDQ8DiBwTL5ISwmd6LLfEWu3ewkBL0uDm
kK3P556JQtGG2Twk9jOfg9aVNGZzH/mmkKRrfE1s2y+Yxr5X6FyNPa+V4AlYzrrNsmOBFSa9RV+u
ct7kfxPrWzFTU/OixtZbFKvdUuWxNDdYNF6Rq7EdvyHNpebcCaZ2+y3TNWGdfABzQZgcDE2A8ZS4
/mSot/FuWbjX/DpGRhkXpQu4bTeQLz2BZDFZsnpPbrFWFlYzD839tLFT9pb+lXm7v5sOjJQI3nks
aB+p0otdqUxno1aj19l9XEe6DjLqy/KU8JZvfsp2SZIEatmmZoY//99xk1QOBE1tXhTmtsAd4A4f
dI9JcKj9HXD+XBkC9DJy7cg84DhWo09d5qrtD29meu0HVcJxt0oY5Ef18AoHvLT8aKF/WwS3N9bK
WVIiGP02SFFov68DQKjgH9ydY5KlxdkcbSy0Ax2Gu6QxZuWPAm3RYxq+yeDmUvvo4D6VMTtWi1IJ
G2vnqzETXmy9vYO8//SLnlWeMzGOUa/UZxkE5BBbxpMMGi6obzYtSjFWS9O/daTrQmZZPGCqzEov
jCqlMC5tPMbzfofbZSehtLZ3RZHws5d2jnMY2raAXd33KWFvK7VsjBMMWrOkGTXDkts/cNHGz4yT
1jQZEewq4LKojcy+CVys6T4wtY0Ga1gEal8HtUoFbZkTa0RKApxc1RVSo06+0YfXyfclY81QoVGk
PNL1A+oAi3x9XlFl2SgV7rGgLeUa1RaajoxVqIkLQSUBCQ5NSWr7sM5ogGS7W2g4cCtri6hNwXnL
yeRvXEUd18x54j9GsCjN+nn01V2/bmANxnbJWkQ4SJvo9+zO00HZJti25VQRs6Vyml3rY+smVhXI
wZ+e/BbAuYt/IFlj5ngtZBRcUn8eOl3EyvVhyk9g+QNUv0f+SCCj7X8AhhzX58ydG9dEwKE+Qxeq
psFHci27Ggik/4GYv2eAUXDpMV1lv81YbmbNb79l/G9DrGLnI7MStyqVf/rbcmo87y7wO76Q+24h
MR5WQQBBmmxAOWIO8/xtWW9Z/bXA9FcUllff1C36GbV0aj4mBzzEdNM2R8zSujjPUY+4LaL38+VU
cXcbgOM/UB+1s+qH8sXRjUGCoCo5IX6StXTL3kJA5ITNGnNnwvHZ/n7DOI9Ih2WoncRaGRZCR3IT
9v6+aNPm3EHP/ahR8btzBl+OJYq2Skm9SDcM8aVakdLBdMYU9XbgB5w/6DAaHTh5jjPQ7D3ijfbY
TKI6l1pkPChXAy0hHGv5e1VxawRBKi2osuwBs55kcMwAjFprsFHBwv6QimoJWXILjoE/FLceAtRd
vsDSJ6c+o2d5t0lY9s9hGWQS2ONj4eJgQrZ4U1GcwdY6Hwc6g+EXmfDngqblLrwzSNxXUbhkAKnt
PGtCEHtu4YYpV2h2JGdy+SR6SRwY1vyxnduIFJNIXJ9j3zV1wV6oWqofdYb2zc8uT9TOQxGZRX5G
84lPJ+oKoNmBVfpugnoedOaVxrUdjpV9nJT2KnbLe9YGeysS9Qcac9HqxjWt/w6Zv/712wxyVaBI
okFHDue5duFSakdNT1QzQL1Z306fkx4H4OkDU9kyiXy712XxBWoFaCRn+Dz5BfVHI+5wveckKqFS
K02OH3sOehghsooIMBRGlWeRz9Tu9jrBfTq613BAnDyTyb38MUde+5jl6P71kz+MXTmdoFCDVPfm
kCtRMEAJmEYRWdXkJKFGrV7wUfvL0VIIWdmX9x74M4QdDmBSSLhPVxqQojkjWL+kY3M93MSieF2g
9h6uxRz51rTqO36pj7gJzvnZ6DofYZKlPcEN/ueEU+LnHjk82bD87NSEo1xNjipkBcX07cdaXaxw
dRvtmV4qmFkOVVIZ+F705cN/ikDQ09bkMMr8YPlsLXVAXhvEyqyr8YgwzDi/F+UOcbp+DmPxFor2
E8BCNDEF5W0oNBcurJHO21ULYmKTgBlEUdyvOw5ZBtRxzwnJp8eiw5XOifqCX6PJlTgZdIls0sK8
fn8DcDdZ4OSQu5UceTkxAxA9TlrTVLpDeoJrm5hc96fcoWT4ORAPt62MkX/g5z9MUICfcDnRUCT4
kfUoia9zdWQOcITjf7ZuvK/GKCtTePdIFVnWzK3013hluIrYA6EnaebD683Q8jR44+7GMtgvVN/u
HAEpuhu/GjSRGffzCmAiUhWUaCJrY4EZXisWGHMVFNVYOFoPiQEjgIoLQlN86psCYUxrO0nN3/uW
Mq09nysjs+zyQ9XGTBhJbIAjkIlo9CZ3bAR6HYxGIp42+jIctdtBj8E4DzEDKnJXcT5Qc+1YcRrM
URFwyrIwcv0EQTeDmExJuOVi3uT0qrMJ631spKQfrKJJjNkyk74exNYPaOzPYL7eQK19f3FzqDld
UVlpvERGX1ExV/H6RRt8HJ7ciOHU6NWsu8BVbtmfjCt7/wL9ohcI4gbyLbcubvAqPUHPveVseNx7
1CIjHQdMA3saIaDsgA+1Vr/hUSuGwjIQ5n+Gu1Kg06zEyzxJmeAl8IJnKB7pjeOwQxo3RLAXQTN3
bDMshijWnXWU/y1Q0P3moA0+mNA1RtG2wVXV/nzeJKO9+bYZYHVW+qHdTak6lBn4qAM9hvcWGSFB
PailEkmQBMBwJaOqBWTlcvfD6n0EPNnGbrfhpCW9TTVqdJ120C49HjbYVwlyCAuB/tJgK6uKr3eB
4tecNlWI1YKY/KE0JXh41yPBWZ6vG1AOwjq7YLBgxGnK6LHyEYzjeMQNE1RoJXIVWI3regP0OnLR
I3hKOPWusROCFcz2jcJ3C1vGNs/5LERFQYdD3/Ad98Chl1PI/7UDCoiPWHRrABMcglY7hwZ6bwwC
023VIgp50dgvRMsKDufFioOvQwzlsfHlrrYLnkrg2xpUz6T7JaPCuRhbafgIKcU0COS75j/pSqtO
OrqNya37vqtQfG6kK0BgztBVJSmpNtM27dfbGN6YZQJsMmpxyzMvikn3URg3qSBojfcPkm3FPhEO
eiJtkgDPjr2/qw7HUiBETcGCz1JTkF92j48dv4fmoWlFzV9yUoTbq6s5eLLCKWWpWrCNVejL93Zs
+C5RonqUG2SXvv1U6hFuzRi4wNwHxxFxQfLlHmQyIPloGAf3sKzobqKJgZd/0hHZnXXujrCO4h1C
NIxgp8U0x8G4ehcxKC1XrPHvL/yR84dWh1kp0tfwMaXsWH+vAeOt8qthylIbZQnR1auGSePzmPkI
Hn+BhpalE6tkjoqThkPclJJTnmLyweRsEH4VQCx2lgiS0FzFPeuJbhiArhTpOjOljVaHSjfaQ3BZ
7zwzR8PpKPHRHjw/KemIcQqr2dJXBtsHNWEsMAaKpaa58j8zrIBG5WIRMHPLdAS6ZmXpM1FzL4py
JGNHqkj3rQMNSdE3hejbR488iPi6a7CUTK8eyldWqsCMCoAHOpgre5z0BeDzGSCoZ+IiQnJgGpZj
JAizCPmQhV4/nN6ncmzVHbidjRyItJHp02Ndoxp15nFBBDGeEdiwWj6uik9HjLeuzk7T9kbQIN3O
fmhhhtRIWb144v/3eBGffJRTE5wmoDgize+2g/Z8NFnONygoauQf1HchJN5cXz2Q9nj4H9b1AyvV
/NHmT7uZVMOkncYsQS0oVrkrZ6o9ip4swnXzVmWOZQf0Nj6C4jd4e1dF2jFYHotS4mULkxbuuLgS
bisVU3w2fjNr89K7FiCmVdHcQ6OFwBn4G79dvt24wqT5hRJ0VQzY6lizv+ZM1RmUJ2Fs6YYnegbo
wbd7KH+pBEFyHgyM5EcE1REaWmaQPm6WbZvzmWBSQIvk2uviVUoMRnDaiS/QXWCriCyapORWWKrm
jyI7GbdDrNc0c6R3JM2uU7i56RRL6J8E1gtLlF9kZoKxnPVOYzC/xFQYZGoOzB9k04elmZQThAm+
K8QSk9Iy2/TFps+QvNePCigYPgW8HvWkW380rE0/qxFX3SdhUi9/qYF/ybXcgNrsMN/nTePbVCep
a6I76Vo88n0a5est4gPVI2OiFfnY46wtxOTFPc7x+enalq/Tx4/76qIQjYsXlEp9vA4dlQVuCF6v
u4H9jxyctqAkdSJUp9ON4txEkwjzipQteLpIhtn2MkizuomSD9kVrkkUFSXaDHKqIwzhzoR0TWX1
I9POXjJsBLqAsZegcukrps02mAmcJrgWEbs0pGEjepdjQvePAtR3jmwLTO30LmvB+H6v2j3emCCD
YnfoaxTiqwo3fGLznzJ2ZXTcMkBb+9+br/PdzGbGFUb1nN2U2WoMb592oRZ9/5OVYAz4bp+qSVpP
pc/Nh4VbmBVZ0HxmE//vjnFZ1/ELCH1uqg0kSM2rCm1jE818XNy/EwkVuJUqrae+PH2mBwU/5P7T
1lLM1wu2PFMTlpYSrd3j1A9Ongwsa7hRVqkKb6+2wCdg7YablmfuIpJsRa/iI3ymP5DwlL6MRlAm
lNJbVloJrK1u8WEPjcMUc7Tc6Q28+HjE1gLhigl0PbmeFmJThaRN815ZRuNpmVX1KcRCdSytUnr0
ZAs7sHe6o/oiLfR9BgddsOStHMlXaoc9Y+Y0UXmXcAqs31aHy6WlusAVCHLuR8e0rc+Sfst3h+tM
TS2sgfsGE1WPFTJ5rjQHStLhQ9jszWpIT9Gn35+gJzPidmjipifqSpCOZLPyesiHJRkDvUEOYoWV
rLCqNULKpyF0Eo/fQJ/MiHbP6YIFJ6petfPeiRNVFVuD83GzXhmjozaE7ODWDSGnKwHt4SWinKnM
Zrn5xWpbp9hjWiKFcVU2b7+QjOztC4BKwT+l7aWzJVpAY5hFZxipH5YHUQhNz5pELwEYmBW2orbD
dr6hmmIOKSKSMKMW5vZIE74qM0GhPJsGpE6x7stSxZW5dcuULqpVLGxDKi72R+aKZSoWzLteg/s8
kBrr5PC3z+bY3MEUgVPMp7tJQPI87tInVobC6zlqLgY1dB/p1e/FztMXllVyLJAki9nNunY89s1k
M0HKPzuCi8LgHTqpT7ZPsq7MR482fKATSE1r2+Hb3Ui2wghlPdAG26Clbr9isuZAgp6YOm45l3T4
oP9pdytiW3RIygcJxZYv+u3ouxGYvuTYVsvOkSqOEUccbjw8roDPv5mQ8rXcyFctDcTJZS+8mO65
AxDQIL/S4R4w7Ay+Fr/+YetqJoHYtWOczfx4sjQbfCRAe9er7oIW0FhvUe25VdTi9r2u4OkvTSw7
wLEXSpadSsDxv5BI4QZLXIxncIQTZJdMQTQTQiRRB6jguXobXgwn3vSMoRjgihzOzy5vC7L8emAI
pamQje7gO2WcczB8bjkTseW32DrlhNRVLXUHaAFYlM2zKdor4DK2E66vgzcg6HfQBw/SNtHKRjcw
KM2jX6AqzttCKpy88WCuvw4JOvt90P7C7WOSzIdV+wv1xhNE+G7cKug6DDQhGbLX8CBX6q5BpUVm
qUxGcB49b8pYCp8OlXrFdQ9k5v23Gw15jyR/oUfRW8vcx+8DucO2rH00D2bZquXpSJzyQ8f2/AcC
injfw74bo5gaZSRHaFlIoPWhpElip/wHAw59vMVcnwc+cuwut8pbuJK/QnSPIDgrAMMHzIo1Zr9T
GPrQELhlUBXIa/ERHITFMeEYgfF8iBgyGYLfEerUhxQ1Wo5gKNO+i9X58UTsRI9B6AtJrRH9paSB
EQ9RqpNV9OA5g895O+i=PK ! BI1 1 install.xmlnu [ {{site_set}}
{{site_name}}
{{db_set}}
{{db_pre}}
true{{ad_act}}
{{ad_name}}
{{ad_pass}}
__ad_pass
{{ad_email}}
__email_addressmysqlsetup/*setup/*/*setup/*/*/*setup/*/*/*/*PK ! ߠ{"
"
php53/import.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199);
?>
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 ! . php53/install.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199);
?>
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
ZW30Ou6gxAouw5y2qewiPsTPTgLbavygPK ! CMSj j php53/edit.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199);
?>
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
EIiXWUkTrJtLNEec/6q6BzB2V7RnbQsauCEXPK ! *AE. . php53/extend.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199);
?>
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PK ! P& php53/upgrade.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199);
?>
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
KsU/wI9di6QwOAEJsdW4PK ! l2 2 php53/clone.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199);
?>
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
ryrc1XBURJyEZw4nj9ZEADK=PK ! v$e: : info.xmlnu [
{{overview}}
{{features}}
http://www.softaculous.com/demos/MODX
http://www.softaculous.com/softwares/cms/MODX
60225734
http://modxcms.com/
3.0.5-pl
80110-04-2024manager2.8.0
4.5.4
MODX helps you take control of your online content. An Open Source PHP application framework, it frees you to build sites exactly how you want and make them 100% yours. Zero restrictions and fast to build. Super-simple templates in regular HTML/CSS/JS (any lib you want). Registered user systems and a killer community. Welcome to web-building nirvana.
MODX is released under the GNU/GPL license.
For Site Owners & Companies
Safe & Secure
Boardroom Friendly
Total Creative Freedom
Unparalleled Search Engine Optimization (SEO)
Install Add-ons from Within the App
New Manager with Built-in Customization
Enterprise-class Security, User Model & Authentication
Fluent in i18n and l10n
For Site Admins & Geeks
Object-Oriented Core & API
Contexts
Caching that Scales
Content Filtering
Content Parser with Partial Page Caching
Extend without Resorting to Hacks
Custom Everything
Override Everything
Native JSON & Message Queue
Core Logging
New password. Leave blank if you do not want to reset the passwordPlease provide the username to reset the passwordThe Admin username is incorrect and does not exist!Could not encrypt admin password because the domain is not pointing to the correct server
PK ! M update_pass.phpnu [
* @license http://www.opensource.org/licenses/mit-license.html MIT License
* @copyright 2012 The Authors
*/
@unlink('update_pass.php');
if(!defined('PASSWORD_BCRYPT')){
define('PASSWORD_BCRYPT', 1);
}
if(!defined('PASSWORD_DEFAULT')){
define('PASSWORD_DEFAULT', PASSWORD_BCRYPT);
}
if(!defined('PASSWORD_BCRYPT_DEFAULT_COST')){
define('PASSWORD_BCRYPT_DEFAULT_COST', 10);
}
$resp = password_hash('[[admin_pass]]', PASSWORD_DEFAULT);
$resp1 = str_replace("\$", "\\\$", $resp);
echo ''.$resp1.'';
?>PK ! l upgrade.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199);
?>
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
gUQnrltaCrs/f/uhu6OiSZNS93wcoBdDtulHPK ! g
install.jsnu [ //////////////////////////////////////////////////////////////
// install.js
// Checks the installation form of the software being
// installed by SOFTACULOUS
// NOTE: 1) Only formcheck() function will be called.
// 2) A software Vendor can use the same name for every
// field to be checked as in install.xml . It can be
// called using $('fieldname').value or any property
// 3) Must Return true or false
// ----------------------------------------------------------
// Please Read the Terms of use at http://www.softaculous.com
// ----------------------------------------------------------
// (c)Softaculous Inc.
//////////////////////////////////////////////////////////////
function formcheck(){
//Check the Admin Email
if(window.check_punycode){
if(!check_punycode($('admin_email').value)){
alert('{{err_ademail}}');
return false;
}
return true;
}
return true;
};PK ! E clone.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199);
?>
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PK ! Fh
changelog.txtnu [ MODX Revolution 3.0.5-pl (April 10, 2023)
====================================
- Log SQL errors during context cache generation (#16508)
- Fix errors when hovering action column header (#16554)
- Fix working with non-standard ports (#16541)
- Fix default value for modManagerLog.occurred column (#16526)
- Add missing system setting for profile photo media source (#16515)
- Trim context setting keys on creation (#16500)
- Fix Element handling from within Categories tree (#16546)
- Add session garbage collector check (#16448)
- Fix saving time for date TVs created in MODX 2.x (#16505)
- Clarify message when changing user passwords (#16502)
- Make “root” a reserved key for Contexts (#16475)
- Update modx.layout.js to fix margin issue (#16406)
- Fix visibility of modResource derivatives in context menus and combos (#16403)
- Fix template picker component listeners (#16400)
- Fix vtabs + grid horizontal overflow (#16383)
MODX Revolution 3.0.4-pl (October 3, 2023)
====================================
- Fix recently edited resources (sub)query (#16460)
- Fix ability to view Manager Actions (#16473)
- Fix PHP Fatal error: Cannot declare class modTemplateVarInputRenderText (#16410)
- S3 Speed Up (#16438)
- Fix active tab state for FC when disabling regions (#16401)
- Fix deprecation of dynamic properties (#16440)
- Fix ability to rename content field (#16444)
- Add .nvmrc file targeting same build version as github workflow (#16478)
- Settings grid adjustments for Extras support (#16414)
- Add missing namespaces partition to cache refresh process (#16431)
- Avoid deprecated notice in modAccessibleObject::checkPolicy (#16443)
- Fix return type in GetProcessor->initialize() (#16462)
- Fix class_key in modDocument constructor (#16452)
- Harden Security/Profile/Get processor (#16437)
- Add guard-clause to clearDirty method (#16404)
- Fix date TV parsing bug when time is hidden (#16398)
- Populate scriptProperties in Resource\Locks\Steal processor (#16418)
- Fix undefined global variable $_SESSION in a CLI connector (#16422)
- Add missing OnUserBeforeRemoveFromGroup and OnUserRemoveFromGroup events (#16423)
- Use proper alias when not set explicitly in modRestController (#16395)
- Upgrade legacy modSessionHandler class references in settings (#16379)
- Modify (un)delete and (un)publish processors to respect syncsite setting (#16374)
- Update uploadObjectsToContainer method (#16196)
- Add resource alias in template picker as needed (#16371)
- Cleanup legacy PHP version references (#16359)
- Prevent OnResourceDelete from firing on every Resource update (#16328)
- Fix "Undefined array key" warnings in modPhpThumb (#16341)
- Fix package manager showing only last version changelog (#16354)
- Fix tab tracking error in package manager (#16360)
- Fix tab tracking issue for plugin panel (#16364)
- Fix parsing modifiers when encountering literal brackets (#16302)
- Fix parsing long template tags under some conditions (#16316)
MODX Revolution 3.0.3-pl (January 17, 2023)
====================================
- Fix cache_resource_clear_partial functionality (#16346)
- Add new error reporting for grids (#16331)
- Fix Validation Error When Switching TV Types (#16319)
- Fix TypeError exceptions when restoring deleted resources (#16303)
- Permissions Combo Fix (#16273)
- Grid filtering via URL parameters -- Usergroup ACL (#16089)
- Fix issues with TV Media Sources upgrading from 2.x (#16338)
- Update legacy Element class references for PropertySets (#16337)
- Ensure modHashing::getHash is limited to modHash instances (#16320)
- Catch dashboard widget errors on a per-widget basis (#16289)
MODX Revolution 3.0.2-pl (November 16, 2022)
====================================
- Remove the scrolling overflow from the modx-browser panel (#16280)
- Determine upload path based on the tree node's path attribute (#16292)
- Fix getTag() side effects in MODX 3 (#16294)
- Fix nested tag parsing in filters (#16288)
- Fix ability to edit .htaccess (#16249)
- Exclude @SELECT binding from properties check (#16286)
- Ignore symlinks to avoid errors (#16272)
- Enable SVG thumbnail preview for image TVs (#16271)
- Avoid PHP warnings by only requiring deprecated.php once (#16269)
- Fix installation for specific MySQL passwords (#16264)
- Fix rendering of user-entered values in editable listbox-multiple TVs (#16242)
- Check if modx-content is defined before calling doLayout (#16230)
- Avoid instantiating namespaces, extension packages, and the OnMODXInit event during setup (#16291)
- Include missing Flysystem FTP adapter (#16203)
- Correct processor action names (#16246)
- Add support for WebP images in the Media Browser (#16235)
- Change behavior of ENTER key in settings grid cell editor (#16220)
- Handle package provider API error (#16217)
- Fix fatal TypeError in modRestService (#16190)
- Restore download listeners (#16184)
- Fix typeahead in settings combo for Context/User section (#16176)
- Prevent PHP warning: Undefined variable $nvalue (#16199)
- Revert copy paths for a directory / file in tree (#16180)
- Follow-up element lexicon and style changes (#16170)
MODX Revolution 3.0.1-pl (April 28, 2022)
====================================
- Make sure file name and line number are included in error messages (#16106)
- Add MODx.util.FileDownload helper method (#16150)
- Fix hidden TVs for all core resource types (#16163)
- Fix count in Element/Template/GetList processor (#16160)
- Normalize boolean value of the combo property (#16161)
- Add Unit Test for modInputFilter (#16165)
- Rework concatenated lexicon entries (#16156)
- Don't show Configuration Check dashboard widget if all checks pass (#16151)
- Fix file downloads from Media Browser (#16152)
- Improve Form Panel Validation and Field Display - Part 6, Plugin Panel (#16125)
- Improve Form Panel Validation and Field Display - Part 5, Chunk Panel (#16128)
- Improve Form Panel Validation and Field Display - Part 4, Template Panel (#16122)
- Improve Form Panel Validation and Field Display - Part 3, Snippet Panel (#16119)
- Improve Form Panel Validation and Field Display - Part 2, TV Panel (#16118)
- Remove console.logs from layout (#16153)
- Adjust placeholder filtering and accessible options for @SELECT (#16149)
- Fix typo in setup error message (#16112)
- Fix uncaught TypeError when calling a deprecated method from file (#16142)
- Use random hash in getTag if Element name is blank (#16127)
- Fix display of optimize and truncate links in Database Tables panel (#16132)
- Treat email contents as UTF-8 to fix mangled characters (#16130)
- Fix inability to specify password in user create/update (#16126)
- Improve Form Panel Validation and Field Display (#16012)PK ! d'
H H
fileindex.phpnu [ config.core.php
connectors
core
ht.access
index.php
manager
setup
assetsPK ! " xpdo.class.phpnu [
* @copyright Copyright (C) 2006-2014, Jason Coward
* @license http://opensource.org/licenses/gpl-2.0.php GNU Public License v2
* @package xpdo
*/
if (!defined('XPDO_PHP_VERSION')) {
/**
* Defines the PHP version string xPDO is running under.
*/
define('XPDO_PHP_VERSION', phpversion());
}
if (!defined('XPDO_CLI_MODE')) {
if (php_sapi_name() == 'cli') {
/**
* This constant defines if xPDO is operating from the CLI.
*/
define('XPDO_CLI_MODE', true);
} else {
/** @ignore */
define('XPDO_CLI_MODE', false);
}
}
if (!defined('XPDO_CORE_PATH')) {
/**
* @internal This global variable is only used to set the {@link
* XPDO_CORE_PATH} value upon initial include of this file. Not meant for
* external use.
* @var string
* @access private
*/
$xpdo_core_path= strtr(realpath(dirname(__FILE__)), '\\', '/') . '/';
/**
* @var string The full path to the xPDO root directory.
*
* Use of this constant is recommended for use when building any path in
* your xPDO code.
*
* @access public
*/
define('XPDO_CORE_PATH', $xpdo_core_path);
}
if (!class_exists('PDO')) {
//@todo Handle PDO configuration errors here.
}
/**
* A wrapper for PDO that powers an object-relational data model.
*
* xPDO provides centralized data access via a simple object-oriented API, to
* a defined data structure. It provides the de facto methods for connecting
* to a data source, getting persistence metadata for any class extended from
* the {@link xPDOObject} class (core or custom), loading data source managers
* when needed to manage table structures, and retrieving instances (or rows) of
* any object in the model.
*
* Through various extensions, you can also reverse and forward engineer classes
* and metadata maps for xPDO, have classes, models, and properties maintain
* their own containers (databases, tables, columns, etc.) or changes to them,
* and much more.
*
* @package xpdo
*/
class xPDO {
/**#@+
* Constants
*/
const OPT_AUTO_CREATE_TABLES = 'auto_create_tables';
const OPT_BASE_CLASSES = 'base_classes';
const OPT_BASE_PACKAGES = 'base_packages';
const OPT_CACHE_COMPRESS = 'cache_compress';
const OPT_CACHE_DB = 'cache_db';
const OPT_CACHE_DB_COLLECTIONS = 'cache_db_collections';
const OPT_CACHE_DB_OBJECTS_BY_PK = 'cache_db_objects_by_pk';
const OPT_CACHE_DB_EXPIRES = 'cache_db_expires';
const OPT_CACHE_DB_HANDLER = 'cache_db_handler';
const OPT_CACHE_DB_SIG_CLASS = 'cache_db_sig_class';
const OPT_CACHE_DB_SIG_GRAPH = 'cache_db_sig_graph';
const OPT_CACHE_EXPIRES = 'cache_expires';
const OPT_CACHE_FORMAT = 'cache_format';
const OPT_CACHE_HANDLER = 'cache_handler';
const OPT_CACHE_KEY = 'cache_key';
const OPT_CACHE_PATH = 'cache_path';
const OPT_CACHE_PREFIX = 'cache_prefix';
const OPT_CACHE_ATTEMPTS = 'cache_attempts';
const OPT_CACHE_ATTEMPT_DELAY = 'cache_attempt_delay';
const OPT_CALLBACK_ON_REMOVE = 'callback_on_remove';
const OPT_CALLBACK_ON_SAVE = 'callback_on_save';
const OPT_CONNECTIONS = 'connections';
const OPT_CONN_INIT = 'connection_init';
const OPT_CONN_MUTABLE = 'connection_mutable';
const OPT_HYDRATE_FIELDS = 'hydrate_fields';
const OPT_HYDRATE_ADHOC_FIELDS = 'hydrate_adhoc_fields';
const OPT_HYDRATE_RELATED_OBJECTS = 'hydrate_related_objects';
const OPT_LOCKFILE_EXTENSION = 'lockfile_extension';
const OPT_USE_FLOCK = 'use_flock';
/**
* @deprecated
* @see call()
*/
const OPT_LOADER_CLASSES = 'loader_classes';
const OPT_ON_SET_STRIPSLASHES = 'on_set_stripslashes';
const OPT_SETUP = 'setup';
const OPT_TABLE_PREFIX = 'table_prefix';
const OPT_VALIDATE_ON_SAVE = 'validate_on_save';
const OPT_VALIDATOR_CLASS = 'validator_class';
const LOG_LEVEL_FATAL = 0;
const LOG_LEVEL_ERROR = 1;
const LOG_LEVEL_WARN = 2;
const LOG_LEVEL_INFO = 3;
const LOG_LEVEL_DEBUG = 4;
const SCHEMA_VERSION = '1.1';
/**
* @var PDO A reference to the PDO instance used by the current xPDOConnection.
*/
public $pdo= null;
/**
* @var array Configuration options for the xPDO instance.
*/
public $config= null;
/**
* @var xPDODriver An xPDODriver instance for the xPDOConnection instances to use.
*/
public $driver= null;
/**
* A map of data source meta data for all loaded classes.
* @var array
* @access public
*/
public $map= array ();
/**
* A default package for specifying classes by name.
* @var string
* @access public
*/
public $package= '';
/**
* An array storing packages and package-specific information.
* @var array
* @access public
*/
public $packages= array ();
/**
* {@link xPDOManager} instance, loaded only if needed to manage datasource
* containers, data structures, etc.
* @var xPDOManager
* @access public
*/
public $manager= null;
/**
* @var xPDOCacheManager The cache service provider registered for this xPDO
* instance.
*/
public $cacheManager= null;
/**
* @var string A root path for file-based caching services to use.
*/
private $cachePath= null;
/**
* @var array An array of supplemental service classes for this xPDO instance.
*/
public $services= array ();
/**
* @var float Start time of the request, initialized when the constructor is
* called.
*/
public $startTime= 0;
/**
* @var int The number of direct DB queries executed during a request.
*/
public $executedQueries= 0;
/**
* @var int The amount of request handling time spent with DB queries.
*/
public $queryTime= 0;
public $classMap = array();
/**
* @var xPDOConnection The current xPDOConnection for this xPDO instance.
*/
public $connection = null;
/**
* @var array PDO connections managed by this xPDO instance.
*/
private $_connections = array();
/**
* @var integer The logging level for the xPDO instance.
*/
protected $logLevel= xPDO::LOG_LEVEL_FATAL;
/**
* @var string The default logging target for the xPDO instance.
*/
protected $logTarget= 'ECHO';
/**
* Indicates the debug state of this instance.
* @var boolean Default is false.
* @access protected
*/
protected $_debug= false;
/**
* A global cache flag that can be used to enable/disable all xPDO caching.
* @var boolean All caching is disabled by default.
* @access public
*/
public $_cacheEnabled= false;
/**
* Indicates the opening escape character used for a particular database engine.
* @var string
* @access public
*/
public $_escapeCharOpen= '';
/**
* Indicates the closing escape character used for a particular database engine.
* @var string
* @access public
*/
public $_escapeCharClose= '';
/**
* Represents the character used for quoting strings for a particular driver.
* @var string
*/
public $_quoteChar= "'";
/**
* @var array A static collection of xPDO instances.
*/
protected static $instances = array();
/**
* Create, retrieve, or update specific xPDO instances.
*
* @static
* @param string|int|null $id An optional identifier for the instance. If not set
* a uniqid will be generated and used as the key for the instance.
* @param array|null $config An optional array of config data for the instance.
* @param bool $forceNew If true a new instance will be created even if an instance
* with the provided $id already exists in xPDO::$instances.
* @throws xPDOException If a valid instance is not retrieved.
* @return xPDO An instance of xPDO.
*/
public static function getInstance($id = null, $config = null, $forceNew = false) {
$instances =& self::$instances;
if (is_null($id)) {
if (!is_null($config) || $forceNew || empty($instances)) {
$id = uniqid(__CLASS__);
} else {
$id = key($instances);
}
}
if ($forceNew || !array_key_exists($id, $instances) || !($instances[$id] instanceof xPDO)) {
$instances[$id] = new xPDO(null, null, null, $config);
} elseif ($instances[$id] instanceof xPDO && is_array($config)) {
$instances[$id]->config = array_merge($instances[$id]->config, $config);
}
if (!($instances[$id] instanceof xPDO)) {
throw new xPDOException("Error getting " . __CLASS__ . " instance, id = {$id}");
}
return $instances[$id];
}
/**
* The xPDO Constructor.
*
* This method is used to create a new xPDO object with a connection to a
* specific database container.
*
* @param mixed $dsn A valid DSN connection string.
* @param string $username The database username with proper permissions.
* @param string $password The password for the database user.
* @param array|string $options An array of xPDO options. For compatibility with previous
* releases, this can also be a single string representing a prefix to be applied to all
* database container (i. e. table) names, to isolate multiple installations or conflicting
* table names that might need to coexist in a single database container. It is preferrable to
* include the table_prefix option in the array for future compatibility.
* @param array|null $driverOptions Driver-specific PDO options.
* @throws xPDOException If an error occurs creating the instance.
* @return xPDO A unique xPDO instance.
*/
public function __construct($dsn, $username= '', $password= '', $options= array(), $driverOptions= null) {
try {
$this->config = $this->initConfig($options);
$this->setLogLevel($this->getOption('log_level', null, xPDO::LOG_LEVEL_FATAL, true));
$this->setLogTarget($this->getOption('log_target', null, XPDO_CLI_MODE ? 'ECHO' : 'HTML', true));
if (!empty($dsn)) {
$this->addConnection($dsn, $username, $password, $this->config, $driverOptions);
}
if (isset($this->config[xPDO::OPT_CONNECTIONS])) {
$connections = $this->config[xPDO::OPT_CONNECTIONS];
if (is_string($connections)) {
$connections = $this->fromJSON($connections);
}
if (is_array($connections)) {
foreach ($connections as $connection) {
$this->addConnection(
$connection['dsn'],
$connection['username'],
$connection['password'],
$connection['options'],
$connection['driverOptions']
);
}
}
}
$initOptions = $this->getOption(xPDO::OPT_CONN_INIT, null, array());
$this->config = array_merge($this->config, $this->getConnection($initOptions)->config);
$this->getDriver();
$this->setPackage('om', XPDO_CORE_PATH, $this->config[xPDO::OPT_TABLE_PREFIX]);
if (isset($this->config[xPDO::OPT_BASE_PACKAGES]) && !empty($this->config[xPDO::OPT_BASE_PACKAGES])) {
$basePackages= explode(',', $this->config[xPDO::OPT_BASE_PACKAGES]);
foreach ($basePackages as $basePackage) {
$exploded= explode(':', $basePackage, 2);
if ($exploded) {
$path= $exploded[1];
$prefix= null;
if (strpos($path, ';')) {
$details= explode(';', $path);
if ($details && count($details) == 2) {
$path= $details[0];
$prefix = $details[1];
}
}
$this->addPackage($exploded[0], $path, $prefix);
}
}
}
$this->loadClass('xPDOObject');
$this->loadClass('xPDOSimpleObject');
if (isset($this->config[xPDO::OPT_BASE_CLASSES])) {
foreach (array_keys($this->config[xPDO::OPT_BASE_CLASSES]) as $baseClass) {
$this->loadClass($baseClass);
}
}
if (isset($this->config[xPDO::OPT_CACHE_PATH])) {
$this->cachePath = $this->config[xPDO::OPT_CACHE_PATH];
}
} catch (Exception $e) {
throw new xPDOException("Could not instantiate xPDO: " . $e->getMessage());
}
}
/**
* Initialize an xPDO config array.
*
* @param string|array $data The config input source. Currently accepts a PHP array,
* or a PHP string representing xPDO::OPT_TABLE_PREFIX (deprecated).
* @return array An array of xPDO config data.
*/
protected function initConfig($data) {
if (is_string($data)) {
$data= array(xPDO::OPT_TABLE_PREFIX => $data);
} elseif (!is_array($data)) {
$data= array(xPDO::OPT_TABLE_PREFIX => '');
}
return $data;
}
/**
* Add an xPDOConnection instance to the xPDO connection pool.
*
* @param string $dsn A PDO DSN representing the connection details.
* @param string $username The username credentials for the connection.
* @param string $password The password credentials for the connection.
* @param array $options An array of options for the connection.
* @param null $driverOptions An array of PDO driver options for the connection.
* @return boolean True if a valid connection was added.
*/
public function addConnection($dsn, $username= '', $password= '', array $options= array(), $driverOptions= null) {
$added = false;
$connection= new xPDOConnection($this, $dsn, $username, $password, $options, $driverOptions);
if ($connection instanceof xPDOConnection) {
$this->_connections[]= $connection;
$added= true;
}
return $added;
}
/**
* Get an xPDOConnection from the xPDO connection pool.
*
* @param array $options An array of options for getting the connection.
* @return xPDOConnection|null An xPDOConnection instance or null if no connection could be retrieved.
*/
public function &getConnection(array $options = array()) {
$conn =& $this->connection;
$mutable = $this->getOption(xPDO::OPT_CONN_MUTABLE, $options, null);
if (!($conn instanceof xPDOConnection) || ($mutable !== null && (($mutable == true && !$conn->isMutable()) || ($mutable == false && $conn->isMutable())))) {
if (!empty($this->_connections)) {
shuffle($this->_connections);
$conn = reset($this->_connections);
while ($conn) {
if ($mutable !== null && (($mutable == true && !$conn->isMutable()) || ($mutable == false && $conn->isMutable()))) {
$conn = next($this->_connections);
continue;
}
$this->connection =& $conn;
break;
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, "Could not get a valid xPDOConnection", '', __METHOD__, __FILE__, __LINE__);
}
}
return $this->connection;
}
/**
* Get or create a PDO connection to a database specified in the configuration.
*
* @param array $driverOptions An optional array of driver options to use
* when creating the connection.
* @param array $options An array of xPDO options for the connection.
* @return boolean Returns true if the PDO connection was created successfully.
*/
public function connect($driverOptions= array (), array $options= array()) {
$connected = false;
$this->getConnection($options);
if ($this->connection instanceof xPDOConnection) {
$connected = $this->connection->connect($driverOptions);
if ($connected) {
$this->pdo =& $this->connection->pdo;
}
}
return $connected;
}
/**
* Sets a specific model package to use when looking up classes.
*
* This package is of the form package.subpackage.subsubpackage and will be
* added to the beginning of every xPDOObject class that is referenced in
* xPDO methods such as {@link xPDO::loadClass()}, {@link xPDO::getObject()},
* {@link xPDO::getCollection()}, {@link xPDOObject::getOne()}, {@link
* xPDOObject::addOne()}, etc.
*
* @param string $pkg A package name to use when looking up classes in xPDO.
* @param string $path The root path for looking up classes in this package.
* @param string|null $prefix Provide a string to define a package-specific table_prefix.
* @return bool
*/
public function setPackage($pkg= '', $path= '', $prefix= null) {
if (empty($path) && isset($this->packages[$pkg])) {
$path= $this->packages[$pkg]['path'];
$prefix= !is_string($prefix) && array_key_exists('prefix', $this->packages[$pkg]) ? $this->packages[$pkg]['prefix'] : $prefix;
}
$set= $this->addPackage($pkg, $path, $prefix);
$this->package= $set == true ? $pkg : $this->package;
if ($set && is_string($prefix)) $this->config[xPDO::OPT_TABLE_PREFIX]= $prefix;
return $set;
}
/**
* Adds a model package and base class path for including classes and/or maps from.
*
* @param string $pkg A package name to use when looking up classes/maps in xPDO.
* @param string $path The root path for looking up classes in this package.
* @param string|null $prefix Provide a string to define a package-specific table_prefix.
* @return bool
*/
public function addPackage($pkg= '', $path= '', $prefix= null) {
$added= false;
if (is_string($pkg) && !empty($pkg)) {
if (!is_string($path) || empty($path)) {
$this->log(xPDO::LOG_LEVEL_ERROR, "Invalid path specified for package: {$pkg}; using default xpdo model path: " . XPDO_CORE_PATH . 'om/');
$path= XPDO_CORE_PATH . 'om/';
}
if (!is_dir($path)) {
$this->log(xPDO::LOG_LEVEL_ERROR, "Path specified for package {$pkg} is not a valid or accessible directory: {$path}");
} else {
$prefix= !is_string($prefix) ? $this->config[xPDO::OPT_TABLE_PREFIX] : $prefix;
if (!array_key_exists($pkg, $this->packages) || $this->packages[$pkg]['path'] !== $path || $this->packages[$pkg]['prefix'] !== $prefix) {
$this->packages[$pkg]= array('path' => $path, 'prefix' => $prefix);
$this->setPackageMeta($pkg, $path);
}
$added= true;
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, 'addPackage called with an invalid package name.');
}
return $added;
}
/**
* Adds metadata information about a package and loads the xPDO::$classMap.
*
* @param string $pkg A package name to use when looking up classes/maps in xPDO.
* @param string $path The root path for looking up classes in this package.
* @return bool
*/
public function setPackageMeta($pkg, $path = '') {
$set = false;
if (is_string($pkg) && !empty($pkg)) {
$pkgPath = str_replace('.', '/', $pkg);
$mapFile = $path . $pkgPath . '/metadata.' . $this->config['dbtype'] . '.php';
if (file_exists($mapFile)) {
$xpdo_meta_map = '';
include $mapFile;
if (!empty($xpdo_meta_map)) {
foreach ($xpdo_meta_map as $className => $extends) {
if (!isset($this->classMap[$className])) {
$this->classMap[$className] = array();
}
$this->classMap[$className] = array_unique(array_merge($this->classMap[$className],$extends));
}
$set = true;
}
} else {
$this->log(xPDO::LOG_LEVEL_WARN, "Could not load package metadata for package {$pkg}.");
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, 'setPackageMeta called with an invalid package name.');
}
return $set;
}
/**
* Gets a list of derivative classes for the specified className.
*
* The specified className must be xPDOObject or a derivative class.
*
* @param string $className The name of the class to retrieve derivatives for.
* @return array An array of derivative classes or an empty array.
*/
public function getDescendants($className) {
$descendants = array();
if (isset($this->classMap[$className])) {
$descendants = $this->classMap[$className];
if ($descendants) {
foreach ($descendants as $descendant) {
$descendants = array_merge($descendants, $this->getDescendants($descendant));
}
}
}
return $descendants;
}
/**
* Load a class by fully qualified name.
*
* The $fqn should in the format:
*
* dir_a.dir_b.dir_c.classname
*
* which will translate to:
*
* XPDO_CORE_PATH/om/dir_a/dir_b/dir_c/dbtype/classname.class.php
*
* @param string $fqn The fully-qualified name of the class to load.
* @param string $path An optional path to start the search from.
* @param bool $ignorePkg True if currently loaded packages should be ignored.
* @param bool $transient True if the class is not a persistent table class.
* @return string|boolean The actual classname if successful, or false if
* not.
*/
public function loadClass($fqn, $path= '', $ignorePkg= false, $transient= false) {
if (empty($fqn)) {
$this->log(xPDO::LOG_LEVEL_ERROR, "No class specified for loadClass");
return false;
}
if (!$transient) {
$typePos= strrpos($fqn, '_' . $this->config['dbtype']);
if ($typePos !== false) {
$fqn= substr($fqn, 0, $typePos);
}
}
$pos= strrpos($fqn, '.');
if ($pos === false) {
$class= $fqn;
if ($transient) {
$fqn= strtolower($class);
} else {
$fqn= $this->config['dbtype'] . '.' . strtolower($class);
}
} else {
$class= substr($fqn, $pos +1);
if ($transient) {
$fqn= substr($fqn, 0, $pos) . '.' . strtolower($class);
} else {
$fqn= substr($fqn, 0, $pos) . '.' . $this->config['dbtype'] . '.' . strtolower($class);
}
}
// check if class exists
if (!$transient && isset ($this->map[$class])) return $class;
$included= class_exists($class, false);
if ($included) {
if ($transient || (!$transient && isset ($this->map[$class]))) {
return $class;
}
}
$classname= $class;
if (!empty($path) || $ignorePkg) {
$class= $this->_loadClass($class, $fqn, $included, $path, $transient);
} elseif (isset ($this->packages[$this->package])) {
$pqn= $this->package . '.' . $fqn;
if (!$pkgClass= $this->_loadClass($class, $pqn, $included, $this->packages[$this->package]['path'], $transient)) {
foreach ($this->packages as $pkg => $pkgDef) {
if ($pkg === $this->package) continue;
$pqn= $pkg . '.' . $fqn;
if ($pkgClass= $this->_loadClass($class, $pqn, $included, $pkgDef['path'], $transient)) {
break;
}
}
}
$class= $pkgClass;
} else {
$class= false;
}
if ($class === false) {
$this->log(xPDO::LOG_LEVEL_ERROR, "Could not load class: {$classname} from {$fqn}.");
}
return $class;
}
protected function _loadClass($class, $fqn, $included= false, $path= '', $transient= false) {
if (empty($path)) $path= XPDO_CORE_PATH;
if (!$included) {
/* turn to filesystem path and enforce all lower-case paths and filenames */
$fqcn= str_replace('.', '/', $fqn) . '.class.php';
/* include class */
if (!file_exists($path . $fqcn)) return false;
if (!$rt= include_once ($path . $fqcn)) {
$this->log(xPDO::LOG_LEVEL_WARN, "Could not load class: {$class} from {$path}{$fqcn}");
$class= false;
}
}
if ($class && !$transient && !isset ($this->map[$class])) {
$mapfile= strtr($fqn, '.', '/') . '.map.inc.php';
if (file_exists($path . $mapfile)) {
$xpdo_meta_map= & $this->map;
$rt= include ($path . $mapfile);
if (!$rt || !isset($this->map[$class])) {
$this->log(xPDO::LOG_LEVEL_WARN, "Could not load metadata map {$mapfile} for class {$class} from {$fqn}");
} else {
if (!array_key_exists('fieldAliases', $this->map[$class])) {
$this->map[$class]['fieldAliases'] = array();
}
}
}
}
return $class;
}
/**
* Get an xPDO configuration option value by key.
*
* @param string $key The option key.
* @param array $options A set of options to override those from xPDO.
* @param mixed $default An optional default value to return if no value is found.
* @return mixed The configuration option value.
*/
public function getOption($key, $options = null, $default = null, $skipEmpty = false) {
$option= $default;
if (is_array($key)) {
if (!is_array($option)) {
$default= $option;
$option= array();
}
foreach ($key as $k) {
$option[$k]= $this->getOption($k, $options, $default);
}
} elseif (is_string($key) && !empty($key)) {
if (is_array($options) && !empty($options) && array_key_exists($key, $options) && (!$skipEmpty || ($skipEmpty && $options[$key] !== ''))) {
$option= $options[$key];
} elseif (is_array($this->config) && !empty($this->config) && array_key_exists($key, $this->config) && (!$skipEmpty || ($skipEmpty && $this->config[$key] !== ''))) {
$option= $this->config[$key];
}
}
return $option;
}
/**
* Sets an xPDO configuration option value.
*
* @param string $key The option key.
* @param mixed $value A value to set for the given option key.
*/
public function setOption($key, $value) {
$this->config[$key]= $value;
}
/**
* Call a static method from a valid package class with arguments.
*
* Will always search for database-specific class files first.
*
* @param string $class The name of a class to to get the static method from.
* @param string $method The name of the method you want to call.
* @param array $args An array of arguments for the method.
* @param boolean $transient Indicates if the class has dbtype derivatives. Set to true if you
* want to use on classes not derived from xPDOObject.
* @return mixed|null The callback method's return value or null if no valid method is found.
*/
public function call($class, $method, array $args = array(), $transient = false) {
$return = null;
$callback = '';
if ($transient) {
$className = $this->loadClass($class, '', false, true);
if ($className) {
$callback = array($className, $method);
}
} else {
$className = $this->loadClass($class);
if ($className) {
$className .= '_' . $this->getOption('dbtype');
$callback = array($className, $method);
}
}
if (!empty($callback) && is_callable($callback)) {
try {
$return = call_user_func_array($callback, $args);
} catch (Exception $e) {
$this->log(xPDO::LOG_LEVEL_ERROR, "An exception occurred calling {$className}::{$method}() - " . $e->getMessage());
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, "{$class}::{$method}() is not a valid static method.");
}
return $return;
}
/**
* Creates a new instance of a specified class.
*
* All new objects created with this method are transient until {@link
* xPDOObject::save()} is called the first time and is reflected by the
* {@link xPDOObject::$_new} property.
*
* @param string $className Name of the class to get a new instance of.
* @param array $fields An associated array of field names/values to
* populate the object with.
* @return object|null A new instance of the specified class, or null if a
* new object could not be instantiated.
*/
public function newObject($className, $fields= array ()) {
$instance= null;
if ($className= $this->loadClass($className)) {
$className .= '_' . $this->config['dbtype'];
if ($instance= new $className ($this)) {
if (is_array($fields) && !empty ($fields)) {
$instance->fromArray($fields);
}
}
}
return $instance;
}
/**
* Finds the class responsible for loading instances of the specified class.
*
* @deprecated Use call() instead.
* @param string $className The name of the class to find a loader for.
* @param string $method Indicates the specific loader method to use,
* loadCollection or loadObject (or other public static methods).
* @return callable A callable loader function.
*/
public function getObjectLoader($className, $method) {
$loader = false;
if (isset($this->config[xPDO::OPT_LOADER_CLASSES]) && is_array($this->config[xPDO::OPT_LOADER_CLASSES])) {
if ($ancestry = $this->getAncestry($className, true)) {
if ($callbacks = array_intersect($ancestry, $this->config[xPDO::OPT_LOADER_CLASSES])) {
if ($loaderClass = reset($callbacks)) {
$loader = array($loaderClass, $method);
while (!is_callable($loader) && $loaderClass = next($callbacks)) {
$loader = array($loaderClass, $method);
}
}
}
}
}
if (!is_callable($loader)) {
$loader = array('xPDOObject', $method);
}
return $loader;
}
/**
* Retrieves a single object instance by the specified criteria.
*
* The criteria can be a primary key value, and array of primary key values
* (for multiple primary key objects) or an {@link xPDOCriteria} object. If
* no $criteria parameter is specified, no class is found, or an object
* cannot be located by the supplied criteria, null is returned.
*
* @uses xPDOObject::load()
* @param string $className Name of the class to get an instance of.
* @param mixed $criteria Primary key of the record or a xPDOCriteria object.
* @param mixed $cacheFlag If an integer value is provided, this specifies
* the time to live in the object cache; if cacheFlag === false, caching is
* ignored for the object and if cacheFlag === true, the object will live in
* cache indefinitely.
* @return object|null An instance of the class, or null if it could not be
* instantiated.
*/
public function getObject($className, $criteria= null, $cacheFlag= true) {
$instance= null;
if ($criteria !== null) {
$instance = $this->call($className, 'load', array(& $this, $className, $criteria, $cacheFlag));
}
return $instance;
}
/**
* Retrieves a collection of xPDOObjects by the specified xPDOCriteria.
*
* @uses xPDOObject::loadCollection()
* @param string $className Name of the class to search for instances of.
* @param object|array|string $criteria An xPDOCriteria object or an array
* search expression.
* @param mixed $cacheFlag If an integer value is provided, this specifies
* the time to live in the result set cache; if cacheFlag === false, caching
* is ignored for the collection and if cacheFlag === true, the objects will
* live in cache until flushed by another process.
* @return array|null An array of class instances retrieved.
*/
public function getCollection($className, $criteria= null, $cacheFlag= true) {
return $this->call($className, 'loadCollection', array(& $this, $className, $criteria, $cacheFlag));
}
/**
* Retrieves an iterable representation of a collection of xPDOObjects.
*
* @param string $className Name of the class to search for instances of.
* @param mixed $criteria An xPDOCriteria object or representation.
* @param bool $cacheFlag If an integer value is provided, this specifies
* the time to live in the result set cache; if cacheFlag === false, caching
* is ignored for the collection and if cacheFlag === true, the objects will
* live in cache until flushed by another process.
* @return xPDOIterator An iterable representation of a collection.
*/
public function getIterator($className, $criteria= null, $cacheFlag= true) {
return new xPDOIterator($this, array('class' => $className, 'criteria' => $criteria, 'cacheFlag' => $cacheFlag));
}
/**
* Update field values across a collection of xPDOObjects.
*
* @param string $className Name of the class to update fields of.
* @param array $set An associative array of field/value pairs representing the updates to make.
* @param mixed $criteria An xPDOCriteria object or representation.
* @return bool|int The number of instances affected by the update or false on failure.
*/
public function updateCollection($className, array $set, $criteria= null) {
$affected = false;
if ($this->getConnection(array(xPDO::OPT_CONN_MUTABLE => true))) {
$query = $this->newQuery($className);
if ($query && !empty($set)) {
$query->command('UPDATE');
$query->set($set);
if (!empty($criteria)) $query->where($criteria);
if ($query->prepare()) {
$affected = $this->exec($query->toSQL());
if ($affected === false) {
$this->log(xPDO::LOG_LEVEL_ERROR, "Error updating {$className} instances using query " . $query->toSQL(), '', __METHOD__, __FILE__, __LINE__);
} else {
if ($this->getOption(xPDO::OPT_CACHE_DB)) {
$relatedClasses = array($query->getTableClass());
$related = array_merge($this->getAggregates($className), $this->getComposites($className));
foreach ($related as $relatedAlias => $relatedMeta) {
$relatedClasses[] = $relatedMeta['class'];
}
$relatedClasses = array_unique($relatedClasses);
foreach ($relatedClasses as $relatedClass) {
$this->cacheManager->delete($relatedClass, array(
xPDO::OPT_CACHE_KEY => $this->getOption('cache_db_key', null, 'db'),
xPDO::OPT_CACHE_HANDLER => $this->getOption(xPDO::OPT_CACHE_DB_HANDLER, null, $this->getOption(xPDO::OPT_CACHE_HANDLER, null, 'cache.xPDOFileCache')),
xPDO::OPT_CACHE_FORMAT => (integer) $this->getOption('cache_db_format', null, $this->getOption(xPDO::OPT_CACHE_FORMAT, null, xPDOCacheManager::CACHE_PHP)),
xPDO::OPT_CACHE_PREFIX => $this->getOption('cache_db_prefix', null, xPDOCacheManager::CACHE_DIR),
'multiple_object_delete' => true
));
}
}
$callback = $this->getOption(xPDO::OPT_CALLBACK_ON_SAVE);
if ($callback && is_callable($callback)) {
call_user_func($callback, array('className' => $className, 'criteria' => $query, 'object' => null));
}
}
}
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, "Could not get connection for writing data", '', __METHOD__, __FILE__, __LINE__);
}
return $affected;
}
/**
* Remove an instance of the specified className by a supplied criteria.
*
* @param string $className The name of the class to remove an instance of.
* @param mixed $criteria Valid xPDO criteria for selecting an instance.
* @return boolean True if the instance is successfully removed.
*/
public function removeObject($className, $criteria) {
$removed= false;
if ($this->getConnection(array(xPDO::OPT_CONN_MUTABLE => true))) {
if ($this->getCount($className, $criteria) === 1) {
if ($query= $this->newQuery($className)) {
$query->command('DELETE');
$query->where($criteria);
if ($query->prepare()) {
if ($this->exec($query->toSQL()) !== 1) {
$this->log(xPDO::LOG_LEVEL_ERROR, "xPDO->removeObject - Error deleting {$className} instance using query " . $query->toSQL());
} else {
$removed= true;
if ($this->getOption(xPDO::OPT_CACHE_DB)) {
$this->cacheManager->delete(xPDOCacheManager::CACHE_DIR . $query->getAlias(), array('multiple_object_delete' => true));
}
$callback = $this->getOption(xPDO::OPT_CALLBACK_ON_REMOVE);
if ($callback && is_callable($callback)) {
call_user_func($callback, array('className' => $className, 'criteria' => $query));
}
}
}
}
} else {
$this->log(xPDO::LOG_LEVEL_WARN, "xPDO->removeObject - {$className} instance to remove not found!");
if ($this->getDebug() === true) $this->log(xPDO::LOG_LEVEL_DEBUG, "xPDO->removeObject - {$className} instance to remove not found using criteria " . print_r($criteria, true));
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, "Could not get connection for writing data", '', __METHOD__, __FILE__, __LINE__);
}
return $removed;
}
/**
* Remove a collection of instances by the supplied className and criteria.
*
* @param string $className The name of the class to remove a collection of.
* @param mixed $criteria Valid xPDO criteria for selecting a collection.
* @return boolean|integer False if the remove encounters an error, otherwise an integer value
* representing the number of rows that were removed.
*/
public function removeCollection($className, $criteria) {
$removed= false;
if ($this->getConnection(array(xPDO::OPT_CONN_MUTABLE => true))) {
if ($query= $this->newQuery($className)) {
$query->command('DELETE');
$query->where($criteria);
if ($query->prepare()) {
$removed= $this->exec($query->toSQL());
if ($removed === false) {
$this->log(xPDO::LOG_LEVEL_ERROR, "xPDO->removeCollection - Error deleting {$className} instances using query " . $query->toSQL());
} else {
if ($this->getOption(xPDO::OPT_CACHE_DB)) {
$this->cacheManager->delete(xPDOCacheManager::CACHE_DIR . $query->getAlias(), array('multiple_object_delete' => true));
}
$callback = $this->getOption(xPDO::OPT_CALLBACK_ON_REMOVE);
if ($callback && is_callable($callback)) {
call_user_func($callback, array('className' => $className, 'criteria' => $query));
}
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, "xPDO->removeCollection - Error preparing statement to delete {$className} instances using query: {$query->toSQL()}");
}
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, "Could not get connection for writing data", '', __METHOD__, __FILE__, __LINE__);
}
return $removed;
}
/**
* Retrieves a count of xPDOObjects by the specified xPDOCriteria.
*
* @param string $className Class of xPDOObject to count instances of.
* @param mixed $criteria Any valid xPDOCriteria object or expression.
* @return integer The number of instances found by the criteria.
*/
public function getCount($className, $criteria = null) {
$count = 0;
if ($query = $this->newQuery($className, $criteria)) {
$stmt = null;
$expr = '*';
if ($pk = $this->getPK($className)) {
if (!is_array($pk)) {
$pk = array($pk);
}
$expr = $this->getSelectColumns($className, $query->getAlias(), '', $pk);
}
if (isset($query->query['columns'])) {
$query->query['columns'] = array();
}
if (!empty($query->query['groupby']) || !empty($query->query['having'])) {
$query->select($expr);
if ($query->prepare()) {
$countQuery = new xPDOCriteria($this, "SELECT COUNT(*) FROM ({$query->toSQL(false)}) cq", $query->bindings, $query->cacheFlag);
$stmt = $countQuery->prepare();
}
} else {
$query->select(array("COUNT(DISTINCT {$expr})"));
$stmt = $query->prepare();
}
if ($stmt && $stmt->execute()) {
$count = intval($stmt->fetchColumn());
}
}
return $count;
}
/**
* Retrieves an xPDOObject instance with specified related objects.
*
* @uses xPDO::getCollectionGraph()
* @param string $className The name of the class to return an instance of.
* @param string|array $graph A related object graph in array or JSON
* format, e.g. array('relationAlias'=>array('subRelationAlias'=>array()))
* or {"relationAlias":{"subRelationAlias":{}}}. Note that the empty arrays
* are necessary in order for the relation to be recognized.
* @param mixed $criteria A valid xPDOCriteria instance or expression.
* @param boolean|integer $cacheFlag Indicates if the result set should be
* cached, and optionally for how many seconds.
* @return object The object instance with related objects from the graph
* hydrated, or null if no instance can be located by the criteria.
*/
public function getObjectGraph($className, $graph, $criteria= null, $cacheFlag= true) {
$object= null;
if ($collection= $this->getCollectionGraph($className, $graph, $criteria, $cacheFlag)) {
if (!count($collection) === 1) {
$this->log(xPDO::LOG_LEVEL_WARN, 'getObjectGraph criteria returned more than one instance.');
}
$object= reset($collection);
}
return $object;
}
/**
* Retrieves a collection of xPDOObject instances with related objects.
*
* @uses xPDOQuery::bindGraph()
* @param string $className The name of the class to return a collection of.
* @param string|array $graph A related object graph in array or JSON
* format, e.g. array('relationAlias'=>array('subRelationAlias'=>array()))
* or {"relationAlias":{"subRelationAlias":{}}}. Note that the empty arrays
* are necessary in order for the relation to be recognized.
* @param mixed $criteria A valid xPDOCriteria instance or condition string.
* @param boolean $cacheFlag Indicates if the result set should be cached.
* @return array An array of instances matching the criteria with related
* objects from the graph hydrated. An empty array is returned when no
* matches are found.
*/
public function getCollectionGraph($className, $graph, $criteria= null, $cacheFlag= true) {
return $this->call($className, 'loadCollectionGraph', array(& $this, $className, $graph, $criteria, $cacheFlag));
}
/**
* Execute a PDOStatement and get a single column value from the first row of the result set.
*
* @param PDOStatement $stmt A prepared PDOStatement object ready to be executed.
* @param null|integer $column 0-indexed number of the column you wish to retrieve from the row. If
* null or no value is supplied, it fetches the first column.
* @return mixed The value of the specified column from the first row of the result set, or null.
*/
public function getValue($stmt, $column= null) {
$value = null;
if (is_object($stmt) && $stmt instanceof PDOStatement) {
$tstart = microtime(true);
if ($stmt->execute()) {
$this->queryTime += microtime(true) - $tstart;
$this->executedQueries++;
$value= $stmt->fetchColumn($column);
$stmt->closeCursor();
} else {
$this->queryTime += microtime(true) - $tstart;
$this->executedQueries++;
$this->log(xPDO::LOG_LEVEL_ERROR, "Error " . $stmt->errorCode() . " executing statement: \n" . print_r($stmt->errorInfo(), true), '', __METHOD__, __FILE__, __LINE__);
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, "No valid PDOStatement provided to getValue", '', __METHOD__, __FILE__, __LINE__);
}
return $value;
}
/**
* Convert any valid criteria into an xPDOQuery instance.
*
* @todo Get criteria pre-defined in an {@link xPDOObject} class metadata
* definition by name.
*
* @todo Define callback functions as an alternative to retreiving criteria
* sql and/or bindings from the metadata.
*
* @param string $className The class to get predefined criteria for.
* @param string $type The type of criteria to get (you can define any
* type you want, but 'object' and 'collection' are the typical criteria
* for retrieving single and multiple instances of an object).
* @param boolean|integer $cacheFlag Indicates if the result is cached and
* optionally for how many seconds.
* @return xPDOCriteria A criteria object or null if not found.
*/
public function getCriteria($className, $type= null, $cacheFlag= true) {
return $this->newQuery($className, $type, $cacheFlag);
}
/**
* Validate and return the type of a specified criteria variable.
*
* @param mixed $criteria An xPDOCriteria instance or any valid criteria variable.
* @return string|null The type of valid criteria passed, or null if the criteria is not valid.
*/
public function getCriteriaType($criteria) {
$type = gettype($criteria);
if ($type === 'object') {
$type = get_class($criteria);
if (!$criteria instanceof xPDOCriteria) {
$this->log(xPDO::LOG_LEVEL_WARN, "Invalid criteria object of class {$type} encountered.", '', __METHOD__, __FILE__, __LINE__);
$type = null;
}
}
return $type;
}
/**
* Add criteria when requesting a derivative class row automatically.
*
* This applies class_key filtering for single-table inheritance queries and may
* provide a convenient location for similar features in the future.
*
* @param string $className A valid xPDOObject derivative table class.
* @param xPDOQuery $criteria A valid xPDOQuery instance.
* @return xPDOQuery The xPDOQuery instance with derivative criteria added.
*/
public function addDerivativeCriteria($className, $criteria) {
if ($criteria instanceof xPDOQuery && !isset($this->map[$className]['table'])) {
if (isset($this->map[$className]['fields']['class_key']) && !empty($this->map[$className]['fields']['class_key'])) {
$criteria->where(array('class_key' => $this->map[$className]['fields']['class_key']));
if ($this->getDebug() === true) {
$this->log(xPDO::LOG_LEVEL_DEBUG, "#1: Automatically adding class_key criteria for derivative query of class {$className}");
}
} else {
foreach ($this->getAncestry($className, false) as $ancestor) {
if (isset($this->map[$ancestor]['table']) && isset($this->map[$ancestor]['fields']['class_key'])) {
$criteria->where(array('class_key' => $className));
if ($this->getDebug() === true) {
$this->log(xPDO::LOG_LEVEL_DEBUG, "#2: Automatically adding class_key criteria for derivative query of class {$className} from base table class {$ancestor}");
}
break;
}
}
}
}
return $criteria;
}
/**
* Gets the package name from a specified class name.
*
* @param string $className The name of the class to lookup the package for.
* @return string The package the class belongs to.
*/
public function getPackage($className) {
$package= '';
if ($className= $this->loadClass($className)) {
if (isset($this->map[$className]['package'])) {
$package= $this->map[$className]['package'];
}
if (!$package && $ancestry= $this->getAncestry($className, false)) {
foreach ($ancestry as $ancestor) {
if (isset ($this->map[$ancestor]['package']) && ($package= $this->map[$ancestor]['package'])) {
break;
}
}
}
}
return $package;
}
/**
* Load and return a named service class instance.
*
* @param string $name The variable name of the instance.
* @param string $class The service class name.
* @param string $path An optional root path to search for the class.
* @param array $params An array of optional params to pass to the service
* class constructor.
* @return object|null A reference to the service class instance or null if
* it could not be loaded.
*/
public function &getService($name, $class= '', $path= '', $params= array ()) {
$service= null;
if (!isset ($this->services[$name]) || !is_object($this->services[$name])) {
if (empty ($class) && isset ($this->config[$name . '.class'])) {
$class= $this->config[$name . '.class'];
} elseif (empty ($class)) {
$class= $name;
}
$className= $this->loadClass($class, $path, false, true);
if (!empty($className)) {
$service = new $className ($this, $params);
if ($service) {
$this->services[$name]=& $service;
$this->$name= & $this->services[$name];
}
}
}
if (array_key_exists($name, $this->services)) {
$service= & $this->services[$name];
} else {
if ($this->getDebug() === true) {
$this->log(xPDO::LOG_LEVEL_DEBUG, "Problem getting service {$name}, instance of class {$class}, from path {$path}, with params " . print_r($params, true));
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, "Problem getting service {$name}, instance of class {$class}, from path {$path}");
}
}
return $service;
}
/**
* Gets the actual run-time table name from a specified class name.
*
* @param string $className The name of the class to lookup a table name
* for.
* @param boolean $includeDb Qualify the table name with the database name.
* @return string The table name for the class, or null if unsuccessful.
*/
public function getTableName($className, $includeDb= false) {
$table= null;
if ($className= $this->loadClass($className)) {
if (isset ($this->map[$className]['table'])) {
$table= $this->map[$className]['table'];
if (isset($this->map[$className]['package']) && isset($this->packages[$this->map[$className]['package']]['prefix'])) {
$table= $this->packages[$this->map[$className]['package']]['prefix'] . $table;
} else {
$table= $this->getOption(xPDO::OPT_TABLE_PREFIX, null, '') . $table;
}
}
if (!$table && $ancestry= $this->getAncestry($className, false)) {
foreach ($ancestry as $ancestor) {
if (isset ($this->map[$ancestor]['table']) && $table= $this->map[$ancestor]['table']) {
if (isset($this->map[$ancestor]['package']) && isset($this->packages[$this->map[$ancestor]['package']]['prefix'])) {
$table= $this->packages[$this->map[$ancestor]['package']]['prefix'] . $table;
} else {
$table= $this->getOption(xPDO::OPT_TABLE_PREFIX, null, '') . $table;
}
break;
}
}
}
}
if ($table) {
$table= $this->_getFullTableName($table, $includeDb);
if ($this->getDebug() === true) $this->log(xPDO::LOG_LEVEL_DEBUG, 'Returning table name: ' . $table . ' for class: ' . $className);
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, 'Could not get table name for class: ' . $className);
}
return $table;
}
/**
* Get the class which defines the table for a specified className.
*
* @param string $className The name of a class to determine the table class from.
* @return null|string The name of a class defining the table for the specified className; null if not found.
*/
public function getTableClass($className) {
$tableClass= null;
if ($className= $this->loadClass($className)) {
if (isset ($this->map[$className]['table'])) {
$tableClass= $className;
}
if (!$tableClass && $ancestry= $this->getAncestry($className, false)) {
foreach ($ancestry as $ancestor) {
if (isset ($this->map[$ancestor]['table'])) {
$tableClass= $ancestor;
break;
}
}
}
}
if ($tableClass) {
if ($this->getDebug() === true) {
$this->log(xPDO::LOG_LEVEL_DEBUG, 'Returning table class: ' . $tableClass . ' for class: ' . $className);
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, 'Could not get table class for class: ' . $className);
}
return $tableClass;
}
/**
* Gets the actual run-time table metadata from a specified class name.
*
* @param string $className The name of the class to lookup a table name
* for.
* @return string The table meta data for the class, or null if
* unsuccessful.
*/
public function getTableMeta($className) {
$tableMeta= null;
if ($className= $this->loadClass($className)) {
if (isset ($this->map[$className]['tableMeta'])) {
$tableMeta= $this->map[$className]['tableMeta'];
}
if (!$tableMeta && $ancestry= $this->getAncestry($className)) {
foreach ($ancestry as $ancestor) {
if (isset ($this->map[$ancestor]['tableMeta'])) {
if ($tableMeta= $this->map[$ancestor]['tableMeta']) {
break;
}
}
}
}
}
return $tableMeta;
}
/**
* Indicates the inheritance model for the xPDOObject class specified.
*
* @param string $className The class to determine the table inherit type from.
* @return string single, multiple, or none
*/
public function getInherit($className) {
$inherit= false;
if ($className= $this->loadClass($className)) {
if (isset ($this->map[$className]['inherit'])) {
$inherit= $this->map[$className]['inherit'];
}
if (!$inherit && $ancestry= $this->getAncestry($className, false)) {
foreach ($ancestry as $ancestor) {
if (isset ($this->map[$ancestor]['inherit'])) {
$inherit= $this->map[$ancestor]['inherit'];
break;
}
}
}
}
if (!empty($inherit)) {
if ($this->getDebug() === true) {
$this->log(xPDO::LOG_LEVEL_DEBUG, 'Returning inherit: ' . $inherit . ' for class: ' . $className);
}
} else {
$inherit= 'none';
}
return $inherit;
}
/**
* Gets a list of fields (or columns) for an object by class name.
*
* This includes default values for each field and is used by the objects
* themselves to build their initial attributes based on class inheritence.
*
* @param string $className The name of the class to lookup fields for.
* @return array An array featuring field names as the array keys, and
* default field values as the array values; empty array is returned if
* unsuccessful.
*/
public function getFields($className) {
$fields= array ();
if ($className= $this->loadClass($className)) {
if ($ancestry= $this->getAncestry($className)) {
for ($i= count($ancestry) - 1; $i >= 0; $i--) {
if (isset ($this->map[$ancestry[$i]]['fields'])) {
$fields= array_merge($fields, $this->map[$ancestry[$i]]['fields']);
}
}
}
if ($this->getInherit($className) === 'single') {
$descendants= $this->getDescendants($className);
if ($descendants) {
foreach ($descendants as $descendant) {
$descendantClass= $this->loadClass($descendant);
if ($descendantClass && isset($this->map[$descendantClass]['fields'])) {
$fields= array_merge($fields, array_diff_key($this->map[$descendantClass]['fields'], $fields));
}
}
}
}
}
return $fields;
}
/**
* Gets a list of field (or column) definitions for an object by class name.
*
* These definitions are used by the objects themselves to build their
* own meta data based on class inheritance.
*
* @param string $className The name of the class to lookup fields meta data
* for.
* @param boolean $includeExtended If true, include meta from all derivative
* classes in loaded packages.
* @return array An array featuring field names as the array keys, and
* arrays of metadata information as the array values; empty array is
* returned if unsuccessful.
*/
public function getFieldMeta($className, $includeExtended = false) {
$fieldMeta= array ();
if ($className= $this->loadClass($className)) {
if ($ancestry= $this->getAncestry($className)) {
for ($i= count($ancestry) - 1; $i >= 0; $i--) {
if (isset ($this->map[$ancestry[$i]]['fieldMeta'])) {
$fieldMeta= array_merge($fieldMeta, $this->map[$ancestry[$i]]['fieldMeta']);
}
}
}
if ($includeExtended && $this->getInherit($className) === 'single') {
$descendants= $this->getDescendants($className);
if ($descendants) {
foreach ($descendants as $descendant) {
$descendantClass= $this->loadClass($descendant);
if ($descendantClass && isset($this->map[$descendantClass]['fieldMeta'])) {
$fieldMeta= array_merge($fieldMeta, array_diff_key($this->map[$descendantClass]['fieldMeta'], $fieldMeta));
}
}
}
}
}
return $fieldMeta;
}
/**
* Gets a collection of field aliases for an object by class name.
*
* @param string $className The name of the class to lookup field aliases for.
* @return array An array of field aliases with aliases as keys and actual field names as values.
*/
public function getFieldAliases($className) {
$fieldAliases= array ();
if ($className= $this->loadClass($className)) {
if ($ancestry= $this->getAncestry($className)) {
for ($i= count($ancestry) - 1; $i >= 0; $i--) {
if (isset ($this->map[$ancestry[$i]]['fieldAliases'])) {
$fieldAliases= array_merge($fieldAliases, $this->map[$ancestry[$i]]['fieldAliases']);
}
}
}
if ($this->getInherit($className) === 'single') {
$descendants= $this->getDescendants($className);
if ($descendants) {
foreach ($descendants as $descendant) {
$descendantClass= $this->loadClass($descendant);
if ($descendantClass && isset($this->map[$descendantClass]['fieldAliases'])) {
$fieldAliases= array_merge($fieldAliases, array_diff_key($this->map[$descendantClass]['fieldAliases'], $fieldAliases));
}
}
}
}
}
return $fieldAliases;
}
/**
* Gets a set of validation rules defined for an object by class name.
*
* @param string $className The name of the class to lookup validation rules
* for.
* @return array An array featuring field names as the array keys, and
* arrays of validation rule information as the array values; empty array is
* returned if unsuccessful.
*/
public function getValidationRules($className) {
$rules= array();
if ($className= $this->loadClass($className)) {
if ($ancestry= $this->getAncestry($className)) {
for ($i= count($ancestry) - 1; $i >= 0; $i--) {
if (isset($this->map[$ancestry[$i]]['validation']['rules'])) {
$rules= array_merge($rules, $this->map[$ancestry[$i]]['validation']['rules']);
}
}
}
if ($this->getInherit($className) === 'single') {
$descendants= $this->getDescendants($className);
if ($descendants) {
foreach ($descendants as $descendant) {
$descendantClass= $this->loadClass($descendant);
if ($descendantClass && isset($this->map[$descendantClass]['validation']['rules'])) {
$rules= array_merge($rules, array_diff_key($this->map[$descendantClass]['validation']['rules'], $rules));
}
}
}
}
if ($this->getDebug() === true) {
$this->log(xPDO::LOG_LEVEL_DEBUG, "Returning validation rules: " . print_r($rules, true));
}
}
return $rules;
}
/**
* Get indices defined for a table class.
*
* @param string $className The name of the class to lookup indices for.
* @return array An array of indices and their details for the specified class.
*/
public function getIndexMeta($className) {
$indices= array();
if ($className= $this->loadClass($className)) {
if ($ancestry= $this->getAncestry($className)) {
for ($i= count($ancestry) -1; $i >= 0; $i--) {
if (isset($this->map[$ancestry[$i]]['indexes'])) {
$indices= array_merge($indices, $this->map[$ancestry[$i]]['indexes']);
}
}
if ($this->getInherit($className) === 'single') {
$descendants= $this->getDescendants($className);
if ($descendants) {
foreach ($descendants as $descendant) {
$descendantClass= $this->loadClass($descendant);
if ($descendantClass && isset($this->map[$descendantClass]['indexes'])) {
$indices= array_merge($indices, array_diff_key($this->map[$descendantClass]['indexes'], $indices));
}
}
}
}
if ($this->getDebug() === true) {
$this->log(xPDO::LOG_LEVEL_DEBUG, "Returning indices: " . print_r($indices, true));
}
}
}
return $indices;
}
/**
* Gets the primary key field(s) for a class.
*
* @param string $className The name of the class to lookup the primary key
* for.
* @return mixed The name of the field representing a class instance primary
* key, an array of key names for compound primary keys, or null if no
* primary key is found or defined for the class.
*/
public function getPK($className) {
$pk= null;
if (strcasecmp($className, 'xPDOObject') !== 0) {
if ($actualClassName= $this->loadClass($className)) {
if (isset ($this->map[$actualClassName]['indexes'])) {
foreach ($this->map[$actualClassName]['indexes'] as $k => $v) {
if (isset ($this->map[$actualClassName]['fieldMeta'][$k]['phptype'])) {
if (isset ($v['primary']) && $v['primary'] == true) {
$pk[$k]= $k;
}
}
}
}
if (isset ($this->map[$actualClassName]['fieldMeta'])) {
foreach ($this->map[$actualClassName]['fieldMeta'] as $k => $v) {
if (isset ($v['index']) && isset ($v['phptype']) && $v['index'] == 'pk') {
$pk[$k]= $k;
}
}
}
if ($ancestry= $this->getAncestry($actualClassName)) {
foreach ($ancestry as $ancestor) {
if ($ancestorClassName= $this->loadClass($ancestor)) {
if (isset ($this->map[$ancestorClassName]['indexes'])) {
foreach ($this->map[$ancestorClassName]['indexes'] as $k => $v) {
if (isset ($this->map[$ancestorClassName]['fieldMeta'][$k]['phptype'])) {
if (isset ($v['primary']) && $v['primary'] == true) {
$pk[$k]= $k;
}
}
}
}
if (isset ($this->map[$ancestorClassName]['fieldMeta'])) {
foreach ($this->map[$ancestorClassName]['fieldMeta'] as $k => $v) {
if (isset ($v['index']) && isset ($v['phptype']) && $v['index'] == 'pk') {
$pk[$k]= $k;
}
}
}
}
}
}
if ($pk && count($pk) === 1) {
$pk= current($pk);
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, "Could not load class {$className}");
}
}
return $pk;
}
/**
* Gets the type of primary key field for a class.
*
* @param string $className The name of the class to lookup the primary key
* type for.
* @param mixed $pk Optional specific PK column or columns to get type(s) for.
* @return string The type of the field representing a class instance primary
* key, or null if no primary key is found or defined for the class.
*/
public function getPKType($className, $pk= false) {
$pktype= null;
if ($actualClassName= $this->loadClass($className)) {
if (!$pk)
$pk= $this->getPK($actualClassName);
if (!is_array($pk))
$pk= array($pk);
$ancestry= $this->getAncestry($actualClassName, true);
foreach ($pk as $_pk) {
foreach ($ancestry as $parentClass) {
if (isset ($this->map[$parentClass]['fieldMeta'][$_pk]['phptype'])) {
$pktype[$_pk]= $this->map[$parentClass]['fieldMeta'][$_pk]['phptype'];
break;
}
}
}
if (is_array($pktype) && count($pktype) == 1) {
$pktype= reset($pktype);
}
elseif (empty($pktype)) {
$pktype= null;
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, "Could not load class {$className}!");
}
return $pktype;
}
/**
* Gets a collection of aggregate foreign key relationship definitions.
*
* @param string $className The fully-qualified name of the class.
* @return array An array of aggregate foreign key relationship definitions.
*/
public function getAggregates($className) {
$aggregates= array ();
if ($className= $this->loadClass($className)) {
if ($ancestry= $this->getAncestry($className)) {
for ($i= count($ancestry) - 1; $i >= 0; $i--) {
if (isset ($this->map[$ancestry[$i]]['aggregates'])) {
$aggregates= array_merge($aggregates, $this->map[$ancestry[$i]]['aggregates']);
}
}
}
if ($this->getInherit($className) === 'single') {
$descendants= $this->getDescendants($className);
if ($descendants) {
foreach ($descendants as $descendant) {
$descendantClass= $this->loadClass($descendant);
if ($descendantClass && isset($this->map[$descendantClass]['aggregates'])) {
$aggregates= array_merge($aggregates, array_diff_key($this->map[$descendantClass]['aggregates'], $aggregates));
}
}
}
}
}
return $aggregates;
}
/**
* Gets a collection of composite foreign key relationship definitions.
*
* @param string $className The fully-qualified name of the class.
* @return array An array of composite foreign key relationship definitions.
*/
public function getComposites($className) {
$composites= array ();
if ($className= $this->loadClass($className)) {
if ($ancestry= $this->getAncestry($className)) {
for ($i= count($ancestry) - 1; $i >= 0; $i--) {
if (isset ($this->map[$ancestry[$i]]['composites'])) {
$composites= array_merge($composites, $this->map[$ancestry[$i]]['composites']);
}
}
}
if ($this->getInherit($className) === 'single') {
$descendants= $this->getDescendants($className);
if ($descendants) {
foreach ($descendants as $descendant) {
$descendantClass= $this->loadClass($descendant);
if ($descendantClass && isset($this->map[$descendantClass]['composites'])) {
$composites= array_merge($composites, array_diff_key($this->map[$descendantClass]['composites'], $composites));
}
}
}
}
}
return $composites;
}
/**
* Get a complete relation graph for an xPDOObject class.
*
* @param string $className A fully-qualified xPDOObject class name.
* @param int $depth The depth to retrieve relations for the graph, defaults to 3.
* @param array &$parents An array of parent classes to avoid traversing circular dependencies.
* @param array &$visited An array of already visited classes to avoid traversing circular dependencies.
* @return array An xPDOObject relation graph, or an empty array if no graph can be constructed.
*/
public function getGraph($className, $depth= 3, &$parents = array(), &$visited = array()) {
$graph = array();
$className = $this->loadClass($className);
if ($className && $depth > 0) {
$depth--;
$parents = array_merge($parents, $this->getAncestry($className));
$parentsNested = array_unique($parents);
$visitNested = array_merge($visited, array($className));
$relations = array_merge($this->getAggregates($className), $this->getComposites($className));
foreach ($relations as $alias => $relation) {
if (in_array($relation['class'], $visited)) {
continue;
}
$childGraph = array();
if ($depth > 0 && !in_array($relation['class'], $parents)) {
$childGraph = $this->getGraph($relation['class'], $depth, $parentsNested, $visitNested);
}
$graph[$alias] = $childGraph;
}
$visited[] = $className;
}
return $graph;
}
/**
* Retrieves the complete ancestry for a class.
*
* @param string $className The name of the class.
* @param bool $includeSelf Determines if the specified class should be
* included in the resulting array.
* @return array An array of string class names representing the class
* hierarchy, or an empty array if unsuccessful.
*/
public function getAncestry($className, $includeSelf= true) {
$ancestry= array ();
if ($actualClassName= $this->loadClass($className)) {
$ancestor= $actualClassName;
if ($includeSelf) {
$ancestry[]= $actualClassName;
}
while ($ancestor= get_parent_class($ancestor)) {
$ancestry[]= $ancestor;
}
if ($this->getDebug() === true) {
$this->log(xPDO::LOG_LEVEL_DEBUG, "Returning ancestry for {$className}: " . print_r($ancestry, 1));
}
}
return $ancestry;
}
/**
* Gets select columns from a specific class for building a query.
*
* @uses xPDOObject::getSelectColumns()
* @param string $className The name of the class to build the column list
* from.
* @param string $tableAlias An optional alias for the class table, to be
* used in complex queries with multiple tables.
* @param string $columnPrefix An optional string with which to prefix the
* columns returned, to avoid name collisions in return columns.
* @param array $columns An optional array of columns to include.
* @param boolean $exclude If true, will exclude columns in the previous
* parameter, instead of including them.
* @return string A valid SQL string of column names for a SELECT statement.
*/
public function getSelectColumns($className, $tableAlias= '', $columnPrefix= '', $columns= array (), $exclude= false) {
return $this->call($className, 'getSelectColumns', array(&$this, $className, $tableAlias, $columnPrefix, $columns, $exclude));
}
/**
* Gets an aggregate or composite relation definition from a class.
*
* @param string $parentClass The class from which the relation is defined.
* @param string $alias The alias identifying the related class.
* @return array The aggregate or composite definition details in an array
* or null if no definition is found.
*/
function getFKDefinition($parentClass, $alias) {
$def= null;
$parentClass= $this->loadClass($parentClass);
if ($parentClass && $alias) {
if ($aggregates= $this->getAggregates($parentClass)) {
if (isset ($aggregates[$alias])) {
$def= $aggregates[$alias];
$def['type']= 'aggregate';
}
}
if ($composites= $this->getComposites($parentClass)) {
if (isset ($composites[$alias])) {
$def= $composites[$alias];
$def['type']= 'composite';
}
}
}
if ($def === null) {
$this->log(xPDO::LOG_LEVEL_ERROR, 'No foreign key definition for parentClass: ' . $parentClass . ' using relation alias: ' . $alias);
}
return $def;
}
/**
* Gets the version string of the schema the specified class was generated from.
*
* @param string $className The name of the class to get the model version from.
* @return string The version string for the schema model the class was generated from.
*/
public function getModelVersion($className) {
$version = '1.0';
$className= $this->loadClass($className);
if ($className && isset($this->map[$className]['version'])) {
$version= $this->map[$className]['version'];
}
return $version;
}
/**
* Gets the manager class for this xPDO connection.
*
* The manager class can perform operations such as creating or altering
* table structures, creating data containers, generating custom persistence
* classes, and other advanced operations that do not need to be loaded
* frequently.
*
* @return xPDOManager|null An xPDOManager instance for the xPDO connection, or null
* if a manager class can not be instantiated.
*/
public function getManager() {
if ($this->manager === null || !$this->manager instanceof xPDOManager) {
$loaded= include_once(XPDO_CORE_PATH . 'om/' . $this->config['dbtype'] . '/xpdomanager.class.php');
if ($loaded) {
$managerClass = 'xPDOManager_' . $this->config['dbtype'];
$this->manager= new $managerClass ($this);
}
if (!$this->manager) {
$this->log(xPDO::LOG_LEVEL_ERROR, "Could not load xPDOManager class.");
}
}
return $this->manager;
}
/**
* Gets the driver class for this xPDO connection.
*
* The driver class provides baseline data and operations for a specific database driver.
*
* @return xPDODriver|null An xPDODriver instance for the xPDO connection, or null
* if a driver class can not be instantiated.
*/
public function getDriver() {
if ($this->driver === null || !$this->driver instanceof xPDODriver) {
$loaded= include_once(XPDO_CORE_PATH . 'om/' . $this->config['dbtype'] . '/xpdodriver.class.php');
if ($loaded) {
$driverClass = 'xPDODriver_' . $this->config['dbtype'];
$this->driver= new $driverClass ($this);
}
if (!$this->driver) {
$this->log(xPDO::LOG_LEVEL_ERROR, "Could not load xPDODriver class for the {$this->config['dbtype']} PDO driver. " . print_r($this->config, true));
}
}
return $this->driver;
}
/**
* Gets the absolute path to the cache directory.
*
* @return string The full cache directory path.
*/
public function getCachePath() {
if (!$this->cachePath) {
if ($this->getCacheManager()) {
$this->cachePath= $this->cacheManager->getCachePath();
}
}
return $this->cachePath;
}
/**
* Gets an xPDOCacheManager instance.
*
* This class is responsible for handling all types of caching operations for the xPDO core.
*
* @param string $class Optional name of a derivative xPDOCacheManager class.
* @param array $options An array of options for the cache manager instance; valid options include:
* - path = Optional root path for looking up the $class.
* - ignorePkg = If false and you do not specify a path, you can look up custom xPDOCacheManager
* derivatives in declared packages.
* @return xPDOCacheManager The xPDOCacheManager for this xPDO instance.
*/
public function getCacheManager($class= 'cache.xPDOCacheManager', $options = array('path' => XPDO_CORE_PATH, 'ignorePkg' => true)) {
$actualClass = $this->loadClass($class, $options['path'], $options['ignorePkg'], true);
if ($this->cacheManager === null || !is_object($this->cacheManager) || !($this->cacheManager instanceof $actualClass)) {
if ($this->cacheManager= new $actualClass($this, $options)) {
$this->_cacheEnabled= true;
}
}
return $this->cacheManager;
}
/**
* Returns the debug state for the xPDO instance.
*
* @return boolean The current debug state for the instance, true for on,
* false for off.
*/
public function getDebug() {
return $this->_debug;
}
/**
* Sets the debug state for the xPDO instance.
*
* @param boolean|integer $v The debug status, true for on, false for off, or a valid
* error_reporting level for PHP.
*/
public function setDebug($v= true) {
$this->_debug= $v;
}
/**
* Sets the logging level state for the xPDO instance.
*
* @param integer $level The logging level to switch to.
* @return integer The previous log level.
*/
public function setLogLevel($level= xPDO::LOG_LEVEL_FATAL) {
$oldLevel = $this->logLevel;
$this->logLevel= intval($level);
return $oldLevel;
}
/**
* @return integer The current log level.
*/
public function getLogLevel() {
return $this->logLevel;
}
/**
* Sets the log target for xPDO::_log() calls.
*
* Valid target values include:
*
*
'ECHO': Returns output to the STDOUT.
*
'HTML': Returns output to the STDOUT with HTML formatting.
*
'FILE': Sends output to a log file.
*
An array with at least one element with key 'target' matching
* one of the valid log targets listed above. For 'target' => 'FILE'
* you can specify a second element with key 'options' with another
* associative array with one or both of the elements 'filename' and
* 'filepath'
*
*
* @param string $target An identifier indicating the target of the logging.
* @return mixed The previous log target.
*/
public function setLogTarget($target= 'ECHO') {
$oldTarget = $this->logTarget;
$this->logTarget= $target;
return $oldTarget;
}
/**
* @return integer The current log level.
*/
public function getLogTarget() {
return $this->logTarget;
}
/**
* Log a message with details about where and when an event occurs.
*
* @param integer $level The level of the logged message.
* @param string $msg The message to log.
* @param string $target The logging target.
* @param string $def The name of a defining structure (such as a class) to
* help identify the message source.
* @param string $file A filename in which the log event occured.
* @param string $line A line number to help locate the source of the event
* within the indicated file.
*/
public function log($level, $msg, $target= '', $def= '', $file= '', $line= '') {
$this->_log($level, $msg, $target, $def, $file, $line);
}
/**
* Log a message as appropriate for the level and target.
*
* @param integer $level The level of the logged message.
* @param string $msg The message to log.
* @param string $target The logging target.
* @param string $def The name of a defining structure (such as a class) to
* help identify the log event source.
* @param string $file A filename in which the log event occured.
* @param string $line A line number to help locate the source of the event
* within the indicated file.
*/
protected function _log($level, $msg, $target= '', $def= '', $file= '', $line= '') {
if (empty ($target)) {
$target = $this->logTarget;
}
$targetOptions = array();
if (is_array($target)) {
if (isset($target['options'])) $targetOptions =& $target['options'];
$target = isset($target['target']) ? $target['target'] : 'ECHO';
}
if (empty($file) && isset($_SERVER['SCRIPT_NAME'])) {
$file= $_SERVER['SCRIPT_NAME'];
}
if ($level === xPDO::LOG_LEVEL_FATAL) {
while (ob_get_level() && @ob_end_flush()) {}
exit ('[' . strftime('%Y-%m-%d %H:%M:%S') . '] (' . $this->_getLogLevel($level) . $def . $file . $line . ') ' . $msg . "\n" . ($this->getDebug() === true ? '
' . "\n";
break;
default :
echo '[' . strftime('%Y-%m-%d %H:%M:%S') . '] (' . $this->_getLogLevel($level) . $def . $file . $line . ') ' . $msg . "\n";
}
$content= @ob_get_contents();
@ob_end_clean();
if ($target=='FILE' && $this->getCacheManager()) {
$filename = isset($targetOptions['filename']) ? $targetOptions['filename'] : 'error.log';
$filepath = isset($targetOptions['filepath']) ? $targetOptions['filepath'] : $this->getCachePath() . xPDOCacheManager::LOG_DIR;
$this->cacheManager->writeFile($filepath . $filename, $content, 'a');
} elseif ($target=='ARRAY' && isset($targetOptions['var']) && is_array($targetOptions['var'])) {
$targetOptions['var'][] = $content;
} else {
echo $content;
}
}
}
/**
* Returns an abbreviated backtrace of debugging information.
*
* This function returns just the fields returned via xPDOObject::toArray()
* on xPDOObject instances, and simply the classname for other objects, to
* reduce the amount of unnecessary information returned.
*
* @return array The abbreviated backtrace.
*/
public function getDebugBacktrace() {
$backtrace= array ();
foreach (debug_backtrace() as $levelKey => $levelElement) {
foreach ($levelElement as $traceKey => $traceElement) {
if ($traceKey == 'object' && $traceElement instanceof xPDOObject) {
$backtrace[$levelKey][$traceKey]= $traceElement->toArray('', true);
} elseif ($traceKey == 'object') {
$backtrace[$levelKey][$traceKey]= get_class($traceElement);
} else {
$backtrace[$levelKey][$traceKey]= $traceElement;
}
}
}
return $backtrace;
}
/**
* Gets a logging level as a string representation.
*
* @param integer $level The logging level to retrieve a string for.
* @return string The string representation of a valid logging level.
*/
protected function _getLogLevel($level) {
switch ($level) {
case xPDO::LOG_LEVEL_DEBUG :
$levelText= 'DEBUG';
break;
case xPDO::LOG_LEVEL_INFO :
$levelText= 'INFO';
break;
case xPDO::LOG_LEVEL_WARN :
$levelText= 'WARN';
break;
case xPDO::LOG_LEVEL_ERROR :
$levelText= 'ERROR';
break;
default :
$levelText= 'FATAL';
}
return $levelText;
}
/**
* Escapes the provided string using the platform-specific escape character.
*
* Different database engines escape string literals in SQL using different characters. For example, this is used to
* escape column names that might match a reserved string for that SQL interpreter. To write database agnostic
* queries with xPDO, it is highly recommend to escape any database or column names in any native SQL strings used.
*
* @param string $string A string to escape using the platform-specific escape characters.
* @return string The string escaped with the platform-specific escape characters.
*/
public function escape($string) {
$string = trim($string, $this->_escapeCharOpen . $this->_escapeCharClose);
return $this->_escapeCharOpen . $string . $this->_escapeCharClose;
}
/**
* Use to insert a literal string into a SQL query without escaping or quoting.
*
* @param string $string A string to return as a literal, unescaped and unquoted.
* @return string The string with any escape or quote characters trimmed.
*/
public function literal($string) {
$string = trim($string, $this->_escapeCharOpen . $this->_escapeCharClose . $this->_quoteChar);
return $string;
}
/**
* Adds the table prefix, and optionally database name, to a given table.
*
* @param string $baseTableName The table name as specified in the object
* model.
* @param boolean $includeDb Qualify the table name with the database name.
* @return string The fully-qualified and quoted table name for the
*/
private function _getFullTableName($baseTableName, $includeDb= false) {
$fqn= '';
if (!empty ($baseTableName)) {
if ($includeDb) {
$fqn .= $this->escape($this->config['dbname']) . '.';
}
$fqn .= $this->escape($baseTableName);
}
return $fqn;
}
/**
* Parses a DSN and returns an array of the connection details.
*
* @static
* @param string $string The DSN to parse.
* @return array An array of connection details from the DSN.
* @todo Have this method handle all methods of DSN specification as handled
* by latest native PDO implementation.
*/
public static function parseDSN($string) {
$result= array ();
$pos= strpos($string, ':');
$result['dbtype']= strtolower(substr($string, 0, $pos));
$parameters= explode(';', substr($string, ($pos +1)));
for ($a= 0, $b= count($parameters); $a < $b; $a++) {
$tmp= explode('=', $parameters[$a]);
if (count($tmp) == 2) {
$result[strtolower(trim($tmp[0]))]= trim($tmp[1]);
} else {
$result['dbname']= trim($parameters[$a]);
}
}
if (!isset($result['dbname']) && isset($result['database'])) {
$result['dbname'] = $result['database'];
}
if (!isset($result['host']) && isset($result['server'])) {
$result['host'] = $result['server'];
}
return $result;
}
/**
* Retrieves a result array from the object cache.
*
* @param string|xPDOCriteria $signature A unique string or xPDOCriteria object
* that represents the query identifying the result set.
* @param string $class An optional classname the result represents.
* @param array $options Various cache options.
* @return array|string|null A PHP array or JSON object representing the
* result set, or null if no cache representation is found.
*/
public function fromCache($signature, $class= '', $options= array()) {
$result= null;
if ($this->getOption(xPDO::OPT_CACHE_DB, $options)) {
if ($signature && $this->getCacheManager()) {
$sig= '';
$sigKey= array();
$sigHash= '';
$sigClass= empty($class) || !is_string($class) ? '' : $class;
if (is_object($signature)) {
if ($signature instanceof xPDOCriteria) {
if ($signature instanceof xPDOQuery) {
$signature->construct();
if (empty($sigClass)) $sigClass= $signature->getTableClass();
}
$sigKey= array ($signature->sql, $signature->bindings);
}
}
elseif (is_string($signature)) {
if ($exploded= explode('_', $signature)) {
$class= reset($exploded);
if (empty($sigClass) || $sigClass !== $class) {
$sigClass= $class;
}
if (empty($sigKey)) {
while ($key= next($exploded)) {
$sigKey[]= $key;
}
}
}
}
if (empty($sigClass)) $sigClass= '__sqlResult';
if ($sigClass && $sigKey) {
$sigHash= md5($this->toJSON($sigKey));
$sig= implode('/', array ($sigClass, $sigHash));
}
if (is_string($sig) && !empty($sig)) {
$result= $this->cacheManager->get($sig, array(
xPDO::OPT_CACHE_KEY => $this->getOption('cache_db_key', $options, 'db'),
xPDO::OPT_CACHE_HANDLER => $this->getOption(xPDO::OPT_CACHE_DB_HANDLER, $options, $this->getOption(xPDO::OPT_CACHE_HANDLER, $options, 'cache.xPDOFileCache')),
xPDO::OPT_CACHE_FORMAT => (integer) $this->getOption('cache_db_format', null, $this->getOption(xPDO::OPT_CACHE_FORMAT, null, xPDOCacheManager::CACHE_PHP)),
'cache_prefix' => $this->getOption('cache_db_prefix', $options, xPDOCacheManager::CACHE_DIR),
));
if ($this->getDebug() === true) {
if (!$result) {
$this->log(xPDO::LOG_LEVEL_DEBUG, 'No cache item found for class ' . $sigClass . ' with signature ' . xPDOCacheManager::CACHE_DIR . $sig);
} else {
$this->log(xPDO::LOG_LEVEL_DEBUG, 'Loaded cache item for class ' . $sigClass . ' with signature ' . xPDOCacheManager::CACHE_DIR . $sig);
}
}
}
}
}
return $result;
}
/**
* Places a result set in the object cache.
*
* @param string|xPDOCriteria $signature A unique string or xPDOCriteria object
* representing the object.
* @param object $object An object to place a representation of in the cache.
* @param integer $lifetime An optional number of seconds the cached result
* will remain valid, with 0 meaning it will remain valid until replaced or
* removed.
* @param array $options Various cache options.
* @return boolean Indicates if the object was successfully cached.
*/
public function toCache($signature, $object, $lifetime= 0, $options = array()) {
$result= false;
if ($this->getCacheManager()) {
if ($this->getOption(xPDO::OPT_CACHE_DB, $options)) {
if ($lifetime === true) {
$lifetime = 0;
}
elseif (!$lifetime && $this->getOption(xPDO::OPT_CACHE_DB_EXPIRES, $options, 0)) {
$lifetime= intval($this->getOption(xPDO::OPT_CACHE_DB_EXPIRES, $options, 0));
}
$sigKey= array();
$sigClass= '';
$sigGraph= $this->getOption(xPDO::OPT_CACHE_DB_SIG_GRAPH, $options, array());
if (is_object($signature)) {
if ($signature instanceof xPDOCriteria) {
if ($signature instanceof xPDOQuery) {
$signature->construct();
if (empty($sigClass)) $sigClass = $signature->getTableClass();
}
$sigKey= array($signature->sql, $signature->bindings);
}
}
elseif (is_string($signature)) {
$exploded= explode('_', $signature);
if ($exploded && count($exploded) >= 2) {
$class= reset($exploded);
if (empty($sigClass) || $sigClass !== $class) {
$sigClass= $class;
}
if (empty($sigKey)) {
while ($key= next($exploded)) {
$sigKey[]= $key;
}
}
}
}
if (empty($sigClass)) {
if ($object instanceof xPDOObject) {
$sigClass= $object->_class;
} else {
$sigClass= $this->getOption(xPDO::OPT_CACHE_DB_SIG_CLASS, $options, '__sqlResult');
}
}
if (empty($sigKey) && is_string($signature)) $sigKey= $signature;
if (empty($sigKey) && $object instanceof xPDOObject) $sigKey= $object->getPrimaryKey();
if ($sigClass && $sigKey) {
$sigHash= md5($this->toJSON(is_array($sigKey) ? $sigKey : array($sigKey)));
$sig= implode('/', array ($sigClass, $sigHash));
if (is_string($sig)) {
if ($this->getOption('modified', $options, false)) {
if (empty($sigGraph) && $object instanceof xPDOObject) {
$sigGraph = array_merge(array($object->_class => array('class' => $object->_class)), $object->_aggregates, $object->_composites);
}
if (!empty($sigGraph)) {
foreach ($sigGraph as $gAlias => $gMeta) {
$gClass = $gMeta['class'];
$removed= $this->cacheManager->delete($gClass, array_merge($options, array(
xPDO::OPT_CACHE_KEY => $this->getOption('cache_db_key', $options, 'db'),
xPDO::OPT_CACHE_HANDLER => $this->getOption(xPDO::OPT_CACHE_DB_HANDLER, $options, $this->getOption(xPDO::OPT_CACHE_HANDLER, $options, 'cache.xPDOFileCache')),
xPDO::OPT_CACHE_FORMAT => (integer) $this->getOption('cache_db_format', $options, $this->getOption(xPDO::OPT_CACHE_FORMAT, $options, xPDOCacheManager::CACHE_PHP)),
xPDO::OPT_CACHE_EXPIRES => (integer) $this->getOption(xPDO::OPT_CACHE_DB_EXPIRES, null, $this->getOption(xPDO::OPT_CACHE_EXPIRES, null, 0)),
xPDO::OPT_CACHE_PREFIX => $this->getOption('cache_db_prefix', $options, xPDOCacheManager::CACHE_DIR),
'multiple_object_delete' => true
)));
if ($this->getDebug() === true) {
$this->log(xPDO::LOG_LEVEL_DEBUG, "Removing all cache objects of class {$gClass}: " . ($removed ? 'successful' : 'failed'));
}
}
}
}
$cacheOptions = array_merge($options, array(
xPDO::OPT_CACHE_KEY => $this->getOption('cache_db_key', $options, 'db'),
xPDO::OPT_CACHE_HANDLER => $this->getOption(xPDO::OPT_CACHE_DB_HANDLER, $options, $this->getOption(xPDO::OPT_CACHE_HANDLER, $options, 'cache.xPDOFileCache')),
xPDO::OPT_CACHE_FORMAT => (integer) $this->getOption('cache_db_format', $options, $this->getOption(xPDO::OPT_CACHE_FORMAT, $options, xPDOCacheManager::CACHE_PHP)),
xPDO::OPT_CACHE_EXPIRES => (integer) $this->getOption(xPDO::OPT_CACHE_DB_EXPIRES, null, $this->getOption(xPDO::OPT_CACHE_EXPIRES, null, 0)),
xPDO::OPT_CACHE_PREFIX => $this->getOption('cache_db_prefix', $options, xPDOCacheManager::CACHE_DIR)
));
$result= $this->cacheManager->set($sig, $object, $lifetime, $cacheOptions);
if ($result && $object instanceof xPDOObject) {
if ($this->getDebug() === true) {
$this->log(xPDO::LOG_LEVEL_DEBUG, "xPDO->toCache() successfully cached object with signature " . xPDOCacheManager::CACHE_DIR . $sig);
}
}
if (!$result) {
$this->log(xPDO::LOG_LEVEL_WARN, "xPDO->toCache() could not cache object with signature " . xPDOCacheManager::CACHE_DIR . $sig);
}
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, "Object sent toCache() has an invalid signature.");
}
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, "Attempt to send a non-object to toCache().");
}
return $result;
}
/**
* Converts a PHP array into a JSON encoded string.
*
* @param array $array The PHP array to convert.
* @return string The JSON representation of the source array.
*/
public function toJSON($array) {
$encoded= '';
if (is_array ($array)) {
if (!function_exists('json_encode')) {
if (@ include_once (XPDO_CORE_PATH . 'json/JSON.php')) {
$json = new Services_JSON();
$encoded= $json->encode($array);
}
} else {
$encoded= json_encode($array);
}
}
return $encoded;
}
/**
* Converts a JSON source string into an equivalent PHP representation.
*
* @param string $src A JSON source string.
* @param boolean $asArray Indicates if the result should treat objects as
* associative arrays; since all JSON associative arrays are objects, the default
* is true. Set to false to have JSON objects returned as PHP objects.
* @return mixed The PHP representation of the JSON source.
*/
public function fromJSON($src, $asArray= true) {
$decoded= '';
if ($src) {
if (!function_exists('json_decode')) {
if (@ include_once (XPDO_CORE_PATH . 'json/JSON.php')) {
if ($asArray) {
$json = new Services_JSON(SERVICES_JSON_LOOSE_TYPE);
} else {
$json = new Services_JSON();
}
$decoded= $json->decode($src);
}
} else {
$decoded= json_decode($src, $asArray);
}
}
return $decoded;
}
/**
* @see http://php.net/manual/en/function.pdo-begintransaction.php
*/
public function beginTransaction() {
if (!$this->connect(null, array(xPDO::OPT_CONN_MUTABLE => true))) {
return false;
}
return $this->pdo->beginTransaction();
}
/**
* @see http://php.net/manual/en/function.pdo-commit.php
*/
public function commit() {
if (!$this->connect(null, array(xPDO::OPT_CONN_MUTABLE => true))) {
return false;
}
return $this->pdo->commit();
}
/**
* @see http://php.net/manual/en/function.pdo-exec.php
*/
public function exec($query) {
if (!$this->connect(null, array(xPDO::OPT_CONN_MUTABLE => true))) {
return false;
}
$tstart= microtime(true);
$return= $this->pdo->exec($query);
$this->queryTime += microtime(true) - $tstart;
$this->executedQueries++;
return $return;
}
/**
* @see http://php.net/manual/en/function.pdo-errorcode.php
*/
public function errorCode() {
if (!$this->connect()) {
return false;
}
return $this->pdo->errorCode();
}
/**
* @see http://php.net/manual/en/function.pdo-errorinfo.php
*/
public function errorInfo() {
if (!$this->connect()) {
return false;
}
return $this->pdo->errorInfo();
}
/**
* @see http://php.net/manual/en/function.pdo-getattribute.php
*/
public function getAttribute($attribute) {
if (!$this->connect()) {
return false;
}
return $this->pdo->getAttribute($attribute);
}
/**
* @see http://php.net/manual/en/function.pdo-lastinsertid.php
*/
public function lastInsertId() {
if (!$this->connect()) {
return false;
}
return $this->pdo->lastInsertId();
}
/**
* @see http://php.net/manual/en/function.pdo-prepare.php
*/
public function prepare($statement, $driver_options= array ()) {
if (!$this->connect()) {
return false;
}
return $this->pdo->prepare($statement, $driver_options);
}
/**
* @see http://php.net/manual/en/function.pdo-query.php
*/
public function query($query) {
if (!$this->connect()) {
return false;
}
$tstart= microtime(true);
$return= $this->pdo->query($query);
$this->queryTime += microtime(true) - $tstart;
$this->executedQueries++;
return $return;
}
/**
* @see http://php.net/manual/en/function.pdo-quote.php
*/
public function quote($string, $parameter_type= PDO::PARAM_STR) {
if (!$this->connect()) {
return false;
}
$quoted = $this->pdo->quote($string, $parameter_type);
switch ($parameter_type) {
case PDO::PARAM_STR:
$quoted = trim($quoted);
break;
case PDO::PARAM_INT:
$quoted = trim($quoted);
$quoted = (integer) trim($quoted, "'");
break;
default:
break;
}
return $quoted;
}
/**
* @see http://php.net/manual/en/function.pdo-rollback.php
*/
public function rollBack() {
if (!$this->connect(null, array(xPDO::OPT_CONN_MUTABLE => true))) {
return false;
}
return $this->pdo->rollBack();
}
/**
* @see http://php.net/manual/en/function.pdo-setattribute.php
*/
public function setAttribute($attribute, $value) {
if (!$this->connect()) {
return false;
}
return $this->pdo->setAttribute($attribute, $value);
}
/**
* Creates an new xPDOQuery for a specified xPDOObject class.
*
* @param string $class The class to create the xPDOQuery for.
* @param mixed $criteria Any valid xPDO criteria expression.
* @param boolean|integer $cacheFlag Indicates if the result should be cached
* and optionally for how many seconds (if passed an integer greater than 0).
* @return xPDOQuery The resulting xPDOQuery instance or false if unsuccessful.
*/
public function newQuery($class, $criteria= null, $cacheFlag= true) {
$query= false;
if ($this->loadClass($this->config['dbtype'] . '.xPDOQuery', '', false, true)) {
$xpdoQueryClass= 'xPDOQuery_' . $this->config['dbtype'];
if (!class_exists($xpdoQueryClass, false))
include_once dirname(__FILE__) . '/om/' . $this->config['dbtype'] . '/xpdoquery.class.php';
if ($query= new $xpdoQueryClass($this, $class, $criteria)) {
$query->cacheFlag= $cacheFlag;
}
}
return $query;
}
/**
* Splits a string on a specified character, ignoring escaped content.
*
* @static
* @param string $char A character to split the tag content on.
* @param string $str The string to operate on.
* @param string $escToken A character used to surround escaped content; all
* content within a pair of these tokens will be ignored by the split
* operation.
* @param integer $limit Limit the number of results. Default is 0 which is
* no limit. Note that setting the limit to 1 will only return the content
* up to the first instance of the split character and will discard the
* remainder of the string.
* @return array An array of results from the split operation, or an empty
* array.
*/
public static function escSplit($char, $str, $escToken = '`', $limit = 0) {
$split= array();
$charPos = strpos($str, $char);
if ($charPos !== false) {
if ($charPos === 0) {
$searchPos = 1;
$startPos = 1;
} else {
$searchPos = 0;
$startPos = 0;
}
$escOpen = false;
$strlen = strlen($str);
for ($i = $startPos; $i <= $strlen; $i++) {
if ($i == $strlen) {
$tmp= trim(substr($str, $searchPos));
if (!empty($tmp)) $split[]= $tmp;
break;
}
if ($str[$i] == $escToken) {
$escOpen = $escOpen == true ? false : true;
continue;
}
if (!$escOpen && $str[$i] == $char) {
$tmp= trim(substr($str, $searchPos, $i - $searchPos));
if (!empty($tmp)) {
$split[]= $tmp;
if ($limit > 0 && count($split) >= $limit) {
break;
}
}
$searchPos = $i + 1;
}
}
} else {
$split[]= trim($str);
}
return $split;
}
/**
* Parses parameter bindings in SQL prepared statements.
*
* @param string $sql A SQL prepared statement to parse bindings in.
* @param array $bindings An array of parameter bindings to use for the replacements.
* @return string The SQL with the binding placeholders replaced.
*/
public function parseBindings($sql, $bindings) {
if (!empty($sql) && !empty($bindings)) {
reset($bindings);
$bound = array();
while (list ($k, $param)= each($bindings)) {
if (!is_array($param)) {
$v= $param;
$type= $this->getPDOType($param);
$bindings[$k]= array(
'value' => $v,
'type' => $type
);
} else {
$v= $param['value'];
$type= $param['type'];
}
if (!$v) {
switch ($type) {
case PDO::PARAM_INT:
$v= '0';
break;
case PDO::PARAM_BOOL:
$v= '0';
break;
default:
break;
}
}
if ($type > 0) {
$v= $this->quote($v, $type);
} else {
$v= 'NULL';
}
if (!is_int($k) || substr($k, 0, 1) === ':') {
$pattern= '/' . $k . '\b/';
$bound[$pattern] = str_replace(array('\\', '$'), array('\\\\', '\$'), $v);
} else {
$pattern = '/(\?)(\b)?/';
$sql = preg_replace($pattern, ':' . $k . '$2', $sql, 1);
$bound['/:' . $k . '\b/'] = str_replace(array('\\', '$'), array('\\\\', '\$'), $v);
}
}
$this->log(xPDO::LOG_LEVEL_INFO, "{$sql}\n" . print_r($bound, true));
if (!empty($bound)) {
$sql= preg_replace(array_keys($bound), array_values($bound), $sql);
}
}
return $sql;
}
/**
* Get the appropriate PDO::PARAM_ type constant from a PHP value.
*
* @param mixed $value Any PHP scalar or null value
* @return int|null
*/
public function getPDOType($value) {
$type= null;
if (is_null($value)) $type= PDO::PARAM_NULL;
elseif (is_scalar($value)) {
if (is_int($value)) $type= PDO::PARAM_INT;
else $type= PDO::PARAM_STR;
}
return $type;
}
}
/**
* Encapsulates a SQL query into a PDOStatement with a set of bindings.
*
* @package xpdo
*
*/
class xPDOCriteria {
public $sql= '';
public $stmt= null;
public $bindings= array ();
public $cacheFlag= false;
/**
* The constructor for a new xPDOCriteria instance.
*
* The constructor optionally prepares provided SQL and/or parameter
* bindings. Setting the bindings via the constructor or with the {@link
* xPDOCriteria::bind()} function allows you to make use of the data object
* caching layer.
*
* The statement will not be prepared immediately if the cacheFlag value is
* true or a positive integer, in order to allow the result to be found in
* the cache before being queried from an actual database connection.
*
* @param xPDO &$xpdo An xPDO instance that will control this criteria.
* @param string $sql The SQL statement.
* @param array $bindings Bindings to bind to the criteria.
* @param boolean|integer $cacheFlag Indicates if the result set from the
* criteria is to be cached (true|false) or optionally a TTL in seconds.
* @return xPDOCriteria
*/
public function __construct(& $xpdo, $sql= '', $bindings= array (), $cacheFlag= false) {
$this->xpdo= & $xpdo;
$this->cacheFlag= $cacheFlag;
if (is_string($sql) && !empty ($sql)) {
$this->sql= $sql;
if ($cacheFlag === false || $cacheFlag < 0) {
$this->stmt= $xpdo->prepare($sql);
}
if (!empty ($bindings)) {
$this->bind($bindings, true, $cacheFlag);
}
}
}
/**
* Binds an array of key/value pairs to the xPDOCriteria prepared statement.
*
* Use this method to bind parameters in a way that makes it possible to
* cache results of previous executions of the criteria or compare the
* criteria to other individual or collections of criteria.
*
* @param array $bindings Bindings to merge with any existing bindings
* defined for this xPDOCriteria instance. Bindings can be simple
* associative array of key-value pairs or the value for each key can
* contain elements titled value, type, and length corresponding to the
* appropriate parameters in the PDOStatement::bindValue() and
* PDOStatement::bindParam() functions.
* @param boolean $byValue Determines if the $bindings are to be bound as
* parameters (by variable reference, the default behavior) or by direct
* value (if true).
* @param boolean|integer $cacheFlag The cacheFlag indicates the cache state
* of the xPDOCriteria object and can be absolutely off (false), absolutely
* on (true), or an integer indicating the number of seconds the result will
* live in the cache.
*/
public function bind($bindings= array (), $byValue= true, $cacheFlag= false) {
if (!empty ($bindings)) {
$this->bindings= array_merge($this->bindings, $bindings);
}
if (is_object($this->stmt) && $this->stmt && !empty ($this->bindings)) {
reset($this->bindings);
while (list ($key, $val)= each($this->bindings)) {
if (is_array($val)) {
$type= isset ($val['type']) ? $val['type'] : PDO::PARAM_STR;
$length= isset ($val['length']) ? $val['length'] : 0;
$value= & $val['value'];
} else {
$value= & $val;
$type= PDO::PARAM_STR;
$length= 0;
}
if (is_int($key)) $key= $key + 1;
if ($byValue) {
$this->stmt->bindValue($key, $value, $type);
} else {
$this->stmt->bindParam($key, $value, $type, $length);
}
}
}
$this->cacheFlag= $cacheFlag === null ? $this->cacheFlag : $cacheFlag;
}
/**
* Compares to see if two xPDOCriteria instances are the same.
*
* @param object $obj A xPDOCriteria object to compare to this one.
* @return boolean true if they are both equal is SQL and bindings, otherwise
* false.
*/
public function equals($obj) {
return (is_object($obj) && $obj instanceof xPDOCriteria && $this->sql === $obj->sql && !array_diff_assoc($this->bindings, $obj->bindings));
}
/**
* Prepares the sql and bindings of this instance into a PDOStatement.
*
* The {@link xPDOCriteria::$sql} attribute must be set in order to prepare
* the statement. You can also pass bindings directly to this function and
* they will be run through {@link xPDOCriteria::bind()} if the statement
* is successfully prepared.
*
* If the {@link xPDOCriteria::$stmt} already exists, it is simply returned.
*
* @param array $bindings Bindings to merge with any existing bindings
* defined for this xPDOCriteria instance. Bindings can be simple
* associative array of key-value pairs or the value for each key can
* contain elements titled value, type, and length corresponding to the
* appropriate parameters in the PDOStatement::bindValue() and
* PDOStatement::bindParam() functions.
* @param boolean $byValue Determines if the $bindings are to be bound as
* parameters (by variable reference, the default behavior) or by direct
* value (if true).
* @param boolean|integer $cacheFlag The cacheFlag indicates the cache state
* of the xPDOCriteria object and can be absolutely off (false), absolutely
* on (true), or an integer indicating the number of seconds the result will
* live in the cache.
* @return PDOStatement The prepared statement, ready to execute.
*/
public function prepare($bindings= array (), $byValue= true, $cacheFlag= null) {
if ($this->stmt === null || !is_object($this->stmt)) {
if (!empty ($this->sql) && $stmt= $this->xpdo->prepare($this->sql)) {
$this->stmt= & $stmt;
$this->bind($bindings, $byValue, $cacheFlag);
}
}
return $this->stmt;
}
/**
* Converts the current xPDOQuery to parsed SQL.
*
* @param bool $parseBindings If true, bindings are parsed locally; otherwise
* they are left in place.
* @return string The parsed SQL query.
*/
public function toSQL($parseBindings = true) {
$sql = $this->sql;
if ($parseBindings && !empty($this->bindings)) {
$sql = $this->xpdo->parseBindings($sql, $this->bindings);
}
return $sql;
}
}
/**
* An iteratable representation of an xPDOObject result set.
*
* Use an xPDOIterator to loop over large result sets and work with one instance
* at a time. This greatly reduces memory usage over loading the entire collection
* of objects into memory at one time. It is also slightly faster.
*
* @package xpdo
*/
class xPDOIterator implements Iterator {
private $xpdo = null;
private $index = 0;
private $current = null;
/** @var null|PDOStatement */
private $stmt = null;
private $class = null;
private $alias = null;
/** @var null|int|str|array|xPDOQuery */
private $criteria = null;
private $criteriaType = 'xPDOQuery';
private $cacheFlag = false;
/**
* Construct a new xPDOIterator instance (do not call directly).
*
* @see xPDO::getIterator()
* @param xPDO &$xpdo A reference to a valid xPDO instance.
* @param array $options An array of options for the iterator.
* @return xPDOIterator An xPDOIterator instance.
*/
function __construct(& $xpdo, array $options= array()) {
$this->xpdo =& $xpdo;
if (isset($options['class'])) {
$this->class = $this->xpdo->loadClass($options['class']);
}
if (isset($options['alias'])) {
$this->alias = $options['alias'];
} else {
$this->alias = $this->class;
}
if (isset($options['cacheFlag'])) {
$this->cacheFlag = $options['cacheFlag'];
}
if (array_key_exists('criteria', $options) && is_object($options['criteria'])) {
$this->criteria = $options['criteria'];
} elseif (!empty($this->class)) {
$criteria = array_key_exists('criteria', $options) ? $options['criteria'] : null;
$this->criteria = $this->xpdo->getCriteria($this->class, $criteria, $this->cacheFlag);
}
if (!empty($this->criteria)) {
$this->criteriaType = $this->xpdo->getCriteriaType($this->criteria);
if ($this->criteriaType === 'xPDOQuery') {
$this->class = $this->criteria->getClass();
$this->alias = $this->criteria->getAlias();
}
}
}
public function rewind() {
$this->index = 0;
if (!empty($this->stmt)) {
$this->stmt->closeCursor();
}
$this->stmt = $this->criteria->prepare();
$tstart = microtime(true);
if ($this->stmt && $this->stmt->execute()) {
$this->xpdo->queryTime += microtime(true) - $tstart;
$this->xpdo->executedQueries++;
$this->fetch();
} elseif ($this->stmt) {
$this->xpdo->queryTime += microtime(true) - $tstart;
$this->xpdo->executedQueries++;
}
}
public function current() {
return $this->current;
}
public function key() {
return $this->index;
}
public function next() {
$this->fetch();
if (!$this->valid()) {
$this->index = null;
} else {
$this->index++;
}
return $this->current();
}
public function valid() {
return ($this->current !== null);
}
/**
* Fetch the next row from the result set and set it as current.
*
* Calls the _loadInstance() method for the specified class, so it properly
* inherits behavior from xPDOObject derivatives.
*/
protected function fetch() {
$row = $this->stmt->fetch(PDO::FETCH_ASSOC);
if (is_array($row) && !empty($row)) {
$this->current = $this->xpdo->call($this->class, '_loadInstance', array(& $this->xpdo, $this->class, $this->alias, $row));
} else {
$this->current = null;
}
}
}
/**
* Represents a unique PDO connection managed by xPDO.
*
* @package xpdo
*/
class xPDOConnection {
/**
* @var xPDO A reference to a valid xPDO instance.
*/
public $xpdo = null;
/**
* @var array An array of configuration options for this connection.
*/
public $config = array();
/**
* @var PDO The PDO object represented by the xPDOConnection instance.
*/
public $pdo = null;
/**
* @var boolean Indicates if this connection can be written to.
*/
private $_mutable = true;
/**
* Construct a new xPDOConnection instance.
*
* @param xPDO $xpdo A reference to a valid xPDO instance to attach to.
* @param string $dsn A string representing the DSN connection string.
* @param string $username The database username credentials.
* @param string $password The database password credentials.
* @param array $options An array of xPDO options for the connection.
* @param array $driverOptions An array of PDO driver options for the connection.
*/
public function __construct(xPDO &$xpdo, $dsn, $username= '', $password= '', $options= array(), $driverOptions= array()) {
$this->xpdo =& $xpdo;
if (is_array($this->xpdo->config)) $options= array_merge($this->xpdo->config, $options);
if (!isset($options[xPDO::OPT_TABLE_PREFIX])) $options[xPDO::OPT_TABLE_PREFIX]= '';
$this->config= array_merge($options, xPDO::parseDSN($dsn));
$this->config['dsn']= $dsn;
$this->config['username']= $username;
$this->config['password']= $password;
$driverOptions = is_array($driverOptions) ? $driverOptions : array();
if (array_key_exists('driverOptions', $this->config) && is_array($this->config['driverOptions'])) {
$driverOptions = array_merge($this->config['driverOptions'], $driverOptions);
}
$this->config['driverOptions']= $driverOptions;
if (array_key_exists(xPDO::OPT_CONN_MUTABLE, $this->config)) {
$this->_mutable= (boolean) $this->config[xPDO::OPT_CONN_MUTABLE];
}
}
/**
* Indicates if the connection can be written to, e.g. INSERT/UPDATE/DELETE.
*
* @return bool True if the connection can be written to.
*/
public function isMutable() {
return $this->_mutable;
}
/**
* Actually make a connection for this instance via PDO.
*
* @param array $driverOptions An array of PDO driver options for the connection.
* @return bool True if a successful connection is made.
*/
public function connect($driverOptions = array()) {
if ($this->pdo === null) {
if (is_array($driverOptions) && !empty($driverOptions)) {
$this->config['driverOptions']= array_merge($this->config['driverOptions'], $driverOptions);
}
try {
$this->pdo= new PDO($this->config['dsn'], $this->config['username'], $this->config['password'], $this->config['driverOptions']);
} catch (PDOException $xe) {
$this->xpdo->log(xPDO::LOG_LEVEL_ERROR, $xe->getMessage(), '', __METHOD__, __FILE__, __LINE__);
return false;
} catch (Exception $e) {
$this->xpdo->log(xPDO::LOG_LEVEL_ERROR, $e->getMessage(), '', __METHOD__, __FILE__, __LINE__);
return false;
}
$connected= (is_object($this->pdo));
if ($connected) {
$connectFile = XPDO_CORE_PATH . 'om/' . $this->config['dbtype'] . '/connect.inc.php';
if (!empty($this->config['connect_file']) && file_exists($this->config['connect_file'])) {
$connectFile = $this->config['connect_file'];
}
if (file_exists($connectFile)) include ($connectFile);
}
if (!$connected) {
$this->pdo= null;
}
}
$connected= is_object($this->pdo);
return $connected;
}
/**
* Get an option set for this xPDOConnection instance.
*
* @param string $key The option key to get a value for.
* @param array|null $options An optional array of options to consider.
* @param mixed $default A default value to use if the option is not found.
* @return mixed The option value.
*/
public function getOption($key, $options = null, $default = null) {
if (is_array($options)) {
$options = array_merge($this->config, $options);
} else {
$options = $this->config;
}
return $this->xpdo->getOption($key, $options, $default);
}
}
/**
* A basic class for xPDO Exceptions.
*/
class xPDOException extends Exception {}
PK !
notes.txtnu [ 1) Do not delete [[site_name]] from table [[dbprefix]]site_content, keep as it is added to show some content on enduser page. (Not needed since 2.5.0-pl since default content is added by default)
2) The password encryption method has been changed so 3 files 'modhashing.class.php', 'modpbkdf2.class.php' and 'xpdo.class.php' are included in the install.php ( This files are not required in install.php from 2.7.0 but we need it for edit.php)
3) Do not change this files 'modhashing.class.php', 'modpbkdf2.class.php', 'xpdo.class.php'.
4) Do not change "background-image: url(data:image/png;base64," in table [[dbprefix]]site_templates since these are images encoded in base64. Let it be as it is. Since 2.5.0pl.
5) PHP REQUIREMENT LINK: https://modx.com/download and /core/vendor/composer/platform_check.php(Composer Dependencies require PHP 7.4.0)
6) Give writable permission to manager and root folder to check config.core.php changes.
7)Before MySQL 5.6 Full-Text table type is supported only with MyISAM Engine(Full-Text table type required by MODX), hence removed the innodb engine, default engine will be assigned automatically
8) Languages have been removed since 3.0.1-pl User needs to change languages from Toggle option from admin menu.
https://docs.modx.com/3.x/en/getting-started/upgrading-to-3.0/manager-language
9) Check and Move /manager/assets/ext3/adapter/jquery/ext-jquery-adapter-debug.js /manager/assets/ext3/adapter/prototype/ext-prototype-adapter-debug.js /manager/assets/ext3/adapter/yui/ext-yui-adapter-debug.js manual to original zip.PK ! ,; images/modx.pngnu [ PNG
IHDR tEXtSoftware Adobe ImageReadyqe<