ÿØÿà JFIF    ÿÛ „  ( %"1!%)+...383,7(-.+  -+++--++++---+-+-----+---------------+---+-++7-----ÿÀ  ß â" ÿÄ     ÿÄ H    !1AQaq"‘¡2B±ÁÑð#R“Ò Tbr‚²á3csƒ’ÂñDS¢³$CÿÄ   ÿÄ %  !1AQa"23‘ÿÚ   ? ôÿ ¨pŸªáÿ —åYõõ\?àÒü©ŠÄï¨pŸªáÿ —åYõõ\?àÓü©ŠÄá 0Ÿªáÿ Ÿå[úƒ ú®ði~TÁbqÐ8OÕpÿ ƒOò¤Oè`–RÂáœá™êi€ßÉ< FtŸI“öÌ8úDf´°å}“¾œ6  öFá°y¥jñÇh†ˆ¢ã/ÃÐ:ªcÈ "Y¡ðÑl>ÿ ”ÏËte:qž\oäŠe÷󲍷˜HT4&ÿ ÓÐü6ö®¿øþßèô Ÿ•7Ñi’•j|“ñì>b…þS?*Óôÿ ÓÐü*h¥£ír¶ü UãS炟[AÐaè[ûª•õ&õj?†Éö+EzP—WeÒírJFt ‘BŒ†Ï‡%#tE Øz ¥OÛ«!1›üä±Í™%ºÍãö]°î(–:@<‹ŒÊö×òÆt¦ãº+‡¦%ÌÁ²h´OƒJŒtMÜ>ÀÜÊw3Y´•牋4ǍýʏTì>œú=Íwhyë,¾Ôò×õ¿ßÊa»«þˆѪQ|%6ž™A õ%:øj<>É—ÿ Å_ˆCbõ¥š±ý¯Ýƒï…¶|RëócÍf溪“t.СøTÿ *Ä¿-{†çàczůŽ_–^XþŒ±miB[X±d 1,é”zEù»& î9gœf™9Ð'.;—™i}!ôšåîqêÛ٤ёý£½ÆA–àôe"A$˝Úsäÿ ÷Û #°xŸëí(l »ý3—¥5m! rt`†0~'j2(]S¦¦kv,ÚÇ l¦øJA£Šƒ J3E8ÙiŽ:cÉžúeZ°€¯\®kÖ(79«Ž:¯X”¾³Š&¡* ….‰Ž(ÜíŸ2¥ª‡×Hi²TF¤ò[¨íÈRëÉ䢍mgÑ.Ÿ<öäS0í„ǹÁU´f#Vß;Õ–…P@3ío<ä-±»Ž.L|kªÀê›fÂ6@»eu‚|ÓaÞÆŸ…¨ááå>åŠ?cKü6ùTÍÆ”†sĤÚ;H2RÚ†õ\Ö·Ÿn'¾ ñ#ºI¤Å´%çÁ­‚â7›‹qT3Iï¨ÖÚ5I7Ë!ÅOóŸ¶øÝñØôת¦$Tcö‘[«Ö³šÒ';Aþ ¸èíg A2Z"i¸vdÄ÷.iõ®§)¿]¤À†–‡É&ä{V¶iŽ”.Ó×Õÿ û?h¬Mt–íª[ÿ Ñÿ ÌV(í}=ibÔ¡›¥¢±b Lô¥‡piη_Z<‡z§èŒ)iÖwiÇ 2hÙ3·=’d÷8éŽ1¦¸c¤µ€7›7Ø ð\á)} ¹fËí›pAÃL%âc2 í§æQz¿;T8sæ°qø)QFMð‰XŒÂ±N¢aF¨…8¯!U  Z©RÊ ÖPVÄÀÍin™Ì-GˆªÅËŠ›•zË}º±ŽÍFò¹}Uw×#ä5B¤{î}Ð<ÙD é©¤&‡ïDbàÁôMÁ." ¤‡ú*õ'VŽ|¼´Úgllº¼klz[Æüï÷Aób‡Eÿ dÑ»Xx9ÃÜ£ÁT/`¼¸vI±Ýµ·Ë‚“G³þ*Ÿû´r|*}<¨îºœ @¦mÄ’M¹”.œ«Y–|6ÏU¤jç¥ÕÞqO ˜kDÆÁ¨5ÿ š;ÐЦ¦€GÙk \ –Þ=â¼=SͧµªS°ÚÍpÜãQűÀõ¬?ÃÁ1Ñ•õZà?hóœ€ L¦l{Y*K˜Ù›zc˜–ˆâ ø+¾ ­-Ök¥%ùEÜA'}ˆ><ÊIè“bpÍ/qÞâvoX€w,\úªò6Z[XdÒæ­@Ö—€$òJí#é>'°Ú ôª˜<)4ryÙ£|óAÅn5žêŸyÒäMÝ2{"}‰–¤l÷ûWX\l¾Á¸góÉOÔ /óñB¤f¸çñ[.P˜ZsÊË*ßT܈§QN¢’¡¨§V¼(Üù*eÕ“”5T¨‹Âê¥FŒã½Dü[8'Ò¥a…Ú¶k7a *•›¼'Ò·\8¨ª\@\õ¢¦íq+DÙrmÎ…_ªæ»ŠÓœ¡¯’Ré9MÅ×D™lælffc+ŒÑ,ý™ÿ ¯þǤ=Å’Á7µ÷ÚÛ/“Ü€ñýã¼àí¾ÕÑ+ƒ,uµMâÀÄbm:ÒÎPæ{˜Gz[ƒ¯«® KHà`ߨŠéí¯P8Aq.C‰ à€kòpj´kN¶qô€…Õ,ÜNŠª-­{Zö’æû44‰sŽè‰îVíRœÕm" 6?³D9¡ÇTíÅꋇ`4«¸ÝÁô ï’ýorqКÇZ«x4Žâéþuïf¹µö[P ,Q£éaX±`PÉÍZ ¸äYúg üAx ’6Lê‚xÝÓ*äQ  Ï’¨hÍ =²,6ï#rÃ<¯–£»ƒ‹,–ê•€ aÛsñ'%Æ"®ÛüìBᝠHÚ3ß°©$“XnœÖ’î2ËTeûìxîß ¦å¿çÉ ðK§þ{‘t‚Ϋ¬jéîZ[ ”š7L¥4VÚCE×]m¤Øy”ä4-dz£œ§¸x.*ãÊÊ b÷•h:©‡¦s`BTÁRû¾g⻩‹jø sF¢àJøFl‘È•Xᓁà~*j¯ +(ÚÕ6-£¯÷GŠØy‚<Ç’.F‹Hœw(+)ÜÜâÈzÄäT§FߘãÏ;DmVœ3Àu@mÚüXÝü•3B¨òÌÁÛ<·ÃÜ z,Ì@õÅ·d2]ü8s÷IôÞ¯^Ç9¢u„~ëAŸï4«M? K]­ÅàPl@s_ p:°¬ZR”´›JC[CS.h‹ƒïËœ«Æ]–÷ó‚wR×k7X‰k›‘´ù¦=¡«‰¨¨Â')—71ó’c‡Ðúµ `é.{§p¹ój\Ž{1h{o±Ý=áUÊïGÖŒõ–-BÄm+AZX¶¡ ïHðæ¥JmÙ;…䡟ˆ¦ ° äšiÉg«$üMk5¤L“’çÊvïâï ,=f“"íἊ5ô¬x6{ɏžID0e¸vçmi'︧ºð9$ò¹÷*£’9ÿ ²TÔ…×>JV¥}Œ}$p[bÔ®*[jzS*8 ”·T›Í–ñUîƒwo$áè=LT™ç—~ô·¤ÈÚ$榍q‰„+´kFm)ž‹©i–ËqÞŠ‰à¶ü( ‚•§ •°ò·‡#5ª•µÊ﯅¡X¨šÁ*F#TXJÊ ušJVÍ&=iÄs1‚3•'fý§5Ñ<=[íÞ­ PÚ;ѱÌ_~Ä££8rÞ ²w;’hDT°>ÈG¬8Á²ÚzŽ®ò®qZcqJêäÞ-ö[ܘbň±çb“ж31²n×iƒðÕ;1¶þÉ ªX‰,ßqÏ$>•î íZ¥Z 1{ç൵+ƒÕµ¥°T$§K]á»Ûï*·¤tMI’ÂZbŽÕiÒ˜}bÓ0£ª5›¨ [5Ž^ÝœWøÂÝh° ¢OWun£¤5 a2Z.G2³YL]jåtì”ä ÁÓ‘%"©<Ôúʰsº UZvä‡ÄiÆÒM .÷V·™ø#kèýiíÌ–ª)µT[)BˆõÑ xB¾B€ÖT¨.¥~ð@VĶr#¸ü*åZNDŽH;âi ],©£öØpù(šºãö¼T.uCê•4@ÿ GÕÛ)Cx›®0ø#:ÏðFÒbR\(€€Ä®fã4Þ‰Fä¯HXƒÅ,†öEÑÔÜ]Öv²?tLÃvBY£ú6Êu5ÅAQ³1‘’¬x–HŒÐ‡ ^ ¸KwJôÖŽ5×CÚ¨vÜ«/B0$×k°=ðbÇ(Ï)w±A†Á† 11Í=èQšµ626ŒÜ/`G«µ<}—-Ö7KEHÈÉðóȤmݱû±·ø«Snmá=“䫚mݱŸ¡¶~ó·“äUóJæúòB|E LêŽy´jDÔ$G¢þÐñ7óR8ýÒ…Ç› WVe#·Ÿ p·Fx~•ݤF÷0Èÿ K¯æS<6’¡WШ; ´ÿ ¥Êø\Òuî†åÝ–VNœkÒ7oòX¨Á­Ø÷FÎÑä±g÷ÿ M~Çî=p,X´ ÝÌÚÅ‹’ÃjÖ.ØöÏñ qïQ¤ÓZE†° =6·]܈ s¸>v•Ž^Ý\wq9r‰Î\¸¡kURÒ$­*‹Nq?Þª*!sŠÆ:TU_u±T+øX¡ ®¹¡,ÄâÃBTsÜ$Ø›4m椴zÜK]’’›Pƒ @€#â˜`é¹=I‡fiV•Ôî“nRm+µFPOhÍ0B£ €+¬5c v•:P'ÒyÎ ‰V~‚Ó†ÖuókDoh$å\*ö%Ю=£«…aȼ½÷Û.-½VŒŠ¼'lyî±1¬3ó#ÞE¿ÔS¤gV£m›=§\û"—WU¤ÚǼÿ ÂnÁGŒÃ ‚õN D³õNÚíŒÕ;HôyÄÈ©P¹Ä{:?R‘Ô¨âF÷ø£bÅó® JS|‚R÷ivýáâ€Æé¡è³´IئÑT!§˜•ت‚¬â@q€wnïCWÄ@JU€ê¯m6]Ï:£âx'+ÒðXvÓ¦Úm=–´7œ $ì“B£~p%ÕŸUþ« N@¼üï~w˜ñø5®—'Ôe»¤5ã//€ž~‰Tþ›Å7•#¤× Íö pÄ$ùeåì*«ÓŠEØWEÈsßg ¦ûvžSsLpºÊW–âµEWöˬH; ™!CYõZ ÃÄf æ#1W. \uWâ\,\Çf j’<qTbên›Î[vxx£ë 'ö¨1›˜ÀM¼Pÿ H)ƒêêŒA7s,|F“ 꺸k³9Ìö*ç®;Ö!Ö$Eiž•¹ÒÚ†ýóéÝû¾ÕS®ó$’NÝäŸz¤5r¦ãÄÃD÷Üø!°ø‡Ô&@m™Ì^Ãä­d q5Lnÿ N;.6½·N|#ä"1Nƒx“ã<3('&ñßt  ~ªu”1Tb㫨9ê–›–bìd$ߣ=#ÕãÒmU¯eí$EFù5ýYô櫨æì™Ç—±ssM]·á¿0ÕåJRÓªîiƒ+O58ÖñªŠÒx" \µâá¨i’¤i —Ö ” M+M¤ë9‚‰A¦°Qõ¾ßøK~¼Ã‘g…Ö´~÷Ï[3GUœÒ½#…kàÔ®Ò”‰³·dWV‰IP‰Ú8u¹”E ÖqLj¾êÕCBš{A^Âß;–¨`¯¬ìö ˼ ×tìø.tƐm*n¨y4o&Àx¥n¦×î‡aupáÛj8¿m›è¶ã!o½;ß0y^ý×^EÑ¿ÒjzŒ­)vÚÑnÄL …^ªô× ‡—‚3k Îý­hï]içå–îÏ*÷ñþ»Ô CÒjøjÍznˆ´ ¹#b'Fô‹ ‰v¥'’à'T´ƒHýÍ%M‰ ƒ&ÆÇŒï1 ‘ –Þ ‰i¬s žR-Ÿ kЬá¬7:þ 0ŒÅÒÕ/aÙ¬ÃÝ#Úøœ ©aiVc‰. ¹¦ãµ” ›Yg¦›ÆÎýº°f³7ƒhá·¸­}&D9¡ÂsÉÙÞèŠõØàC™¨ñbFC|´Ü(ŸƒÚÒ-%»'a Ì¿)ËÇn¿úÿ ÞŽX…4ÊÅH^ôΑí@ù¹Eh¶“L8Çjù ¼ÎåVªóR©Ï5uà V4lZß®=€xÖŸ–ÑÈ ÷”¨°¾__yM1tÉ?uÆþIkÄgæ@þ[¢†°XÃJ£j·:nkÅ¢u ‘}âGzö­/IµèЬ¼48q¦F°ŽR¼=ûì{´¯RýicS ÕÛ íNtÍÙï£,w4rêì®»~x(©Uñ§#Ñ&œÕ¤>ÎåÍÓ9’Ö{9eV­[Öjâ²ãu]˜å2›qÑšÕJç0€sÄ|Êëè0튔bÁ>“{×_F`Ø©ºê:µä,v¤ðfc1±"«ÔÍän1#=· Âøv~H½ÐßA¾¿Ü€Óš]Õ; I¾÷ç‚Qi†î¹9ywÔKG˜áñ zQY—§ÃÕZ07§X‚ Áh;ÁM)iÌCH-¯T‘ë|A0{Ò½LÚ–TâÖkÜ’dÀ“rmm»”جPF³ÖcbE§T€ÒxKºû’Ó®7±²(\4ŽÃ¸Uu@j™yĵ;³µ!Á¢b.W¤=mõ´êµK k ¸K^ÜÛ#p*Ü14qkZç5ïë †°5Ï%ÍÛ<Õ¤×Ô¥ê†C Õ´¼ú$ƒÖ“”]Ù¬qÞÚ[4©ý!ûÏ—Áb쳐XµA¬â~`›Çr¸8ìùÝ䫦<>ä÷«?xs´ÇÑ /á;¹øüÊÈÙà{"@Žïzâ¬[âß‚ U_<ÇŸ½4èN˜ú61®qŠu ¦þF£»äJ_ˆÙÎ~ ÞAã–݄ϗrŠD;xTž‘ô`É«…suãO`?³à™ô Lý#Íc5öoæØ‚y´´÷«ZR§<&JÇ+éâô´€i!Àˆ0æAoàðLèÖ-2ŸõW.’t^–(KÁmHµV@xÜÇy®Ñø­â^:Ú3w· 7½¹°ñ¸â¹®:',«Mœ—n­Á+Ãbš LÈ‘ÄnRÓÅœ%¦²‰¨ùQ:¤f‚ "PÕtô¸…cæl…&˜Ú˜Ôkv‹ž+vŠ,=¢v­6—Xy*¥t£«<™:“aîϲ=¦6rO]XI¿Œ÷¤zÚ­›¶ 6÷”w\d ü~v®ˆÌk«^m<ÿ ¢‰Õ\)ùºŽ;… lîÙÅEŠ®cѾ@vnMÏ,¼“ñ•ŽBxðÃzãÇç%3ˆ"}Ù•Åî> BÉú;Ò]V+P˜F_´ßé> Øše|ï‡ÄOmFæÇ ãqÞ$/xÐx­z`ï9"œÜij‚!7.\Td…9M‡•iŽ‹¾‘50ÞŽn¥ß4ÉôO ¹*í^QêËÜÇÌ8=ާs‰'ÂëÙ«á%Pú[O †ÅP¯Vsް.‰,kc¶ ¬A9n˜XÎ-ÞšN["¹QÕ‰ƒMýÁߺXJæÍaLj¾×Ãmã¾ãÚ uñÒþåQô¦¥ /ÄUx:‚ÍÜ’ Đ©ØÝ3V¨‰ÕnÐ6ó*óúK­«…c ¯U òhsý­jóÔj#,ímŒRµ«lbïUTŒÑ8†Ä0œÏr`ð¡¬É Ї ë"À² ™ 6¥ f¶ ¢ÚoܱԷ-<Àî)†a¶ž'Ú»¨TXqØæ¶÷YÄHy˜9ÈIW­YÀuMFë ºÏ’AqÌ4·/Ú †ô'i$øä­=Ä Ý|öK×40è|È6p‘0§)o¥ctî§H+CA-“ xØ|ÐXАç l8íºð3Ø:³¤¬KX¯UÿÙ attributes()->type != $type ) { return; } if ( $type == 'joomla_menu' ) { $item = JTable::getInstance( 'menutype' ); } elseif ( $type == 'joomla_menuitem' ) { $item = JTable::getInstance( 'menu' ); } elseif ( $type == 'joomla_category' ) { $item = JTable::getInstance( 'category' ); } else { return; } $root = $xml->{$type}; foreach ( $item as $k => $v ) { if ( isset( $root->{$k} ) ) { $item->$k = (string)$root->{$k}; } } // Store $call = 'beforeImport'.$type; $pk = self::$call( $type, $item, $data, $config ); if ( $pk ) { continue; } $item->check(); $item->store(); $call = 'afterImport'.$type; self::$call( $type, $item, $xml, $data ); } } // importElements public static function importElements( $elemtype, $path, $items, &$data, $config = array() ) { require_once JPATH_ADMINISTRATOR.'/components/'.CCK_COM.'/tables/'.$elemtype.'.php'; if ( count( $items ) ) { foreach ( $items as $item ) { CCK_Import::importElement( $elemtype, $path.$item, $data, $config ); } } } // importElement public static function importElement( $elemtype, $path, &$data, $config = array() ) { $xml = JCckDev::fromXML( $path ); if ( !$xml || (string)$xml->attributes()->type != $elemtype.'s' ) { return; } $item = JTable::getInstance( 'Table'.$elemtype, 'CCK_' ); $root = $xml->{$elemtype}; foreach ( $item as $k => $v ) { if ( isset( $root->{$k} ) ) { $item->$k = (string)$root->{$k}; } } if ( ! ( isset( $item->name ) && $item->name != '' ) ) { return; } // Folder if ( isset( $item->folder ) ) { $idx = $item->folder; if ( isset( $data['folders2'][$idx] ) ) { $item->folder = $data['folders2'][$idx]->id; } elseif ( isset( $data['folders'][$idx] ) ) { $item->folder = $data['folders'][$idx]->id; } else { $item->folder = 7; } } // Store $call = 'beforeImport'.$elemtype; $pk = self::$call( $elemtype, $item, $data, $config ); if ( $pk != -1 ) { if ( $pk > 0 ) { $item->id = $pk; } $item->store(); $call = 'afterImport'.$elemtype; self::$call( $xml, $elemtype, $item, $data ); } } // beforeImportFolder public static function beforeImportFolder( $elemtype, &$item, $data, $config = array() ) { if ( isset( $item->parent_id ) ) { $idx = $item->parent_id; if ( isset( $item->path ) && isset( $data['folders2'][$idx] ) ) { $item->parent_id = $data['folders2'][$idx]->id; } elseif ( isset( $data['folders'][$idx] ) ) { $item->parent_id = $data['folders'][$idx]->id; } else { $item->parent_id = 7; } } return JCckDatabase::loadResult( 'SELECT id FROM #__cck_core_'.$elemtype.'s WHERE name = "'.(string)$item->name.'"' ); } // afterImportFolder public static function afterImportFolder( &$xml, $elemtype, $item, &$data ) { $acl = (string)$xml->acl; if ( $acl ) { JCckDatabase::execute( 'UPDATE #__assets SET rules = "'.JFactory::getDbo()->escape( $acl ).'" WHERE name = "com_cck.folder.'.$item->id.'"' ); } Helper_Folder::rebuildTree( 2, 1 ); if ( !$item->path ) { Helper_Folder::rebuildBranch( $item->id ); $item->path = JCckDatabase::loadResult( 'SELECT a.path FROM #__cck_core_folders AS a WHERE a.id = '.(int)$item->id ); } if ( !isset( $data['folders2'][$item->path] ) ) { $data['folders'][$item->name] = new stdClass; $data['folders'][$item->name]->id = $item->id; $data['folders'][$item->name]->name = $item->name; $data['folders2'][$item->path] = new stdClass; $data['folders2'][$item->path]->id = $item->id; $data['folders2'][$item->path]->path = $item->path; } } // beforeImportField public static function beforeImportField( $elemtype, &$item, $data, $config = array() ) { $pk = JCckDatabase::loadResult( 'SELECT id FROM #__cck_core_'.$elemtype.'s WHERE name = "'.(string)$item->name.'"' ); if ( $pk > 0 && $config['isApp'] && $config['isUpgrade'] && $item->storage != 'dev' ) { return -1; } if ( file_exists( JPATH_SITE.'/plugins/cck_field/'.$item->type.'/classes/app.php' ) ) { require_once JPATH_SITE.'/plugins/cck_field/'.$item->type.'/classes/app.php'; JCck::callFunc_Array( 'plgCCK_Field'.$item->type.'_App', 'onCCK_FieldImportField', array( &$item, $data ) ); } return $pk; } // afterImportField public static function afterImportField( &$xml, $elemtype, $item, &$data ) { } // beforeImportTemplate public static function beforeImportTemplate( $elemtype, &$item, $data, $config = array() ) { return JCckDatabase::loadResult( 'SELECT id FROM #__cck_core_'.$elemtype.'s WHERE name = "'.(string)$item->name.'"' ); } // afterImportTemplate public static function afterImportTemplate( &$xml, $elemtype, $item, &$data ) { } // beforeImportType public static function beforeImportType( $elemtype, &$item, $data, $config = array() ) { $pk = JCckDatabase::loadResult( 'SELECT id FROM #__cck_core_'.$elemtype.'s WHERE name = "'.(string)$item->name.'"' ); if ( $pk > 0 && $config['isApp'] && $config['isUpgrade'] ) { return -1; } self::_setStyle( array( 'admin', 'site', 'intro', 'content' ), $item, $data ); return $pk; } // afterImportType public static function afterImportType( &$xml, $elemtype, $item, &$data ) { JCckDatabase::execute( 'DELETE IGNORE a.*, b.* FROM #__cck_core_'.$elemtype.'_field AS a' . ' LEFT JOIN #__cck_core_'.$elemtype.'_position AS b ON b.'.$elemtype.'id = a.'.$elemtype.'id' . ' WHERE a.'.$elemtype.'id = '.(int)$item->id ); $db = JFactory::getDbo(); $acl = (string)$xml->acl; JCckDatabase::execute( 'UPDATE #__assets SET rules = "'.$db->escape( $acl ).'" WHERE name = "com_cck.form.'.$item->id.'"' ); if ( !isset( $data['tables_columns']['#__cck_core_'.$elemtype.'_field'] ) ) { $table = '#__cck_core_'.$elemtype.'_field'; $data['tables_columns'][$table] = $db->getTableColumns( $table ); unset( $data['tables_columns'][$table][$elemtype.'id'] ); unset( $data['tables_columns'][$table]['fieldid'] ); $table = '#__cck_core_'.$elemtype.'_position'; $data['tables_columns'][$table] = $db->getTableColumns( $table ); unset( $data['tables_columns'][$table][$elemtype.'id'] ); unset( $data['tables_columns'][$table]['position'] ); } self::_importJoined( 'field', $xml->fields->children(), $elemtype, $item, $data ); self::_importJoined( 'position', $xml->positions->children(), $elemtype, $item, $data ); } // beforeImportSearch public static function beforeImportSearch( $elemtype, &$item, $data, $config = array() ) { $pk = JCckDatabase::loadResult( 'SELECT id FROM #__cck_core_'.$elemtype.'s WHERE name = "'.(string)$item->name.'"' ); if ( $pk > 0 && $config['isApp'] && $config['isUpgrade'] ) { return -1; } self::_setStyle( array( 'search', 'filter', 'list', 'item' ), $item, $data ); return $pk; } // afterImportSearch public static function afterImportSearch( &$xml, $elemtype, $item, &$data ) { $db = JFactory::getDbo(); JCckDatabase::execute( 'DELETE IGNORE a.*, b.* FROM #__cck_core_'.$elemtype.'_field AS a' . ' LEFT JOIN #__cck_core_'.$elemtype.'_position AS b ON b.'.$elemtype.'id = a.'.$elemtype.'id' . ' WHERE a.'.$elemtype.'id = '.(int)$item->id ); if ( !isset( $data['tables_columns']['#__cck_core_'.$elemtype.'_field'] ) ) { $table = '#__cck_core_'.$elemtype.'_field'; $data['tables_columns'][$table] = $db->getTableColumns( $table ); unset( $data['tables_columns'][$table][$elemtype.'id'] ); unset( $data['tables_columns'][$table]['fieldid'] ); $table = '#__cck_core_'.$elemtype.'_position'; $data['tables_columns'][$table] = $db->getTableColumns( $table ); unset( $data['tables_columns'][$table][$elemtype.'id'] ); unset( $data['tables_columns'][$table]['position'] ); } self::_importJoined( 'field', $xml->fields->children(), $elemtype, $item, $data ); self::_importJoined( 'position', $xml->positions->children(), $elemtype, $item, $data ); } // _importJoined protected static function _importJoined( $type, $joined, $elemtype, $item, &$data ) { $db = JFactory::getDbo(); $str = ''; $table = '#__cck_core_'.$elemtype.'_'.$type; foreach ( $joined as $j ) { $name = (string)$j; if ( $type == 'field' ) { if ( isset( $data['fields'][$name] ) ) { if ( file_exists( JPATH_SITE.'/plugins/cck_field/'.$data['fields'][$name]->type.'/classes/app.php' ) ) { require_once JPATH_SITE.'/plugins/cck_field/'.$data['fields'][$name]->type.'/classes/app.php'; JCck::callFunc_Array( 'plgCCK_Field'.$data['fields'][$name]->type.'_App', 'onCCK_FieldImport'.$elemtype.'_Field', array( $data['fields'][$name], &$j, $data ) ); } $name = $data['fields'][$name]->id; } else { $name = ''; } } if ( $name ) { $str2 = $item->id.', "'.$name.'", '; $attributes = $j->attributes(); if ( (string)$attributes->link != '' ) { if ( file_exists( JPATH_SITE.'/plugins/cck_field_link/'.(string)$attributes->link.'/classes/app.php' ) ) { require_once JPATH_SITE.'/plugins/cck_field_link/'.(string)$attributes->link.'/classes/app.php'; JCck::callFunc_Array( 'plgCCK_Field_Link'.(string)$attributes->link.'_App', 'onCCK_Field_LinkImport'.$elemtype.'_Field', array( $data['fields'][$name], &$attributes, $data ) ); } } foreach ( $data['tables_columns'][$table] as $key=>$val ) { if ( isset( $attributes[$key] ) ) { $str2 .= '"'.$db->escape( (string)$attributes[$key] ).'", '; } else { $str2 .= '"", '; } } if ( $str2 != '' ) { $str2 = substr( trim( $str2 ), 0, -1 ); $str .= '(' . $str2 . '), '; } } } if ( strlen( $str ) > 1 ) { $str = substr( trim( $str ), 0, -1 ); JCckDatabase::execute( 'INSERT INTO '.$table.' VALUES '.$str ); } } // _setStyle protected static function _setStyle( $views, &$item, $data ) { foreach ( $views as $v ) { $e = 'template_'.$v; $t = $item->$e; $s = 0; if ( strpos( $t, '('.$v.')' ) !== false ) { if ( isset( $data['styles']['custom'][$t] ) ) { $s = $data['styles']['custom'][$t]->id; } } else { if ( isset( $data['styles']['default'][$t] ) ) { $s = $data['styles']['default'][$t]->id; } } $item->$e = $s; } } // -------- -------- -------- -------- -------- -------- -------- -------- // Content // beforeImportJoomla_Category public static function beforeImportJoomla_Category( $type, &$table, &$data, $config = array() ) { if ( $config['isApp'] && $config['isUpgrade'] ) { // todo: improve (import only new categories) return -1; } return 0; } // afterImportJoomla_Category public static function afterImportJoomla_Category( $type, &$table, $xml, &$data ) { self::afterImportCategory( $type, $table, $xml, $data ); } // beforeImportJoomla_Menu public static function beforeImportJoomla_Menu( $type, &$table, &$data, $config = array() ) { if ( $config['isApp'] && $config['isUpgrade'] ) { return -1; } return 0; } // afterImportJoomla_Menu public static function afterImportJoomla_Menu( $type, &$table, $xml, &$data ) { } // beforeImportJoomla_MenuItem public static function beforeImportJoomla_MenuItem( $type, &$table, &$data, $config = array() ) { if ( $config['isApp'] && $config['isUpgrade'] ) { return -1; } if ( $table->type == 'component' ) { $table->component_id = JCckDatabase::loadResult( 'SELECT extension_id FROM #__extensions WHERE type = "component" AND element = "'.$table->component_id.'"' ); } if ( $table->level > 1 ) { $table->parent_id = JCckDatabase::loadResult( 'SELECT id FROM #__menu WHERE alias = "'.$table->parent_id.'"' ); } $table->setLocation( $table->parent_id, 'last-child' ); return 0; } // afterImportJoomla_Menu public static function afterImportJoomla_MenuItem( $type, &$table, $xml, &$data ) { $table->rebuildPath( $table->id ); } // -------- -------- -------- -------- -------- -------- -------- -------- // More // importMore public static function importMore( $elemtype, $path, $items, &$data ) { if ( count( $items ) ) { foreach ( $items as $item ) { $xml = JCckDev::fromXML( $path.$item ); if ( !$xml || (string)$xml->attributes()->type != $data['elements'][$elemtype] ) { return; } $root = $xml->{$elemtype}; $call = 'beforeImport'.$elemtype; $table = self::$call( $elemtype, $data ); foreach ( $table as $k => $v ) { if ( isset( $root->{$k} ) ) { $table->$k = (string)$root->{$k}; } } $call = 'afterImport'.$elemtype; self::$call( $elemtype, $table, $xml, $data ); } } } // beforeImportCategory public static function beforeImportCategory( $elemtype, &$data ) { return JTable::getInstance( 'category' ); } // afterImportCategory public static function afterImportCategory( $elemtype, &$table, $xml, &$data ) { $app = ( isset( $xml->app ) ) ? (string)$xml->app : ''; $core = ( $app ) ? JCckDatabase::loadObject( 'SELECT id, pk FROM #__cck_core WHERE app = "'.$app.'"' ) : 0; if ( is_object( $core ) ) { $id = $core->id; $isNew = false; } else { $id = JCckPluginLocation::g_onCCK_Storage_LocationPrepareStore(); $isNew = true; } if ( @$core->pk > 0 ) { $table->id = $core->pk; } $table->description = '::cck::'.$id.'::/cck::
::description::::/description::'; //todo $table->parent_id = ( $data['root_category'] > 0 ) ? $data['root_category'] : 1; $rules = new JAccessRules( '{"core.create":[],"core.delete":[],"core.edit":[],"core.edit.state":[],"core.edit.own":[]}' ); $table->setRules( $rules ); $table->setLocation( $table->parent_id, 'last-child' ); $table->check(); $table->store(); $data['root_category'] = ( $data['root_category'] > 0 ) ? $data['root_category'] : $table->id; $data['categories'][$app] = $table->id; if ( $table->rebuildPath( $table->id ) ) { $table->rebuild( $table->id, $table->lft, $table->level, $table->path ); } if ( $isNew === true ) { $core = JCckTable::getInstance( '#__cck_core', 'id' ); $core->load( $id ); $core->pk = $table->id; $core->cck = 'category'; //todo $core->storage_location = 'joomla_category'; $core->author_id = JCck::getConfig_Param( 'integration_user_default_author', 42 ); //todo $core->parent_id = $table->parent_id; $core->date_time = ''; //todo $core->app = $app; $core->storeIt(); } } // beforeImportTemplate_Style public static function beforeImportTemplate_Style( $elemtype, &$data ) { return JCckTable::getInstance( '#__'.$data['elements'][$elemtype], 'id' ); } // afterImportTemplate_Style public static function afterImportTemplate_Style( $elemtype, &$table, $xml, &$data ) { if ( $table->client_id == '' ) { $table->client_id = 0; } if ( $table->home == '' ) { $table->home = 0; } // Store $pk = JCckDatabase::loadResult( 'SELECT id FROM #__'.$elemtype.'s WHERE template = "'.(string)$table->template.'" AND title = "'.(string)$table->title.'"' ); if ( $pk > 0 ) { $table->id = $pk; } $table->store(); } // -------- -------- -------- -------- -------- -------- -------- -------- // Tables // importProcessings public static function importProcessings( $data ) { $path = $data['root'].'/processings'; $processings = JCckDatabaseCache::loadObjectListArray( 'SELECT id, scriptfile, type FROM #__cck_more_processings WHERE published != -44', 'scriptfile', 'type' ); if ( file_exists( $path ) ) { $files = JFolder::files( $path, '\.xml$' ); if ( count( $files ) ) { foreach ( $files as $file ) { $xml = JCckDev::fromXML( $path.'/'.$file ); if ( !$xml || (string)$xml->attributes()->type != 'processings' ) { break; } $name = (string)$xml->processing->name; $scriptfile = (string)$xml->processing->scriptfile; $state = (string)$xml->processing->published; $type = (string)$xml->processing->type; if ( $name && $scriptfile && $type != '' ) { if ( isset( $processings[$scriptfile] ) ) { if ( isset( $processings[$scriptfile][$type] ) ) { continue; } else { $state = 0; } } $table = JCckTable::getInstance( '#__cck_more_processings' ); $table->name = $name; $table->title = (string)$xml->processing->title; // Folder $idx = (string)$xml->processing->folder; if ( isset( $data['folders2'][$idx] ) ) { $table->folder = $data['folders2'][$idx]->id; } elseif ( isset( $data['folders'][$idx] ) ) { $table->folder = $data['folders'][$idx]->id; } else { $table->folder = 7; } $table->type = $type; $table->description = (string)$xml->processing->description; $table->options = (string)$xml->processing->options; $table->ordering = (string)$xml->processing->ordering; $table->published = $state; $table->scriptfile = $scriptfile; $table->store(); } } } } } // -------- -------- -------- -------- -------- -------- -------- -------- // SQL // importSQL public static function importSQL( $src ) { if ( JFolder::exists( $src ) ) { $db = JFactory::getDbo(); $files = JFolder::files( $src ); foreach ( $files as $file ) { $path = $src.'/'.$file; if ( JFile::exists( $path ) ) { $query = JFile::read( $path ); $db->setQuery( $query ); $db->queryBatch(); } } } } // -------- -------- -------- -------- -------- -------- -------- -------- // Tables // importTables public static function importTables( $data ) { $db = JFactory::getDbo(); $path = $data['root'].'/tables'; if ( file_exists( $path ) ) { $items = JFolder::files( $path, '\.xml$' ); if ( count( $items ) ) { $prefix = JFactory::getConfig()->get( 'dbprefix' ); $tables = array_flip( JCckDatabase::loadColumn( 'SHOW TABLES' ) ); foreach ( $items as $item ) { $xml = JCckDev::fromXML( $path.'/'.$item ); if ( !$xml || (string)$xml->attributes()->type != 'tables' ) { return; } $name = (string)$xml->table->name; $table_key = (string)$xml->table->primary_key; $short = str_replace( '#__', $prefix, $name ); if ( isset( $tables[$short] ) ) { $table = JCckTable::getInstance( $name ); $table_fields = $table->getFields(); $previous = ''; // Fields $fields = $xml->fields->children(); if ( count( $fields ) ) { foreach ( $fields as $field ) { $column = (string)$field; $type = (string)$field->attributes()->type; $default = (string)$field->attributes()->default; if ( !isset( $table_fields[$column] ) ) { $query = 'ALTER TABLE '.$name.' ADD '.JCckDatabase::quoteName( $column ).' '.$type.' NOT NULL'; $query .= ( $default != '' ) ? ' DEFAULT "'.$default.'"' : ''; $query .= ( $previous != '' ) ? ' AFTER '.JCckDatabase::quoteName( $previous ) : ' FIRST'; JCckDatabase::execute( $query ); } else { if ( $type != $table_fields[$column]->Type ) { $query = 'ALTER TABLE '.$name.' CHANGE '.JCckDatabase::quoteName( $column ).' '.JCckDatabase::quoteName( $column ).' '.$type.' NOT NULL'; $query .= ( $default != '' ) ? ' DEFAULT "'.$default.'"' : ''; JCckDatabase::execute( $query ); } } $previous = $column; } } // Indexes $indexes = $xml->indexes->children(); $indexes2 = array(); if ( count( $indexes ) ) { foreach ( $indexes as $index ) { $idx = (string)$index; $indexes2[$idx][(string)$index->attributes()->seq_in_type] = (string)$index->attributes()->column_name; } } if ( count( $indexes2 ) ) { foreach ( $indexes2 as $k=>$v ) { if ( $k == 'PRIMARY' ) { JCckDatabase::execute( 'ALTER TABLE '.$name.' DROP PRIMARY KEY, ADD PRIMARY KEY ( '.implode( ',', $v ).' )' ); } else { // todo } } } } else { $sql_query = ''; // Fields $fields = $xml->fields->children(); if ( count( $fields ) ) { foreach ( $fields as $field ) { $type = (string)$field->attributes()->type; $default = (string)$field->attributes()->default; $sql_query .= ' '.JCckDatabase::quoteName( (string)$field ).' '.$type.' NOT NULL'; if ( $default != '' ) { $sql_query .= ' DEFAULT "'.$default.'"'; } $sql_query .= ','; } } // Indexes $indexes = $xml->indexes->children(); $indexes2 = array(); if ( count( $indexes ) ) { foreach ( $indexes as $index ) { $idx = (string)$index; $indexes2[$idx][(string)$index->attributes()->seq_in_type] = (string)$index->attributes()->column_name; } } if ( count( $indexes2 ) ) { foreach ( $indexes2 as $k=>$v ) { $sql_query .= ( $k == 'PRIMARY' ) ? ' PRIMARY KEY ( '.implode( ',', $v ).' ),' : ' KEY '.$k.' ( '.implode( ',', $v ).' ),'; } } $sql_query = ( $sql_query ) ? substr( $sql_query, 0, -1 ) : ''; JCckDatabase::execute( 'CREATE TABLE IF NOT EXISTS '.$name.' (' . $sql_query . ') ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci;' ); } } } } } } ?>