Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
3a0d3c0
feat: Display Neos Page tree in shopware navigation and enable render…
nlx-jonas Nov 24, 2025
dc45456
refactor: Content exchange service
nlx-jonas Nov 26, 2025
466f52a
feat: Add upmerge workflows
nlx-jonas Dec 9, 2025
979d181
fix: read from main composer.json
nlx-jonas Dec 9, 2025
a892fa8
fix: remove unaccesible upermge-description workflow
nlx-jonas Dec 9, 2025
84d6e2c
Merge pull request #4 from netlogix/feature/combined-navigation-tree
nlx-jonas Dec 10, 2025
a372e3c
fix: Run workflow on correct branch
nlx-jonas Dec 10, 2025
f69344e
mend
nlx-jonas Dec 10, 2025
ea81c01
Merge pull request #7 from netlogix/bugfix/run-require-version-workfl…
paxuclus Dec 10, 2025
8b71b09
fix: Try to fix read composer.json version task
nlx-jonas Dec 10, 2025
7e2c21b
Merge pull request #8 from netlogix/bugfix/workflows
nlx-jonas Dec 11, 2025
d55d801
feat: Wrap Neos errors in a 503 HTTP Response
nlx-jonas Dec 11, 2025
30aaf71
Merge pull request #9 from netlogix/feature/503-storefront-response-o…
nlx-jonas Dec 11, 2025
07456cb
feat: Add CODEOWNERS file
nlx-jonas Jan 13, 2026
a63d8fc
Merge pull request #10 from netlogix/feat/add-codeowners-file
paxuclus Jan 15, 2026
5038847
fix: auto collapse for sidebar fixed
AnnaPaulini Jan 16, 2026
b3d597b
Merge pull request #11 from netlogix/bugfix/WSGENIUS-268-fix-sidebar-…
paxuclus Jan 16, 2026
65aeb62
feat: Store CmsPageId on Neos Nodes
nlx-jonas Jan 22, 2026
85e51dd
feat: Wrap Neos errors in a 503 HTTP Response
nlx-jonas Dec 11, 2025
e1527f5
feat: Store CmsPageId on Neos Nodes
nlx-jonas Jan 22, 2026
024d5ba
Merge pull request #12 from netlogix/feature/invert-cmsPage-to-node-c…
nlx-jonas Jan 22, 2026
e183c02
fix: require-version-raised action
nlx-jonas Jan 22, 2026
5fbe041
Merge branch 'feature/invert-cmsPage-to-node-connection' of https://g…
nlx-jonas Jan 22, 2026
8cbf56c
Merge pull request #13 from netlogix/feature/invert-cmsPage-to-node-c…
nlx-jonas Jan 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
@netlogix-internal/neos
@netlogix-internal/ecommerce
30 changes: 30 additions & 0 deletions .github/workflows/release-tag.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
name: Release Tag on Merge to Main

on:
pull_request:
types: [closed]
branches: [main]

jobs:
tag:
if: github.event.pull_request.merged == true && github.event.pull_request.base.ref == 'main'
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-tags: true

- name: Extract version from composer.json
id: version
run: |
VERSION=$(jq -r '.version' composer.json)
echo "version=$VERSION" >> $GITHUB_OUTPUT

- name: Create Git tag
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git tag -a "${{ steps.version.outputs.version }}" -m "Release ${{ steps.version.outputs.version }}"
git push origin "${{ steps.version.outputs.version }}"
44 changes: 44 additions & 0 deletions .github/workflows/require-version-raised.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
name: Require Version Raise

on:
pull_request:
branches:
- main

jobs:
require-version-bump:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v6
with:
fetch-tags: true

- name: Read head version (PR branch)
id: head_version
run: |
HEAD_VERSION=$(jq -r '.version' composer.json)
echo "value=$HEAD_VERSION" >> $GITHUB_OUTPUT

- name: Read base version (main branch)
id: base_version
run: |
git fetch origin main
git checkout origin/main -- composer.json
BASE_VERSION=$(jq -r '.version' composer.json)
echo "value=$BASE_VERSION" >> $GITHUB_OUTPUT

- name: Compare versions
run: |
BASE="${{ steps.base_version.outputs.value }}"
HEAD="${{ steps.head_version.outputs.value }}"

echo "Base version: $BASE"
echo "PR version: $HEAD"

if [ "$BASE" = "$HEAD" ]; then
echo "❌ ERROR: composer.json version must be updated in this PR."
exit 1
else
echo "✅ Version changed — OK."
fi
25 changes: 25 additions & 0 deletions .github/workflows/upmerge.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: Create Upmerge PR

on:
push:
branches:
- develop

jobs:
upmerge:
runs-on: ubuntu-latest
env:
GH_TOKEN: ${{ github.token }}
steps:
- name: Checkout
uses: actions/checkout@v6

- run: |
OPEN_PR=$(gh pr list --head=develop --base=main --json=url)

if [ "$OPEN_PR" != "[]" ]; then
echo "Open PRs found, skipping..."
exit 0
fi

gh pr create --base=main --head=develop --title="UPMERGE: develop -> main" --body="Merge develop to main"
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "netlogix/neos-content",
"description": "This plugin enables Shopware templates to be designed with an Enterprise CMS.",
"version": "0.1.24",
"version": "0.1.26",
"type": "shopware-platform-plugin",
"license": "MIT",
"autoload": {
Expand Down
2 changes: 1 addition & 1 deletion src/Core/Content/Admin/AbstractUpdatePagesRoute.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@ abstract class AbstractUpdatePagesRoute
{
abstract public function getDecorated(): AbstractUpdatePagesRoute;

abstract public function load(): Response;
abstract public function load(Request $request, Context $context): Response;
}
19 changes: 11 additions & 8 deletions src/Core/Content/Admin/UpdateNeosPagesRoute.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,21 +27,24 @@ public function getDecorated(): AbstractUpdatePagesRoute
}

#[Route(path: '/api/_action/neos/update-neos-pages', name: 'api.neos.update-neos-pages', methods: ['POST'])]
public function load(): Response
public function load(Request $request, Context $context): Response
{
$context = Context::createDefaultContext();
$content = json_decode(json: $request->getContent(), associative: true) ?? [];
// If nodes are provided in the request, only process those
if (!empty($content['updatedNodes'])) {
$this->neosLayoutPageService->processProvidedNodes($content['updatedNodes'], $context);
return new JsonResponse(['status' => 'Provided Neos layout pages processed successfully.'], Response::HTTP_OK);
}

try {
$neosPages = $this->neosLayoutPageService->getNeosLayoutPages(
explode('|', NeosLayoutPageService::AVAILABLE_FILTER_PAGE_TYPES)
);
$neosPages = $this->neosLayoutPageService->getNeosCmsPageTemplates();
} catch (GuzzleException $e) {
$this->neosLayoutPageService->createNotification($context);
throw new Exception('Failed to retrieve Neos layout pages: ' . $e->getMessage(), 1751381726, $e);
throw new Exception('Failed to retrieve Neos templates: ' . $e->getMessage(), 1751381726, $e);
}

$this->neosLayoutPageService->createMissingNeosCmsPages($neosPages, $context);
$this->neosLayoutPageService->updateNeosCmsPages($neosPages, $context);
$this->neosLayoutPageService->removeCmsPagesWithInvalidNodeIdentifiers($neosPages, $context);
$this->neosLayoutPageService->removeObsoleteCmsPages($neosPages, $context);


return new JsonResponse(['status' => 'Neos layout pages updated successfully.'], Response::HTTP_OK);
Expand Down
12 changes: 12 additions & 0 deletions src/Core/Content/Cms/Aggregate/CmsBlock/NeosCmsBlockCollection.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

declare(strict_types=1);

namespace nlxNeosContent\Core\Content\Cms\Aggregate\CmsBlock;

use Shopware\Core\Content\Cms\Aggregate\CmsBlock\CmsBlockCollection;

class NeosCmsBlockCollection extends CmsBlockCollection
{

}
12 changes: 12 additions & 0 deletions src/Core/Content/Cms/Aggregate/CmsBlock/NeosCmsBlockEntity.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

declare(strict_types=1);

namespace nlxNeosContent\Core\Content\Cms\Aggregate\CmsBlock;

use Shopware\Core\Content\Cms\Aggregate\CmsBlock\CmsBlockEntity;

class NeosCmsBlockEntity extends CmsBlockEntity
{

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

declare(strict_types=1);

namespace nlxNeosContent\Core\Content\Cms\Aggregate\CmsSection;

use Shopware\Core\Content\Cms\Aggregate\CmsSection\CmsSectionCollection;

class NeosCmsSectionCollection extends CmsSectionCollection
{

}
12 changes: 12 additions & 0 deletions src/Core/Content/Cms/Aggregate/CmsSection/NeosCmsSectionEntity.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

declare(strict_types=1);

namespace nlxNeosContent\Core\Content\Cms\Aggregate\CmsSection;

use Shopware\Core\Content\Cms\Aggregate\CmsSection\CmsSectionEntity;

class NeosCmsSectionEntity extends CmsSectionEntity
{

}
12 changes: 12 additions & 0 deletions src/Core/Content/Cms/Aggregate/CmsSlot/NeosCmsSlotCollection.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

declare(strict_types=1);

namespace nlxNeosContent\Core\Content\Cms\Aggregate\CmsSlot;

use Shopware\Core\Content\Cms\Aggregate\CmsSlot\CmsSlotCollection;

class NeosCmsSlotCollection extends CmsSlotCollection
{

}
12 changes: 12 additions & 0 deletions src/Core/Content/Cms/Aggregate/CmsSlot/NeosCmsSlotEntity.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

declare(strict_types=1);

namespace nlxNeosContent\Core\Content\Cms\Aggregate\CmsSlot;

use Shopware\Core\Content\Cms\Aggregate\CmsSlot\CmsSlotEntity;

class NeosCmsSlotEntity extends CmsSlotEntity
{

}
12 changes: 12 additions & 0 deletions src/Core/Content/Cms/Aggregate/FieldConfig/NeosFieldConfig.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

declare(strict_types=1);

namespace nlxNeosContent\Core\Content\Cms\Aggregate\FieldConfig;

use Shopware\Core\Content\Cms\DataResolver\FieldConfig;

class NeosFieldConfig extends FieldConfig
{

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

declare(strict_types=1);

namespace nlxNeosContent\Core\Content\Cms\Aggregate\FieldConfig;

use Shopware\Core\Content\Cms\DataResolver\FieldConfigCollection;

class NeosFieldConfigCollection extends FieldConfigCollection
{

}
3 changes: 2 additions & 1 deletion src/Core/Content/NeosNode/NeosNodeDefinition.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use Shopware\Core\Content\Cms\CmsPageDefinition;
use Shopware\Core\Framework\DataAbstractionLayer\EntityDefinition;
use Shopware\Core\Framework\DataAbstractionLayer\Field\BoolField;
use Shopware\Core\Framework\DataAbstractionLayer\Field\DateField;
use Shopware\Core\Framework\DataAbstractionLayer\Field\FkField;
use Shopware\Core\Framework\DataAbstractionLayer\Field\Flag\PrimaryKey;
Expand Down Expand Up @@ -38,7 +39,7 @@ protected function defineFields(): FieldCollection
((new IdField('id', 'id'))->addFlags(new Required(), new PrimaryKey())),
(new DateField('created_at', 'createdAt')),
(new DateField('updated_at', 'updatedAt')),
(new StringField('node_identifier', 'nodeIdentifier')),
(new BoolField('neos_connection', 'neosConnection')),
(new FkField('cms_page_id', 'cmsPageId', CmsPageDefinition::class))->addFlags(new Required()),
(new ReferenceVersionField(CmsPageDefinition::class, 'cms_page_version_id')),
(new OneToOneAssociationField('cmsPage', 'cms_page_id', 'id', CmsPageDefinition::class, false)),
Expand Down
10 changes: 5 additions & 5 deletions src/Core/Content/NeosNode/NeosNodeEntity.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,16 @@ class NeosNodeEntity extends Entity

protected string $cmsPageVersionId;

protected ?string $nodeIdentifier;
protected bool $neosConnection = false;

public function getNodeIdentifier(): ?string
public function getNeosConnection(): bool
{
return $this->nodeIdentifier;
return $this->neosConnection;
}

public function nodeIdentifier(?string $nodeIdentifier): void
public function neosConnection(bool $neosConnection): void
{
$this->nodeIdentifier = $nodeIdentifier;
$this->neosConnection = $neosConnection;
}

public function getCmsPage(): CmsPageEntity
Expand Down
2 changes: 1 addition & 1 deletion src/Error/CanNotDeleteDefaultLayoutPageException.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

use Shopware\Core\Content\Cms\CmsPageEntity;

class CanNotDeleteDefaultLayoutPageException extends \Exception
class CanNotDeleteDefaultLayoutPageException extends \Exception implements NeosExceptionInterface
{
public function __construct(CmsPageEntity $cmsPageEntity, int $code = 1753085155, ?\Throwable $previous = null)
{
Expand Down
16 changes: 16 additions & 0 deletions src/Error/FaultyNeosSectionDataException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

declare(strict_types=1);

namespace nlxNeosContent\Error;

use Exception;
use Throwable;

class FaultyNeosSectionDataException extends Exception implements NeosExceptionInterface
{
public function __construct(string $message = "", int $code = 0, ?Throwable $previous = null, mixed $sectionData = null)
{
parent::__construct($message, $code, $previous);
}
}
2 changes: 1 addition & 1 deletion src/Error/MissingCmsPageEntityException.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

namespace nlxNeosContent\Error;

class MissingCmsPageEntityException extends \Exception
class MissingCmsPageEntityException extends \Exception implements NeosExceptionInterface
{
public function __construct(string $message = 'No cmsPage entity was found in CmsPageLoadedEvent.', int $code = 1752652152, ?\Throwable $previous = null)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Error/NeosContentFetchException.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

namespace nlxNeosContent\Error;

class NeosContentFetchException extends \Exception
class NeosContentFetchException extends \Exception implements NeosExceptionInterface
{
public function __construct(string $message = 'Neos Content could not be fetched.', int $code = 1752651981, ?\Throwable $previous = null)
{
Expand Down
10 changes: 10 additions & 0 deletions src/Error/NeosExceptionInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

declare(strict_types=1);

namespace nlxNeosContent\Error;

interface NeosExceptionInterface extends \Throwable
{

}
2 changes: 1 addition & 1 deletion src/Error/NeosUrlNotConfiguredException.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

namespace nlxNeosContent\Error;

class NeosUrlNotConfiguredException extends \Exception
class NeosUrlNotConfiguredException extends \Exception implements NeosExceptionInterface
{
public function __construct(string $message = 'Neos URL is not configured.', int $code = 1752646642, ?\Throwable $previous = null)
{
Expand Down
Loading