<?php
/**
* @package HikaShop for Joomla!
* @version 1.4.3
* @author hikashop.com
* @copyright (C) 2010 HIKARI SOFTWARE. All rights reserved.
* @license GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
*/
defined('_JEXEC') or die('Restricted access');
?>
<?php
class hikashopZoneClass extends hikashopClass{
var $tables = array('zone_link','zone_link','zone');
var $pkeys = array('','','zone_id');
var $namekeys = array('zone_parent_namekey','zone_child_namekey','zone_namekey');
var $deleteToggle = array('zone_link'=>array('zone_parent_namekey','zone_child_namekey'));
var $toggle = array('zone_published'=>'zone_id');
function saveForm(){
$zone = null;
$zone->zone_id = hikashop::getCID('zone_id');
$formData = JRequest::getVar( 'data', array(), '', 'array' );
$status = false;
if(!empty($formData['zone'])){
foreach($formData['zone'] as $column => $value){
hikashop::secureField($column);
$zone->$column = strip_tags($value);
}
$status = $this->save($zone);
if(!$status){
JRequest::setVar( 'fail', $zone );
$app =& JFactory::getApplication();
$app->enqueueMessage(JText::_( 'DUPLICATE_ZONE' ), 'error');
}
}
return $status;
}
function getZoneParents($zone_id,$already=array()){
if(!is_array($zone_id)){
if(is_numeric($zone_id)){
$zone = $this->get($zone_id);
if($zone){
$zone_id = $zone->zone_namekey;
}
}
$zone_id = array($zone_id);
}
$quoted = array();
foreach($zone_id as $zone){
$quoted[]=$this->database->Quote($zone);
}
$query = 'SELECT a.zone_parent_namekey FROM '.hikashop::table('zone_link').' AS a WHERE a.zone_child_namekey IN ('.implode(',',$quoted).');';
$this->database->setQuery($query);
$parents = $this->database->loadResultArray();
$results = array();
foreach($zone_id as $z){
$results[$z]=$z;
}
if(!empty($parents)){
$getParents = array();
foreach($parents as $p){
if(!isset($already[$p])){
$getParents[]=$p;
}
$results[$p]=$p;
}
if(!empty($getParents)){
$grandparents = $this->getZoneParents($getParents,$results);
foreach($grandparents as $gp){
$results[$gp]=$gp;
}
}
}
return $results;
}
function getZoneCurrency($zone_id){
$zone = $this->get($zone_id);
$already = array($zone->zone_namekey);
$childs = array($zone->zone_namekey);
if(empty($zone->zone_currency_id)){
while(!empty($childs)){
$quoted = array();
foreach($childs as $z){
$quoted[]=$this->database->Quote($z);
}
$query = 'SELECT b.* FROM '.hikashop::table('zone_link').' AS a LEFT JOIN '.hikashop::table('zone').' AS b ON a.zone_parent_namekey=b.zone_namekey WHERE a.zone_child_namekey IN ('.implode(',',$quoted).');';
$this->database->setQuery($query);
$parents = $this->database->loadObjectList();
$childs = array();
if(!empty($parents)){
foreach($parents as $parent){
if(in_array($parent->zone_namekey,$already)) continue;
if(!empty($parent->zone_currency_id)){
return (int)$parent->zone_currency_id;
}
$childs[]=$parent->zone_namekey;
$already[]=$parent->zone_namekey;
}
}
}
}
return (int)$zone->zone_currency_id;
}
function getOrderZones(&$order){
$field = 'address_country';
$fieldClass = hikashop::get('class.field');
$fields = $fieldClass->getData('frontcomp','address');
if(in_array('address_state',array_keys($fields)) && !empty($order->shipping_address) && !empty($order->shipping_address->address_state)){
$field='address_state';
}
if(empty($order->shipping_address) || empty($order->shipping_address->$field)){
$zones = $this->getZoneParents(hikashop::getZone());
}else{
$zones =& $order->shipping_address->$field;
if(!is_array($zones)){
$zones=array($zones);
}
}
return $zones;
}
function getNamekey($element){
return $element->zone_type.'_'.preg_replace('#[^a-z_]#i','',$element->zone_name_english).'_'.rand();
}
function addChilds($mainNamekey,$childNamekeys){
if(empty($mainNamekey)) return null;
if(empty($childNamekeys)) return null;
$NamekeysString = '';
if(is_numeric($mainNamekey)){
foreach($childNamekeys as $childNamekey){
$NamekeysString .= $this->database->Quote($childNamekey).',';
}
$NamekeysString .= $this->database->Quote($mainNamekey).',';
$query = 'SELECT zone_id,zone_namekey FROM '.hikashop::table('zone').' WHERE zone_id IN ('.rtrim($NamekeysString,',').')';
$this->database->setQuery($query);
$zones = $this->database->loadObjectList('zone_id');
$newChildNamekeys = array();
foreach($childNamekeys as $childNamekey){
$newNamekey = $zones[$childNamekey]->zone_namekey;
$NamekeysString .= $this->database->Quote($newNamekey).',';
$newChildNamekeys[] = $newNamekey;
}
$mainNamekey = $zones[$mainNamekey]->zone_namekey;
$childNamekeys = $newChildNamekeys;
}else{
foreach($childNamekeys as $childNamekey){
$NamekeysString .= $this->database->Quote($childNamekey).',';
}
}
$query = 'SELECT zone_child_namekey FROM '.hikashop::table('zone_link').' WHERE zone_parent_namekey = '.$this->database->Quote($mainNamekey).' AND zone_child_namekey IN ('.rtrim($NamekeysString,',').') LIMIT 1';
$this->database->setQuery($query);
$alreadyChild = $this->database->loadResultArray();
$toInsertNamekeys = array();
foreach($childNamekeys as $childNamekey){
if(!in_array($childNamekey,$alreadyChild))$toInsertNamekeys[]=$childNamekey;
}
if(empty($toInsertNamekeys)) return null;
$query = 'INSERT IGNORE INTO '.hikashop::table('zone_link').' (zone_parent_namekey,zone_child_namekey) VALUES ';
foreach($toInsertNamekeys as $childNamekey){
$query.='('.$this->database->Quote($mainNamekey).','.$this->database->Quote($childNamekey).'),';
}
$this->database->setQuery(rtrim($query,',').';');
$this->database->query();
return $toInsertNamekeys;
}
}