Пример #1
0
 /**
  *
  * @return shopDimension
  */
 public static function getInstance()
 {
     if (!self::$instance) {
         self::$instance = new self();
     }
     return self::$instance;
 }
 public function execute()
 {
     if (!$this->getUser()->getRights('shop', 'settings')) {
         throw new waRightsException(_w('Access denied'));
     }
     $values = waRequest::post('values');
     if (!$values || !is_array($values)) {
         $values = array();
         $values[] = array('name' => 'test', 'value' => 0);
     }
     $type = null;
     $value_type = waRequest::post('value_type', waRequest::TYPE_STRING, shopFeatureModel::TYPE_VARCHAR);
     if (strpos($value_type, '.')) {
         list($value_type, $type) = explode('.', $value_type, 2);
     }
     foreach ($values as $data) {
         switch ($value_type) {
             case shopFeatureModel::TYPE_DIMENSION:
                 $data['type'] = $type;
                 $this->response[] = shopDimension::getControl($data['name'], $data);
                 break;
             case shopFeatureModel::TYPE_BOOLEAN:
                 $this->response[] = waHtmlControl::getControl(waHtmlControl::CHECKBOX, $data['name'], $data);
                 break;
             default:
                 $this->response[] = waHtmlControl::getControl(waHtmlControl::INPUT, $data['name'], $data);
                 break;
         }
     }
 }
 protected function getRates($shipping_id, $items, $address, $total)
 {
     $plugin = shopShipping::getPlugin(null, $shipping_id);
     $weight_unit = $plugin->allowedWeightUnit();
     $dimension = shopDimension::getInstance()->getDimension('weight');
     if ($weight_unit != $dimension['base_unit']) {
         foreach ($items as $item_id => $item) {
             if ($item['weight']) {
                 $items[$item_id]['weight'] = $item['weight'] / $dimension['units'][$weight_unit]['multiplier'];
             }
         }
     }
     $currency = $plugin->allowedCurrency();
     $currrent_currency = wa()->getConfig()->getCurrency(false);
     if ($currency != $currrent_currency) {
         $total = shop_currency($total, $currrent_currency, $currency, false);
     }
     $rates = $plugin->getRates($items, $address, array('total_price' => $total));
     if (is_array($rates)) {
         $is_html = waRequest::request('html');
         foreach ($rates as $r_id => &$r) {
             $r['id'] = $r_id;
             $r['rate_html'] = $is_html ? shop_currency_html($r['rate'], $r['currency']) : shop_currency($r['rate'], $r['currency']);
             $r['rate'] = shop_currency($r['rate'], $r['currency']);
         }
         unset($r);
         return array_values($rates);
     }
     return $rates;
 }
 protected function parseValue($value, $type)
 {
     $dimensions = shopDimension::getInstance();
     $data = array();
     if (strpos($type, '.')) {
         $type = preg_replace('/^.+\\./', '', $type);
         if (!is_array($value) || count($value) == 1) {
             $matches = null;
             $value = trim(is_array($value) ? reset($value) : $value);
             if (preg_match('/^(\\-?\\d+([\\.,]\\d+)?)\\s+(.+)$/', $value, $matches)) {
                 $value = array('value' => $this->castValue('double', $matches[1]), 'unit' => shopDimension::castUnit($type, trim($matches[3])));
             } else {
                 $value = array('value' => $this->castValue('double', $value), 'unit' => '');
             }
         }
         $value['type'] = $type;
     }
     if (!empty($value['code'])) {
         if (strpos($value['code'], '.')) {
             list($data['type'], $data['unit']) = explode('.', $value['code'], 2);
             //$dimension = $dimensions->getDimension($data['type']);
         } elseif ($dimension = $dimensions->getDimension(empty($value['type']) ? $value['code'] : $value['type'])) {
             $data['type'] = !empty($value['type']) ? $value['type'] : $value['code'];
             $data['unit'] = !empty($value['unit']) ? $value['unit'] : $dimension['base_unit'];
         } else {
             $data['unit'] = !empty($value['unit']) ? $value['unit'] : '';
             $data['type'] = null;
         }
     } else {
         $data['type'] = !empty($value['type']) ? $value['type'] : '';
         if ($dimension = $dimensions->getDimension($data['type'])) {
             $data['unit'] = !empty($value['unit']) ? $value['unit'] : $dimension['base_unit'];
         } else {
             $data['unit'] = !empty($value['unit']) ? $value['unit'] : '';
         }
     }
     $data['unit'] = $dimensions->fixUnit($data['type'], $data['unit']);
     $data['value'] = isset($value['value']) ? $this->castValue('double', $value['value']) : 0;
     $data['value_base_unit'] = $dimensions->convert($data['value'], $data['type'], null, $data['unit']);
     return $data;
 }
 /**
  * Filters collection products by specified conditions. 
  * 
  * @param array $data Product filtering conditions:
  *     'in_stock_only'     => whether only products with positive or unlimited stock count must be returned
  *     'price_min'         => minimum price limit
  *     'price_max'         => maximum price limit
  *     '%feature_code%'    => feature value
  */
 public function filters($data)
 {
     if ($this->filtered) {
         return;
     }
     $delete = array('page', 'sort', 'order');
     foreach ($delete as $k) {
         if (isset($data[$k])) {
             unset($data[$k]);
         }
     }
     $config = wa('shop')->getConfig();
     if (isset($data['in_stock_only'])) {
         $this->where[] = '(p.count > 0 OR p.count IS NULL)';
     }
     if (isset($data['price_min']) && $data['price_min'] !== '') {
         $this->where[] = 'p.max_price >= ' . $this->toFloat(shop_currency($data['price_min'], true, $config->getCurrency(true), false));
         unset($data['price_min']);
     }
     if (isset($data['price_max']) && $data['price_max'] !== '') {
         $this->where[] = 'p.min_price <= ' . $this->toFloat(shop_currency($data['price_max'], true, $config->getCurrency(true), false));
         unset($data['price_max']);
     }
     $feature_model = new shopFeatureModel();
     $features = $feature_model->getByField('code', array_keys($data), 'code');
     foreach ($data as $feature_code => $values) {
         if (!is_array($values)) {
             if ($values === '') {
                 continue;
             }
             $values = array($values);
         }
         if (isset($features[$feature_code])) {
             if (isset($values['min']) || isset($values['max']) || isset($values['unit'])) {
                 if (ifset($values['min'], '') === '' && ifset($values['max'], '') === '') {
                     continue;
                 } else {
                     $unit = ifset($values['unit']);
                     $min = $max = null;
                     if (isset($values['min'])) {
                         $min = $values['min'];
                         if ($unit) {
                             $min = shopDimension::getInstance()->convert($min, $features[$feature_code]['type'], null, $unit);
                         }
                     }
                     if (isset($values['max'])) {
                         $max = $values['max'];
                         if ($unit) {
                             $max = shopDimension::getInstance()->convert($max, $features[$feature_code]['type'], null, $unit);
                         }
                     }
                     $fm = $feature_model->getValuesModel($features[$feature_code]['type']);
                     $values = $fm->getValueIdsByRange($features[$feature_code]['id'], $min, $max);
                 }
             } else {
                 foreach ($values as &$v) {
                     $v = (int) $v;
                 }
             }
             if ($values) {
                 $this->addJoin('shop_product_features', 'p.id = :table.product_id AND :table.feature_id = ' . (int) $features[$feature_code]['id'], ':table.feature_value_id IN (' . implode(',', $values) . ')');
                 $this->group_by = 'p.id';
             } else {
                 $this->where[] = '0';
             }
         }
     }
     $this->filtered = true;
 }
 public function __get($field)
 {
     if ($field == 'units') {
         return shopDimension::getUnits($this->type);
     }
     if ($field == 'compare') {
         return trim($this->begin_base_unit . ':' . $this->end_base_unit);
     }
     if ($field == 'value') {
         $str = array();
         if ($this->begin !== null) {
             $str[] = sprintf(self::$format, _w('from'), $this->begin);
             if ($this->end !== null) {
                 $str[] = '—';
             }
         }
         if ($this->end !== null) {
             $str[] = sprintf(self::$format, _w('to'), $this->end);
         }
         return implode(' ', $str);
     }
     return isset($this->{$field}) ? $this->{$field} : null;
 }
Пример #7
0
 public static function getTypes()
 {
     static $types;
     if (!$types) {
         $dimensions = shopDimension::getInstance();
         $units_list = $dimensions->getList();
         $units_index = array_keys($units_list);
         #single types
         $single_types = array();
         $single_types[] = array('name' => _w('Texts'), 'type' => self::TYPE_VARCHAR, 'available' => 1);
         $single_types[] = array('name' => _w('Custom number'), 'type' => self::TYPE_DOUBLE, 'available' => 1);
         $single_types[] = array('name' => _w('Color'), 'type' => self::TYPE_COLOR, 'available' => 1);
         $numerical_types = array();
         $numerical_types[] = array('name' => _w('Custom number'), 'group' => _w('Numerical'), 'type' => '%s.' . self::TYPE_DOUBLE, 'alias' => array(self::TYPE_DIMENSION . '.' . self::TYPE_DOUBLE => self::TYPE_DOUBLE), 'multiple' => false, 'selectable' => false, 'available' => 2);
         foreach ($units_index as $unit) {
             $type = array('type' => '%s' . '.' . self::TYPE_DIMENSION . '.' . $unit, 'alias' => array(self::TYPE_RANGE . '.' . self::TYPE_DIMENSION . '.' . $unit => self::TYPE_RANGE . '.' . $unit, self::TYPE_DIMENSION . '.' . self::TYPE_DIMENSION . '.' . $unit => self::TYPE_DIMENSION . '.' . $unit), 'available' => 2);
             if ($dimension = $dimensions->getDimension($unit)) {
                 if (empty($type['name'])) {
                     $type['name'] = $dimension['name'];
                 }
                 $count = count($dimension['units']);
                 $units = array_slice(array_values($dimension['units']), 0, min(4, $count));
                 if ($count > 5) {
                     $units[] = array('name' => '...');
                 }
                 foreach ($units as &$u) {
                     $u = $u['name'];
                 }
                 unset($u);
                 $type['short_name'] = $type['name'];
                 $type['name'] .= " (" . implode(', ', $units) . ")";
             } else {
                 $type['available'] = 0;
             }
             $single_types[] = $type;
             $numerical_types[$unit] = $type;
         }
         $types = array();
         $types[] = array('name' => _w('Custom text (input)'), 'type' => self::TYPE_VARCHAR, 'multiple' => false, 'selectable' => false, 'available' => 2);
         $types[] = array('name' => _w('HTML (textarea)'), 'type' => self::TYPE_TEXT, 'multiple' => false, 'selectable' => false, 'available' => 2);
         $types[] = array('name' => _w('Yes/No toggle (boolean)'), 'type' => self::TYPE_BOOLEAN, 'multiple' => false, 'selectable' => false, 'available' => 2);
         /* Shortcuts */
         $types[] = array('name' => _w('Color'), 'type' => self::TYPE_COLOR, 'multiple' => true, 'selectable' => true, 'available' => 2);
         foreach (array('weight', 'length') as $unit) {
             if (isset($numerical_types[$unit])) {
                 $type = $numerical_types[$unit];
                 $type += array('multiple' => false, 'selectable' => false, 'available' => 2);
                 if (strpos($type['type'], '%s') !== false) {
                     $type['type'] = sprintf($type['type'], self::TYPE_DIMENSION);
                     if (!empty($type['alias']) && isset($type['alias'][$type['type']])) {
                         $type['type'] = $type['alias'][$type['type']];
                     }
                 }
                 if (!empty($type['short_name'])) {
                     $type['name'] = $type['short_name'];
                 }
                 $types[] = $type;
             }
         }
         /* Numerical */
         $types[] = array('name' => _w('Value'), 'group' => _w('Numerical'), 'type' => self::TYPE_DIMENSION . '.*', 'multiple' => false, 'selectable' => false, 'available' => 2, 'subtype' => self::extendSubtypes($numerical_types, self::TYPE_DIMENSION));
         /**
          * $types[] = array(
          * 'name'       => _w('Date'),
          * 'group'      => _w('Numerical'),
          * 'type'       => 'date',
          * 'multiple'   => false,
          * 'selectable' => false,
          * 'available'  => 0,
          * );
          */
         $types[] = array('name' => _w('Range'), 'group' => _w('Numerical'), 'type' => self::TYPE_RANGE . '.*', 'multiple' => false, 'selectable' => false, 'available' => 2, 'subtype' => self::extendSubtypes($numerical_types, self::TYPE_RANGE));
         $types[] = array('name' => _w('Value') . ' × ' . _w('Value'), 'group' => _w('Numerical'), 'type' => self::TYPE_2D . '.*', 'multiple' => false, 'selectable' => false, 'available' => 1, 'subtype' => self::extendSubtypes($numerical_types, self::TYPE_2D));
         $types[] = array('name' => _w('Value') . ' × ' . _w('Value') . ' × ' . _w('Value'), 'group' => _w('Numerical'), 'type' => self::TYPE_3D . '.*', 'multiple' => false, 'selectable' => false, 'available' => 1, 'subtype' => self::extendSubtypes($numerical_types, self::TYPE_3D));
         /* Selectable */
         $types[] = array('name' => _w('Select'), 'group' => _w('Selectable'), 'type' => '*', 'multiple' => false, 'selectable' => true, 'available' => 1, 'subtype' => self::extendSubtypes($single_types, self::TYPE_DIMENSION));
         /** TODO
          * $types[] = array(
          * 'name'       => 'Radiobuttons',
          * 'group'      => _w('Selectable'),
          * 'type'       => '*',
          * 'multiple'   => false,
          * 'selectable' => true,
          * 'available'  => 0,
          * 'subtype'    => & $single_types,
          * );
          */
         $types[] = array('name' => _w('Checkboxes (multiple choice)'), 'group' => _w('Selectable'), 'type' => '*', 'multiple' => true, 'selectable' => true, 'available' => 1, 'subtype' => self::extendSubtypes($single_types, self::TYPE_DIMENSION));
         /* divider */
         $types[] = array('name' => _w('Divider'), 'group' => _w('Other'), 'type' => self::TYPE_DIVIDER, 'multiple' => false, 'selectable' => false, 'available' => 0);
     }
     return $types;
 }
Пример #8
0
 /**
  * Returns available shipping methods and rates for specified address.
  *
  * @param array $address Address data
  * @param array $items Order items
  * @param array $params Optional extra parameters:
  *     'payment'     => [int] payment method id for which available shipping methods must be returned
  *     'currency'    => [string] currency code to convert shipping rates to
  *     'total_price' => [float] arbitrary total order items cost to be taken into account for obtaining shipping rates
  * @return array
  */
 public static function getShippingMethods($address = null, $items = array(), $params = array())
 {
     $plugin_model = new shopPluginModel();
     $options = array();
     if (!empty($params[shopPluginModel::TYPE_PAYMENT])) {
         $options[shopPluginModel::TYPE_PAYMENT] = $params[shopPluginModel::TYPE_PAYMENT];
     }
     $methods = $plugin_model->listPlugins(shopPluginModel::TYPE_SHIPPING, $options);
     if ($address !== null) {
         $config = wa('shop')->getConfig();
         /**
          * @var $config shopConfig
          */
         $result = array();
         $currency = isset($params['currency']) ? $params['currency'] : $config->getCurrency();
         $dimensions = shopDimension::getInstance();
         foreach ($methods as $m) {
             if ($m['available']) {
                 $plugin = shopShipping::getPlugin($m['plugin'], $m['id']);
                 $plugin_info = $plugin->info($m['plugin']);
                 $plugin_currency = (array) $plugin->allowedCurrency();
                 $total = null;
                 if ($plugin_currency != $currency) {
                     if (!$config->getCurrencies($plugin_currency)) {
                         $result[$m['id']] = array('plugin' => $m['plugin'], 'logo' => $m['logo'], 'icon' => $plugin_info['icon'], 'img' => $plugin_info['img'], 'name' => $m['name'], 'error' => sprintf(_w('Shipping rate was not calculated because required currency %s is not defined in your store settings.'), implode(', ', $plugin_currency)), 'rate' => '', 'currency' => $currency);
                         continue;
                     }
                 }
                 if (isset($params['total_price'])) {
                     if (!in_array($currency, $plugin_currency)) {
                         $total = shop_currency($params['total_price'], $currency, reset($plugin_currency), false);
                     } else {
                         $total = $params['total_price'];
                     }
                 } else {
                     foreach ($items as $item) {
                         if (!empty($item['price'])) {
                             $total += $item['price'] * (isset($item['quantity']) ? $item['quantity'] : 1);
                         }
                         if ($total && !in_array($currency, $plugin_currency)) {
                             $total = shop_currency($total, $currency, reset($plugin_currency), false);
                         }
                     }
                 }
                 $weight_unit = $plugin->allowedWeightUnit();
                 foreach ($items as &$item) {
                     if (!empty($item['weight'])) {
                         $item['weight'] = $dimensions->convert($item['weight'], 'weight', $weight_unit);
                     }
                 }
                 unset($item);
                 $rates = $plugin->getRates($items, $address ? $address : array(), $total ? array('total_price' => $total) : array());
                 if (is_array($rates)) {
                     foreach ($rates as $rate_id => $info) {
                         if (is_array($info)) {
                             $rate = is_array($info['rate']) ? max($info['rate']) : $info['rate'];
                             $rate = (double) shop_currency($rate, reset($plugin_currency), $currency, false);
                             $result[$m['id'] . '.' . $rate_id] = array('plugin' => $m['plugin'], 'logo' => $m['logo'], 'icon' => $plugin_info['icon'], 'img' => $plugin_info['img'], 'name' => $m['name'] . (!empty($info['name']) ? ' (' . $info['name'] . ')' : ''), 'rate' => $rate, 'currency' => $currency);
                         }
                     }
                 } elseif (is_string($rates)) {
                     $result[$m['id']] = array('plugin' => $m['plugin'], 'logo' => $m['logo'], 'icon' => $plugin_info['icon'], 'img' => $plugin_info['img'], 'name' => $m['name'], 'error' => $rates, 'rate' => '', 'currency' => $currency);
                 }
             }
         }
         return $result;
     } else {
         return $methods;
     }
 }
Пример #9
0
 private function getOrderItems($items, $weight_unit)
 {
     $product_ids = array();
     foreach ($items as $item) {
         $product_ids[] = $item['product_id'];
     }
     $product_ids = array_unique($product_ids);
     $feature_model = new shopFeatureModel();
     $f = $feature_model->getByCode('weight');
     if (!$f) {
         $values = array();
     } else {
         $values_model = $feature_model->getValuesModel($f['type']);
         $values = $values_model->getProductValues($product_ids, $f['id']);
     }
     $m = null;
     if ($weight_unit) {
         $dimension = shopDimension::getInstance()->getDimension('weight');
         if ($weight_unit != $dimension['base_unit']) {
             $m = $dimension['units'][$weight_unit]['multiplier'];
         }
     }
     foreach ($items as &$item) {
         if ($item['type'] == 'product') {
             if (isset($values['skus'][$item['sku_id']])) {
                 $w = $values['skus'][$item['sku_id']];
             } else {
                 $w = isset($values[$item['product_id']]) ? $values[$item['product_id']] : 0;
             }
             if ($m !== null) {
                 $w = $w / $m;
             }
             $item['weight'] = $w;
         } else {
             $item['weight'] = 0;
         }
     }
     unset($item);
     return $items;
 }
Пример #10
0
 public function execute()
 {
     $id = waRequest::get('order_id');
     if (!$id) {
         throw new waException("Unknown order", 404);
     }
     $order = $this->getOrder($id);
     if (!$order) {
         $id = shopHelper::decodeOrderId($id);
         $order = $this->getOrder($id);
         if (!$order) {
             throw new waException("Unkown order", 404);
         }
     }
     $product_ids = array();
     foreach ($order['items'] as $item) {
         if ($item['type'] == 'product') {
             $product_ids[] = $item['product_id'];
         }
     }
     $product_ids = array_unique($product_ids);
     $form_id = waRequest::get('form_id');
     if (strpos($form_id, '.')) {
         list($type, $form) = explode('.', $form_id, 2);
     } else {
         $form = null;
         $type = $form_id;
     }
     $order_params_model = new shopOrderParamsModel();
     $params = $order_params_model->get($order['id']);
     $plugin = self::getPlugin($type, ifempty($params[$type . '_id']));
     if ($type == 'shipping') {
         /* add weight info only for shipping modules */
         $feature_model = new shopFeatureModel();
         $f = $feature_model->getByCode('weight');
         if (!$f) {
             $weights = array();
         } else {
             $values_model = $feature_model->getValuesModel($f['type']);
             $weights = $values_model->getProductValues($product_ids, $f['id']);
         }
         if ($weights) {
             $dimension = shopDimension::getInstance()->getDimension('weight');
             $weight_unit = $plugin->allowedWeightUnit();
             $m = null;
             if ($weight_unit != $dimension['base_unit']) {
                 $m = $dimension['units'][$weight_unit]['multiplier'];
             }
             foreach ($order['items'] as &$item) {
                 if ($item['type'] == 'product') {
                     if (isset($weights['skus'][$item['sku_id']])) {
                         $w = $weights['skus'][$item['sku_id']];
                     } else {
                         $w = isset($weights[$item['product_id']]) ? $weights[$item['product_id']] : 0;
                     }
                     if ($m !== null) {
                         $w = $w / $m;
                     }
                     $item['weight'] = $w;
                 }
             }
             unset($item);
         }
     }
     if (!$plugin) {
         throw new waException(_w('Printform not found'), 404);
     }
     print $plugin->displayPrintForm(ifempty($form, $plugin->getId()), shopPayment::getOrderData($order, $plugin));
     exit;
 }
 public function getItems($weight_unit = null)
 {
     $items = array();
     $cart = new shopCart();
     $cart_items = $cart->items();
     $product_ids = $sku_ids = array();
     foreach ($cart_items as $item) {
         $product_ids[] = $item['product_id'];
         $sku_ids[] = $item['sku_id'];
     }
     $feature_model = new shopFeatureModel();
     $f = $feature_model->getByCode('weight');
     if (!$f) {
         $values = array();
     } else {
         $values_model = $feature_model->getValuesModel($f['type']);
         $values = $values_model->getProductValues($product_ids, $f['id']);
     }
     $m = null;
     if ($weight_unit) {
         $dimension = shopDimension::getInstance()->getDimension('weight');
         if ($weight_unit != $dimension['base_unit']) {
             $m = $dimension['units'][$weight_unit]['multiplier'];
         }
     }
     foreach ($cart_items as $item) {
         if (isset($values['skus'][$item['sku_id']])) {
             $w = $values['skus'][$item['sku_id']];
         } else {
             $w = isset($values[$item['product_id']]) ? $values[$item['product_id']] : 0;
         }
         if ($m !== null) {
             $w = $w / $m;
         }
         $items[] = array('name' => $item['name'], 'price' => $item['price'], 'quantity' => $item['quantity'], 'weight' => $w);
     }
     return $items;
 }
 public function execute()
 {
     $category = $this->getCategory();
     $this->addCanonical();
     // breadcrumbs
     $root_category_id = $category['id'];
     if ($category['parent_id']) {
         $breadcrumbs = array();
         $path = array_reverse($this->getModel()->getPath($category['id']));
         $root_category = reset($path);
         $root_category_id = $root_category['id'];
         foreach ($path as $row) {
             $breadcrumbs[] = array('url' => wa()->getRouteUrl('/frontend/category', array('category_url' => waRequest::param('url_type') == 1 ? $row['url'] : $row['full_url'])), 'name' => $row['name']);
         }
         if ($breadcrumbs) {
             $this->view->assign('breadcrumbs', $breadcrumbs);
         }
     }
     $this->view->assign('root_category_id', $root_category_id);
     // sort
     if ($category['type'] == shopCategoryModel::TYPE_DYNAMIC && !$category['sort_products']) {
         $category['sort_products'] = 'create_datetime DESC';
     }
     if ($category['sort_products'] && !waRequest::get('sort')) {
         $sort = explode(' ', $category['sort_products']);
         $this->view->assign('active_sort', $sort[0] == 'count' ? 'stock' : $sort[0]);
     } elseif (!$category['sort_products'] && !waRequest::get('sort')) {
         $this->view->assign('active_sort', '');
     }
     $this->view->assign('category', $category);
     // products
     $collection = new shopProductsCollection('category/' . $category['id']);
     // filters
     if ($category['filter']) {
         $filter_ids = explode(',', $category['filter']);
         $feature_model = new shopFeatureModel();
         $features = $feature_model->getById(array_filter($filter_ids, 'is_numeric'));
         if ($features) {
             $features = $feature_model->getValues($features);
         }
         $category_value_ids = $collection->getFeatureValueIds();
         $filters = array();
         foreach ($filter_ids as $fid) {
             if ($fid == 'price') {
                 $range = $collection->getPriceRange();
                 if ($range['min'] != $range['max']) {
                     $filters['price'] = array('min' => shop_currency($range['min'], null, null, false), 'max' => shop_currency($range['max'], null, null, false));
                 }
             } elseif (isset($features[$fid]) && isset($category_value_ids[$fid])) {
                 $filters[$fid] = $features[$fid];
                 $min = $max = $unit = null;
                 foreach ($filters[$fid]['values'] as $v_id => $v) {
                     if (!in_array($v_id, $category_value_ids[$fid])) {
                         unset($filters[$fid]['values'][$v_id]);
                     } else {
                         if ($v instanceof shopRangeValue) {
                             $begin = $this->getFeatureValue($v->begin);
                             if ($min === null || $begin < $min) {
                                 $min = $begin;
                             }
                             $end = $this->getFeatureValue($v->end);
                             if ($max === null || $end > $max) {
                                 $max = $end;
                                 if ($v->end instanceof shopDimensionValue) {
                                     $unit = $v->end->unit;
                                 }
                             }
                         } else {
                             $tmp_v = $this->getFeatureValue($v);
                             if ($min === null || $tmp_v < $min) {
                                 $min = $tmp_v;
                             }
                             if ($max === null || $tmp_v > $max) {
                                 $max = $tmp_v;
                                 if ($v instanceof shopDimensionValue) {
                                     $unit = $v->unit;
                                 }
                             }
                         }
                     }
                 }
                 if (!$filters[$fid]['selectable'] && ($filters[$fid]['type'] == 'double' || substr($filters[$fid]['type'], 0, 6) == 'range.' || substr($filters[$fid]['type'], 0, 10) == 'dimension.')) {
                     if ($min == $max) {
                         unset($filters[$fid]);
                     } else {
                         $type = preg_replace('/^[^\\.]*\\./', '', $filters[$fid]['type']);
                         if ($type != 'double') {
                             $filters[$fid]['base_unit'] = shopDimension::getBaseUnit($type);
                             $filters[$fid]['unit'] = shopDimension::getUnit($type, $unit);
                             if ($filters[$fid]['base_unit']['value'] != $filters[$fid]['unit']['value']) {
                                 $dimension = shopDimension::getInstance();
                                 $min = $dimension->convert($min, $type, $filters[$fid]['unit']['value']);
                                 $max = $dimension->convert($max, $type, $filters[$fid]['unit']['value']);
                             }
                         }
                         $filters[$fid]['min'] = $min;
                         $filters[$fid]['max'] = $max;
                     }
                 }
             }
         }
         $this->view->assign('filters', $filters);
         $this->setCollection($collection);
         // fix prices
         $products = $this->view->getVars('products');
         $product_ids = array();
         foreach ($products as $p_id => $p) {
             if ($p['sku_count'] > 1) {
                 $product_ids[] = $p_id;
             }
         }
         if ($product_ids) {
             $min_price = $max_price = null;
             $tmp = array();
             foreach ($filters as $fid => $f) {
                 if ($fid == 'price') {
                     $min_price = waRequest::get('price_min');
                     if (!empty($min_price)) {
                         $min_price = (double) $min_price;
                     } else {
                         $min_price = null;
                     }
                     $max_price = waRequest::get('price_max');
                     if (!empty($max_price)) {
                         $max_price = (double) $max_price;
                     } else {
                         $max_price = null;
                     }
                 } else {
                     $fvalues = waRequest::get($f['code']);
                     if ($fvalues && !isset($fvalues['min']) && !isset($fvalues['max'])) {
                         $tmp[$fid] = $fvalues;
                     }
                 }
             }
             $product_skus = array();
             if ($tmp) {
                 $pf_model = new shopProductFeaturesModel();
                 $product_skus = $pf_model->getSkusByFeatures($product_ids, $tmp);
             } elseif ($min_price || $max_price) {
                 $ps_model = new shopProductSkusModel();
                 $rows = $ps_model->getByField('product_id', $product_ids, true);
                 foreach ($rows as $row) {
                     $product_skus[$row['product_id']][] = $row;
                 }
             }
             $default_currency = $this->getConfig()->getCurrency(true);
             if ($product_skus) {
                 foreach ($product_skus as $product_id => $skus) {
                     $currency = $products[$product_id]['currency'];
                     usort($skus, array($this, 'sortSkus'));
                     $k = 0;
                     if ($min_price || $max_price) {
                         foreach ($skus as $i => $sku) {
                             if ($min_price) {
                                 $tmp_price = shop_currency($min_price, true, $currency, false);
                                 if ($sku['price'] < $tmp_price) {
                                     continue;
                                 }
                             }
                             if ($max_price) {
                                 $tmp_price = shop_currency($max_price, true, $currency, false);
                                 if ($sku['price'] > $tmp_price) {
                                     continue;
                                 }
                             }
                             $k = $i;
                             break;
                         }
                     }
                     $sku = $skus[$k];
                     if ($products[$product_id]['sku_id'] != $sku['id']) {
                         $products[$product_id]['sku_id'] = $sku['id'];
                         $products[$product_id]['frontend_url'] .= '?sku=' . $sku['id'];
                         $products[$product_id]['price'] = shop_currency($sku['price'], $currency, $default_currency, false);
                         $products[$product_id]['compare_price'] = shop_currency($sku['compare_price'], $currency, $default_currency, false);
                     }
                 }
                 $this->view->assign('products', $products);
             }
         }
     } else {
         $this->setCollection($collection);
     }
     //отображение дополнительных размеров
     $products = $this->view->getVars('products');
     $product_features_model = new shopProductFeaturesSelectableModel();
     foreach ($products as &$p) {
         $sku_features = $product_features_model->getByProduct($p['id']);
         $sizes = $sku_features[3];
         if (!$sizes) {
             $p['sizes'] = array();
             continue;
         }
         $pf_names = $product_features_model->query("SELECT `id`, `value` FROM shop_feature_values_varchar where `id` IN (" . implode(',', $sizes) . ') ORDER BY `sort`;')->fetchAll();
         foreach ($pf_names as $key => $val) {
             $sizes[$val['id']] = $val['value'];
         }
         $p['sizes'] = $pf_names;
     }
     //отображение всех картинок
     foreach ($products as &$p) {
         $images_full = shopViewHelper::images($p['id']);
         if (isset($images_full[$p['id']])) {
             $p['image_ids'] = array_keys($images_full[$p['id']]);
         }
     }
     $this->view->assign('products', $products);
     // set meta
     $title = $category['meta_title'] ? $category['meta_title'] : $category['name'];
     wa()->getResponse()->setTitle($title);
     wa()->getResponse()->setMeta('keywords', $category['meta_keywords']);
     wa()->getResponse()->setMeta('description', $category['meta_description']);
     /**
      * @event frontend_category
      * @return array[string]string $return[%plugin_id%] html output for category
      */
     $this->view->assign('frontend_category', wa()->event('frontend_category', $category));
     $this->setThemeTemplate('category.html');
 }
Пример #13
0
 public function convert($unit, $format = null)
 {
     if ($format === null) {
         $format = $this->format;
     }
     $value = shopDimension::getInstance()->convert($this->value, $this->type, $unit, $this->unit);
     return $format === false ? $value : sprintf($format, $value, $this->getUnitName($unit));
 }
 public function execute()
 {
     $routing = wa()->getRouting();
     $settlements = array();
     $profile_helper = new shopImportexportHelper($this->plugin_id);
     $this->view->assign('profiles', $list = $profile_helper->getList());
     $profile = $profile_helper->getConfig();
     $profile['config'] += array('hash' => '', 'domain' => '', 'lifetime' => 0);
     $current_domain =& $profile['config']['domain'];
     $this->view->assign('current_domain', $current_domain);
     $domain_routes = $routing->getByApp('shop');
     foreach ($domain_routes as $domain => $routes) {
         foreach ($routes as $route) {
             $settlement = $domain . '/' . $route['url'];
             if ($settlement == $current_domain || $current_domain === '') {
                 $current_domain = $settlement;
                 $routing->setRoute($route, $domain);
                 waRequest::setParam($route);
             }
             $settlements[] = $settlement;
         }
     }
     $this->view->assign('profile', $profile);
     $info = array();
     $this->view->assign('settlements', $settlements);
     if (!empty($profile['id'])) {
         $path = shopYandexmarketPlugin::path($profile['id'] . '.xml');
         $info['exists'] = file_exists($path);
         $info['mtime'] = $info['exists'] ? filemtime($path) : null;
     } else {
         $info['mtime'] = $info['exists'] = null;
     }
     if ($info['exists']) {
         $route_params = array('plugin' => $this->plugin_id, 'hash' => $this->plugin()->getHash($profile['id']));
         $info['url'] = $routing->getUrl('shop/frontend/catalog', $route_params, true);
     } else {
         $info['url'] = null;
     }
     $this->view->assign('info', $info);
     /**
      * @var shopConfig $config ;
      */
     $config = wa('shop')->getConfig();
     $this->view->assign('primary_currency', $config->getCurrency());
     $this->view->assign('company', ifempty($profile['config']['company'], $config->getGeneralSettings('name')));
     $this->view->assign('company_name', ifempty($profile['config']['company_name'], $config->getGeneralSettings('name')));
     $type_model = new shopTypeModel();
     $this->view->assign('types', $type_model->getAll());
     $profile_map = ifset($profile['config']['map'], array());
     $export = ifset($profile['config']['export'], array());
     $set_model = new shopSetModel();
     $map = $this->plugin()->map(array(), null, true);
     $params = array();
     if ($profile_map) {
         foreach ($map as $type => &$type_map) {
             foreach ($type_map['fields'] as $field => &$info) {
                 $info['source'] = ifempty($profile_map[$type][$field], 'skip:');
                 unset($profile_map[$type][$field]);
                 unset($info);
             }
             if (!empty($type_map['fields']['param.*'])) {
                 $params[$type] = -1;
             }
             unset($type_map);
         }
         foreach ($profile_map as $type => $fields) {
             foreach ($fields as $field => $source) {
                 $info_field = strpos($field, 'param.') === 0 ? 'param.*' : $field;
                 if (isset($map[$type]['fields'][$info_field])) {
                     $info = $map[$type]['fields'][$info_field];
                     $info['source'] = ifempty($source, 'skip:');
                     $map[$type]['fields'][$field] = $info;
                     $params[$type] = max(ifset($params[$type], -1), intval(preg_replace('@\\D+@', '', $field)));
                 }
             }
         }
     }
     $this->view->assign('sets', $set_model->getAll());
     $this->view->assign('type_map', $map);
     $this->view->assign('params', array('params' => $params));
     $this->view->assign('export', $export);
     $this->view->assign('types_map', ifset($profile['config']['types'], array()));
     $app_settings_model = new waAppSettingsModel();
     $app_settings = array('ignore_stock_count' => $app_settings_model->get('shop', 'ignore_stock_count', 0));
     $this->view->assign('app_settings', $app_settings);
     $feature_model = new shopFeatureModel();
     $config = wa('shop')->getConfig();
     /**
      * @var shopConfig $config
      */
     $limit = $config->getOption('features_per_page');
     if ($feature_model->countByField(array('parent_id' => null)) < $limit) {
         $features = $feature_model->getFeatures(true);
         /*, true*/
         foreach ($features as $id => $feature) {
             if ($feature['type'] == shopFeatureModel::TYPE_DIVIDER) {
                 unset($features[$id]);
             }
         }
     } else {
         $this->view->assign('features_autocomplete', true);
         $features = array();
         foreach ($map as $type_map) {
             foreach ($type_map['fields'] as $info) {
                 if (!empty($info['source']) && preg_match('@^feature:([\\w\\d_\\-]+)$@', $info['source'], $matches)) {
                     $features[] = $matches[1];
                 }
             }
         }
         if ($features = array_unique($features)) {
             $features = $feature_model->getFeatures('code', $features);
         } else {
             $features = array();
         }
     }
     foreach ($features as $id => &$feature) {
         if (strpos($feature['type'], shopFeatureModel::TYPE_DIMENSION . '.') === 0) {
             $units = shopDimension::getUnits($feature['type']);
             $feature['units'] = array();
             foreach ($units as $unit) {
                 $feature['units'][] = $unit['title'];
             }
             $feature['units'] = implode(', ', $feature['units']);
         } elseif (preg_match('@\\(([^\\)]+)\\)$@', $feature['name'], $matches)) {
             $feature['units'] = trim($matches[1]);
         }
         unset($feature);
     }
     $this->view->assign('features', $features);
     $fields = array('name' => _w('Product name'), 'description' => _w('Description'), 'summary' => _w('Summary'), 'count' => _w('In stock'), 'sku' => _w('SKU code'));
     $this->view->assign('fields', $fields);
 }