Jump to content
thirty bees forum

the.rampage.rado

Silver member
  • Posts

    1,147
  • Joined

  • Last visited

  • Days Won

    97

Everything posted by the.rampage.rado

  1. I don't know about your importing setup but if you are reusing the products (importing so to update prices, etc) why you simply don't skip the image import on the consecutive tries? Regarding Tidy - yes, I too was concerned about this after the image rewrite but it's is working as expected - it detects the unlinked images and offers them for deletion: Delete unused image files (preview) Unused images found and deleted: 9947 /domain.com/img/p/9/8/3/6/9836-cart_default2x.webp - unused /domain.com/img/p/9/8/3/6/9836-backoffice_product_medium2x.webp - unused /domain.com/img/p/9/8/3/6/9836-medium_default2x.webp - unused /domain.com/img/p/9/8/3/6/9836-large_default2x.webp - unused /domain.com/img/p/9/8/3/6/9836-home_default2x.webp - unused /domain.com/img/p/9/8/3/6/9836-small_default2x.webp - unused /domain.com/img/p/9/8/3/0/9830-large_default2x.webp - unused /domain.com/img/p/9/8/3/0/9830-small_default2x.webp - unused /domain.com/img/p/9/8/3/0/9830-home_default2x.webp - unused /domain.com/img/p/9/8/3/0/9830-medium_default2x.webp - unused /domain.com/img/p/9/8/3/0/9830-backoffice_product_medium2x.webp - unused /domain.com/img/p/9/8/3/0/9830-cart_default2x.webp - unused /domain.com/img/p/9/8/3/3/9833-large_default2x.webp - unused /domain.com/img/p/9/8/3/3/9833-backoffice_product_medium2x.webp - unused
  2. If your newly imported products have new ID (and they should have) they created new image. Thirty bees does not care if it is 1:1 with another image on the filesystem (and it should not care). The issue comes from that when old products are deleted their images stay on the filesystem. Which should not be the case. I can recommend Tidy module to cope with those unlinked old images (it wont clean 'duplicates' but it will clean old unneeded images): https://codecanyon.net/item/prestashop-tidy/18965736 It can also do many more things. JUST always do backups.
  3. How many Opencart or Woocommerce themes are compatible with this? Oh... none?
  4. No, full page cache is not fixed on 1.6 but there are those two new functions to keep your site cleaner.
  5. Regarding this can you confirm if this list is complete and contains all the 'states' in Switzerland and I'll be able to make a PR so datakick can include it in the localization pack and you would be able to import them from Localization -> Import a localization pack ? <states> <state name="Aargau (de)" iso_code="CH-AG" country="CH" zone="Europe" tax_behavior="0" /> <state name="Appenzell Ausserrhoden (de)" iso_code="CH-AR" country="CH" zone="Europe" tax_behavior="0" /> <state name="Appenzell Innerrhoden (de)" iso_code="CH-AI" country="CH" zone="Europe" tax_behavior="0" /> <state name="Basel-Landschaft (de)" iso_code="CH-BL" country="CH" zone="Europe" tax_behavior="0" /> <state name="Basel-Stadt (de)" iso_code="CH-BS" country="CH" zone="Europe" tax_behavior="0" /> <state name="Bern (de), Berne (fr)" iso_code="CH-BE" country="CH" zone="Europe" tax_behavior="0" /> <state name="Fribourg (fr), Freiburg (de)" iso_code="CH-FR" country="CH" zone="Europe" tax_behavior="0" /> <state name="Genève (fr)" iso_code="CH-GE" country="CH" zone="Europe" tax_behavior="0" /> <state name="Glarus (de)" iso_code="CH-GL" country="CH" zone="Europe" tax_behavior="0" /> <state name="Graubünden (de)" iso_code="CH-GR" country="CH" zone="Europe" tax_behavior="0" /> <state name="Jura (fr)" iso_code="CH-JU" country="CH" zone="Europe" tax_behavior="0" /> <state name="Luzern (de)" iso_code="CH-LU" country="CH" zone="Europe" tax_behavior="0" /> <state name="Neuchâtel (fr)" iso_code="CH-NE" country="CH" zone="Europe" tax_behavior="0" /> <state name="Nidwalden (de)" iso_code="CH-NW" country="CH" zone="Europe" tax_behavior="0" /> <state name="Obwalden (de)" iso_code="CH-OW" country="CH" zone="Europe" tax_behavior="0" /> <state name="Sankt Gallen (de)" iso_code="CH-SG" country="CH" zone="Europe" tax_behavior="0" /> <state name="Schaffhausen (de)" iso_code="CH-SH" country="CH" zone="Europe" tax_behavior="0" /> <state name="Schwyz (de)" iso_code="CH-SZ" country="CH" zone="Europe" tax_behavior="0" /> <state name="Solothurn (de)" iso_code="CH-SO" country="CH" zone="Europe" tax_behavior="0" /> <state name="Thurgau (de)" iso_code="CH-TG" country="CH" zone="Europe" tax_behavior="0" /> <state name="Ticino (it)" iso_code="CH-TI" country="CH" zone="Europe" tax_behavior="0" /> <state name="Uri (de)" iso_code="CH-UR" country="CH" zone="Europe" tax_behavior="0" /> <state name="Valais (fr), Wallis (de)" iso_code="CH-VS" country="CH" zone="Europe" tax_behavior="0" /> <state name="Vaud (fr)" iso_code="CH-VD" country="CH" zone="Europe" tax_behavior="0" /> <state name="Zug (de)" iso_code="CH-ZG" country="CH" zone="Europe" tax_behavior="0" /> <state name="Zürich (de)" iso_code="CH-ZH" country="CH" zone="Europe" tax_behavior="0" /> </states> Regarding the default country you can set this here Localization->Localization: While at this issue we can fix the tax rates too: (current rates in thirty bees) <taxes> <tax id="1" name="TVA CH 8.0%" rate="8.0"/> <tax id="2" name="TVA CH 3.8%" rate="3.8"/> <tax id="3" name="TVA CH 2.5%" rate="2.5"/> <taxRulesGroup name="CH Standard Rate (8.0%)"> <taxRule iso_code_country="ch" id_tax="1"/> </taxRulesGroup> <taxRulesGroup name="CH Reduced Rate (3.8%)"> <taxRule iso_code_country="ch" id_tax="2"/> </taxRulesGroup> <taxRulesGroup name="CH Super Reduced Rate (2.5%)"> <taxRule iso_code_country="ch" id_tax="3"/> </taxRulesGroup> </taxes> I see the following information currently online, if you can confirm this is true:
  6. 1.6 is the latest official version which offers the latest bugfixes, security fixes and new features. Running versions prior to the latest on ecommerce sites is like running windows 7 or XP in 2025 - 'it's working' but leaves a bad taste in your mouth. If 1.6 is not 'stable' for somebody they should consider hunting bugs in their theme and 3rd party modules as the system has never been more stable.
  7. DON'T use Full page cache as it is 'broken'. Use the following settings for caching and no hassle: You say the large amount of files are in your cache folder, you mean root/cache or root/themes/cache? If it is in your theme cache folder you can manually go in and delete everything that is older than 2 months. If you are not using thirty bees 1.6 or later the system did not clear those files automatically. As you can see in my instance there are two new settings for logs and js and css files retention. When you set those up thirty bees will delete files older than this period.
  8. I assume you are able to access the remote images in your browser?
  9. Please, check if your AdminImportController has the following fix: https://github.com/thirtybees/thirtybees/commit/a15ff326ca0917f14e741818a1d7bc006de13dd5 It should be there as it should be part of thirty bees 1.6 but...
  10. the.rampage.rado

    TB 1.6

    This should not happen (wrong permisions), each product in separate folder is proper behavior. Contact your host if you are on managed service - they will probably be able to troubleshoot.
  11. Probably you installed a version that is not 'native' to your server PHP version. Go ahead and update those. Also check your db structure (the button on top right) - if changes are present there - apply those too.
  12. Two entries from me for when this list is updated: Mikasabulgaria.com VoleibolenMagazin.com
  13. I was not going to respond to this thread, but 'what automatic updates on thirtybees'?! 😄 😄 😄 Regarding the 'pseudo-security updates' - sooner or later you will have 'an outage beyond the unpublished golden limits' but it's up to you. Nobody can force you to update the shop.
  14. For me the main idea behind multistore is sharing products (that can be manipulated per store context - name, keywords, descriptions, even images) and sharing their quantities, simplifying stock movement, etc. Yes, you probably will have to adjust and optimize the product per store, but then you have to work with it's quantities, combinations, etc at only one place. Same for order processing, etc.
  15. It is possible to have two exactly the same sites with exactly the same content but it will 100% hurt your rankings. Google will take your more reputable site and slash the other. I'm currently experiencing exactly the same - I have 6 sites in my multistore that share 50% of the products and 50% are unique. One is very old and reputable (ranks with multiple pages in first page), one is 2 years old and have every page indexed and showing in google (not first page for all the words, probably 10% of them), the rest were made last year. Despite I have unique products with them, not only the shared categories that apply for all shops, the last four shops experience this: So in your case - if you have control over .com I would simply redirect at server level those backlinks with 301 to .ca domain/product/category or even better if possible do a reverse and move your shop back to .com and do the redirect thing for the .ca domain (hopefully the domain authority for com has not dropped since).
  16. For the login issue try this: And after you regenerate your pass delete this file as anybody would be able to enter your admin when it's present on the server.
  17. IMHO it would be better to leave Stripe and simply add some cards under it. Stripe and PayPal adds trust to your store so it should be nice to show that you process those payments with them at this step.
  18. I put my money on that inside stripe's module there is a image folder where you can swap this with something sized and optimized for this place. 🙂 In this case it's /views/img/stripebtnlogo.png But keep in mind that this will be overwritten on every update.
  19. @datakick, I think chatgpt made a working code for me but can you confirm there is something wrong in this mechanism or it's just a bug with my csv file (let's say using Cyrillic and making the encoded ajax call very big for this operation with so many lines, etc). During debuggint it advised the following is not working: Key Changes: Handling of crossStepsVariables: It now checks if crossStepsVars exists in the AJAX request and decodes it correctly. If crossStepsVars is missing or invalid, it initializes crossStepsVariables with empty arrays for groups, attributes, and deletedProducts. Extensive Logging: Logs the raw and decoded crossStepsVars at the start. Logs the final crossStepsVariables after the import step. Fallback for Missing Data: Ensures that crossStepsVariables is never empty or invalid, preventing errors in subsequent processing. Improved Structure: Cleaned up logic for handling results and reserved additional POST size for large imports. (of course I removed the logging from the following functions after debugging) Working versions for me that import the large file: public function attributeImport($offset = false, $limit = false, &$crossStepsVariables = false, $validateOnly = false) { $defaultLanguage = Configuration::get('PS_LANG_DEFAULT'); // Initialize groups $groups = is_array($crossStepsVariables) && array_key_exists('groups', $crossStepsVariables) ? $crossStepsVariables['groups'] : []; foreach (AttributeGroup::getAttributesGroups($defaultLanguage) as $group) { $groups[$group['name']] = (int) $group['id_attribute_group']; } // Initialize attributes $attributes = is_array($crossStepsVariables) && array_key_exists('attributes', $crossStepsVariables) ? $crossStepsVariables['attributes'] : []; foreach (ProductAttribute::getAttributes($defaultLanguage) as $attribute) { $attributes[$attribute['attribute_group'].'_'.$attribute['name']] = (int) $attribute['id_attribute']; } // Initialize deleted products $deletedProducts = is_array($crossStepsVariables) && array_key_exists('deletedProducts', $crossStepsVariables) ? $crossStepsVariables['deletedProducts'] : []; $this->receiveTab(); $datasource = $this->openDataSource($offset); static::setLocale(); $regenerate = Tools::getValue('regenerate'); $shopIsFeatureActive = Shop::isFeatureActive(); $lineCount = 0; for ($currentLine = 0; ($line = $datasource->getRow()) && (!$limit || $currentLine < $limit); $currentLine++) { $lineCount++; if (empty($line) || !is_array($line) || count(array_filter($line)) == 0) { $this->warnings[] = $this->l('There is an empty row in the file that won\'t be imported.'); continue; } $info = static::getMaskedRow($line); $info = array_map('trim', $info); try { $this->attributeImportOne( $info, $defaultLanguage, $groups, // by ref $attributes, // by ref $regenerate, $shopIsFeatureActive, $validateOnly, $deletedProducts // by ref ); } catch (PrestaShopException $e) { $this->errors[] = $e->getMessage(); } } $datasource->close(); if ($crossStepsVariables !== false) { $crossStepsVariables['groups'] = is_array($groups) ? $groups : []; $crossStepsVariables['attributes'] = is_array($attributes) ? $attributes : []; $crossStepsVariables['deletedProducts'] = is_array($deletedProducts) ? $deletedProducts : []; } return $lineCount; } public function importByGroups($offset = false, $limit = false, &$results = null, $validateOnly = false, $moreStep = 0) { // Check if the CSV file exists if (Tools::getValue('filename')) { $entityType = $this->getSelectedEntity(); $shopIsFeatureActive = Shop::isFeatureActive(); // If I am a superadmin, truncate table (ONLY IF OFFSET == 0 or false and NOT FOR VALIDATION MODE!) if (!$offset && !$moreStep && !$validateOnly && (($shopIsFeatureActive && $this->context->employee->isSuperAdmin()) || !$shopIsFeatureActive) && Tools::getValue('truncate')) { $this->truncateTables($entityType); } $doneCount = 0; $crossStepsVariables = []; // Get crossStepsVariables from the previous AJAX call if ($crossStepsVars = Tools::getValue('crossStepsVars')) { $crossStepsVars = json_decode($crossStepsVars, true); if (!empty($crossStepsVars) && is_array($crossStepsVars)) { $crossStepsVariables = $crossStepsVars; } else { $crossStepsVariables = ['groups' => [], 'attributes' => [], 'deletedProducts' => []]; } } else { $crossStepsVariables = ['groups' => [], 'attributes' => [], 'deletedProducts' => []]; } // Process based on entity type if (static::hasEntityType($entityType)) { $doneCount += $this->importGroup(static::getEntityType($entityType), $offset, $limit, $crossStepsVariables, $validateOnly, $moreStep); } else { // Fallback to original implementation switch ($entityType) { case static::ENTITY_TYPE_CATEGORIES: $doneCount += $this->categoryImport($offset, $limit, $crossStepsVariables, $validateOnly); $this->clearSmartyCache(); break; case static::ENTITY_TYPE_PRODUCTS: if (!defined('PS_MASS_PRODUCT_CREATION')) { define('PS_MASS_PRODUCT_CREATION', true); } $moreStepLabels = [$this->l('Linking Accessories...')]; $doneCount += $this->productImport($offset, $limit, $crossStepsVariables, $validateOnly, $moreStep); $this->clearSmartyCache(); break; case static::ENTITY_TYPE_COMBINATIONS: $doneCount += $this->attributeImport($offset, $limit, $crossStepsVariables, $validateOnly); $this->clearSmartyCache(); break; // Add other cases if needed case static::ENTITY_TYPE_CUSTOMERS: $doneCount += $this->customerImport($offset, $limit, $validateOnly); break; case static::ENTITY_TYPE_ADDRESSES: $doneCount += $this->addressImport($offset, $limit, $validateOnly); break; case static::ENTITY_TYPE_MANUFACTURERS: $doneCount += $this->manufacturerImport($offset, $limit, $validateOnly); $this->clearSmartyCache(); break; case static::ENTITY_TYPE_SUPPLIERS: $doneCount += $this->supplierImport($offset, $limit, $validateOnly); $this->clearSmartyCache(); break; case static::ENTITY_TYPE_ALIAS: $doneCount += $this->aliasImport($offset, $limit, $validateOnly); break; case static::ENTITY_TYPE_STORE_CONTACTS: $doneCount += $this->storeContactImport($offset, $limit, $validateOnly); $this->clearSmartyCache(); break; case static::ENTITY_TYPE_SUPPLY_ORDERS: $doneCount += $this->supplyOrdersImport($offset, $limit, $validateOnly); break; case static::ENTITY_TYPE_SUPPLY_ORDER_DETAILS: $doneCount += $this->supplyOrdersDetailsImport($offset, $limit, $crossStepsVariables, $validateOnly); break; } } // Handle results and progress if ($results !== null) { $results['isFinished'] = ($doneCount < $limit); $results['doneCount'] = $offset + $doneCount; if ($offset === 0) { // Compute total count only once $datasource = $this->openDataSource(0); $results['totalCount'] = $datasource->getNumberOfRows() - Tools::getIntValue('skip'); $datasource->close(); } if (!isset($moreStepLabels)) { $moreStepLabels = []; } if (!$results['isFinished'] || (!$validateOnly && ($moreStep < count($moreStepLabels)))) { $nextPostSize = mb_strlen(json_encode($crossStepsVariables)); $results['crossStepsVariables'] = $crossStepsVariables; $results['nextPostSize'] = $nextPostSize + (1024 * 64); // Reserve additional size $results['postSizeLimit'] = Tools::getMaxUploadSize(); } if ($results['isFinished'] && !$validateOnly && ($moreStep < count($moreStepLabels))) { $results['oneMoreStep'] = $moreStep + 1; $results['moreStepLabel'] = $moreStepLabels[$moreStep]; } } // Final log for current step $logMessage = sprintf($this->l('%s import'), $entityType); if ($offset !== false && $limit !== false) { $logMessage .= ' ' . sprintf($this->l('(from %s to %s)'), $offset, $limit); } if (Tools::getValue('truncate')) { $logMessage .= ' ' . $this->l('with truncate'); } Logger::addLog($logMessage, 1, null, $entityType, null, true, (int) $this->context->employee->id); } else { $this->errors[] = $this->l('To proceed, please upload a file first.'); } }
  20. Quotes don't help - the values get imported with them in the store (when the import succeeds). I managed to import few combinations but only if the file is very small (under 20 rows or so). I see that large files are split in multiple parts that are imported by ajax but I can't figure out what is breaking. So I looked at my file and found a row where a product had only color but not size associated with it (no stock is available). An easy fix - python script will exclude those and give me a list to remove them from my store. But then when I try to import the file without those unproperly formatted lines I get this error: And once again - if I make the file very small (~20 lines) it imports, but if I have 2k lines - this error appears...
  21. @312erik123 thanks, now I'll try your hint with the quotes. Regarding the position - the default demo csv gives only 0 and 1 for all positions, so I don't understand it at all. First I was thinking it was the position inside the drop down (speaking for Size attribute), later I saw on PS' forum that it is the order in which the attribute groups are shown in FO, which does not make any sense (first color, then Size, or vise versa). Then there was an opinion that they can be removed altogether and rely only on the positions inside the attribute group. Will make a shorter file and try this too. On one installation a file with ~2k rows throws this error on the 25th row, on another it does on ~1600th row. So not quite sure what is going on. Logger says only:
  22. I'm trying to make a python file that matches two files with information and generates me a CSV to import in my site. The output is as follows: But it can not be imported because of the following error: Errors occurred: Property ProductAttribute->name is empty I'm trying the following settings for Combinations import: Does anybody have some ideas? Also - what is the purpose of position value in Attribute and Value columns? I believe they should not increase per same product reference (according to the demo csv).
  23. Will this solve the issue with non regeneration of thumbnails?
  24. Here is my configuration that works for Warehouse theme. Your theme should be similar (sizes are dependent on your theme so no need to change them as they should be left as the theme configured them when you updated to 1.6, only fix the entities). But I can't remember if this will fix your issue - the entities are used to show the already generated images I think in front office. Nevertheless it should be configured so go ahead and test, hopefully datakick can join with master suggestion for this issue.
×
×
  • Create New...