+ All Categories
Home > Technology > Liiptalk Neos CMS

Liiptalk Neos CMS

Date post: 12-Apr-2017
Category:
Upload: dfeyer
View: 164 times
Download: 3 times
Share this document with a friend
67
Transcript
Page 1: Liiptalk Neos CMS
Page 2: Liiptalk Neos CMS

building a CMS for ambitious editors

Page 3: Liiptalk Neos CMS

history

Page 4: Liiptalk Neos CMS

born under the TYPO3 umbrella

Page 5: Liiptalk Neos CMS

goals

Page 6: Liiptalk Neos CMS

foundation

Page 7: Liiptalk Neos CMS

FLOW full stack PHP framework

Page 8: Liiptalk Neos CMS

yet an other framework

Page 9: Liiptalk Neos CMS

convention over configuration

Page 10: Liiptalk Neos CMS

security framework

Page 11: Liiptalk Neos CMS

privilegeTargets:

'TYPO3\Flow\Security\Authorization\Privilege\Method\MethodPrivilege':

'Acme.MyPackage:RestrictedController.customerAction': matcher: 'method(Acme\MyPackage\Controller\RestrictedController-> customerAction())'

'Acme.MyPackage:RestrictedController.adminAction': matcher: 'method(Acme\MyPackage\Controller\RestrictedController-> (admin|drop)Action())’

'Acme.MyPackage:editOwnPost': matcher: ‘method(Acme\MyPackage\Controller\PostController-> editAction(post.owner == current.userService.currentUser))'

Page 12: Liiptalk Neos CMS

roles: 'Acme.MyPackage:Customer': privileges: - privilegeTarget: 'Acme.MyPackage:RestrictedController.customerAction' permission: GRANT - privilegeTarget: 'Acme.MyPackage:RestrictedController.adminAction' permission: GRANT - privilegeTarget: 'Acme.MyPackage:RestrictedController.editOwnPost' permission: GRANT

'Acme.MyPackage:Customer': privileges: - privilegeTarget: 'Acme.MyPackage:RestrictedController.customerAction' permission: GRANT

'Acme.MyPackage:PrivilegedCustomer': parentRoles: ['Acme.MyPackage:Customer'] privileges: - privilegeTarget: 'Acme.MyPackage:RestrictedController.editOwnPost' permission: GRANT

Page 13: Liiptalk Neos CMS

security CLI helpers

Page 14: Liiptalk Neos CMS

$ ./flow security:showunprotectedactions

TYPO3\Neos\Controller\Backend\ContentController initializeUploadAssetAction initializeCreateImageVariantAction

TYPO3\Neos\Controller\LoginController initializeIndexAction

TYPO3\Neos\Controller\Service\WorkspacesController initializeUpdateAction

Ttree\CloudButler\Controller\JobController initializeRegisterAction

Page 15: Liiptalk Neos CMS

AOP

Page 16: Liiptalk Neos CMS

help with single responsibility principle

Page 17: Liiptalk Neos CMS

danger zone

Page 18: Liiptalk Neos CMS

We compile your code

Page 19: Liiptalk Neos CMS

Powerful Reflection API

Page 20: Liiptalk Neos CMS

@Flow\CompileStatic

Page 21: Liiptalk Neos CMS

/** * Returns a map of action method names and their parameters. * * @param \TYPO3\Flow\Object\ObjectManagerInterface $objectManager * @return array Array of method parameters by action name * @Flow\CompileStatic */ static public function getActionMethodParameters($objectManager) { $reflectionService = $objectManager->get( 'TYPO3\Flow\Reflection\ReflectionService'); $className = get_called_class(); $methodParameters = $reflectionService->getMethodParameters($className, get_class_methods($className)); foreach ($methodParameters as $parameterName => $parameterInfo) { ... } return $methodParameters; }

Page 22: Liiptalk Neos CMS

NEOS is just a package

Page 23: Liiptalk Neos CMS

NEOS Content Repository

Page 24: Liiptalk Neos CMS

where content lives

Page 25: Liiptalk Neos CMS

yaml configuration

Page 26: Liiptalk Neos CMS

'My.Package:SpecialHeadline': superTypes: 'TYPO3.Neos:Content': true ui: label: 'Special Headline' group: 'general' properties: headline: type: 'string' defaultValue: 'My Headline Default' ui: inlineEditable: true validation: 'TYPO3.Neos/Validation/StringLengthValidator': minimum: 1 maximum: 255

Page 27: Liiptalk Neos CMS

inspired by PHPCR

Page 28: Liiptalk Neos CMS

editing content

Page 29: Liiptalk Neos CMS

editor experience

Page 30: Liiptalk Neos CMS
Page 31: Liiptalk Neos CMS
Page 32: Liiptalk Neos CMS
Page 33: Liiptalk Neos CMS
Page 34: Liiptalk Neos CMS
Page 35: Liiptalk Neos CMS

workspace

Page 36: Liiptalk Neos CMS
Page 37: Liiptalk Neos CMS
Page 38: Liiptalk Neos CMS
Page 39: Liiptalk Neos CMS

content dimensions

Page 40: Liiptalk Neos CMS
Page 41: Liiptalk Neos CMS

contents lives in multiple contexts

Page 42: Liiptalk Neos CMS
Page 43: Liiptalk Neos CMS

WYSIFTW

Page 44: Liiptalk Neos CMS
Page 45: Liiptalk Neos CMS
Page 46: Liiptalk Neos CMS
Page 47: Liiptalk Neos CMS

developer

Page 48: Liiptalk Neos CMS

don’t hide features

Page 49: Liiptalk Neos CMS

create values

Page 50: Liiptalk Neos CMS

flexible content structure

Page 51: Liiptalk Neos CMS

modern rendering stack

Page 52: Liiptalk Neos CMS

fusion

Page 53: Liiptalk Neos CMS

prototype(Vendor:Staff) < prototype(TYPO3.Neos:Content) { templatePath = ‘resource://Vendor.Site/Private/Templates/ElementName.html'

headline = ${q(node).property('headline')} subheadline = ${q(node).property('subheadline')} text = ${q(node).property('text')} image = ${q(node).property('image')} }

Page 54: Liiptalk Neos CMS

prototype(Vendor:Staff) < prototype(TYPO3.Neos:Content) { templatePath = ‘resource://Vendor.Site/Private/Templates/ElementName.html'

headline = ${q(node).property('headline')} subheadline = ${q(node).property('subheadline')} text = ${q(node).property('text')} image = ${q(node).property(‘image’)}

staffIdentifier = ${q(node).property(‘staffIdentifier’)} [email protected] = ${ErpApi.getStaffDetails(value)} }

Page 55: Liiptalk Neos CMS

prototype(Vendor:YourTwoColumns) {

prototype(Vendor:Staff) { templatePath = ‘resource://Vendor.Site/Private/Templates/Compact.html' }

}

prototype(Vendor:StaffDirectory.Document) {

prototype(Vendor:Staff) { templatePath = ‘resource://Vendor.Site/Private/Templates/Square.html' staffPageLink = ${q(node).property(‘staffIdentifier’)} [email protected] = ${ErpApi.getStaffUri(value)} }

}

Page 56: Liiptalk Neos CMS

prototype(Vendor:StaffListing) < prototype(Flowpack.Listable:Listable) { @context.limit = 10 collection = ${q(site).find('[instanceof Vendor:Staff]’).get()} itemRenderer = ‘Vendor:StaffListingItem' }

prototype(Vendor:StaffListingItem) < prototype(Vendor:Staff) { templatePath = ‘resource://Vendor.Site/Private/Templates/ListingItem.html' }

Page 57: Liiptalk Neos CMS

cache on steroid

Page 58: Liiptalk Neos CMS

prototype(Vendor:StaffListingItem) { @cache { mode = 'cached'

maximumLifetime = '86400'

entryIdentifier { node = ${node} }

entryTags { 1 = ${'Node_' + documentNode.identifier} } }

}

Page 59: Liiptalk Neos CMS

much much more open to organize a workshop to build

something on top of NEOS

Page 60: Liiptalk Neos CMS

from the lab

Page 61: Liiptalk Neos CMS
Page 62: Liiptalk Neos CMS

CQRS for the content repository

Page 63: Liiptalk Neos CMS

touch points

Page 64: Liiptalk Neos CMS

neos.io

Page 65: Liiptalk Neos CMS
Page 66: Liiptalk Neos CMS
Page 67: Liiptalk Neos CMS

[email protected] - @ttreeagency - github.com/ttreeagency

tt ttreedigital beans


Recommended