Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Liiptalk Neos CMS

Liiptalk Neos CMS

Neos CMS introduction at the Liiptalk on the 27th of september 2016, record available https://www.youtube.com/watch?v=J6q5Hk7Dr4k

Dominique Feyer

September 27, 2016
Tweet

More Decks by Dominique Feyer

Other Decks in Technology

Transcript

  1. building a CMS for
    ambitious editors

    View full-size slide

  2. born under
    the TYPO3 umbrella

    View full-size slide

  3. FLOW
    full stack PHP framework

    View full-size slide

  4. yet an other framework

    View full-size slide

  5. convention over
    configuration

    View full-size slide

  6. security framework

    View full-size slide

  7. 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))'

    View full-size slide

  8. 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

    View full-size slide

  9. security CLI helpers

    View full-size slide

  10. $ ./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

    View full-size slide

  11. help with single
    responsibility principle

    View full-size slide

  12. We compile your code

    View full-size slide

  13. Powerful Reflection API

    View full-size slide

  14. @Flow\CompileStatic

    View full-size slide

  15. /**
    * 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;
    }

    View full-size slide

  16. NEOS is just a package

    View full-size slide

  17. NEOS Content Repository

    View full-size slide

  18. where content lives

    View full-size slide

  19. yaml configuration

    View full-size slide

  20. '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

    View full-size slide

  21. inspired by PHPCR

    View full-size slide

  22. editing content

    View full-size slide

  23. editor experience

    View full-size slide

  24. content dimensions

    View full-size slide

  25. contents lives
    in multiple contexts

    View full-size slide

  26. don’t hide features

    View full-size slide

  27. create values

    View full-size slide

  28. flexible content structure

    View full-size slide

  29. modern rendering stack

    View full-size slide

  30. 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')}
    }

    View full-size slide

  31. 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)}
    }

    View full-size slide

  32. 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)}
    }
    }

    View full-size slide

  33. 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'
    }

    View full-size slide

  34. cache on steroid

    View full-size slide

  35. prototype(Vendor:StaffListingItem) {
    @cache {
    mode = 'cached'
    maximumLifetime = '86400'
    entryIdentifier {
    node = ${node}
    }
    entryTags {
    1 = ${'Node_' + documentNode.identifier}
    }
    }
    }

    View full-size slide

  36. much much more
    open to organize a workshop to build
    something on top of NEOS

    View full-size slide

  37. from the lab

    View full-size slide

  38. CQRS
    for the content repository

    View full-size slide

  39. touch points

    View full-size slide

  40. [email protected] - @ttreeagency - github.com/ttreeagency
    tt ttree
    digital beans

    View full-size slide