Benjamin M Harris benjamin.harris

benjamin.harris đã đẩy đến main tại benjamin.harris/Reverb_Opencart_Extension

  • afe97be0bd feat: add Country of Origin field to product Reverb tab Adds origin_country_code (ISO 3166-1 alpha-2) to the per-product Reverb tab with a Select2 searchable country dropdown. - DB: origin_country_code VARCHAR(2) added to oc_reverb_product_map in both install() CREATE TABLE and migrate() addColumnIfMissing() so existing installs get the column automatically on next load - saveProductMap(): persists the value; sanitised to 2-char uppercase - saveProductReverb() event handler: reads reverb_origin_country_code from POST and passes it through to saveProductMap() - ProductMapper::toReverb(): includes origin_country_code in the listing payload when set - productTab(): loads oc_country list via model_localisation_country, resolves the store default from config_country_id, falls back to that default when the saved value is empty - Template: Select2 country dropdown placed above the Handmade field; initialised alongside the existing category Select2 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

1 tuần trước cách đây

benjamin.harris đã đẩy đến main tại benjamin.harris/Reverb_Opencart_Extension

  • 7c1669d4e2 feat: Select2 category search + Reverb Categories tab Product tab: - Category dropdown now uses Select2 (type-to-search with clear button). OC3 admin already bundles Select2 so no extra dependency is needed. Settings page — new Reverb Categories tab (4th tab): - Scrollable table of every Reverb category with its full_name and UUID; pre-populated from the cached category list on page load - Live client-side filter input (search-as-you-type across the table) - "Refresh from Reverb" button calls refreshCategories() AJAX action which bypasses the 24 h cache, hits /categories/flat, saves the result, and re-renders the table in-place with the fresh data - refreshReverbCategories() model method extracted from getReverbCategories() so both the normal (cached) and forced-refresh paths share the same fetch and persist logic Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

1 tuần trước cách đây

benjamin.harris đã đẩy đến main tại benjamin.harris/Reverb_Opencart_Extension

  • c542f1b725 feat: store selector, default qty, and clear listing link Settings tab — Order Import section: - Checkbox list of all OC stores (Default + any extra stores); saves as module_reverb_order_stores[]; first selected store_id is applied to imported orders (replaces hardcoded store_id = 0) - Default Product Quantity field; used as fallback when a Reverb order line has no quantity (replaces hardcoded qty = 1) Product tab: - "Remove link" button shown next to the Reverb listing ID; calls clearListingId() which nulls reverb_listing_id and last_synced_at so the next sync treats the product as new and creates a fresh listing Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

1 tuần trước cách đây

benjamin.harris đã đẩy đến main tại benjamin.harris/Reverb_Opencart_Extension

  • 9300e79d97 feat: add Clear Log button to sync log tab Adds a trash button at the top of the Sync Log tab that DELETEs all rows from oc_reverb_sync_log via a new clearLog() AJAX endpoint. Confirms before clearing, shows a brief success message, then reloads the page so the empty-log state renders correctly. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
  • eba102aed3 fix: replace undefined text_edit panel heading with heading_title text_edit is a global OC string not loaded in module language context, causing the raw key to appear as the panel heading. Use heading_title ('Reverb Integration') which is already defined in the language file. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
  • Xem so sánh cho các commit 2 »

1 tuần trước cách đây

benjamin.harris đã đẩy đến main tại benjamin.harris/Reverb_Opencart_Extension

  • 514ba53b62 fix(ocmod): replace failing header.php and column_left.php patches header.php addStyle() call was not found in the live OC3 install; switch to patching admin/view/template/common/header.twig instead, searching for </head> which is version-agnostic across all OC3 releases. column_left.php regex was not matched; replace with a simple literal search for `if ($sale) {` which appears exactly once in the file (just before the menu-sale assignment) and is reliable without whitespace sensitivity. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

1 tuần trước cách đây

benjamin.harris đã đẩy đến main tại benjamin.harris/Reverb_Opencart_Extension

  • 210dce3b8a Image Upload
  • da47a7c86a Add Reverb entry to admin left-nav with r_icon.svg - upload/admin/view/image/reverb/r_icon.svg — icon asset served by admin - upload/admin/view/stylesheet/reverb.css — CSS mask technique so the SVG icon inherits currentColor (matches sidebar text at all states) - install.xml: two new OCMOD patches * admin/controller/common/header.php: loads reverb.css via document->addStyle * admin/controller/common/column_left.php: injects menu-reverb item above menu-sale using a whitespace-agnostic regex search Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
  • Xem so sánh cho các commit 2 »

1 tuần trước cách đây

benjamin.harris đã đẩy đến main tại benjamin.harris/Reverb_Opencart_Extension

  • ce675a918a Add order import, hierarchical category dropdowns, and handmade/UPC fields - Admin: Import Orders from Reverb button (AJAX) pulls paginated orders into OC, deduplicates via oc_reverb_order_map, decrements stock, logs each import - Admin: Reverb category dropdowns now use <optgroup> grouped by root category (parses full_name field from /categories/flat) - Admin: added handmade checkbox and UPC/EAN radio buttons to per-product tab - Catalog: order deduplication now uses oc_reverb_order_map (not comment search); pollOrders handles pagination and updated_start_date - ProductMapper: title and description HTML-decoded; manufacturer mapped to make field - ReverbApi: corrected orders endpoint to /my/orders/selling/all - DB: oc_reverb_order_map table; handmade + upc_does_not_apply columns on product map - Docs: CLAUDE.md and README.md updated to reflect current implementation Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

1 tuần trước cách đây

benjamin.harris đã đẩy đến main tại benjamin.harris/Reverb_Opencart_Extension

1 tuần trước cách đây

benjamin.harris đã đẩy đến main tại benjamin.harris/Reverb_Opencart_Extension

  • 699b9d061f Publish Reverb listings immediately on create/update Without publish=true the Reverb API saves listings as drafts, visible in the seller dashboard but not in the public shop. Also add has_inventory=true so Reverb treats the quantity field correctly for stock-tracked listings. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
  • 112d0030d2 Fix missing description field in sync query and buffer corruption getSyncEnabledProducts() selected pd.name but not pd.description, causing an 'Undefined array key description' PHP warning in ProductMapper::toReverb() which was buffered by OC3 and prepended to the JSON response, making it unparseable by jQuery. Also clean the OB buffer at the top of sync() so any future PHP notices cannot corrupt AJAX JSON responses. Revert diagnostic error callback now that the root cause is identified and fixed. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
  • Xem so sánh cho các commit 2 »

2 tuần trước cách đây

benjamin.harris đã đẩy đến main tại benjamin.harris/Reverb_Opencart_Extension

  • d8b3722169 Fix sync AJAX using stale user_token from rendered Twig URL {{ sync_url }} bakes the token in at render time and uses an absolute URL, which causes OC3 session validation to fail (HTTP vs HTTPS mismatch or token drift). Read user_token from window.location.search at click time using a relative URL — the same pattern that works for productTab. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
  • e9d82b5e33 Show raw HTTP status and response in sync error callback for diagnosis Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
  • Xem so sánh cho các commit 2 »

2 tuần trước cách đây

benjamin.harris đã đẩy đến main tại benjamin.harris/Reverb_Opencart_Extension

  • 9c7582f43e gitignore
  • 797dd687b7 Make sync() always return valid JSON with a readable error message Set Content-Type: application/json before any code runs so uncaught exceptions cannot produce HTML output that breaks jQuery's JSON parser. Wrap the entire sync body in a top-level try/catch. Move log() calls into safeLog() so a missing reverb_sync_log table cannot propagate an exception out of the inner catch block and crash the response. Also surface the "no categories configured" case explicitly instead of silently returning a 0-product success. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
  • 3fa9e1a9c7 Fix OCMOD targeting wrong template file (product.twig vs product_form.twig) OC3 on this host uses product_form.twig, not product.twig. OC3 silently skips OCMOD operations for files that don't exist, explaining why the tab never appeared and the modification log showed no errors. Also wrap getSyncEnabledProducts() in try/catch so sync failures return a descriptive JSON error instead of a raw PHP exception causing a 500. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
  • Xem so sánh cho các commit 3 »

2 tuần trước cách đây

benjamin.harris đã đẩy đến main tại benjamin.harris/Reverb_Opencart_Extension

  • 00e906869f Replace OCMOD PHP injection with AJAX-based product tab loading The OC3 product controller's setOutput call differs across versions, causing the OCMOD PHP search to fail and abort the entire modification (including the Twig injection). New approach: - OCMOD only patches product.twig (no PHP controller patching) - Tab content is loaded via AJAX from a new productTab() controller action - Saving still handled by the existing OC event hooks (eventProductSave) - error="skip" on each OCMOD operation prevents one miss aborting the other Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

2 tuần trước cách đây

benjamin.harris đã đẩy đến main tại benjamin.harris/Reverb_Opencart_Extension

  • 2315196c3f CLAUDE changes
  • 157de46254 Fix OCMOD tab injection by anchoring on SEO tab and embedding content inline The Design tab search string was not matching the target product.twig, silently skipping the injection. Changed anchor to the SEO tab (always present in OC3) and embedded the Reverb tab HTML directly in the OCMOD XML to avoid Twig include path resolution issues. Also replaced PHP 7.0+ short array syntax and ?? operators in injected PHP with older-compatible equivalents for maximum server compatibility. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
  • Xem so sánh cho các commit 2 »

2 tuần trước cách đây

benjamin.harris đã đẩy đến main tại benjamin.harris/Reverb_Opencart_Extension

  • ec318c26e2 Naming Improvements
  • ead903d0d8 Fix memory exhaustion caused by recursive category tree loading OC3's ModelCatalogCategory::getCategories() ignores the parent_id filter, so the recursive getCategoryTree() was re-querying all categories on every call, causing infinite recursion and PHP memory exhaustion (128 MB limit). Replaced with a single direct SQL query + iterative stack-based tree builder. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
  • Xem so sánh cho các commit 2 »

2 tuần trước cách đây

benjamin.harris đã đẩy đến main tại benjamin.harris/Reverb_Opencart_Extension

  • ccdd44388e Change XML name
  • b53fee8fa9 Fix 500 error on module edit and correct several integration bugs - Replace Twig 1.x-incompatible ?? operator with |default() filter in both twig templates (OC3 ships Twig ~1.x; ?? was added in Twig 2.0) - Pass all required language strings explicitly into $data in the admin controller (OC's Twig renderer only receives what is in $data) - Replace $this->load->library() with require_once(DIR_SYSTEM . ...) for standalone PHP classes; OC's library loader tries to instantiate the class with $registry which is incorrect for non-OC-aware classes - Fix reverb_product.twig category dropdown to iterate reverb_categories (full list with names) instead of the raw OC→Reverb mapping array - Add reverb_categories loading to install.xml OCMOD PHP patch so the product tab category dropdown is populated on the product edit page - Rename duplicate text_success language key to text_log_success to prevent the save-success message being overwritten by the log status label Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
  • Xem so sánh cho các commit 2 »

2 tuần trước cách đây

benjamin.harris đã đẩy đến main tại benjamin.harris/Reverb_Opencart_Extension

2 tuần trước cách đây

benjamin.harris đã đẩy đến main tại benjamin.harris/Reverb_Opencart_Extension

2 tuần trước cách đây

benjamin.harris tạo nhánh mới main tại benjamin.harris/Reverb_Opencart_Extension

2 tuần trước cách đây

benjamin.harris đã tạo kho lưu trữ benjamin.harris/Reverb_Opencart_Extension

2 tuần trước cách đây

benjamin.harris đã đẩy đến main tại benjamin.harris/modulos_internal

  • 9f1ae4afdc Security hardening: XSS fixes, hide errors, protect auth tokens - council_forms/form_71a.php: escape all DB output via e() helper; fix SQL injection ($client_quote int cast); init $signedDate to avoid possible undefined variable - contract.php: escape client_email in hidden input; remove stale console.log comment; fix always-https typo in base href - breadcrumb.php: remove console.log({target, now}) from countdown - All contracts PHP: display_errors=0 + log_errors=1; replace exit('Database connection failed: '.$e->getMessage()) with generic 'Service unavailable' + error_log throughout add_stage, admin_dashboard, breadcrumb, edit_application, progress, save_stages - loa.php + contracts-admin.php: hard-fail on empty LOA_TOKEN_SECRET / ADMIN_SHARED_SECRET so unconfigured deployments cannot forge tokens - planbuild.php: already fixed in prior session (included in diff) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

2 tuần trước cách đây