/**
  * @return array of used attribute models
  */
 public function getModels()
 {
     if (is_array($this->_models)) {
         return $this->_models;
     }
     $this->_models = array();
     $cr = new CDbCriteria();
     $cr->addInCondition('StoreAttribute.name', array_keys($this->_attributes));
     $query = StoreAttribute::model()->displayOnFront()->findAll($cr);
     foreach ($query as $m) {
         $this->_models[$m->name] = $m;
     }
     return $this->_models;
 }
 /**
  * @static
  * @param $type
  * @param $externalId
  * @param bool $loadModel
  */
 public static function getObject($type, $externalId, $loadModel = true)
 {
     $query = Yii::app()->db->createCommand()->select("*")->from('accounting1c')->where('object_type=:type AND external_id=:externalId', array(':type' => $type, ':externalId' => $externalId))->limit(1)->queryRow();
     if ($query === false) {
         return false;
     }
     if ($loadModel === true && $query['object_id']) {
         switch ($type) {
             case self::OBJECT_TYPE_CATEGORY:
                 return StoreCategory::model()->findByPk($query['object_id']);
                 break;
             case self::OBJECT_TYPE_ATTRIBUTE:
                 return StoreAttribute::model()->findByPk($query['object_id']);
                 break;
             case self::OBJECT_TYPE_PRODUCT:
                 return StoreProduct::model()->findByPk($query['object_id']);
                 break;
         }
     }
     return $query['object_id'];
 }
 /**
  * Get data to render dropdowns for configurable product.
  * Used on product view.
  * array(
  *      'attributes' // Array of StoreAttribute models used for configurations
  *      'prices'     // Key/value array with configurations prices array(product_id=>price)
  *      'data'       // Array to render dropdowns. array(color=>array('Green'=>'1/3/5/', 'Silver'=>'7/'))
  * )
  * @todo Optimize. Cache queries.
  * @return array
  */
 public function getConfigurableData()
 {
     $attributeModels = StoreAttribute::model()->findAllByPk($this->model->configurable_attributes);
     $models = StoreProduct::model()->findAllByPk($this->model->configurations);
     $data = array();
     $prices = array();
     foreach ($attributeModels as $attr) {
         foreach ($models as $m) {
             $prices[$m->id] = $m->price;
             if (!isset($data[$attr->name])) {
                 $data[$attr->name] = array('---' => '0');
             }
             $method = 'eav_' . $attr->name;
             $value = $m->{$method};
             if (!isset($data[$attr->name][$value])) {
                 $data[$attr->name][$value] = '';
             }
             $data[$attr->name][$value] .= $m->id . '/';
         }
     }
     return array('attributes' => $attributeModels, 'prices' => $prices, 'data' => $data);
 }
 /**
  * Update product type
  * @param bool $new
  * @throws CHttpException
  */
 public function actionUpdate($new = false)
 {
     if ($new === true) {
         $model = new StoreProductType();
     } else {
         $model = StoreProductType::model()->findByPk($_GET['id']);
     }
     if (!$model) {
         throw new CHttpException(404, Yii::t('StoreModule.admin', 'Тип продукта не найден.'));
     }
     if (Yii::app()->request->isPostRequest) {
         $model->attributes = $_POST['StoreProductType'];
         if (isset($_POST['categories']) && !empty($_POST['categories'])) {
             $model->categories_preset = serialize($_POST['categories']);
             $model->main_category = $_POST['main_category'];
         } else {
             //return defaults when all checkboxes were checked off
             $model->categories_preset = null;
             $model->main_category = 0;
         }
         if ($model->validate()) {
             $model->save();
             // Set type attributes
             $model->useAttributes(Yii::app()->request->getPost('attributes', array()));
             $this->setFlashMessage(Yii::t('StoreModule.admin', 'Изменения успешно сохранены'));
             if (isset($_POST['REDIRECT'])) {
                 $this->smartRedirect($model);
             } else {
                 $this->redirect('create');
             }
         }
     }
     // Select available(not used) attributes
     $cr = new CDbCriteria();
     $cr->addNotInCondition('StoreAttribute.id', CHtml::listData($model->attributeRelation, 'attribute_id', 'attribute_id'));
     $allAttributes = StoreAttribute::model()->findAll($cr);
     $this->render('update', array('model' => $model, 'attributes' => $allAttributes));
 }
Exemple #5
0
 /**
  * @param string $eav_prefix
  * @return array
  */
 public function getImportableAttributes($eav_prefix = '')
 {
     $attributes = array('type' => Yii::t('StoreModule.core', 'Тип'), 'name' => Yii::t('StoreModule.core', 'Название'), 'category' => Yii::t('StoreModule.core', 'Категория'), 'additionalCategories' => Yii::t('StoreModule.core', 'Доп. Категории'), 'manufacturer' => Yii::t('StoreModule.core', 'Производитель'), 'sku' => Yii::t('StoreModule.core', 'Артикул'), 'url' => Yii::t('StoreModule.core', 'URL'), 'price' => Yii::t('StoreModule.core', 'Цена'), 'is_active' => Yii::t('StoreModule.core', 'Активен'), 'image' => Yii::t('StoreModule.core', 'Главное изображение'), 'short_description' => Yii::t('StoreModule.core', 'Краткое описание'), 'full_description' => Yii::t('StoreModule.core', 'Полное описание'), 'meta_title' => Yii::t('StoreModule.core', 'Meta Title'), 'meta_keywords' => Yii::t('StoreModule.core', 'Meta Keywords'), 'meta_description' => Yii::t('StoreModule.core', 'Meta Description'), 'layout' => Yii::t('StoreModule.core', 'Макет'), 'view' => Yii::t('StoreModule.core', 'Шаблон'), 'quantity' => Yii::t('StoreModule.core', 'Количество'), 'availability' => Yii::t('StoreModule.core', 'Доступность'), 'created' => Yii::t('StoreModule.core', 'Дата создания'), 'updated' => Yii::t('StoreModule.core', 'Дата обновления'));
     foreach (StoreAttribute::model()->findAll() as $attr) {
         $attributes[$eav_prefix . $attr->name] = $attr->title;
     }
     return $attributes;
 }
Exemple #6
0
<?php

return array('id' => 'attributeUpdateForm', 'showErrorSummary' => true, 'elements' => array('content' => array('type' => 'form', 'title' => Yii::t('StoreModule.admin', 'Параметры'), 'elements' => array('title' => array('type' => 'text'), 'name' => array('type' => 'text', 'hint' => Yii::t('StoreModule.admin', 'Укажите уникальный идентификатор')), 'required' => array('type' => 'checkbox'), 'type' => array('type' => 'dropdownlist', 'items' => StoreAttribute::getTypesList()), 'display_on_front' => array('type' => 'dropdownlist', 'items' => array(1 => Yii::t('StoreModule.admin', 'Да'), 0 => Yii::t('StoreModule.admin', 'Нет'))), 'use_in_filter' => array('type' => 'dropdownlist', 'items' => array(1 => Yii::t('StoreModule.admin', 'Да'), 0 => Yii::t('StoreModule.admin', 'Нет')), 'hint' => Yii::t('StoreModule.admin', 'Использовать свойство для поиска продуктов')), 'select_many' => array('type' => 'dropdownlist', 'items' => array(0 => Yii::t('StoreModule.admin', 'Нет'), 1 => Yii::t('StoreModule.admin', 'Да')), 'hint' => Yii::t('StoreModule.admin', 'Позволяет искать продукты по более чем одному параметру одновременно')), 'use_in_variants' => array('type' => 'dropdownlist', 'items' => array(0 => Yii::t('StoreModule.admin', 'Нет'), 1 => Yii::t('StoreModule.admin', 'Да'))), 'use_in_compare' => array('type' => 'dropdownlist', 'items' => array(1 => Yii::t('StoreModule.admin', 'Да'), 0 => Yii::t('StoreModule.admin', 'Нет'))), 'position' => array('type' => 'text')))));
 /**
  * Import product properties
  */
 public function importProperties()
 {
     foreach ($this->xml->{"Классификатор"}->{"Свойства"}->{"Свойство"} as $attribute) {
         $model = C1ExternalFinder::getObject(C1ExternalFinder::OBJECT_TYPE_ATTRIBUTE, $attribute->{"Ид"});
         if ($attribute->{"ЭтоФильтр"} == 'false') {
             $useInFilter = false;
         } else {
             $useInFilter = true;
         }
         if (!$model) {
             // Create new attribute
             $model = new StoreAttribute();
             $model->name = SlugHelper::run($attribute->{"Наименование"});
             $model->name = str_replace('-', '_', $model->name);
             $model->title = $attribute->{"Наименование"};
             $model->type = StoreAttribute::TYPE_DROPDOWN;
             $model->use_in_filter = $useInFilter;
             $model->display_on_front = true;
             if ($model->save()) {
                 // Add to type
                 $typeAttribute = new StoreTypeAttribute();
                 $typeAttribute->type_id = self::DEFAULT_TYPE;
                 $typeAttribute->attribute_id = $model->id;
                 $typeAttribute->save();
                 $this->createExternalId(C1ExternalFinder::OBJECT_TYPE_ATTRIBUTE, $model->id, $attribute->{"Ид"});
             }
         }
         // Update attributes
         $model->name = SlugHelper::run($attribute->{"Наименование"});
         $model->use_in_filter = $useInFilter;
         $model->save();
     }
 }
 /**
  * Allows to access EAV attributes like normal model attrs.
  * e.g $model->eav_some_attribute_name
  *
  * @todo Optimize, cache.
  * @param $name
  * @return null
  */
 public function __get($name)
 {
     if (substr($name, 0, 4) === 'eav_') {
         if ($this->getIsNewRecord()) {
             return null;
         }
         $attribute = substr($name, 4);
         $eavData = $this->getEavAttributes();
         if (isset($eavData[$attribute])) {
             $value = $eavData[$attribute];
         } else {
             return null;
         }
         $attributeModel = StoreAttribute::model()->findByAttributes(array('name' => $attribute));
         return $attributeModel->renderValue($value);
     }
     return parent::__get($name);
 }
 /**
  * Add option to store attribute
  *
  * @throws CHttpException
  */
 public function actionAddOptionToAttribute()
 {
     $attribute = StoreAttribute::model()->findByPk($_GET['attr_id']);
     if (!$attribute) {
         throw new CHttpException(404, Yii::t('StoreModule.admin', 'Ошибка загрузки атрибута'));
     }
     $attributeOption = new StoreAttributeOption();
     $attributeOption->attribute_id = $attribute->id;
     $attributeOption->value = $_GET['value'];
     $attributeOption->save(false);
     echo $attributeOption->id;
 }
 /**
  * @return array of available attributes in category
  */
 public function getEavAttributes()
 {
     if (is_array($this->_eavAttributes)) {
         return $this->_eavAttributes;
     }
     // Find category types
     $model = new StoreProduct(null);
     $criteria = $model->applyCategories($this->model)->active()->getDbCriteria();
     unset($model);
     $builder = new CDbCommandBuilder(Yii::app()->db->getSchema());
     $criteria->select = 'type_id';
     $criteria->group = 'type_id';
     $criteria->distinct = true;
     $typesUsed = $builder->createFindCommand(StoreProduct::model()->tableName(), $criteria)->queryColumn();
     // Find attributes by type
     $criteria = new CDbCriteria();
     $criteria->addInCondition('types.type_id', $typesUsed);
     $query = StoreAttribute::model()->useInFilter()->with(array('types', 'options'))->findAll($criteria);
     $this->_eavAttributes = array();
     foreach ($query as $attr) {
         $this->_eavAttributes[$attr->name] = $attr;
     }
     return $this->_eavAttributes;
 }
 /**
  * @param $name
  * @return StoreAttribute
  */
 public function getAttributeByName($name)
 {
     if (isset($this->attributesCache[$name])) {
         return $this->attributesCache[$name];
     }
     $attribute = StoreAttribute::model()->findByAttributes(array('name' => $name));
     if (!$attribute) {
         // Create new attribute
         $attribute = new StoreAttribute();
         $attribute->name = $name;
         $attribute->title = ucfirst(str_replace('_', ' ', $name));
         $attribute->type = StoreAttribute::TYPE_DROPDOWN;
         $attribute->display_on_front = true;
         $attribute->save(false);
         // Add to type
         $typeAttribute = new StoreTypeAttribute();
         $typeAttribute->type_id = $this->model->type_id;
         $typeAttribute->attribute_id = $attribute->id;
         $typeAttribute->save(false);
     }
     $this->attributesCache[$name] = $attribute;
     return $attribute;
 }
 * Confirutable products tab
 *
 * @var Controller $this
 * @var StoreProduct $product Current product
 * @var StoreProduct $model
 */
Yii::app()->clientScript->registerScriptFile($this->module->assetsUrl . '/admin/products.configurations.js');
// For grid view we use new products instance
$model = new StoreProduct();
if (isset($_GET['ConfProduct'])) {
    $model->attributes = $_GET['ConfProduct'];
}
$columns = array(array('class' => 'CCheckBoxColumn', 'checked' => !empty($product->configurations) && !isset($clearConfigurations) && !$product->isNewRecord ? 'true' : 'false'), array('name' => 'id', 'type' => 'text', 'value' => '$data->id', 'filter' => CHtml::textField('ConfProduct[id]', $model->id)), array('name' => 'name', 'type' => 'raw', 'value' => 'CHtml::link(CHtml::encode($data->name), array("update", "id"=>$data->id), array("target"=>"_blank"))', 'filter' => CHtml::textField('ConfProduct[name]', $model->name)), array('name' => 'sku', 'value' => '$data->sku', 'filter' => CHtml::textField('ConfProduct[sku]', $model->sku)), array('name' => 'price', 'value' => '$data->price', 'filter' => CHtml::textField('ConfProduct[price]', $model->price)));
// Process attributes
$eavAttributes = array();
$attributeModels = StoreAttribute::model();
$attributeModels->setTableAlias('StoreAttribute');
$attributeModels = $attributeModels->findAllByPk($product->configurable_attributes);
foreach ($attributeModels as $attribute) {
    $selected = null;
    if (isset($_GET['eav'][$attribute->name]) && !empty($_GET['eav'][$attribute->name])) {
        $eavAttributes[$attribute->name] = $_GET['eav'][$attribute->name];
        $selected = $_GET['eav'][$attribute->name];
    } else {
        array_push($eavAttributes, $attribute->name);
    }
    $columns[] = array('name' => 'eav_' . $attribute->name, 'header' => $attribute->title, 'htmlOptions' => array('class' => 'eav'), 'filter' => CHtml::dropDownList('eav[' . $attribute->name . ']', $selected, CHtml::listData($attribute->options, 'id', 'value'), array('empty' => '---')));
}
if (!empty($eavAttributes)) {
    $model = $model->withEavAttributes($eavAttributes);
}
 /**
  * Load StoreAttribute models by names
  * @return array of StoreAttribute models
  */
 public function getAttributes()
 {
     if ($this->_attributes === null) {
         $this->_attributes = array();
         $names = array();
         foreach ($this->getProducts() as $p) {
             $names = array_merge($names, array_keys($p->getEavAttributes()));
         }
         $cr = new CDbCriteria();
         $cr->addInCondition('StoreAttribute.name', $names);
         $query = StoreAttribute::model()->displayOnFront()->useInCompare()->findAll($cr);
         foreach ($query as $m) {
             $this->_attributes[$m->name] = $m;
         }
     }
     return $this->_attributes;
 }
Exemple #14
0
    // Price
    echo CHtml::openTag('span', array('class' => 'amount'));
    echo StoreProduct::formatPrice(Yii::app()->currency->convert($price));
    echo ' ' . Yii::app()->currency->active->symbol;
    echo CHtml::closeTag('span');
    // Display variant options
    if (!empty($product['variant_models'])) {
        echo CHtml::openTag('span', array('class' => 'cartProductOptions'));
        foreach ($product['variant_models'] as $variant) {
            echo ' - ' . $variant->attribute->title . ': ' . $variant->option->value . '<br/>';
        }
        echo CHtml::closeTag('span');
    }
    // Display configurable options
    if (isset($product['configurable_model'])) {
        $attributeModels = StoreAttribute::model()->findAllByPk($product['model']->configurable_attributes);
        echo CHtml::openTag('span', array('class' => 'cartProductOptions'));
        foreach ($attributeModels as $attribute) {
            $method = 'eav_' . $attribute->name;
            echo ' - ' . $attribute->title . ': ' . $product['configurable_model']->{$method} . '<br/>';
        }
        echo CHtml::closeTag('span');
    }
    ?>
			</td>
			<td>
                <div class="quantity buttons_added">
                <button class="small_silver_button plus">+</button>
				<?php 
    echo CHtml::numberField("quantities[{$index}]", $product['quantity'], array('class' => 'count'));
    ?>
 /**
  * Delete attribute
  * @param array $id
  */
 public function actionDelete($id = array())
 {
     if (Yii::app()->request->isPostRequest) {
         $model = StoreAttribute::model()->findAllByPk($_REQUEST['id']);
         if (!empty($model)) {
             foreach ($model as $m) {
                 $count = StoreProduct::model()->withEavAttributes(array($m->name))->count();
                 if ($count) {
                     throw new CHttpException(503, Yii::t('StoreModule.admin', 'Ошибка удаления атрибута - он используется продуктами.'));
                 }
                 $m->delete();
             }
         }
         if (!Yii::app()->request->isAjaxRequest) {
             $this->redirect('index');
         }
     }
 }
Exemple #16
0
<?php

/**
 * Display attributes list
 **/
$this->pageHeader = Yii::t('StoreModule.admin', 'Атрибуты');
$this->breadcrumbs = array('Home' => $this->createUrl('/admin'), Yii::t('StoreModule.admin', 'Атрибуты'));
$this->topButtons = $this->widget('application.modules.admin.widgets.SAdminTopButtons', array('template' => array('create'), 'elements' => array('create' => array('link' => $this->createUrl('create'), 'title' => Yii::t('StoreModule.admin', 'Создать атрибут'), 'options' => array('icons' => array('primary' => 'ui-icon-plus'))))));
$this->widget('ext.sgridview.SGridView', array('dataProvider' => $dataProvider, 'id' => 'productsListGrid', 'filter' => $model, 'columns' => array(array('class' => 'CCheckBoxColumn'), array('class' => 'SGridIdColumn', 'name' => 'id'), array('name' => 'title', 'type' => 'raw', 'value' => 'CHtml::link(CHtml::encode($data->title), array("/store/admin/attribute/update", "id"=>$data->id))'), 'name', array('name' => 'type', 'filter' => StoreAttribute::getTypesList(), 'value' => 'CHtml::encode(StoreAttribute::getTypeTitle($data->type))'), 'position', array('class' => 'CButtonColumn', 'template' => '{update}{delete}'))));
Exemple #17
0
 /**
  * Create new order
  * @return Order
  */
 public function createOrder()
 {
     if (Yii::app()->cart->countItems() == 0) {
         return false;
     }
     $order = new Order();
     // Set main data
     $order->user_id = Yii::app()->user->isGuest ? null : Yii::app()->user->id;
     $order->user_name = $this->form->name;
     $order->user_email = $this->form->email;
     $order->user_phone = $this->form->phone;
     $order->user_address = $this->form->address;
     $order->user_comment = $this->form->comment;
     $order->delivery_id = $this->form->delivery_id;
     if ($order->validate()) {
         $order->save();
     } else {
         throw new CHttpException(503, Yii::t('OrdersModule.core', 'Ошибка создания заказа'));
     }
     // Process products
     foreach (Yii::app()->cart->getDataWithModels() as $item) {
         $ordered_product = new OrderProduct();
         $ordered_product->order_id = $order->id;
         $ordered_product->product_id = $item['model']->id;
         $ordered_product->configurable_id = $item['configurable_id'];
         $ordered_product->name = $item['model']->name;
         $ordered_product->quantity = $item['quantity'];
         $ordered_product->sku = $item['model']->sku;
         $ordered_product->price = StoreProduct::calculatePrices($item['model'], $item['variant_models'], $item['configurable_id']);
         // Process configurable product
         if (isset($item['configurable_model']) && $item['configurable_model'] instanceof StoreProduct) {
             $configurable_data = array();
             $ordered_product->configurable_name = $item['configurable_model']->name;
             // Use configurable product sku
             $ordered_product->sku = $item['configurable_model']->sku;
             // Save configurable data
             $attributeModels = StoreAttribute::model()->findAllByPk($item['model']->configurable_attributes);
             foreach ($attributeModels as $attribute) {
                 $method = 'eav_' . $attribute->name;
                 $configurable_data[$attribute->title] = $item['configurable_model']->{$method};
             }
             $ordered_product->configurable_data = serialize($configurable_data);
         }
         // Save selected variants as key/value array
         if (!empty($item['variant_models'])) {
             $variants = array();
             foreach ($item['variant_models'] as $variant) {
                 $variants[$variant->attribute->title] = $variant->option->value;
             }
             $ordered_product->variants = serialize($variants);
         }
         $ordered_product->save();
     }
     // Reload order data.
     $order->refresh();
     // All products added. Update delivery price.
     $order->updateDeliveryPrice();
     // Send email to user.
     $this->sendEmail($order);
     return $order;
 }