basecom/shopware-connector
Akeneo PIM to Shopware connector bundle. Adds entity overrides and export jobs to sync products, categories, families and media via the Shopware API. Includes setup notes, required Shopware import extension, and Akeneo configuration steps.
Installation
AppKernel.php:
new \Basecom\Bundle\ShopwareConnectorBundle\BasecomShopwareConnectorBundle(),
akeneo_storage_utils in config.yml:
akeneo_storage_utils:
mapping_overrides:
- { original: Pim\Bundle\CatalogBundle\Entity\Category, override: Basecom\Bundle\ShopwareConnectorBundle\Entity\Category }
- { original: Pim\Bundle\CatalogBundle\Entity\Family, override: Basecom\Bundle\ShopwareConnectorBundle\Entity\Family }
- { original: Akeneo\Component\FileStorage\Model\FileInfo, override: Basecom\Bundle\ShopwareConnectorBundle\Entity\FileInfo }
- { original: Pim\Component\Catalog\Model\Product, override: Basecom\Bundle\ShopwareConnectorBundle\Entity\Product }
php app/console cache:clear --env=prod
php app/console doctrine:schema:update --force
Shopware Extension
First Export Job
name → name, sku → article_number).Run Initial Sync
name, sku, price, images).php app/console akeneo:export:product).Attribute Mapping
pim_catalog_identifier → article_number).price attribute:
# config/akeneo_shopware.yml
attributes:
price:
shopware_field: price
type: decimal
Job Configuration
php app/console akeneo:export:product --job-name="shopware_export" --api-key="your_shopware_api_key"
0 3 * * * php /path/to/akeneo/app/console akeneo:export:product --job-name="shopware_export"
Handling Associations
associations:
- { type: "CATEGORY", attribute: "categories" }
- { type: "PRODUCT", attribute: "related_products" }
Media Handling
MediaWriter to sync images/videos:
// In a custom exporter service
$mediaWriter = $this->container->get('basecom_shopware_connector.media_writer');
$mediaWriter->write($fileInfo, $productId);
Custom Exporters
namespace AppBundle\Exporter;
use Basecom\Bundle\ShopwareConnectorBundle\Exporter\AbstractExporter;
class CustomProductExporter extends AbstractExporter
{
protected function transformProduct($product)
{
// Custom transformations
$data = parent::transformProduct($product);
$data['custom_field'] = $product->getCustomAttribute();
return $data;
}
}
services.yml:
app.custom_product_exporter:
class: AppBundle\Exporter\CustomProductExporter
tags:
- { name: akeneo_shopware.exporter, type: product }
Webhooks for Real-Time Sync
// Shopware hook (e.g., afterSaveProduct)
$client = new \GuzzleHttp\Client();
$client->post('http://akeneo/api/export', [
'json' => ['product_id' => $productId]
]);
Error Handling
$logger = $this->container->get('logger');
$logger->error('Export failed for product ' . $product->getId(), [
'error' => $e->getMessage(),
'product' => $product->getIdentifier()
]);
API Key Mismatch
401 Unauthorized./var/log/shopware.log) for API errors.Attribute Mapping Errors
bin/console debug:akeneo:shopware:attributes to list unmapped attributes.Media Sync Failures
/app/storage/files/).config.yml:
basecom_shopware_connector:
debug: true
Association Loops
associations:
max_depth: 2
Enable Verbose Logging
config.yml:
monolog:
handlers:
main:
level: debug
var/log/dev.log.Validate API Responses
POST /api/_action/akeneo_import
Headers: { Authorization: Bearer YOUR_API_KEY }
Body: { "data": [...] }
Database Schema Issues
doctrine:schema:update fails:
php app/console doctrine:schema:update --dump-sql
Custom Field Transformers
namespace AppBundle\Transformer;
use Basecom\Bundle\ShopwareConnectorBundle\Transformer\AbstractTransformer;
class CustomPriceTransformer extends AbstractTransformer
{
public function transform($value, $attribute)
{
return $value * 1.1; // Add 10% tax
}
}
services.yml:
app.custom_price_transformer:
class: AppBundle\Transformer\CustomPriceTransformer
tags:
- { name: akeneo_shopware.transformer, attribute: price }
Pre/Post Export Hooks
namespace AppBundle\EventListener;
use Basecom\Bundle\ShopwareConnectorBundle\Event\ExportEvent;
class ExportListener
{
public function onExport(ExportEvent $event)
{
if ($event->getType() === 'product') {
$event->getProduct()->setCustomField('pre_export_value');
}
}
}
services.yml:
app.export_listener:
class: AppBundle\EventListener\ExportListener
tags:
- { name: kernel.event_listener, event: akeneo_shopware.export, method: onExport }
Shop-Specific Configs
# config/parameters.yml
parameters:
shopware_api_key: "%env(SHOPWARE_API_KEY)%"
shopware_base_url: "%env(SHOPWARE_URL)%"
$shop = $event->getShop();
$mappings = $this->container->get('akeneo_shopware.mapping_loader
How can I help you explore Laravel packages today?