private function _migrateProduct($data) { // Check for product_name. if (!empty($data->product_name)) { $isNew = false; if (!empty($data->product_id)) { if ((int) $data->product_id) { $data['product_id'] = 0; $isNew = true; } } JTable::addIncludePath(JPATH_ADMINISTRATOR . DIRECTORY_SEPARATOR . 'components' . DIRECTORY_SEPARATOR . 'com_citruscart' . DIRECTORY_SEPARATOR . 'tables'); $product = JTable::getInstance('Products', 'CitruscartTable'); if (!$isNew) { if (!$product->load($data['product_id'])) { $isNew = true; $data['product_id'] = 0; } } // If is a new product, use product->create() if ($isNew) { $product->product_price = 0; $product->product_quantity = 0; $product->bind($this->simpleXml2Array($data)); if ($product->product_full_image) { Citruscart::load('CitruscartFile', 'library.file'); // Do the same cleaning to the image title that the image helper does $name = explode('.', $product->product_full_image); $name = CitruscartFile::cleanTitle($name[0]) . '.' . $name[count($name) - 1]; $product->product_full_image = $name; } $product->create(); $this->_migrateAttributes($product->product_id, $data->product_attributes); $this->_migrateCategories($product->product_id, $data->product_categories); $this->_migrateFiles($product->product_id, $data->product_files); $this->_migrateImages($product->product_id, $data->product_images); $this->_migrateChildren($product->product_id, $data->product_children); $this->_migrateRelated($product->product_id, $data->related_products); $this->_migrateCustomFields($product->product_id, $data->product_custom_fields); } else { $product->bind($this->simpleXml2Array($data)); //check if normal price exists Citruscart::load("CitruscartHelperProduct", 'helpers.product'); $prices = CitruscartHelperProduct::getPrices($product->product_id); $quantities = CitruscartHelperProduct::getProductQuantities($product->product_id); if ($product->save()) { $product->product_id = $product->id; // New price? if (empty($prices)) { // set price if new or no prices set $price = JTable::getInstance('Productprices', 'CitruscartTable'); $price->product_id = $product->id; $price->product_price = (string) $data->product_price; $price->group_id = Citruscart::getInstance()->get('default_user_group', '1'); $price->save(); } else { // set price if new or no prices set $price = JTable::getInstance('Productprices', 'CitruscartTable'); $price->load($prices[0]->product_price_id); $price->product_price = (string) $data->product_price; $price->group_id = Citruscart::getInstance()->get('default_user_group', '1'); $price->save(); } // New quantity? if (empty($quantities)) { // save default quantity $quantity = JTable::getInstance('Productquantities', 'CitruscartTable'); $quantity->product_id = $product->id; $quantity->quantity = (string) $data->product_quantity; $quantity->save(); } else { // save default quantity $quantity = JTable::getInstance('Productquantities', 'CitruscartTable'); $quantity->load($quantities[0]->productquantity_id); $quantity->product_id = $product->id; $quantity->quantity = (string) $data->product_quantity; $quantity->save(); } } } return $product; } return null; }
/** * Do the migration * * @return array */ function _migrate($datas) { $queries = array(); $results = array(); $n = 0; // Loop though the rows foreach ($datas as $data) { // Check for product_name. Explode() could have generated an empty row if (!empty($data['product_name'])) { $isNew = false; if (!$data['product_id']) { $data['product_id'] = 0; $isNew = true; } JTable::addIncludePath(JPATH_ADMINISTRATOR . DS . 'components' . DS . 'com_citruscart' . DS . 'tables'); $product = JTable::getInstance('Products', 'CitruscartTable'); if (!$isNew) { if (!$product->load($data['product_id'])) { $isNew = true; $data['product_id'] = 0; } } // If is a new product, use product->create() if ($isNew) { $product->product_price = 0; $product->product_quantity = 0; $product->bind($data); if ($product->product_full_image) { Citruscart::load('CitruscartFile', 'library.file'); // Do the same cleaning to the image title that the image helper does $name = explode('.', $product->product_full_image); $name = CitruscartFile::cleanTitle($name[0]) . '.' . $name[count($name) - 1]; $product->product_full_image = $name; } $product->create(); $this->_migrateAttributes($product->product_id, $data['product_attributes']); } else { $product->bind($data); //check if normal price exists Citruscart::load("CitruscartHelperProduct", 'helpers.product'); $prices = CitruscartHelperProduct::getPrices($product->product_id); $quantities = CitruscartHelperProduct::getProductQuantities($product->product_id); if ($product->save()) { $product->product_id = $product->id; // New price? if (empty($prices)) { // set price if new or no prices set $price = JTable::getInstance('Productprices', 'CitruscartTable'); $price->product_id = $product->id; $price->product_price = $data['product_price']; $price->group_id = Citruscart::getInstance()->get('default_user_group', '1'); $price->save(); } else { // set price if new or no prices set $price = JTable::getInstance('Productprices', 'CitruscartTable'); $price->load($prices[0]->product_price_id); $price->product_price = $data['product_price']; $price->group_id = Citruscart::getInstance()->get('default_user_group', '1'); $price->save(); } // New quantity? if (empty($quantities)) { // save default quantity $quantity = JTable::getInstance('Productquantities', 'CitruscartTable'); $quantity->product_id = $product->id; $quantity->quantity = $data['product_quantity']; $quantity->save(); } else { // save default quantity $quantity = JTable::getInstance('Productquantities', 'CitruscartTable'); $quantity->load($quantities[0]->productquantity_id); $quantity->product_id = $product->id; $quantity->quantity = $data['product_quantity']; $quantity->save(); } } } // at this point, the product is saved, so now do additional relationships // such as categories if (!empty($product->product_id) && !empty($data['product_categories'])) { foreach ($data['product_categories'] as $category_id) { // This is probably not the best way to do it // Numeric = id, string = category name if (!is_numeric($category_id)) { // check for existance JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . DS . 'components' . DS . 'com_citruscart' . DS . 'models'); $model = JModelLegacy::getInstance('Categories', 'CitruscartModel'); $model->setState('filter_name', $category_id); $matches = $model->getList(); $matched = false; if ($matches) { foreach ($matches as $match) { // is a perfect match? if (strtolower($category_id) == strtolower($match->category_name)) { $category_id = $match->category_id; $matched = true; } } } // Not matched, create category if (!$matched) { $category = JTable::getInstance('Categories', 'CitruscartTable'); $category->category_name = $category_id; $category->parent_id = 1; $category->category_enabled = 1; $category->save(); $category_id = $category->category_id; } } // save xref in every case $xref = JTable::getInstance('ProductCategories', 'CitruscartTable'); $xref->product_id = $product->product_id; $xref->category_id = $category_id; $xref->save(); } } $results[$n]->title = $product->product_name; $results[$n]->query = ""; $results[$n]->error = implode('\\n', $product->getErrors()); $results[$n]->affectedRows = 1; $n++; $this->_migrateImages($product->product_id, $data['product_images'], $results); } } return $results; }
/** * Saves an item and redirects based on task * @return void */ function save() { $app = JFactory::getApplication(); $task = $app->input->getString('task'); $post = $app->input->getArray($_POST); //print_r($post); exit; $model = $this->getModel($this->get('suffix')); $isSaveAs = false; $row = $model->getTable(); $row->load($model->getId()); // to set the Product Id $row->product_id = isset($post['id']) ? $post['id'] : ""; $row->bind($post); $row->product_description = $app->input->get('product_description', '', 'RAW'); $row->product_description_short = $app->input->get('product_description_short', '', 'RAW'); // 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($app->input->getArray($_POST)); $row->product_description = $app->input->get('product_description', '', 'RAW'); $row->product_description_short = $app->input->get('product_description_short', '', 'RAW'); $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' ); $userfiles = $app->input->post->get($fieldname, '', 'files', 'array'); // save the integrations $row = $this->prepareParameters($row); //check if normal price exists Citruscart::load("CitruscartHelperProduct", 'helpers.product'); if ($isSaveAs) { // and the prices $prices = CitruscartHelperProduct::getPrices($oldPk); } else { $prices = CitruscartHelperProduct::getPrices($row->product_id); } if ($row->save()) { $row->product_id = $row->id; $model->setId($row->id); $this->messagetype = 'message'; $this->message = JText::_('COM_CITRUSCART_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', 'CitruscartTable'); $price->product_id = $row->id; $price->product_price = $app->input->get('product_price'); $price->group_id = Citruscart::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', 'CitruscartTable'); $category->product_id = $row->id; $category->category_id = $app->input->getInt('category_id'); if (!$category->save()) { $this->messagetype = 'notice'; $this->message .= " :: " . $category->getError(); } // save default quantity $quantity = JTable::getInstance('Productquantities', 'CitruscartTable'); $quantity->product_id = $row->id; $quantity->quantity = $app->input->getInt('product_quantity'); if (!$quantity->save()) { $this->messagetype = 'notice'; $this->message .= " :: " . $quantity->getError(); } } if ($isSaveAs) { // set price when cloning $priceTable = JTable::getInstance('Productprices', 'CitruscartTable'); 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', 'CitruscartTable'); $categories = CitruscartHelperProduct::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 = CitruscartHelperProduct::getAttributes($oldPk); foreach ($attributes as $attribute) { $attributeTable = JTable::getInstance('ProductAttributes', 'CitruscartTable'); $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 = CitruscartHelperProduct::getAttributeOptionsObjects($oldAttrbuteId); foreach ($options as $option) { $attributeOptionsTable = JTable::getInstance('ProductAttributeOptions', 'CitruscartTable'); $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', 'CitruscartTable'); $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', 'CitruscartTable'); $quantities = CitruscartHelperProduct::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', 'CitruscartTable'); 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 JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_citruscart/models'); $model = JModelLegacy::getInstance('EavAttributes', 'CitruscartModel'); $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', 'CitruscartTable'); $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 = CitruscartHelperEav::getAttributeValue($teav, 'products', $row->product_id); $newValue = JTable::getInstance('EavValues', 'CitruscartTable'); $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 CitruscartHelperProduct(); $helper->onAfterSaveProducts($row); $model->clearCache(); JFactory::getApplication()->triggerEvent('onAfterSave' . $this->get('suffix'), array($row)); } else { $this->messagetype = 'notice'; $this->message = JText::_('COM_CITRUSCART_SAVE_FAILED') . " - " . $row->getError(); } $redirect = "index.php?option=com_citruscart"; switch ($task) { case "save_as": $redirect .= '&view=' . $this->get('suffix') . '&task=edit&id=' . $row->product_id; $this->message .= " - " . JText::_('COM_CITRUSCART_YOU_ARE_NOW_EDITING_NEW_PRODUCT'); break; case "saveprev": $redirect .= '&view=' . $this->get('suffix'); // get prev in list Citruscart::load("CitruscartHelperProduct", 'helpers.product'); $surrounding = CitruscartHelperProduct::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 Citruscart::load("CitruscartHelperProduct", 'helpers.product'); $surrounding = CitruscartHelperProduct::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); }
<?php echo JText::_('COM_CITRUSCART_ITEM_NOT_FOR_SALE'); ?> </td> <td> <span class="text text-warning product-for-sale-help"><strong><?php echo JText::_('COM_CITRUSCART_ITEM_NOT_FOR_SALE_HELP'); ?> </strong></span> <?php echo CitruscartSelect::btbooleanlist('product_notforsale', '', $row->product_notforsale, 'JYES', 'JNO'); ?> </td> </tr> <?php $prices = $helper_product->getPrices($row->product_id); if (empty($row->product_id) || empty($prices)) { // new product (or no prices set) - ask for normal price ?> <tr> <td class="dsc-key"><?php echo JText::_('COM_CITRUSCART_NORMAL_PRICE'); ?> : </td> <td><input type="text" name="product_price" id="product_price" value="<?php echo isset($row->product_price) ? $row->product_price : ""; ?> " size="25" maxlength="25" /> <div class="note well"> <?php
/** * Updates a product and its related informations (price, quantity & categories) * The price will be created from the $this->product_price property * The quantity will be created from the $this->product_quantity property * The categories will be created from the $this->product_category property */ function update() { // If this product is already stored, we shouldn't create the product! if (!$this->product_id) { $this->setError(JText::_('COM_CITRUSCART_YOU_CANNOT_UPDATE_A_NON_EXISTING_PRODUCT')); return false; } $product_price = $this->product_price; $product_quantity = $this->product_quantity; $product_categories = $this->product_category; if (!is_array($product_categories)) { $product_categories = array($product_categories); } unset($this->product_price); unset($this->product_quantity); unset($this->product_category); // Save the product First $success = $this->save(); if ($success) { // now the price if ($product_price) { // Load the default price Citruscart::load('CitruscartHelperProduct', 'helpers.product'); $prices = CitruscartHelperProduct::getPrices($this->product_id); if (count($prices)) { $price_id = $prices[0]->product_price_id; } else { $price_id = 0; } Citruscart::load('CitruscartTableProductPrices', 'tables.productprices'); $price = JTable::getInstance('ProductPrices', 'CitruscartTable'); // load the price if it does exist if ($price_id) { $price->load($price_id); } // else just save it as a new price $price->product_id = $this->product_id; $price->product_price = $product_price; $price->group_id = Citruscart::getInstance()->get('default_user_group', '1'); $success = $price->save(); if (!$success) { $this->setError($price->getError()); return false; } } // now the quantities if ($product_quantity) { // Load the default quantity Citruscart::load('CitruscartHelperProduct', 'helpers.product'); $quantities = CitruscartHelperProduct::getProductQuantities($this->product_id); if (count($quantities)) { $quantity_id = $quantities[0]->productquantity_id; } else { $quantity_id = 0; } Citruscart::load('CitruscartTableProductQuantities', 'tables.productquantities'); $quantity = JTable::getInstance('ProductQuantities', 'CitruscartTable'); // load the quantity if it does exist if ($quantity_id) { $quantity->load($quantity_id); } // else just save it as a new quantity $quantity->product_id = $this->product_id; $quantity->quantity = $product_quantity; $success = $quantity->save(); if (!$success) { $this->setError($quantity->getError()); return false; } } // now the categories if ($product_categories) { foreach ($product_categories as $product_category) { // This is probably not the best way to do it // Numeric = id, string = category name if (!is_numeric($product_category)) { // check for existance JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . DIRECTORY_SEPARATOR . 'components' . DIRECTORY_SEPARATOR . 'com_citruscart' . DIRECTORY_SEPARATOR . 'models'); $model = JModelLegacy::getInstance('Categories', 'CitruscartModel'); $model->setState('filter_name', $product_category); $matches = $model->getList(); $matched = false; if ($matches) { foreach ($matches as $match) { // is a perfect match? if (strtolower($product_category) == strtolower($match->category_name)) { $product_category = $match->category_id; $matched = true; } } } // Not matched, create category if (!$matched) { Citruscart::load('CitruscartTableCategories', 'tables.categories'); $category = JTable::getInstance('Categories', 'CitruscartTable'); $category->category_name = $product_category; $category->parent_id = 1; $category->category_enabled = 1; $category->save(); $product_category = $category->category_id; } } // save xref in every case Citruscart::load('CitruscartTableProductCategories', 'tables.productcategories'); $xref = JTable::getInstance('ProductCategories', 'CitruscartTable'); $xref->product_id = $this->product_id; $xref->category_id = $product_category; $xref->save(); } } } else { return false; } return true; }