public function execute()
 {
     if (!$this->getUser()->getRights('shop', 'settings')) {
         throw new waRightsException(_w('Access denied'));
     }
     $types_per_page = $this->getConfig()->getOption('types_per_page');
     $values_per_feature = 7;
     $type_model = new shopTypeModel();
     $type_features_model = new shopTypeFeaturesModel();
     $feature_model = new shopFeatureModel();
     $types = $type_model->getAll($type_model->getTableId(), true);
     $type_features_model->countFeatures($types);
     $show_all_features = $feature_model->countAll() < $this->getConfig()->getOption('features_per_page');
     if ($show_all_features) {
         $feature_model = new shopFeatureModel();
         if ($features = $feature_model->getFeatures(true, null, 'id', $values_per_feature)) {
             $show_all_features = count($features);
             $type_features_model->fillTypes($features, $types);
             shopFeatureModel::appendTypeNames($features);
         }
     } else {
         $features = array();
     }
     $this->view->assign('type_templates', shopTypeModel::getTemplates());
     $this->view->assign('show_all_features', $show_all_features);
     $this->view->assign('show_all_types', count($types) - $types_per_page < 3);
     $this->view->assign('types_per_page', $types_per_page);
     $this->view->assign('values_per_feature', $values_per_feature);
     $this->view->assign('icons', (array) $this->getConfig()->getOption('type_icons'));
     $this->view->assign('product_types', $types);
     $this->view->assign('features', $features);
 }
 public function execute()
 {
     if (!$this->getUser()->getRights('shop', 'settings')) {
         throw new waRightsException(_w('Access denied'));
     }
     $feature_model = new shopFeatureModel();
     $values_per_feature = 7;
     $type = waRequest::get('type', waRequest::TYPE_STRING, '');
     if ($type_id = intval($type)) {
         $features = $feature_model->getByType($type_id, 'id', $values_per_feature);
     } else {
         if ($type === 'empty') {
             $features = $feature_model->getByType(null, 'id', $values_per_feature);
         } elseif ($type === '') {
             $features = $feature_model->getFeatures(true, null, 'id', $values_per_feature);
         } else {
             $features = $feature_model->getByType(0, 'id', $values_per_feature);
         }
     }
     if ($features) {
         shopFeatureModel::appendTypeNames($features);
         $type_features_model = new shopTypeFeaturesModel();
         $type_features_model->fillTypes($features);
     }
     $this->view->assign('features', $features);
     $this->view->assign('values_per_feature', $values_per_feature);
 }
 public function execute()
 {
     $feature_id = waRequest::post('feature_id');
     $feature_model = new shopFeatureModel();
     $feature = $feature_model->getById($feature_id);
     if (!$feature) {
         throw new waException(_w('Unknown feature'));
     }
     if (waRequest::post('subtype')) {
         $to = waRequest::post('subtype');
     } else {
         $to = waRequest::post('type');
     }
     $to = array('type' => $to, 'selectable' => (int) waRequest::post('selectable', 0, waRequest::TYPE_INT), 'multiple' => (int) waRequest::post('multiple', 0, waRequest::TYPE_INT));
     $result = shopFeatureValuesConverter::run($feature_id, $to);
     if (!$result) {
         $this->errors[] = _w('Feature type conversion is not allowed or failed');
     } else {
         if ($feature = $feature_model->getById($feature_id)) {
             $this->response = array($feature_id => &$feature);
             $feature['selectable'] = (int) $feature['selectable'];
             $feature['multiple'] = (int) $feature['multiple'];
             if ($feature['selectable']) {
                 $this->response = $feature_model->getValues($this->response, true);
                 $sort = 0;
                 foreach ($feature['values'] as $id => &$value) {
                     if (!is_object($value)) {
                         $value = array('id' => $id, 'value' => $value, 'sort' => $sort++);
                         unset($value);
                     } else {
                         if (method_exists($value, 'getRaw')) {
                             $value = $value->getRaw();
                         } else {
                             $value = array('id' => $id, 'value' => (string) $value, 'sort' => $sort++);
                         }
                     }
                 }
                 $feature['values'] = array_values($feature['values']);
             }
             shopFeatureModel::appendTypeNames($this->response);
             $type_features_model = new shopTypeFeaturesModel();
             $type_features_model->fillTypes($this->response);
             $feature['types'] = array_keys($feature['types']);
             sort($feature['types']);
         }
     }
 }
 /**
  * @param shopProduct $product
  * @return array|bool
  * @example <pre>
  * array(
  *  'feature_1'=>array(
  *      'selected'=>int,
  *      'values'=>array(
  *         %value_id%=> array(
  *              'value_id'=>int,
  *              'value'=>string,
  *              'selected'=>bool,
  *          ),
  *      ),
  *  ),
  * )
  * </pre>
  */
 public function getData(shopProduct $product)
 {
     $feature_model = new shopFeatureModel();
     if ($product->sku_type == shopProductModel::SKU_TYPE_SELECTABLE) {
         $selected = $this->getByProduct($product->id);
         $env = wa()->getEnv();
         if ($env == 'backend') {
             $features = $feature_model->getMultipleSelectableFeaturesByType($product->type_id);
         } else {
             $features = $feature_model->getById(array_keys($selected));
             if ($product->type_id) {
                 $types = array($product->type_id => true);
                 $type_features_model = new shopTypeFeaturesModel();
                 $type_features_model->fillTypes($features, $types);
                 foreach ($features as &$feature) {
                     unset($feature['types']);
                     $feature['sort'] = ifset($feature['sort'][$product->type_id]);
                     unset($feature);
                 }
                 uasort($features, create_function('$a,$b', 'return max(-1,min(1,$a["sort"]-$b["sort"]));'));
             }
         }
         // attach values
         $features = $feature_model->getValues($features);
         foreach ($features as &$f) {
             $count = 0;
             foreach ($f['values'] as $id => &$v) {
                 $is_selected = isset($selected[$f['id']][$id]);
                 if ($env == 'backend') {
                     if (is_object($v)) {
                         $v['selected'] = $is_selected;
                     } else {
                         $v = array('value' => htmlentities((string) $v, ENT_NOQUOTES, 'utf-8'), 'selected' => $is_selected);
                     }
                     unset($v);
                     if ($is_selected) {
                         $count += 1;
                     }
                 } elseif (!$is_selected) {
                     unset($f['values'][$id]);
                 }
             }
             $f['selected'] = $count;
             unset($f);
         }
     } else {
         if (wa()->getEnv() == 'backend') {
             $features = $feature_model->isTypeMultipleSelectable($product->type_id);
         } else {
             $features = array();
         }
     }
     return $features;
     //Frontend
     $data = $feature_model->getValues($data);
     foreach ($data as $code => $f) {
         foreach ($f['values'] as $id => $v) {
             if (!isset($v_id, $selected[$code][$id])) {
                 unset($data[$code]['values'][$id]);
             }
         }
     }
     return $data;
 }