Jump to content
thirty bees forum

the.rampage.rado

Silver member
  • Posts

    1,126
  • Joined

  • Last visited

  • Days Won

    92

Everything posted by the.rampage.rado

  1. First of all. Did you try gradually updating between official major versions and keeping their requirements in check (like dependencies, php version, extensions, etc.)? I would recommend to try this 1.0.8->1.1.0->1.2.0->1.3.0->1.4.0->1.5.0->1.6.0. This would take more time but you will be able to investigate step by step where things break, where you have to check your hosting configuration, etc. 1.0.8->1.6 is quite a big leap, quite a lot things changed for these years, and on top of that when you have some custom work done to the code which could have messed up the database it's get messy quite fast. Also I would recommend on each step to consult with the release notes for every version so you can expect some things that are changed. You can find those here: https://forum.thirtybees.com/forum/2-announcements-about-thirty-bees/ Install Collect logs module when it's visible for you in the modules catalog (I don't know if it supports 1.0.8) and check what is recorded there. Make a test FO registration, make an order, send an email, cancel an order. If everything is OK and there are no records in Collect logs module proceed to the next version of thirty bees. On each step update the files through Core Updated but don't forget to check if there are table updates too - do those or your system will not work as expected. Now, on to your topics: 1. Did you install a mail transport module when under thirtybees 1.6? This functionality was moved to a module so different methods can be used (the one in PS and thirty bees up until now was unmaintained and obstructed further development of the system). After you install your module and configure it you should also select it for use in Advanced Preferences->Email: 2. If you have migrated your old table to a fresh 1.6 install the order state ids might be different. This is not thirty bees fault, it introduces some default states but this configuration might be modified by each shop and this approach is not recommended when updating. If you use Core Updater this will not be the case. 3. Here is the same - most probably a conflict between your old table records and your new install order state ids. When I cancel an order the stock levels are returned to the previous value. 4. Share your carrier settings, check your zones and your carrier coverage for them. More information would be needed to troubleshoot this.
  2. Tidy module I recommended has cronjobs for clearing image so if you're so dependent on your current setup you can try it. It should clear all 'unlinked' images.
  3. Same here. In theory nothing more should be done, but yes, my source is also not minified and it looks 'human-readable'. But I'm pretty sure this was the case before the extraction. EDIT: You have to have your module active and then in Performance have those settings as follows:
  4. If you already have a theme that you like I would advise to contact datakick and he might have some free time in order to help you out with any bugs that you have. The main issue is always within theme's block cart overrides - which leads to 500. The rest is most probably warnings and deprecations. I'm with Warehouse 3.8.7 (the latest version for PS1.6) and it had some issues, cart one too - but now I'm rocking it on php 8.1 with few warnings and it's making me money. Same - I would like to contact datakick soon in order to work on those issues so I can move to 8.2 and later 8.3 (if nothing big pops up).
  5. 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
  6. 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.
  7. How many Opencart or Woocommerce themes are compatible with this? Oh... none?
  8. No, full page cache is not fixed on 1.6 but there are those two new functions to keep your site cleaner.
  9. 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:
  10. 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.
  11. 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.
  12. I assume you are able to access the remote images in your browser?
  13. 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...
  14. 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.
  15. 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.
  16. Two entries from me for when this list is updated: Mikasabulgaria.com VoleibolenMagazin.com
  17. 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.
  18. 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.
  19. 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).
  20. 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.
  21. 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.
  22. 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.
  23. @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.'); } }
  24. 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...
×
×
  • Create New...