예제 #1
0
 /**
  * Get the custom fields for the given entity
  * @param string $entity
  * @param int $id
  * @param bool $cache_values If the values should be cached in RAV helper
  */
 function getCustomFields($entity, $id, $cache_values = true, $editable_by = '')
 {
     Tienda::load('TiendaModelEavAttributes', 'models.eavattributes');
     Tienda::load('TiendaHelperEav', 'helpers.eav');
     $eavs = TiendaHelperEav::getAttributes($entity, $id, false, $editable_by);
     $fields = array();
     foreach (@$eavs as $eav) {
         $key = $eav->eavattribute_alias;
         $value = TiendaHelperEav::getAttributeValue($eav, $entity, $id, false, $cache_values);
         $fields[] = array('attribute' => $eav, 'value' => $value);
     }
     return $fields;
 }
예제 #2
0
파일: carts.php 프로젝트: annggeel/tienda
 /**
  *
  * @param $session_id
  * @param $user_id
  * @return unknown_type
  */
 function mergeSessionCartWithUserCart($session_id, $user_id)
 {
     Tienda::load('TiendaHelperEav', 'helpers.eav');
     $date = JFactory::getDate();
     $session = JFactory::getSession();
     JModel::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_tienda/models');
     $model = JModel::getInstance('Carts', 'TiendaModel');
     $model->setState('filter_user_leq', '0');
     $model->setState('filter_session', $session_id);
     $session_cartitems = $model->getList();
     $this->deleteSessionCartItems($session_id);
     if (!empty($session_cartitems)) {
         JTable::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_tienda/tables');
         $table = JTable::getInstance('Carts', 'TiendaTable');
         foreach ($session_cartitems as $session_cartitem) {
             $keynames = array();
             $keynames['user_id'] = $user_id;
             $keynames['product_id'] = $session_cartitem->product_id;
             $keynames['product_attributes'] = $session_cartitem->product_attributes;
             // fire plugin event: onGetAdditionalCartKeyValues
             //this event allows plugins to extend the multiple-column primary key of the carts table
             // load EAVs from the previous cart
             $additionalKeyValues = TiendaHelperCarts::getAdditionalKeyValues($session_cartitem, null, null);
             if (!empty($additionalKeyValues)) {
                 $keynames = array_merge($keynames, $additionalKeyValues);
             }
             $table->product_id = $session_cartitem->product_id;
             if ($table->load($keynames)) {
                 // the quantity as set in the session takes precedence
                 $table->product_qty = $session_cartitem->product_qty;
             } else {
                 $eavs = TiendaHelperEav::getAttributes('products', $session_cartitem->product_id);
                 foreach (@$eavs as $eav) {
                     $table->{$eav->eavattribute_alias} = TiendaHelperEav::getAttributeValue($eav, 'carts', $session_cartitem->cart_id, true, false);
                 }
                 foreach ($session_cartitem as $key => $value) {
                     if (property_exists($table, $key)) {
                         $table->set($key, $value);
                     }
                 }
                 // this is a new cartitem, so set cart_id = 0
                 $table->cart_id = '0';
             }
             $table->user_id = $user_id;
             $table->session_id = $session->getId();
             $table->last_updated = $date->toMysql();
             if (!$table->save()) {
                 JError::raiseNotice('updateCart', $table->getError());
             }
             $table->cart_id = '0';
         }
     }
 }
예제 #3
0
 /**
  * Inserts a new row if id is zero or updates an existing row in the database table
  * Check for custom fields and store them in the right table
  * Can be overloaded/supplemented by the child class
  *
  * @access public
  * @param boolean If false, null object variables are not updated
  * @return null|string null if successful otherwise returns and error message
  */
 function store($updateNulls = false)
 {
     Tienda::load("TiendaHelperEav", 'helpers.eav');
     $dispatcher = JDispatcher::getInstance();
     $before = $dispatcher->trigger('onBeforeStore' . $this->get('_suffix'), array(&$this));
     if (in_array(false, $before, true)) {
         return false;
     }
     $key = $this->_tbl_key;
     $id = $this->{$key};
     $post_id = JRequest::getInt($key, null, 'post');
     // ID from post
     $app = JFactory::getApplication();
     $editable_by = $app->isAdmin() ? 1 : 2;
     if ($app->isAdmin()) {
         $view = JRequest::getCmd('view', '');
         if ($view == 'pos') {
             // display all for POS
             $editable_by = array(0, 1, 2);
         }
     }
     // Get the custom fields for this entities
     $eavs = TiendaHelperEav::getAttributes($this->get('_suffix'), $id, false, $editable_by);
     // Is this a mirrored table (see decription at the beginning of this file)
     if (strlen($this->_linked_table) && $this->_linked_table_key) {
         // Copy the custom field value to this table
         $mirrored_eavs = TiendaHelperEav::getAttributes($this->_linked_table, $this->_linked_table_key, false, $editable_by);
         $eavs = array_merge($eavs, $mirrored_eavs);
     }
     $custom_fields = array();
     // Is this a mirrored table (see decription at the beginning of this file)
     // Get is eavs first, and then override them with values from the request
     if (strlen($this->_linked_table) && $this->_linked_table_key) {
         // Copy the custom field value to this table
         $mirrored_eavs = TiendaHelperEav::getAttributes($this->_linked_table, $this->_linked_table_key, false, $editable_by);
         // If there are Custom Fields for the linked key
         if (count($mirrored_eavs)) {
             foreach ($mirrored_eavs as $eav) {
                 $key = $eav->eavattribute_alias;
                 // Check if the key exists in this object (already mirrored)
                 if (!property_exists($this, $key)) {
                     // Get the value
                     //						if( $id === null || $post_id == $id )
                     $value = TiendaHelperEav::getAttributeValue($eav, $this->_linked_table, $this->_linked_table_key, !($id === null || $post_id == $id), false);
                     //						else
                     //							$value = null;
                     // Store it into the array for eav values
                     if ($value !== null) {
                         $custom_fields[$key] = array('eav' => $eav, 'value' => $value);
                     }
                 } else {
                     $value = $this->{$key};
                     unset($this->{$key});
                     // Store it into the array for eav values
                     $custom_fields[$key] = array('eav' => $eav, 'value' => $value);
                 }
             }
         }
     }
     // If there are Custom Fields in this object
     if (count($eavs)) {
         foreach ($eavs as $eav) {
             $key = $eav->eavattribute_alias;
             // Check if the key exists in this object (could be a ->load() ->set() ->store() workflow)
             if (property_exists($this, $key)) {
                 // Fetch the value from the post (if any) and overwrite the object value if it exists
                 if ($eav->eavattribute_type == 'text') {
                     $value = JRequest::getVar($key, null, 'post', 'string', JREQUEST_ALLOWHTML);
                 } else {
                     $value = JRequest::getVar($key, null, 'post');
                 }
                 if ($value === null) {
                     // If not, use the object value
                     $value = $this->{$key};
                 }
                 unset($this->{$key});
                 // Store it into the array for eav values
                 $custom_fields[$key] = array('eav' => $eav, 'value' => $value);
             } else {
                 if ($id === null || $post_id == $id) {
                     // Fetch the value from the post (if any)
                     $value = JRequest::getVar($key, null, 'post');
                 } else {
                     $value = null;
                 }
                 if ($value !== null) {
                     // Store it into the array for eav values
                     $custom_fields[$key] = array('eav' => $eav, 'value' => $value);
                 }
             }
         }
     }
     if ($return = parent::store($updateNulls)) {
         // Store custom fields if needed
         if (count($custom_fields)) {
             $key = $this->_tbl_key;
             $id = $this->{$key};
             foreach ($custom_fields as $cf) {
                 // get the value table
                 $table = JTable::getInstance('EavValues', 'TiendaTable');
                 // set the type based on the attribute
                 $table->setType($cf['eav']->eavattribute_type);
                 // load the value based on the entity id
                 $keynames = array();
                 $keynames['eavattribute_id'] = $cf['eav']->eavattribute_id;
                 $keynames['eaventity_id'] = $id;
                 $loaded = $table->load($keynames);
                 // Add the value if it's a first time save
                 if (!$loaded) {
                     $table->eavattribute_id = $cf['eav']->eavattribute_id;
                     $table->eaventity_id = $id;
                 }
                 // Store the value
                 $table->eavvalue_value = $cf['value'];
                 $table->eaventity_type = $this->get('_suffix');
                 $stored = $table->store();
                 // Log the errors
                 if (!$stored) {
                     if (strlen($this->getError())) {
                         $this->setError($this->getError());
                     }
                 }
             }
         }
         $dispatcher = JDispatcher::getInstance();
         $dispatcher->trigger('onAfterStore' . $this->get('_suffix'), array($this));
     }
     return $return;
 }
예제 #4
0
 /**
  * Saves an item and redirects based on task
  * @return void
  */
 function save()
 {
     $task = JRequest::getVar('task');
     $model = $this->getModel($this->get('suffix'));
     $isSaveAs = false;
     $row = $model->getTable();
     $row->load($model->getId());
     $row->bind(JRequest::get('POST'));
     $row->product_description = JRequest::getVar('product_description', '', 'post', 'string', JREQUEST_ALLOWRAW);
     $row->product_description_short = JRequest::getVar('product_description_short', '', 'post', 'string', JREQUEST_ALLOWRAW);
     // set the id as 0 for new entry
     if ($task == "save_as") {
         unset($row);
         // load WITHOUT EAV! otherwise the save will fail
         $row = $model->getTable();
         $row->load($model->getId(), true, false);
         $row->bind(JRequest::get('POST'));
         $row->product_description = JRequest::getVar('product_description', '', 'post', 'string', JREQUEST_ALLOWRAW);
         $row->product_description_short = JRequest::getVar('product_description_short', '', 'post', 'string', JREQUEST_ALLOWRAW);
         $isSaveAs = true;
         $oldProductImagePath = $row->getImagePath();
         $pk = $row->getKeyName();
         $oldPk = $row->{$pk};
         // these get reset
         $row->{$pk} = 0;
         $row->product_images_path = '';
         $row->product_rating = '';
         $row->product_comments = '';
     }
     $row->_isNew = empty($row->product_id);
     $fieldname = 'product_full_image_new';
     $userfiles = JRequest::getVar($fieldname, '', 'files', 'array');
     // save the integrations
     $row = $this->prepareParameters($row);
     //check if normal price exists
     Tienda::load("TiendaHelperProduct", 'helpers.product');
     if ($isSaveAs) {
         // and the prices
         $prices = TiendaHelperProduct::getPrices($oldPk);
     } else {
         $prices = TiendaHelperProduct::getPrices($row->product_id);
     }
     if ($row->save()) {
         $row->product_id = $row->id;
         $model->setId($row->id);
         $this->messagetype = 'message';
         $this->message = JText::_('COM_TIENDA_SAVED');
         // check it's new entry or empty price but not save as
         if (($row->_isNew || empty($prices)) && !$isSaveAs) {
             // set price if new or no prices set
             $price = JTable::getInstance('Productprices', 'TiendaTable');
             $price->product_id = $row->id;
             $price->product_price = JRequest::getVar('product_price');
             $price->group_id = Tienda::getInstance()->get('default_user_group', '1');
             if (!$price->save()) {
                 $this->messagetype = 'notice';
                 $this->message .= " :: " . $price->getError();
             }
         }
         if ($row->_isNew && !$isSaveAs) {
             // set category
             $category = JTable::getInstance('Productcategories', 'TiendaTable');
             $category->product_id = $row->id;
             $category->category_id = JRequest::getVar('category_id');
             if (!$category->save()) {
                 $this->messagetype = 'notice';
                 $this->message .= " :: " . $category->getError();
             }
             // save default quantity
             $quantity = JTable::getInstance('Productquantities', 'TiendaTable');
             $quantity->product_id = $row->id;
             $quantity->quantity = JRequest::getInt('product_quantity');
             if (!$quantity->save()) {
                 $this->messagetype = 'notice';
                 $this->message .= " :: " . $quantity->getError();
             }
         }
         if ($isSaveAs) {
             // set price when cloning
             $priceTable = JTable::getInstance('Productprices', 'TiendaTable');
             foreach ($prices as $price) {
                 $priceTable->product_id = $row->id;
                 $priceTable->product_price = $price->product_price;
                 $priceTable->product_price_startdate = $price->product_price_startdate;
                 $priceTable->product_price_enddate = $price->product_price_enddate;
                 $priceTable->created_date = $price->created_date;
                 $priceTable->modified_date = $price->modified_date;
                 $priceTable->group_id = $price->group_id;
                 $priceTable->price_quantity_start = $price->price_quantity_start;
                 $priceTable->price_quantity_end = $price->price_quantity_end;
                 if (!$priceTable->save()) {
                     $this->messagetype = 'notice';
                     $this->message .= " :: " . $priceTable->getError();
                 }
             }
             // set category
             $categoryTable = JTable::getInstance('Productcategories', 'TiendaTable');
             $categories = TiendaHelperProduct::getCategories($oldPk);
             foreach ($categories as $category) {
                 $categoryTable->product_id = $row->id;
                 $categoryTable->category_id = $category;
                 if (!$categoryTable->save()) {
                     $this->messagetype = 'notice';
                     $this->message .= " :: " . $categoryTable->getError();
                 }
             }
             // TODO Save Attributes
             // An array to map attribute id  old attribute id  are as key and new attribute id are as value
             $attrbuteMappingArray = array();
             $attrbuteParentMappingArray = array();
             $attributes = TiendaHelperProduct::getAttributes($oldPk);
             foreach ($attributes as $attribute) {
                 $attributeTable = JTable::getInstance('ProductAttributes', 'TiendaTable');
                 $attributeTable->productattribute_name = $attribute->productattribute_name;
                 $attributeTable->product_id = $row->id;
                 $attributeTable->ordering = $attribute->ordering;
                 if ($attributeTable->save()) {
                     $attrbuteMappingArray[$attribute->productattribute_id] = $attributeTable->productattribute_id;
                     $attrbuteParentMappingArray[$attributeTable->productattribute_id] = $attribute->parent_productattributeoption_id;
                 } else {
                     $this->messagetype = 'notice';
                     $this->message .= " :: " . $attributeTable->getError();
                 }
             }
             // set Attribute options
             $attrbuteOptionsMappingArray = array();
             foreach ($attrbuteMappingArray as $oldAttrbuteId => $newAttributeId) {
                 // set Attribute options
                 $options = TiendaHelperProduct::getAttributeOptionsObjects($oldAttrbuteId);
                 foreach ($options as $option) {
                     $attributeOptionsTable = JTable::getInstance('ProductAttributeOptions', 'TiendaTable');
                     $attributeOptionsTable->productattribute_id = $newAttributeId;
                     $attributeOptionsTable->productattributeoption_name = $option->productattributeoption_name;
                     $attributeOptionsTable->productattributeoption_price = $option->productattributeoption_price;
                     $attributeOptionsTable->productattributeoption_prefix = $option->productattributeoption_prefix;
                     $attributeOptionsTable->productattributeoption_code = $option->productattributeoption_code;
                     $attributeOptionsTable->ordering = $option->ordering;
                     if ($attributeOptionsTable->save()) {
                         $attrbuteOptionsMappingArray[$option->productattributeoption_id] = $attributeOptionsTable->productattributeoption_id;
                     } else {
                         $this->messagetype = 'notice';
                         $this->message .= " :: " . $attributeOptionsTable->getError();
                     }
                 }
                 // save parent relationship
                 if ($attrbuteParentMappingArray[$newAttributeId]) {
                     $attributeTable = JTable::getInstance('ProductAttributes', 'TiendaTable');
                     $attributeTable->load($newAttributeId);
                     $attributeTable->parent_productattributeoption_id = $attrbuteOptionsMappingArray[$attrbuteParentMappingArray[$newAttributeId]];
                     if (!$attributeTable->save()) {
                         $this->messagetype = 'notice';
                         $this->message .= " :: " . $attributeTable->getError();
                     }
                 }
             }
             // set quantity
             $quantityTable = JTable::getInstance('Productquantities', 'TiendaTable');
             $quantities = TiendaHelperProduct::getProductQuantitiesObjects($oldPk);
             foreach ($quantities as $quantity) {
                 $quantityTable->product_attributes = $quantity->product_attributes;
                 $quantityTable->product_id = $row->id;
                 $quantityTable->vendor_id = $quantity->vendor_id;
                 $quantityTable->quantity = $quantity->quantity;
                 $optionsCSV = $quantity->product_attributes;
                 $options = explode(",", $optionsCSV);
                 $newOptions = array();
                 foreach ($options as $option) {
                     $newOptions[] = $attrbuteOptionsMappingArray[$option];
                 }
                 $optionsCSV = implode(",", $newOptions);
                 $quantityTable->product_attributes = $optionsCSV;
                 if (!$quantityTable->save()) {
                     $this->messagetype = 'notice';
                     $this->message .= " :: " . $quantityTable->getError();
                 }
             }
             // copy all gallery files
             jimport('joomla.filesystem.folder');
             jimport('joomla.filesystem.file');
             $galleryFiles = JFolder::files($oldProductImagePath);
             // get all gallery images
             if (count($galleryFiles)) {
                 JFolder::create($row->getImagePath());
                 // create folder for images
                 JFolder::create($row->getImagePath() . 'thumbs');
                 // create folder for thumbnails images
                 for ($i = 0, $c = count($galleryFiles); $i < $c; $i++) {
                     // copy only images with both original file and a corresponding thumbnail
                     if (JFile::exists($oldProductImagePath . 'thumbs/' . $galleryFiles[$i]) && JFile::exists($oldProductImagePath . $galleryFiles[$i])) {
                         JFile::copy($oldProductImagePath . $galleryFiles[$i], $row->getImagePath() . DS . $galleryFiles[$i]);
                         JFile::copy($oldProductImagePath . 'thumbs/' . $galleryFiles[$i], $row->getImagePath() . '/thumbs/' . $galleryFiles[$i]);
                     }
                 }
             }
             // duplicate product files (only in db)
             $modelFiles = $this->getModel('productfiles');
             $modelFiles->setState('filter_product', $oldPk);
             $listFiles = $modelFiles->getList();
             if (count($listFiles)) {
                 $row_file = JTable::getInstance('Productfiles', 'TiendaTable');
                 for ($i = 0, $c = count($listFiles); $i < $c; $i++) {
                     $row_file->bind($listFiles[$i]);
                     // bind old data
                     $row_file->productfile_id = 0;
                     // will be set
                     $row_file->product_id = $row->product_id;
                     // use clone's ID
                     $row_file->save();
                     // save the data
                 }
             }
             // create duplicate connections for EAV custom fields
             JModel::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_tienda/models');
             $model = JModel::getInstance('EavAttributes', 'TiendaModel');
             $model->setState('filter_entitytype', 'products');
             $model->setState('filter_entityid', $oldPk);
             $listEAV = $model->getList();
             $teav = $model->getTable();
             if (is_array($listEAV)) {
                 for ($i = 0, $c = count($listEAV); $i < $c; $i++) {
                     $tblEAV = JTable::getInstance('EavAttributeEntities', 'TiendaTable');
                     $tblEAV->eaventity_id = $row->product_id;
                     $tblEAV->eaventity_type = 'products';
                     $tblEAV->eavattribute_id = $listEAV[$i]->eavattribute_id;
                     $tblEAV->save();
                     // Clone the values too!
                     $teav->load($listEAV[$i]->eavattribute_id);
                     $value = TiendaHelperEav::getAttributeValue($teav, 'products', $row->product_id);
                     $newValue = JTable::getInstance('EavValues', 'TiendaTable');
                     $newValue->setType($teav->eavattribute_type);
                     $newValue->eavattribute_id = $listEAV[$i]->eavattribute_id;
                     $newValue->eaventity_id = $row->product_id;
                     // Store the value
                     $newValue->eavvalue_value = $value;
                     $newValue->eaventity_type = 'products';
                     $newValue->store();
                 }
             }
         }
         // Multiple images processing
         $i = 0;
         $error = false;
         while (!empty($userfiles['size'][$i])) {
             $dir = $row->getImagePath(true);
             if ($upload = $this->addimage($fieldname, $i, $dir)) {
                 // The first One is the default (if there is no default yet)
                 if ($i == 0 && (empty($row->product_full_image) || $row->product_full_image == '')) {
                     $row->product_full_image = $upload->getPhysicalName();
                     // need to re-save in this instance
                     // should we be storing or saving?
                     $row->save();
                 }
             } else {
                 $error = true;
             }
             $i++;
         }
         if ($error) {
             $this->messagetype = 'notice';
             $this->message .= " :: " . $this->getError();
         }
         $helper = new TiendaHelperProduct();
         $helper->onAfterSaveProducts($row);
         $model->clearCache();
         $dispatcher = JDispatcher::getInstance();
         $dispatcher->trigger('onAfterSave' . $this->get('suffix'), array($row));
     } else {
         $this->messagetype = 'notice';
         $this->message = JText::_('COM_TIENDA_SAVE_FAILED') . " - " . $row->getError();
     }
     $redirect = "index.php?option=com_tienda";
     switch ($task) {
         case "save_as":
             $redirect .= '&view=' . $this->get('suffix') . '&task=edit&id=' . $row->product_id;
             $this->message .= " - " . JText::_('COM_TIENDA_YOU_ARE_NOW_EDITING_NEW_PRODUCT');
             break;
         case "saveprev":
             $redirect .= '&view=' . $this->get('suffix');
             // get prev in list
             Tienda::load("TiendaHelperProduct", 'helpers.product');
             $surrounding = TiendaHelperProduct::getSurrounding($model->getId());
             if (!empty($surrounding['prev'])) {
                 $redirect .= '&task=edit&id=' . $surrounding['prev'];
             }
             break;
         case "savenext":
             $redirect .= '&view=' . $this->get('suffix');
             // get next in list
             Tienda::load("TiendaHelperProduct", 'helpers.product');
             $surrounding = TiendaHelperProduct::getSurrounding($model->getId());
             if (!empty($surrounding['next'])) {
                 $redirect .= '&task=edit&id=' . $surrounding['next'];
             }
             break;
         case "savenew":
             $redirect .= '&view=' . $this->get('suffix') . '&task=add';
             break;
         case "apply":
             $redirect .= '&view=' . $this->get('suffix') . '&task=edit&id=' . $model->getId();
             break;
         case "save":
         default:
             $redirect .= "&view=" . $this->get('suffix');
             break;
     }
     $redirect = JRoute::_($redirect, false);
     $this->setRedirect($redirect, $this->message, $this->messagetype);
 }
예제 #5
0
파일: default.php 프로젝트: annggeel/tienda
    ?>
 
            <?php 
    foreach ($items as $item) {
        ?>
            	
            	<?php 
        $params = new DSCParameter(trim(@$item->cartitem_params));
        $default_url = "index.php?option=com_tienda&view=products&task=view&id=" . $item->product_id;
        $attributes = TiendaHelperProduct::convertAttributesToArray($item->product_id, $item->product_attributes);
        for ($j = 0, $c = count($attributes); $j < $c; $j++) {
            $default_url .= '&attribute_' . $attributes[$j][0] . '=' . $attributes[$j][1];
        }
        $eavs = TiendaHelperEav::getAttributes('products', $item->product_id, true, 2);
        for ($j = 0, $cj = count($eavs); $j < $cj; $j++) {
            $default_url .= '&' . urlencode($eavs[$j]->eavattribute_alias) . '=' . urlencode(TiendaHelperEav::getAttributeValue($eavs[$j], 'carts', $item->cart_id, false, true));
        }
        $link = $params->get('product_url', $default_url);
        $link = JRoute::_($link);
        ?>
            
                <tr class="row<?php 
        echo $k;
        ?>
">
                    <td style="width: 20px; text-align: center;">
                        <input type="checkbox" id="cb<?php 
        echo $i;
        ?>
" name="cid[<?php 
        echo $item->cart_id;