├── .editorconfig ├── .env.example ├── .gitattributes ├── .gitignore ├── .php_cs.dist ├── README.md ├── app ├── AppKernel.php ├── Resources │ └── views │ │ ├── Advanced │ │ ├── assetThumbnailList.html.twig │ │ ├── contactForm.html.twig │ │ ├── email.html.twig │ │ ├── index.html.twig │ │ ├── objectForm.html.twig │ │ ├── search.html.twig │ │ ├── sitemap.html.twig │ │ └── sitemapPartial.html.twig │ │ ├── Areas │ │ ├── blockquote │ │ │ └── view.html.twig │ │ ├── embed │ │ │ └── view.html.twig │ │ ├── featurette │ │ │ └── view.html.twig │ │ ├── gallery-carousel │ │ │ └── view.html.twig │ │ ├── gallery-folder │ │ │ └── view.html.twig │ │ ├── gallery-single-images │ │ │ └── view.html.twig │ │ ├── headlines │ │ │ └── view.html.twig │ │ ├── horizontal-line │ │ │ └── view.html.twig │ │ ├── icon-teaser-row │ │ │ └── view.html.twig │ │ ├── image-hotspot-marker │ │ │ └── view.html.twig │ │ ├── image │ │ │ └── view.html.twig │ │ ├── pdf │ │ │ └── view.html.twig │ │ ├── standard-teaser-row │ │ │ └── view.html.twig │ │ ├── tabbed-slider-text │ │ │ └── view.html.twig │ │ ├── text-accordion │ │ │ └── view.html.twig │ │ ├── time-slider-featurette │ │ │ └── view.html.twig │ │ ├── video │ │ │ └── view.html.twig │ │ ├── wysiwyg-with-images │ │ │ └── view.html.twig │ │ └── wysiwyg │ │ │ └── view.html.twig │ │ ├── Blog │ │ ├── detail.html.twig │ │ ├── index.html.twig │ │ ├── meta.html.twig │ │ └── sidebarBox.html.twig │ │ ├── Category │ │ └── Example │ │ │ └── test.html.twig │ │ ├── Content │ │ ├── default.html.twig │ │ ├── editableRoundup.html.twig │ │ ├── galleryRenderlet.html.twig │ │ ├── portal.html.twig │ │ ├── simpleForm.html.twig │ │ ├── thumbnails.html.twig │ │ └── websiteTranslations.html.twig │ │ ├── Default │ │ └── default.html.twig │ │ ├── Form │ │ ├── default.html.twig │ │ └── login.html.twig │ │ ├── Includes │ │ ├── area-headlines.html.twig │ │ ├── content-default.html.twig │ │ ├── content-headline.html.twig │ │ ├── editmode-layout.html.twig │ │ ├── footer.html.twig │ │ ├── jumbotron.html.twig │ │ ├── language.html.twig │ │ ├── login.html.twig │ │ ├── macros.html.twig │ │ ├── paging.html.twig │ │ └── sidebar.html.twig │ │ ├── News │ │ ├── detail.html.twig │ │ └── index.html.twig │ │ ├── Newsletter │ │ ├── confirm.html.twig │ │ ├── standardMail.html.twig │ │ ├── subscribe.html.twig │ │ └── unsubscribe.html.twig │ │ ├── Secure │ │ ├── login.html.twig │ │ └── secure.html.twig │ │ ├── Snippets │ │ └── standard-teaser.html.twig │ │ ├── Web2print │ │ ├── container.html.twig │ │ └── default.html.twig │ │ └── layout.html.twig ├── config │ ├── config.yml │ ├── config_dev.yml │ ├── config_prod.yml │ ├── config_test.yml │ ├── local │ │ └── .gitkeep │ ├── parameters.example.yml │ ├── pimcore │ │ ├── customviews.example.php │ │ ├── google-api-private-key.json.example │ │ ├── hybridauth.example.php │ │ ├── perspectives.example.php │ │ └── workflowmanagement.example.php │ ├── routing.yml │ ├── routing_dev.yml │ ├── security.yml │ └── services.yml └── constants.example.php ├── bin └── console ├── composer.json ├── composer.lock ├── dump ├── create-dump.php └── data.sql ├── gpl-3.0.txt ├── phpunit.xml.dist ├── src ├── .gitkeep └── AppBundle │ ├── AppBundle.php │ ├── Command │ └── AwesomeCommand.php │ ├── Controller │ ├── AdvancedController.php │ ├── BlogController.php │ ├── Category │ │ └── ExampleController.php │ ├── ContentController.php │ ├── DefaultController.php │ ├── FrontendController.php │ ├── NewsController.php │ ├── NewsletterController.php │ ├── SecureController.php │ └── Web2printController.php │ ├── DependencyInjection │ └── AppExtension.php │ ├── Document │ └── Areabrick │ │ ├── AbstractAreabrick.php │ │ ├── Blockquote.php │ │ ├── Embed.php │ │ ├── Featurette.php │ │ ├── GalleryCarousel.php │ │ ├── GalleryFolder.php │ │ ├── GallerySingleImages.php │ │ ├── Headlines.php │ │ ├── HorizontalLine.php │ │ ├── IconTeaserRow.php │ │ ├── Image.php │ │ ├── ImageHotspotMarker.php │ │ ├── Pdf.php │ │ ├── StandardTeaserRow.php │ │ ├── TabbedSliderText.php │ │ ├── TextAccordion.php │ │ ├── TimeSliderFeaturette.php │ │ ├── Video.php │ │ ├── Wysiwyg.php │ │ └── WysiwygWithImages.php │ ├── EventListener │ └── TestListener.php │ ├── Form │ ├── ContactFormType.php │ ├── LoginFormType.php │ ├── Newsletter │ │ ├── SubscriptionFormType.php │ │ └── UnsubscriptionFormType.php │ └── PersonInquiryType.php │ ├── LinkGenerator │ └── NewsLinkGenerator.php │ ├── Model │ └── DataObject │ │ └── User.php │ ├── Resources │ └── config │ │ ├── pimcore │ │ ├── config.yml │ │ ├── routing.yml │ │ └── security.yml │ │ └── services.yml │ ├── Sitemaps │ ├── NewsGenerator.php │ └── Processor │ │ └── NewsImageProcessor.php │ ├── Templating │ └── Helper │ │ └── LanguageSwitcher.php │ └── Twig │ ├── LanguageSwitcherExtension.php │ └── UniqidExtension.php ├── var ├── .gitkeep ├── classes │ ├── definition_blogArticle.php │ ├── definition_blogCategory.php │ ├── definition_inquiry.php │ ├── definition_news.php │ ├── definition_person.php │ └── definition_user.php └── config │ ├── document-types.php │ ├── extensions.php │ ├── image-thumbnails.php │ ├── predefined-properties.php │ ├── qrcode.php │ ├── staticroutes.php │ ├── system.template.yml │ └── video-thumbnails.php └── web ├── .htaccess ├── app.php ├── static ├── bootstrap │ ├── css │ │ ├── bootstrap-theme.css │ │ ├── bootstrap-theme.css.map │ │ ├── bootstrap-theme.min.css │ │ ├── bootstrap-theme.min.css.map │ │ ├── bootstrap.css │ │ ├── bootstrap.css.map │ │ ├── bootstrap.min.css │ │ └── bootstrap.min.css.map │ ├── fonts │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ └── glyphicons-halflings-regular.woff2 │ └── js │ │ ├── bootstrap.js │ │ ├── bootstrap.min.js │ │ └── npm.js ├── css │ ├── editmode.css │ ├── global.css │ └── print.css ├── img │ ├── de.png │ ├── en.png │ ├── logo-overlay.png │ ├── logo-standard.png │ ├── logo-white.svg │ ├── logo.svg │ ├── mask-example.png │ ├── social-icons │ │ ├── facebook.png │ │ ├── google.png │ │ ├── twitter.png │ │ └── youtube.png │ └── transparent-background-placeholder.png ├── js │ ├── html5shiv.js │ ├── jquery-1.11.0.min.js │ ├── respond.min.js │ └── srcset-polyfill.min.js ├── lib │ ├── magnific │ │ ├── magnific.css │ │ └── magnific.js │ └── video-js │ │ ├── demo.captions.vtt │ │ ├── demo.html │ │ ├── font │ │ ├── vjs.eot │ │ ├── vjs.svg │ │ ├── vjs.ttf │ │ └── vjs.woff │ │ ├── lang │ │ ├── de.js │ │ ├── es.js │ │ ├── fr.js │ │ ├── it.js │ │ ├── ja.js │ │ ├── ko.js │ │ └── pt-BR.js │ │ ├── video-js.css │ │ ├── video-js.less │ │ ├── video-js.min.css │ │ ├── video-js.swf │ │ ├── video.dev.js │ │ └── video.js └── screenshots │ ├── 1.png │ ├── 2.png │ └── 3.png └── var └── assets ├── documents ├── example-excel.xlsx ├── example.docx ├── example.pptx └── pimcore_t-mobile.pdf ├── examples ├── italy │ ├── dsc04344.jpg │ ├── dsc04346.jpg │ ├── dsc04399.jpg │ └── dsc04462.jpg ├── panama │ ├── img_0037.jpg │ ├── img_0089.jpg │ ├── img_0117.jpg │ ├── img_0160.jpg │ ├── img_0201.jpg │ ├── img_0399.jpg │ ├── img_0410.jpg │ └── img_0411.jpg ├── singapore │ ├── dsc03778.jpg │ ├── dsc03807.jpg │ └── dsc03835.jpg └── south-africa │ ├── img_0322.jpg │ ├── img_0391.jpg │ ├── img_1414.jpg │ ├── img_1544.jpg │ ├── img_1739.jpg │ ├── img_1752.jpg │ ├── img_1842.jpg │ ├── img_1920.jpg │ ├── img_2133.jpg │ ├── img_2155.jpg │ └── img_2240.jpg ├── portal-sujets ├── slide-01.jpg ├── slide-02.jpg └── slide-03.jpg ├── screenshots ├── e-commerce1.png ├── glossary.png ├── objects-forms.png ├── pim1.png ├── properties-1.png ├── properties-2.png ├── properties-3.png ├── tag-snippet-management.png ├── thumbnail-configuration.png └── website-translations.png └── videos └── home-trailer-english.mp4 /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_style = space 7 | indent_size = 4 8 | 9 | [*.php] 10 | insert_final_newline = true 11 | trim_trailing_whitespace = true 12 | 13 | [*.md] 14 | trim_trailing_whitespace = false 15 | 16 | [*.yml] 17 | indent_size = 4 18 | 19 | [*.json] 20 | indent_style = space 21 | indent_size = 2 22 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | # In all environments, the following files are loaded if they exist, 2 | # the later taking precedence over the former: 3 | # 4 | # * .env contains default values for the environment variables needed by the app 5 | # * .env.local uncommitted file with local overrides 6 | # * .env.$APP_ENV committed environment-specific defaults 7 | # * .env.$APP_ENV.local uncommitted environment-specific overrides 8 | # 9 | # Real environment variables win over .env files. 10 | # 11 | # DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES. 12 | # 13 | # Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). 14 | # https://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration 15 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | 2 | * -text 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # remove the following ignores for your project 2 | /app/constants.php 3 | 4 | # symfony default 5 | /.web-server-pid 6 | /app/config/parameters.yml 7 | /build/ 8 | /phpunit.xml 9 | /web/bundles/ 10 | 11 | # local config 12 | /.env.local 13 | /.env.local.php 14 | /.env.*.local 15 | !/app/config/local 16 | /app/config/local/* 17 | !app/config/local/.gitkeep 18 | 19 | # pimcore legacy (remove this for your own development) 20 | !/legacy 21 | /legacy/* 22 | !legacy/.gitkeep 23 | !legacy/bundle 24 | 25 | /var/* 26 | !/var/.gitkeep 27 | !/var/classes/ 28 | /var/classes/DataObject 29 | 30 | !/var/config 31 | /var/config/system.yml 32 | /var/config/debug-mode.php 33 | /var/config/maintenance.php 34 | 35 | # project specific recommendations 36 | /var/config/tag-manager.php 37 | /var/config/reports.php 38 | 39 | 40 | #/web/var/ 41 | /web/sitemap*.xml 42 | 43 | # PHP-CS-Fixer 44 | /.php_cs 45 | /.php_cs.cache 46 | 47 | # composer.local.json is referenced in composer-merge-plugin 48 | # remove this for your projects if you want to track the file 49 | /composer.local.json 50 | 51 | # composer 52 | /vendor/ 53 | 54 | # PhpStorm / IDEA 55 | .idea 56 | # NetBeans 57 | nbproject 58 | 59 | # Core / bundle development 60 | /dev/ 61 | 62 | # keep legacy paths ignored for easier migration 63 | /plugins/ 64 | /tools/ 65 | /website/ 66 | .temp 67 | -------------------------------------------------------------------------------- /.php_cs.dist: -------------------------------------------------------------------------------- 1 | in([ 5 | __DIR__ . '/app', 6 | __DIR__ . '/src', 7 | ]) 8 | 9 | ->exclude([ 10 | 11 | ]) 12 | 13 | // do not fix views 14 | ->notName('*.html.php') 15 | 16 | // using notPath instead of exclude here as they can be nested (install-profiles) 17 | ->notPath('/var\/config/') 18 | ->notPath('/var\/classes/') 19 | ; 20 | 21 | // do not enable self_accessor as it breaks pimcore models relying on get_called_class() 22 | return PhpCsFixer\Config::create() 23 | ->setRules([ 24 | '@PSR1' => true, 25 | '@PSR2' => true, 26 | 'array_syntax' => ['syntax' => 'short'], 27 | 28 | // keep aligned = and => operators as they are: do not force aligning, but do not remove it 29 | 'binary_operator_spaces' => ['align_double_arrow' => null, 'align_equals' => null], 30 | 31 | 'blank_line_before_return' => true, 32 | 'encoding' => true, 33 | 'function_typehint_space' => true, 34 | 'hash_to_slash_comment' => true, 35 | 'lowercase_cast' => true, 36 | 'magic_constant_casing' => true, 37 | 'method_argument_space' => ['ensure_fully_multiline' => false], 38 | 'method_separation' => true, 39 | 'native_function_casing' => true, 40 | 'no_blank_lines_after_class_opening' => true, 41 | 'no_blank_lines_after_phpdoc' => true, 42 | 'no_empty_comment' => true, 43 | 'no_empty_phpdoc' => true, 44 | 'no_empty_statement' => true, 45 | 'no_extra_consecutive_blank_lines' => true, 46 | 'no_leading_import_slash' => true, 47 | 'no_leading_namespace_whitespace' => true, 48 | 'no_short_bool_cast' => true, 49 | 'no_spaces_around_offset' => true, 50 | 'no_unneeded_control_parentheses' => true, 51 | 'no_unused_imports' => true, 52 | 'no_whitespace_before_comma_in_array' => true, 53 | 'no_whitespace_in_blank_line' => true, 54 | 'object_operator_without_whitespace' => true, 55 | 'ordered_imports' => true, 56 | 'phpdoc_indent' => true, 57 | 'phpdoc_no_useless_inheritdoc' => true, 58 | 'phpdoc_scalar' => true, 59 | 'phpdoc_separation' => true, 60 | 'phpdoc_single_line_var_spacing' => true, 61 | 'return_type_declaration' => true, 62 | 'short_scalar_cast' => true, 63 | 'single_blank_line_before_namespace' => true, 64 | 'single_quote' => true, 65 | 'space_after_semicolon' => true, 66 | 'standardize_not_equals' => true, 67 | 'ternary_operator_spaces' => true, 68 | 'whitespace_after_comma_in_array' => true, 69 | ]) 70 | ->setFinder($finder); 71 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Pimcore 5 Demo Basic (Twig-Templates) 2 | 3 | This demo package is intended to be used by Pimcore newcomers. It's tailored get an overview of 4 | Pimcore and contains some very basic use-cases to get you started quickly with Pimcore. 5 | 6 | ## Getting started 7 | ```bash 8 | COMPOSER_MEMORY_LIMIT=-1 composer create-project pimcore/demo-basic-twig my-project 9 | cd ./my-project 10 | ./vendor/bin/pimcore-install 11 | ``` 12 | 13 | - Point your virtual host to `my-project/web` 14 | - Open https://your-host/admin in your browser 15 | - Done! 😎 16 | 17 | 18 | ## Other demo/skeleton packages 19 | - [Pimcore Basic Demo (PHP-Templates)](https://github.com/pimcore/demo-basic) 20 | - [Pimcore Basic Demo (Twig-Templates)](https://github.com/pimcore/demo-basic-twig) 21 | - [Pimcore Advanced Demo](https://github.com/pimcore/demo-ecommerce) 22 | - [Pimcore Skeleton](https://github.com/pimcore/skeleton) 23 | -------------------------------------------------------------------------------- /app/AppKernel.php: -------------------------------------------------------------------------------- 1 | addBundle(new \AppBundle\AppBundle); 29 | } 30 | 31 | if (class_exists('\Pimcore\Bundle\LegacyBundle\PimcoreLegacyBundle')) { 32 | $collection->addBundle(new \Pimcore\Bundle\LegacyBundle\PimcoreLegacyBundle); 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/Resources/views/Advanced/assetThumbnailList.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html.twig' %} 2 | 3 | {% block content %} 4 | 5 | {% if editmode %} 6 |
7 | Specify the parent folder here (default is home) 8 | {{ pimcore_href('parentFolder') }} 9 |
10 | {% endif %} 11 | 12 |
13 | {% set thumbnailOptions = { 14 | width: 180, 15 | height: 180, 16 | cover: true 17 | } %} 18 | 19 | {% for asset in list %} 20 | {# @var asset \Pimcore\Model\Asset #} 21 | 22 | {% if asset.getType() in ['video', 'image', 'document'] %} 23 |
24 | 25 | {% if asset is instanceof('\\Pimcore\\Model\\Asset\\Image') %} 26 | 27 | {{ asset.getThumbnail(thumbnailOptions).getHTML({ class: 'thumbnail' })|raw }} 28 | 29 | {% else %} 30 | 31 | {% set thumbnail = asset.getImageThumbnail(thumbnailOptions) %} 32 | 33 | 34 | {% endif %} 35 | 36 |
37 | {% endif %} 38 | {% endfor %} 39 | 40 |
41 | 42 | {% endblock %} 43 | -------------------------------------------------------------------------------- /app/Resources/views/Advanced/contactForm.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html.twig' %} 2 | 3 | {% block content %} 4 | {{ include('Includes/content-default.html.twig') }} 5 | 6 | {% if not success %} 7 | 8 | {# see comment on objectForm template regarding the form theme #} 9 | {% form_theme form 'Form/default.html.twig' %} 10 | 11 | {{ form_start(form, { 12 | attr: { 13 | class: 'form-horizontal', 14 | role: 'form' 15 | } 16 | }) }} 17 | 18 |
19 |
20 | {{ form_row(form.gender) }} 21 | {{ form_row(form.firstname) }} 22 | {{ form_row(form.lastname) }} 23 | {{ form_row(form.email) }} 24 |
25 |
26 |

{{ "Click one of the following logos to auto-fill the form with your data"|trans }}

27 | 28 | 29 | 30 | 31 |
32 |
33 | 34 |
35 |
36 |

{{ form.message.vars['label'] }}

37 | 38 | {{ form_widget(form.message, { 39 | attr: { 40 | style: 'height: 300px', 41 | class: 'form-control' 42 | } 43 | }) }} 44 |
45 |
46 | 47 |
48 | 49 |
50 | {{ form_widget(form.submit, { 51 | attr: { 52 | class: 'btn btn-default' 53 | } 54 | }) }} 55 |
56 | 57 | {{ form_end(form) }} 58 | 59 | {% else %} 60 | 61 |

{{ "Thank you very much"|trans }}

62 |

63 | We received the following information from you: 64 | 65 |
66 |
67 | 68 | Firstname: {{ firstname }}
69 | Lastname: {{ lastname }}
70 | E-Mail: {{ email }}
71 |

72 | 73 | {% endif %} 74 | 75 | {% endblock %} 76 | -------------------------------------------------------------------------------- /app/Resources/views/Advanced/email.html.twig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Example 6 | 7 | 8 | 9 | 10 | 57 | 58 | 59 |
60 | 63 | 64 |

{{ pimcore_input('headline') }}

65 |

66 | {{ pimcore_wysiwyg('content') }} 67 |

68 |
69 | 70 | 71 | -------------------------------------------------------------------------------- /app/Resources/views/Advanced/index.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html.twig' %} 2 | 3 | {% block content %} 4 | {{ include('Includes/content-default.html.twig') }} 5 | 6 | {% if documents.getTotalCount() > 0 %} 7 | {# we use the Pimcore 4 compatible placeholder notation here (indexed array) #} 8 |

{% trans with [documents.getTotalCount()] %}Total: %s{% endtrans %}

9 | 10 | {# for new developments/translation keys you should use the native Symfony translator syntax: #} 11 | {# {% trans with { '%count%': documents.getTotalCount() } %}Total: %count%{% endtrans %} #} 12 | 13 | 20 | 21 | {% endif %} 22 | {% endblock %} 23 | -------------------------------------------------------------------------------- /app/Resources/views/Advanced/objectForm.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html.twig' %} 2 | 3 | {% block content %} 4 | {% if (not error and not success) or editmode %} 5 | {{ include('Includes/content-default.html.twig') }} 6 | {% endif %} 7 | 8 | {% if error or editmode %} 9 |
10 |
11 | {{ pimcore_input('errorMessage') }} 12 |
13 | {% endif %} 14 | 15 | {% if not success %} 16 | 17 | {# 18 | We created a custom form theme, where we override the parts we want to change with bootstrap markup. See: 19 | 20 | * http://symfony.com/doc/current/form/form_customization.html and 21 | * http://symfony.com/doc/current/form/rendering.html 22 | * http://symfony.com/doc/current/form/form_themes.html 23 | #} 24 | {% form_theme form 'Form/default.html.twig' %} 25 | 26 | {{ form_start(form, { 27 | attr: { 28 | class: 'form-horizontal', 29 | role: 'form' 30 | } 31 | }) }} 32 | 33 | {# call form_row() for normal inputs #} 34 | {{ form_row(form.gender) }} 35 | {{ form_row(form.firstname) }} 36 | {{ form_row(form.lastname) }} 37 | {{ form_row(form.email) }} 38 | {{ form_row(form.message) }} 39 | 40 | {# render checkbox manually as we need custom markup #} 41 |
42 |
43 |
44 | 47 |
48 |
49 |
50 | 51 |
52 | 53 |
54 |
55 | {{ form_widget(form.submit, { 56 | attr: { 57 | class: 'btn btn-default' 58 | } 59 | }) }} 60 |
61 |
62 | 63 | {{ form_end(form) }} 64 | 65 | {% else %} 66 | 67 |

{{ "Thank you very much"|trans }}

68 |

69 | We received the following information from you: 70 | 71 |
72 |
73 | 74 | Firstname: {{ firstname }}
75 | Lastname: {{ lastname }}
76 | E-Mail: {{ email }}
77 |

78 | 79 | {% endif %} 80 | {% endblock %} 81 | -------------------------------------------------------------------------------- /app/Resources/views/Advanced/search.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html.twig' %} 2 | 3 | {% block content %} 4 | {% if queryString is defined and queryString is not empty %} 5 | {{ include('Includes/content-headline.html.twig') }} 6 | {% else %} 7 | {{ include('Includes/content-default.html.twig') }} 8 | {% endif %} 9 | 10 |
11 |
12 |
13 | 14 |
15 | 16 |
17 | 18 | {% if paginator is defined %} 19 | 20 | {% set facets = result.getFacets() %} 21 | {% if facets is not empty %} 22 |
23 | Facets: 24 | {% for label, anchor in facets %} 25 | 26 | {{ anchor }} 27 | 28 | {% endfor %} 29 |
30 |
31 | {% endif %} 32 | 33 | {% for item in paginator %} 34 | 35 | {# @var item \Pimcore\Google\Cse\Item #} 36 | 37 | 38 |
39 | {% if item.getImage() is not empty %} 40 | 41 | {% if item.getImage() is instanceof('\\Pimcore\\Model\\Asset') %} 42 | 43 | {{ item.getImage().getThumbnail('newsList').getHTML({ 44 | class: 'media-object' 45 | })|raw }} 46 | 47 | {% else %} 48 | 49 | 50 | 51 | {% endif %} 52 | {% endif %} 53 | 54 | 71 |
72 | 73 | {% endfor %} 74 | 75 | 76 | {% include 'Includes/paging.html.twig' with { paginator: paginator } only %} 77 | 78 | 79 | {% elseif queryString is defined and queryString is not empty %} 80 | 81 | {# no paginator, but a query string #} 82 |
83 | Sorry, something went wrong ... 84 |
85 | 86 | {% else %} 87 | 88 |
89 | Type your keyword and press search 90 |
91 | 92 | {% endif %} 93 | 94 |
95 | {% endblock %} 96 | -------------------------------------------------------------------------------- /app/Resources/views/Advanced/sitemap.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html.twig' %} 2 | 3 | {% block content %} 4 | {% include 'Advanced/sitemapPartial.html.twig' with { doc: doc } only %} 5 | {% endblock %} 6 | -------------------------------------------------------------------------------- /app/Resources/views/Advanced/sitemapPartial.html.twig: -------------------------------------------------------------------------------- 1 | {# @var doc \Pimcore\Model\Document\PageSnippet #} 2 | 3 |
  • 4 | 5 | {{ doc.getProperty('navigation_name') }} 6 | 7 | 8 | {% if doc.hasChildren() %} 9 | 10 | 19 | 20 | {% endif %} 21 |
  • 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/Resources/views/Areas/blockquote/view.html.twig: -------------------------------------------------------------------------------- 1 |
    2 | 3 |
    4 |

    {{ pimcore_input('quote') }}

    5 | {{ pimcore_input('author') }} 6 |
    7 | 8 |
    9 | -------------------------------------------------------------------------------- /app/Resources/views/Areas/embed/view.html.twig: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | 4 | {% for i in 1..2 %} 5 | {% for i in pimcore_iterate_block(pimcore_block('contents_' ~ i)) %} 6 |
    7 | {{ pimcore_embed('socialContent', { 8 | width: 426, 9 | height: 300 10 | }) }} 11 |
    12 | {% endfor %} 13 | {% endfor %} 14 | 15 |
    16 |
    17 | 18 | -------------------------------------------------------------------------------- /app/Resources/views/Areas/featurette/view.html.twig: -------------------------------------------------------------------------------- 1 | {% set featuretteBlock = pimcore_block('block') %} 2 | 3 |
    4 | {% for i in pimcore_iterate_block(featuretteBlock) %} 5 | {% set positionSelect = pimcore_select('position', { 6 | store: [["left","left"],["right","right"]] 7 | }) %} 8 | 9 | {% set typeSelect = pimcore_select('type', { 10 | reload: true, 11 | store: [["video","video"], ["image","image"]] 12 | }) %} 13 | 14 | {% set position = positionSelect.getData()|default('right') %} 15 | 16 |
    17 |
    18 |

    19 | {{ pimcore_input('headline') }} 20 | {{ pimcore_input('subline') }} 21 |

    22 | 23 |
    24 | {{ pimcore_wysiwyg('content', { 25 | height: 200 26 | }) }} 27 |
    28 |
    29 | 30 |
    31 | {% if editmode %} 32 | 33 |
    34 | 35 | {{ positionSelect|raw }} 36 |
    37 | 38 |
    39 | 40 | {{ typeSelect|raw }} 41 |
    42 | 43 | {% endif %} 44 | 45 | {% set type = typeSelect.getData() %} 46 | 47 | {% if type == 'video' %} 48 | 49 | {{ pimcore_video('video', { 50 | thumbnail: 'featurerette', 51 | attributes: { 52 | class: 'video-js vjs-default-skin vjs-big-play-centered', 53 | 'data-setup': '{}' 54 | } 55 | }) }} 56 | 57 | {% else %} 58 | 59 | {{ pimcore_image('image', { 60 | class: 'featurette-image img-responsive', 61 | thumbnail: 'featurerette' 62 | }) }} 63 | 64 | {% endif %} 65 | 66 |
    67 |
    68 | 69 | {% if featuretteBlock.getCurrent() < (featuretteBlock.getCount() - 1) %} 70 |
    71 | {% endif %} 72 | 73 | {% endfor %} 74 |
    75 | -------------------------------------------------------------------------------- /app/Resources/views/Areas/gallery-carousel/view.html.twig: -------------------------------------------------------------------------------- 1 | 91 | 92 | -------------------------------------------------------------------------------- /app/Resources/views/Areas/gallery-folder/view.html.twig: -------------------------------------------------------------------------------- 1 | 9 | 10 | -------------------------------------------------------------------------------- /app/Resources/views/Areas/gallery-single-images/view.html.twig: -------------------------------------------------------------------------------- 1 | {% import 'Includes/macros.html.twig' as macros %} 2 | 3 | 14 | 15 | -------------------------------------------------------------------------------- /app/Resources/views/Areas/headlines/view.html.twig: -------------------------------------------------------------------------------- 1 | {{ include('Includes/area-headlines.html.twig') }} 2 | -------------------------------------------------------------------------------- /app/Resources/views/Areas/horizontal-line/view.html.twig: -------------------------------------------------------------------------------- 1 |
    2 | -------------------------------------------------------------------------------- /app/Resources/views/Areas/image-hotspot-marker/view.html.twig: -------------------------------------------------------------------------------- 1 | {% import _self as local_macros %} 2 | 3 | {% macro image_marker(el, class, attributes) %} 4 | 5 | {# extract title #} 6 | {% set title = '' %} 7 | {% for d in el['data'] %} 8 | {% if d['name'] == 'title' %} 9 | {% set title = d['value'] %} 10 | {% endif %} 11 | {% endfor %} 12 | 13 | {# build style attributes #} 14 | {% set styleAttributes = [] %} 15 | {% for attribute in attributes %} 16 | {% if el[attribute] is defined %} 17 | {% set attributePair = attribute ~ ': ' ~ el[attribute] ~ '%' %} 18 | {% set styleAttributes = styleAttributes|merge([attributePair]) %} 19 | {% endif %} 20 | {% endfor %} 21 | 22 | {% set style = styleAttributes|join('; ') %} 23 | 24 |
    25 | 26 | {% endmacro %} 27 | 28 |
    29 |
    30 | {% set image = pimcore_image('image', { 31 | thumbnail: 'content' 32 | }) %} 33 | 34 | {{ image|raw }} 35 | 36 | {% if not editmode %} 37 | 38 | {# markers #} 39 | {% for marker in image.getMarker() %} 40 | {{ local_macros.image_marker(marker, 'image-marker', ['top', 'left']) }} 41 | {% endfor %} 42 | 43 | {# hotspots #} 44 | {% for hotspot in image.getHotspots() %} 45 | {{ local_macros.image_marker(hotspot, 'image-hotspot', ['width', 'height', 'top', 'left']) }} 46 | {% endfor %} 47 | 48 | {% endif %} 49 |
    50 |
    51 | -------------------------------------------------------------------------------- /app/Resources/views/Areas/image/view.html.twig: -------------------------------------------------------------------------------- 1 | {% import 'Includes/macros.html.twig' as macros %} 2 | 3 |
    4 | {{ macros.image_link(pimcore_image('image', { thumbnail: 'content' }), editmode, 'galleryLightbox') }} 5 |
    6 | -------------------------------------------------------------------------------- /app/Resources/views/Areas/pdf/view.html.twig: -------------------------------------------------------------------------------- 1 |
    2 | {{ pimcore_pdf('pdf') }} 3 |
    4 | 5 | -------------------------------------------------------------------------------- /app/Resources/views/Areas/standard-teaser-row/view.html.twig: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | {% for t in 0..2 %} 4 | {% set select = pimcore_select('type_' ~ t, { 5 | width: 90, 6 | reload: true, 7 | store: [ 8 | ['direct','direct'], 9 | ['snippet','snippet'] 10 | ] 11 | }) %} 12 | 13 |
    14 | {% if editmode %} 15 |
    16 | 17 | {{ select|raw }} 18 |
    19 | {% endif %} 20 | 21 | {% set type = select.getData() %} 22 | {% if type == "direct" %} 23 | {{ include('Snippets/standard-teaser.html.twig', { 24 | suffix: (t+1) 25 | }) }} 26 | {% else %} 27 | {{ pimcore_snippet('teaser_' ~ t) }} 28 | {% endif %} 29 |
    30 | {% endfor %} 31 |
    32 |
    33 | -------------------------------------------------------------------------------- /app/Resources/views/Areas/tabbed-slider-text/view.html.twig: -------------------------------------------------------------------------------- 1 |
    2 | 3 | {% set selectStore = [] %} 4 | {% for i in 2..5 %} 5 | {% set selectStore = selectStore|merge([i , i]) %} 6 | {% endfor %} 7 | 8 | {% set slidesSelect = pimcore_select('slides', { 9 | store: selectStore, 10 | reload: true, 11 | width: 70 12 | }) %} 13 | 14 | {% set id = 'tabbed-slider-' ~ uniqid() %} 15 | {% set slides = slidesSelect.getData()|default(2) %} 16 | 17 | {% if editmode %} 18 | 19 |
    20 | How many tabs you want to show? 21 | {{ slidesSelect|raw }} 22 |
    23 | 24 | {% endif %} 25 | 26 | 63 | 64 |
    65 | 66 | -------------------------------------------------------------------------------- /app/Resources/views/Areas/text-accordion/view.html.twig: -------------------------------------------------------------------------------- 1 | {% set accordionBlock = pimcore_block('accordion') %} 2 | {% set id = uniqid('accordion-') %} 3 | 4 |
    5 |
    6 | 7 | {% for i in pimcore_iterate_block(accordionBlock) %} 8 | {% set entryId = id ~ '-' ~ accordionBlock.getCurrent() %} 9 | {% set stateClass = (editmode or (accordionBlock.getCurrent() == 0)) ? 'in' %} 10 | 11 |
    12 | 19 | 20 |
    21 |
    22 | {{ pimcore_wysiwyg('text') }} 23 |
    24 |
    25 |
    26 | 27 | {% endfor %} 28 |
    29 |
    30 | -------------------------------------------------------------------------------- /app/Resources/views/Areas/time-slider-featurette/view.html.twig: -------------------------------------------------------------------------------- 1 | {% set featuretteBlock = pimcore_scheduledblock('block') %} 2 | 3 |
    4 | {% for i in pimcore_iterate_block(featuretteBlock) %} 5 | {% set positionSelect = pimcore_select('position', { 6 | store: [["left","left"],["right","right"]] 7 | }) %} 8 | 9 | {% set position = positionSelect.getData()|default('right') %} 10 | 11 |
    12 |
    13 |

    14 | {{ pimcore_input('headline') }} 15 | {{ pimcore_input('subline') }} 16 |

    17 | 18 |
    19 | {{ pimcore_wysiwyg('content', { 20 | height: 200 21 | }) }} 22 |
    23 |
    24 | 25 |
    26 | {% if editmode %} 27 | 28 |
    29 | 30 | {{ positionSelect|raw }} 31 |
    32 | 33 | 34 | {% endif %} 35 | 36 | {{ pimcore_image('image', { 37 | class: 'featurette-image img-responsive', 38 | thumbnail: 'featurerette' 39 | }) }} 40 | 41 |
    42 |
    43 | 44 | 45 | {% endfor %} 46 |
    47 | -------------------------------------------------------------------------------- /app/Resources/views/Areas/video/view.html.twig: -------------------------------------------------------------------------------- 1 |
    2 | {{ pimcore_video('video', { 3 | attributes: { 4 | class: 'video-js vjs-default-skin vjs-big-play-centered', 5 | 'data-setup': '{}' 6 | }, 7 | thumbnail: 'content', 8 | height: 380 9 | }) }} 10 |
    11 | -------------------------------------------------------------------------------- /app/Resources/views/Areas/wysiwyg-with-images/view.html.twig: -------------------------------------------------------------------------------- 1 | {% import 'Includes/macros.html.twig' as macros %} 2 | 3 | {% set content = pimcore_wysiwyg('content') %} 4 | 5 | {# add autogenerated meta description #} 6 | {% do pimcore_head_meta().setDescription(content.getData(), 160) %} 7 | 8 |
    9 |
    10 |
    11 | {% pimcoreglossary %} 12 | {{ content|raw }} 13 | {% endpimcoreglossary %} 14 |
    15 |
    16 | {% for i in pimcore_iterate_block(pimcore_block('images')) %} 17 | {{ macros.image_link(pimcore_image('image', { thumbnail: 'galleryThumbnail' }), editmode, 'galleryLightbox') }} 18 | {% endfor %} 19 |
    20 |
    21 |
    22 | -------------------------------------------------------------------------------- /app/Resources/views/Areas/wysiwyg/view.html.twig: -------------------------------------------------------------------------------- 1 | {% set content = pimcore_wysiwyg('content') %} 2 | 3 | {# add autogenerated meta description #} 4 | {% do pimcore_head_meta().setDescription(content.getData(), 160) %} 5 | 6 |
    7 | {% pimcoreglossary %} 8 | {{ content|raw }} 9 | {% endpimcoreglossary %} 10 |
    11 | -------------------------------------------------------------------------------- /app/Resources/views/Blog/detail.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html.twig' %} 2 | 3 | {% do pimcore_head_title().set(article.getTitle()) %} 4 | {% do pimcore_head_meta().setDescription(article.getText(), 160) %} 5 | 6 | {% block content %} 7 | 8 |
    9 | 12 | 13 | {% include 'Blog/meta.html.twig' with { article: article } only %} 14 | 15 |
    16 | 17 | {% if article.getPosterImage() %} 18 | {# @var posterImage \Pimcore\Model\DataObject\Data\Hotspotimage #} 19 | {% set posterImage = article.getPosterImage() %} 20 | 21 |
    22 | {{ posterImage.getThumbnail('content').getHTML({ class: 'img-responsive' })|raw }} 23 | 24 | {% for hotspot in posterImage.getHotspots()|default([]) %} 25 |
    26 | {% endfor %} 27 | 28 | {% for marker in posterImage.getMarker()|default([]) %} 29 |
    30 | {% endfor %} 31 |
    32 | 33 |

    34 | {% endif %} 35 | 36 | {{ article.getText()|raw }} 37 | 38 |
    39 |
    40 | 51 | 52 | comments powered by Disqus 53 |
    54 |
    55 | 56 | {% endblock %} 57 | -------------------------------------------------------------------------------- /app/Resources/views/Blog/index.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html.twig' %} 2 | 3 | {% block content %} 4 | {{ include('Includes/content-default.html.twig') }} 5 | 6 |
    7 | 8 |
    9 |
    10 | 11 | {% for article in articles %} 12 | {# @var article \Pimcore\Model\DataObject\BlogArticle #} 13 | 14 |
    15 | {% set detailLink = path('blog', { 16 | id: article.getId(), 17 | text: article.getTitle(), 18 | prefix: document.getFullPath() 19 | }) %} 20 | 21 |
    22 |

    23 | {{ article.getTitle() }} 24 |

    25 | 26 | {% include 'Blog/meta.html.twig' with { article: article } only %} 27 | 28 |
    29 | 30 | {% if article.getPosterImage() %} 31 | {{ article.getPosterImage().getThumbnail('content').getHTML()|raw }} 32 |

    33 | {% endif %} 34 | 35 | {{ article.getText()|raw }} 36 |
    37 |
    38 | 39 | {% endfor %} 40 | 41 | 42 | {% include 'Includes/paging.html.twig' with { paginator: articles } only %} 43 | 44 |
    45 | 46 |
    47 |
    48 |

    {{ 'Categories'|trans }}

    49 | 50 | 63 |
    64 | 65 |
    66 |

    {{ 'Archive'|trans }}

    67 | 68 | 82 |
    83 |
    84 |
    85 | {% endblock %} 86 | -------------------------------------------------------------------------------- /app/Resources/views/Blog/meta.html.twig: -------------------------------------------------------------------------------- 1 | {{ article.getDate()|date('d/m/Y') }} 2 | 3 | 4 | {% for category in article.getCategories() %} 5 | {%- spaceless -%} 6 | {# @var category \Pimcore\Model\DataObject\BlogCategory #} 7 | {%- if loop.index0 > 0 -%}, {% endif -%}{{ category.getName() }} 8 | {%- endspaceless -%} 9 | {% endfor %} 10 | 11 | -------------------------------------------------------------------------------- /app/Resources/views/Blog/sidebarBox.html.twig: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |

    {{ "Recently in the Blog"|trans }}

    4 |
    5 |
    6 |
    7 | {% for article in articles %} 8 | {% set detailLink = path('blog', { 9 | id: article.id, 10 | text: article.title, 11 | prefix: document.getProperty('blog').getFullPath() 12 | }) %} 13 | 14 | 15 |
    {{ article.title }}
    16 | 17 | {% if article.date is not empty %} 18 |

    19 | 20 | {{ article.date|date('d/m/Y') }} 21 |

    22 | {% endif %} 23 |
    24 | {% endfor %} 25 |
    26 |
    27 |
    28 | -------------------------------------------------------------------------------- /app/Resources/views/Category/Example/test.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html.twig' %} 2 | 3 | {% block content %} 4 | {{ include('Includes/content-default.html.twig') }} 5 | 6 |

    This is just a simple example of a sub-module.

    7 |
    8 | Please check the settings of this static route / document and the corresponding controller / view to see how this works. 9 | 10 |
    11 |
    12 |
    13 | {% endblock %} 14 | -------------------------------------------------------------------------------- /app/Resources/views/Content/default.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html.twig' %} 2 | 3 | {% block content %} 4 | {{ include('Includes/content-default.html.twig') }} 5 | {% endblock %} 6 | -------------------------------------------------------------------------------- /app/Resources/views/Content/galleryRenderlet.html.twig: -------------------------------------------------------------------------------- 1 |
    2 | {% if asset %} 3 | 4 |
    5 | {% for image in asset.getChildren() %} 6 | {% if image is instanceof('\\Pimcore\\Model\\Asset\\Image') %} 7 | 12 | {% endif %} 13 | {% endfor %} 14 |
    15 | 16 | {% endif %} 17 |
    18 | -------------------------------------------------------------------------------- /app/Resources/views/Content/portal.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html.twig' %} 2 | 3 | {% block content %} 4 | 65 | 66 | {% if editmode %} 67 | 68 |
    69 | Number of Slides: {{ carouselSlides|raw }} 70 |
    71 | 72 | {% endif %} 73 | 74 |
    75 | {{ pimcore_areablock('content') }} 76 |
    77 | {% endblock %} 78 | -------------------------------------------------------------------------------- /app/Resources/views/Content/simpleForm.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html.twig' %} 2 | 3 | {% block content %} 4 | {{ include('Includes/content-default.html.twig') }} 5 | 6 | {% if success %} 7 | 8 |

    {{ 'Thank you very much'|trans }}

    9 |

    10 | We received the following information from you: 11 | 12 |
    13 |
    14 | 15 | Firstname: {{ firstname }}
    16 | Lastname: {{ lastname }}
    17 | E-Mail: {{ email }}
    18 |

    19 | 20 | {% else %} 21 | {# see comment on advanced/objectForm template regarding the form theme #} 22 | {% form_theme form 'Form/default.html.twig' %} 23 | 24 | {{ form_start(form, { 25 | attr: { 26 | class: 'form-horizontal', 27 | role: 'form' 28 | } 29 | }) }} 30 | 31 | {{ form_row(form.firstname) }} 32 | {{ form_row(form.lastname) }} 33 | {{ form_row(form.email) }} 34 | 35 | {# render checkbox manually as we need custom markup #} 36 |
    37 |
    38 |
    39 | 42 |
    43 |
    44 |
    45 | 46 |
    47 |
    48 | {{ form_widget(form.submit, { 49 | attr: { 50 | class: 'btn btn-default' 51 | } 52 | }) }} 53 |
    54 |
    55 | 56 | {{ form_end(form) }} 57 | 58 | {% endif %} 59 | {% endblock %} 60 | -------------------------------------------------------------------------------- /app/Resources/views/Content/thumbnails.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html.twig' %} 2 | 3 | {% block content %} 4 | {{ include('Includes/content-default.html.twig') }} 5 | 6 | {# this is just used for demonstration #} 7 | {% set image = pimcore_asset(53) %} 8 | 9 | {% set thumbnails = { 10 | 'Cover': 'exampleCover', 11 | 'Contain': 'exampleContain', 12 | 'Frame': 'exampleFrame', 13 | 'Rotate': 'exampleRotate', 14 | 'Resize': 'exampleResize', 15 | 'Scale by Width': 'exampleScaleWidth', 16 | 'Scale by Height': 'exampleScaleHeight', 17 | 'Contain & Overlay': 'exampleOverlay', 18 | 'Rounded Corners': 'exampleCorners', 19 | 'Sepia': 'exampleSepia', 20 | 'Grayscale': 'exampleGrayscale', 21 | 'Mask': 'exampleMask', 22 | 'Combined 1': 'exampleCombined1', 23 | 'Combined 2': 'exampleCombined2' 24 | } %} 25 | 26 |

    27 | {{ 'Original Dimensions of the Image'|trans }} 28 | {{ image.width }} x {{ image.height }} 29 |

    30 | 31 |
    32 | {% for title, name in thumbnails %} 33 | 34 | {% if loop.index0 % 3 == 0 %} 35 |
    36 | {% endif %} 37 | 38 |
    39 | {% set thumbnail = image.getThumbnail(name) %} 40 | 41 |
    42 | {{ thumbnail.getHTML()|raw }} 43 |
    44 | 45 |

    {{ title|trans }}

    46 | 47 |
    48 | {{ 'Dimensions'|trans }} 49 | {{ thumbnail.width }} x {{ thumbnail.height }} 50 |
    51 |
    52 | 53 | {% if loop.last or ((loop.index0 + 1) % 3 == 0) %} 54 |
    55 | {% endif %} 56 | {% endfor %} 57 |
    58 | 59 | {{ pimcore_areablock('content_bottom') }} 60 | {% endblock %} 61 | 62 | 63 | -------------------------------------------------------------------------------- /app/Resources/views/Content/websiteTranslations.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html.twig' %} 2 | 3 | {% block content %} 4 | {{ include('Includes/content-default.html.twig') }} 5 | 6 |
    7 |
    8 |

    {{ 'Download compiled'|trans }}

    9 |

    {{ 'Fastest way to get started: get the compiled and minified versions of our CSS, JS, and images. No docs or original source files.'|trans }}

    10 |

    {{ 'Download'|trans }}

    11 |
    12 |
    13 |

    {% trans with {'%date%': "now"|date('d/m/Y')} %}Download Now (%date%){% endtrans %}

    14 |

    {{ 'Get the original files for all CSS and JavaScript, along with a local copy of the docs by downloading the latest version directly from GitHub.'|trans }}

    15 |

    {{ 'Download'|trans }}

    16 |
    17 |
    18 | 19 | {{ pimcore_areablock('contentBottom') }} 20 | {% endblock %} 21 | -------------------------------------------------------------------------------- /app/Resources/views/Default/default.html.twig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Example 6 | 7 | 8 | 9 | 10 | 72 | 73 | 74 |
    75 | 78 |
    79 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /app/Resources/views/Form/default.html.twig: -------------------------------------------------------------------------------- 1 | {%- block form_errors -%} 2 | {%- if errors|length > 0 -%} 3 | 8 | {%- endif -%} 9 | {%- endblock form_errors -%} 10 | 11 | {%- block form_row -%} 12 |
    13 | {{- form_label(form, null, { 14 | label_attr: { 15 | class: 'col-lg-2 control-label' 16 | } 17 | }) -}} 18 | 19 |
    20 | {{- form_widget(form, { 21 | attr: { 22 | class: 'form-control' 23 | } 24 | }) -}} 25 | {{- form_errors(form) -}} 26 |
    27 |
    28 | {%- endblock form_row -%} 29 | -------------------------------------------------------------------------------- /app/Resources/views/Form/login.html.twig: -------------------------------------------------------------------------------- 1 | {%- block form_row -%} 2 |
    3 | {{- form_label(form) -}} 4 | {{- form_widget(form, { 5 | attr: { 6 | class: 'form-control' 7 | } 8 | }) -}} 9 |
    10 | {%- endblock form_row -%} 11 | -------------------------------------------------------------------------------- /app/Resources/views/Includes/area-headlines.html.twig: -------------------------------------------------------------------------------- 1 | {% set headline = pimcore_input('headline') %} 2 | {% set lead = pimcore_wysiwyg('lead', { 3 | height: 100 4 | }) %} 5 | 6 | {% if editmode or not headline.isEmpty() %} 7 | 10 | {% endif %} 11 | 12 | {% if editmode or not lead.isEmpty() %} 13 |
    14 | {{ lead|raw }} 15 |
    16 | {% endif %} 17 | -------------------------------------------------------------------------------- /app/Resources/views/Includes/content-default.html.twig: -------------------------------------------------------------------------------- 1 | {{ include('Includes/content-headline.html.twig') }} 2 | {{ pimcore_areablock('content') }} 3 | -------------------------------------------------------------------------------- /app/Resources/views/Includes/content-headline.html.twig: -------------------------------------------------------------------------------- 1 | {% set headline = pimcore_input('headline') %} 2 | {% do pimcore_head_title(headline.getData()) %} 3 | 4 | 8 | -------------------------------------------------------------------------------- /app/Resources/views/Includes/editmode-layout.html.twig: -------------------------------------------------------------------------------- 1 | {% block editmode_header %} 2 | {% if editmode %} 3 | {# add some wrapping HTML to make it looking nicer in the editmode #} 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
    16 | 23 |
    24 | 25 | 26 | {% endif %} 27 | {% endblock %} 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /app/Resources/views/Includes/footer.html.twig: -------------------------------------------------------------------------------- 1 | {% if editmode %} 2 | {# styles only for editmode #} 3 | 4 | {% endif %} 5 | 6 | 7 | 19 | -------------------------------------------------------------------------------- /app/Resources/views/Includes/jumbotron.html.twig: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |

    {{ pimcore_input('headTitle') }}

    4 |

    {{ pimcore_input('headDescription') }}

    5 |
    6 | 7 | {% set color = document.getProperty('headerColor') %} 8 | {% if color %} 9 | {% set colorMapping = { 10 | blue: ['#258dc1', '#2aabeb'], 11 | green: ['#278415', '#1a9f00'] 12 | } %} 13 | 14 | {% if colorMapping[color] is defined %} 15 | {% set c = colorMapping[color] %} 16 | 17 | 29 | {% endif %} 30 | 31 | {% endif %} 32 |
    33 | -------------------------------------------------------------------------------- /app/Resources/views/Includes/language.html.twig: -------------------------------------------------------------------------------- 1 | 17 | -------------------------------------------------------------------------------- /app/Resources/views/Includes/login.html.twig: -------------------------------------------------------------------------------- 1 | 51 | -------------------------------------------------------------------------------- /app/Resources/views/Includes/macros.html.twig: -------------------------------------------------------------------------------- 1 | {% macro image_link(image, editmode = false, linkThumbnail = 'galleryLightbox') %} 2 | 3 | {# @var image \Pimcore\Model\Document\Tag\Image #} 4 | {% set hasLink = not editmode and linkThumbnail is not empty %} 5 | 6 | {% if hasLink %} 7 | 8 | {% endif %} 9 | 10 | {{ image|raw }} 11 | 12 | {% if hasLink %} 13 | 14 | {% endif %} 15 | 16 | {% endmacro %} 17 | -------------------------------------------------------------------------------- /app/Resources/views/Includes/paging.html.twig: -------------------------------------------------------------------------------- 1 | {% set pages = paginator.getPages('Sliding') %} 2 | 3 | {% if pages.pageCount > 0 %} 4 | 5 | 32 | 33 | {% endif %} 34 | -------------------------------------------------------------------------------- /app/Resources/views/Includes/sidebar.html.twig: -------------------------------------------------------------------------------- 1 | {% use 'Includes/editmode-layout.html.twig' %} 2 | 3 | {{ block('editmode_header') }} 4 | 5 |
    6 | {% for i in pimcore_iterate_block(pimcore_block('teasers')) %} 7 | {{ pimcore_snippet('teaser') }} 8 | {% endfor %} 9 |
    10 | 11 | {% set articleSelect = pimcore_select('blogArticles', { 12 | width: 70, 13 | store: [[1,1],[2,2],[3,3]] 14 | }) %} 15 | 16 | {% if editmode %} 17 |
    18 |
    19 |
    20 |

    How many blog articles should be listed (set 0 to hide the box):

    21 |
    22 | {{ articleSelect|raw }} 23 |
    24 | {% else %} 25 | {% set count = articleSelect.getData() %} 26 | {% if count is defined and count > 0 %} 27 | {{ pimcore_action('sidebarBox', 'Blog', null, { 28 | items: count 29 | }) }} 30 | {% endif %} 31 | {% endif %} 32 | 33 | {{ block('editmode_footer') }} 34 | -------------------------------------------------------------------------------- /app/Resources/views/News/detail.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html.twig' %} 2 | 3 | {% do pimcore_head_title().set(news.getTitle()) %} 4 | {% do pimcore_head_meta().setDescription(news.getShortText, 160) %} 5 | 6 | {% block content %} 7 |
    8 | 11 | 12 |
    13 |

    {{ news.shortText }}

    14 |
    15 | 16 | {{ news.text|raw }} 17 | 18 |
    19 | {% for i in 1..3 %} 20 | {% set image = attribute(news, 'getImage_' ~ i) %} 21 | 22 | {% if image is defined and image is not empty %} 23 | 28 | {% endif %} 29 | {% endfor %} 30 |
    31 |
    32 | {% endblock %} 33 | -------------------------------------------------------------------------------- /app/Resources/views/News/index.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html.twig' %} 2 | 3 | {% block content %} 4 | {{ include('Includes/content-default.html.twig') }} 5 | 6 | {% for newsArticle in news %} 7 | 8 |
    9 | {% set detailLink = path('news', { 10 | id: newsArticle.id, 11 | text: newsArticle.title, 12 | prefix: document.fullPath 13 | }) %} 14 | 15 | {% if newsArticle.getImage_1() is not empty %} 16 | 17 | {{ newsArticle.getImage_1().getThumbnail('newsList').getHTML({ class: 'media-object' })|raw }} 18 | 19 | {% endif %} 20 | 21 |
    22 |
    23 | {{ newsArticle.title }} 24 |
    25 | {{ newsArticle.date|date('d/m/Y') }} 26 |
    27 |
    28 | 29 | {{ newsArticle.shortText }} 30 |
    31 | 32 | {% endfor %} 33 | {% endblock %} 34 | -------------------------------------------------------------------------------- /app/Resources/views/Newsletter/confirm.html.twig: -------------------------------------------------------------------------------- 1 | {% if success %} 2 | 3 |
    4 |

    {{ "Thanks for confirming your address!"|trans }}

    5 |
    6 | 7 | {% else %} 8 | 9 |
    10 |

    {{ "Sorry, something went wrong, please sign up again!"|trans }}

    11 |
    12 | 13 | {% endif %} 14 | -------------------------------------------------------------------------------- /app/Resources/views/Newsletter/subscribe.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html.twig' %} 2 | 3 | {% block content %} 4 | {{ include('Includes/content-default.html.twig') }} 5 | 6 | {% if not success %} 7 | {% if submitted %} 8 | 9 |
    10 | {{ "Sorry, something went wrong, please check the data in the form and try again!"|trans }}. 11 | {% if error is defined %} 12 |
    {{ error }} 13 | {% endif %} 14 |
    15 | 16 |
    17 |
    18 | 19 | {% endif %} 20 | 21 | {# see comment on advanced/objectForm template regarding the form theme #} 22 | {% form_theme form 'Form/default.html.twig' %} 23 | 24 | {{ form_start(form, { 25 | attr: { 26 | class: 'form-horizontal', 27 | role: 'form' 28 | } 29 | }) }} 30 | 31 | {{ form_row(form.gender) }} 32 | {{ form_row(form.firstname) }} 33 | {{ form_row(form.lastname) }} 34 | {{ form_row(form.email) }} 35 | 36 |
    37 | 38 |
    39 |
    40 | {{ form_widget(form.submit, { 41 | attr: { 42 | class: 'btn btn-default' 43 | } 44 | }) }} 45 |
    46 |
    47 | 48 | {{ form_end(form) }} 49 | 50 | {% else %} 51 | 52 |
    {{ "Success, Please check your mailbox!"|trans }}
    53 | 54 | {% endif %} 55 | {% endblock %} 56 | -------------------------------------------------------------------------------- /app/Resources/views/Newsletter/unsubscribe.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html.twig' %} 2 | 3 | {% block content %} 4 | {{ include('Includes/content-default.html.twig') }} 5 | 6 | {% if not success %} 7 | {% if unsubscribeMethod is not empty %} 8 |
    9 | {% if unsubscribeMethod == 'email' %} 10 | Sorry, we don't have your address in our database. 11 | {% else %} 12 | Sorry, your unsubscribe token is invalid, try to remove your address manually. 13 | {% endif %} 14 |
    15 | {% endif %} 16 | 17 | {# see comment on advanced/objectForm template regarding the form theme #} 18 | {% form_theme form 'Form/default.html.twig' %} 19 | 20 | {{ form_start(form, { 21 | attr: { 22 | class: 'form-horizontal', 23 | role: 'form' 24 | } 25 | }) }} 26 | 27 | {{ form_row(form.email) }} 28 | 29 |
    30 | 31 |
    32 |
    33 | {{ form_widget(form.submit, { 34 | attr: { 35 | class: 'btn btn-default' 36 | } 37 | }) }} 38 |
    39 |
    40 | 41 | {{ form_end(form) }} 42 | {% else %} 43 |
    44 |

    Unsubscribed

    45 |
    46 | {% endif %} 47 | {% endblock %} 48 | -------------------------------------------------------------------------------- /app/Resources/views/Secure/login.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html.twig' %} 2 | 3 | {% block content %} 4 | 5 |
    6 |
    7 | 8 |
    9 |
    10 |

    11 | {{ "Please log in to continue"|trans }} 12 |

    13 |
    14 | 15 |
    16 | 17 | {% if error %} 18 |
    19 | {{ error.getMessage() }} 20 |
    21 | {% endif %} 22 | 23 |

    {{ "Depending on the user role and its permissions, the user dropdown in the navbar will show different entries."|trans }}

    24 |

    {{ "Available Users"|trans }}:

    25 | 26 |
      27 | {% for availableUser in availableUsers %} 28 | 29 |
    • 30 | {{ availableUser.username }} 31 | with password 32 | {{ availableUser.password }} 33 | 34 | — 35 | 36 | {% for role in availableUser.roles %} 37 | {{ role }} 38 | {% endfor %} 39 |
    • 40 | {% endfor %} 41 |
    42 | 43 | {% form_theme form 'Form/login.html.twig' %} 44 | {{ form_start(form) }} 45 | {{ form_row(form._username) }} 46 | {{ form_row(form._password) }} 47 | {{ form_widget(form._target_path) }} 48 | {{ form_widget(form._submit, { 49 | attr: { 50 | class: 'btn btn-primary pull-right' 51 | } 52 | }) }} 53 | {{ form_end(form) }} 54 |
    55 |
    56 |
    57 |
    58 | 59 | {% endblock %} 60 | -------------------------------------------------------------------------------- /app/Resources/views/Secure/secure.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html.twig' %} 2 | 3 | {% block content %} 4 | {% set admin = admin is defined and admin %} 5 | 6 |

    {{ admin ? 'Admin' : 'User' }}

    7 | 8 | {% if admin %} 9 |

    {{ "This page can only be seen as admin user."|trans }}

    10 | {% else %} 11 |

    {{ "This page can only be seen as logged in user."|trans }}

    12 | {% endif %} 13 | 14 |

    15 | {{ "Currently logged in as"|trans }} 16 | 17 | 18 | {{ app.user.username }} 19 | 20 | 21 | {{ "with roles"|trans }} 22 | {{ app.user.roles|join(', ') }}. 23 |

    24 | 25 |

    26 | 27 | {{ "Logout"|trans }} 28 | 29 |

    30 | 31 | {% endblock %} 32 | -------------------------------------------------------------------------------- /app/Resources/views/Snippets/standard-teaser.html.twig: -------------------------------------------------------------------------------- 1 | {% set suffix = suffix ?? '' %} 2 | 3 | {% if suffix is empty and editmode %} 4 | 13 | {% endif %} 14 | 15 |
    16 | {% set circle = pimcore_checkbox('circle' ~ suffix) %} 17 | 18 | {{ pimcore_image('image' ~ suffix, { 19 | thumbnail: 'standardTeaser', 20 | class: circle.isChecked() ? 'img-circle' 21 | }) }} 22 | 23 | {% if editmode %} 24 |
    25 | 26 | {{ circle }} 27 |
    28 | {% endif %} 29 | 30 |

    {{ pimcore_input('headline' ~ suffix) }}

    31 | 32 |
    33 | {{ pimcore_wysiwyg('text' ~ suffix, { 34 | height: 100 35 | }) }} 36 |
    37 | 38 |

    39 | {{ pimcore_link('link' ~ suffix, { 40 | class: 'btn btn-default' 41 | }) }} 42 |

    43 |
    44 | -------------------------------------------------------------------------------- /app/Resources/views/Web2print/container.html.twig: -------------------------------------------------------------------------------- 1 | {% for child in allChildren %} 2 | {% if child is instanceof('\\Pimcore\\Model\\Document\\Hardlink') %} 3 | {% set child = pimcore_document_wrap_hardlink(child) %} 4 | {% endif %} 5 | 6 | {{ pimcore_inc(child) }} 7 | {% endfor %} 8 | -------------------------------------------------------------------------------- /app/Resources/views/Web2print/default.html.twig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 30 | 31 | 95 | 96 | {% if printermarks %} 97 | 98 | {% endif %} 99 | 100 | 101 | Example 102 | 103 | 104 | 105 | 106 |
    107 |
    108 | 115 |
    116 |
    117 | 118 | 119 | 120 | -------------------------------------------------------------------------------- /app/config/config.yml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: parameters.yml } 3 | - { resource: security.yml } 4 | - { resource: services.yml } 5 | - { resource: 'local/' } 6 | 7 | pimcore: 8 | 9 | # IMPORTANT Notice! 10 | # Following there are only some examples listed, for a full list of possible options, please run the following command: 11 | # ./bin/console debug:config pimcore 12 | # you can also filter them by path, eg. 13 | # ./bin/console debug:config pimcore assets 14 | # or even more specific: 15 | # ./bin/console debug:config pimcore assets.image 16 | 17 | 18 | #### TRANSLATIONS 19 | # translations: 20 | # case_insensitive: true 21 | 22 | #### REDIS CACHE 23 | # cache: 24 | # pools: 25 | # redis: 26 | # enabled: true 27 | # connection: 28 | # server: localhost 29 | # database: 14 30 | 31 | #### FEATURE FLAGS 32 | # flags: 33 | # zend_date: true 34 | 35 | #### CLASS OVERRIDES EXAMPLES 36 | # models: 37 | # class_overrides: 38 | # 'Pimcore\Model\DataObject\News': 'AppBundle\Model\DataObject\News' 39 | # 'Pimcore\Model\DataObject\News\Listing': 'AppBundle\Model\DataObject\News\Listing' 40 | # 'Pimcore\Model\DataObject\Folder': 'AppBundle\Model\DataObject\Folder' 41 | # 'Pimcore\Model\Asset\Folder': 'AppBundle\Model\Asset\Folder' 42 | # 'Pimcore\Model\Asset\Image': 'AppBundle\Model\Asset\Image' 43 | # 'Pimcore\Model\Document\Page': 'AppBundle\Model\Document\Page' 44 | # 'Pimcore\Model\Document\Link': 'AppBundle\Model\Document\Link' 45 | # 'Pimcore\Model\Document\Listing': 'AppBundle\Model\Document\Listing' 46 | # 'Pimcore\Model\Version': 'AppBundle\Model\Version' 47 | 48 | 49 | #### CUSTOM DOCUMENT EDITABLES 50 | # documents: 51 | # tags: 52 | # map: 53 | # markdown: \AppBundle\Model\Document\Tag\Markdown 54 | 55 | 56 | #### CUSTOM OBJECT DATA TYPES 57 | # objects: 58 | # class_definitions: 59 | # data: 60 | # map: 61 | # myDataType: \AppBundle\Model\DataObject\Data\MyDataType 62 | 63 | 64 | #### ASSET CUSTOM SETTINGS 65 | # assets: 66 | # versions: 67 | # use_hardlinks: false 68 | # image: 69 | # low_quality_image_preview: 70 | # enabled: false 71 | # generator: imagick 72 | # thumbnails: 73 | # webp_auto_support: false 74 | 75 | #### SYMFONY OVERRIDES 76 | framework: 77 | 78 | #### USE SESSION HANDLER CONFIGURED IN php.ini 79 | # session: 80 | # handler_id: null 81 | 82 | -------------------------------------------------------------------------------- /app/config/config_dev.yml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: config.yml } 3 | 4 | -------------------------------------------------------------------------------- /app/config/config_prod.yml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: config.yml } 3 | 4 | -------------------------------------------------------------------------------- /app/config/config_test.yml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: config_dev.yml } 3 | 4 | # this cache is used during tests when setting up pimcore 5 | pimcore: 6 | cache: 7 | pool_service_id: pimcore.cache.core.pool.array 8 | 9 | doctrine: 10 | dbal: 11 | connections: 12 | default: 13 | url: '%pimcore_test.db.dsn%' 14 | host: ~ 15 | port: ~ 16 | dbname: ~ 17 | user: ~ 18 | password: ~ 19 | 20 | parameters: 21 | pimcore_test.db.dsn: '%env(PIMCORE_TEST_DB_DSN)%' 22 | env(PIMCORE_TEST_DB_DSN): ~ 23 | -------------------------------------------------------------------------------- /app/config/local/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/app/config/local/.gitkeep -------------------------------------------------------------------------------- /app/config/parameters.example.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | secret: ThisTokenIsNotSoSecretChangeIt 3 | 4 | # customize the full path to external executables 5 | # normally they are auto-detected by `which program` or auto-discovered in the configured path in 6 | # System Settings -> General -> Additional $PATH variable 7 | # but in general it's a good idea to have your programs in your $PATH environment variable (system wide) 8 | 9 | #pimcore_executable_composer: php /opt/vendor/bin/composer.phar 10 | #pimcore_executable_html2text: /usr/local/html2text/bin/html2text 11 | #pimcore_executable_soffice: /opt/libreoffice/bin/soffice 12 | #pimcore_executable_gs: /opt/ghostscript/bin/gs 13 | #pimcore_executable_pdftotext: /opt/tools/pdftotext 14 | #pimcore_executable_xvfb-run: /opt/tools/xvfb-run 15 | #pimcore_executable_pngcrush: /opt/tools/pngcrush 16 | #pimcore_executable_zopflipng: /opt/tools/zopflipng 17 | #pimcore_executable_pngout: /opt/tools/pngout 18 | #pimcore_executable_advpng: /opt/tools/advpng 19 | #pimcore_executable_cjpeg: /opt/tools/cjpeg 20 | #pimcore_executable_jpegoptim: /opt/tools/jpegoptim 21 | #pimcore_executable_php: /usr/local/custom-php/bin/php 22 | #pimcore_executable_nice: /opt/tools/nice 23 | #pimcore_executable_nohup: /opt/tools/nohup 24 | #pimcore_executable_ffmpeg: /opt/tools/ffmpeg 25 | #pimcore_executable_exiftool: /opt/tools/exiftool 26 | 27 | -------------------------------------------------------------------------------- /app/config/pimcore/google-api-private-key.json.example: -------------------------------------------------------------------------------- 1 | { 2 | "type": "service_account", 3 | "project_id": "api-project-73893596983", 4 | "private_key_id": "e2afe72839dbf9f39e33aad363907a9ebd563bf9", 5 | "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDAifl1kWlxgHM/\nGHILhcrOi7TF4ASPO6aXxeSpOivieUVeuIx7kWxNLUsgtqRaTAXApXSAxnLglhS4\nKqaxP3VpGHlyA2ec1gnalziq4liAoTuzqk6tcqfkw0s+M6Mqio0JTDkljYsPVgDj\nrCVOqgK6tU+74ya816EkWfWvA/m/h1llWDWboIoCH04MSb9zT6IEXCaE8U3kXMZW\ntOYmn7sEwRGAkAgIZoMJYT1ORvy0ctObk+UZzFNeJXLI2eXVfkC3YoHZvTouucS3\n9arYmcdqi/92QZl6MA8qGUrkzFKb2PlnXi2A6lxbXLvnHjom3k4s9BYvpUmhBpqr\n4q2WWrmDAgMBAAECggEAEcYq80GDPGkhOnflP08Qk9St0X6GrTpSfLxWCZFHL9cG\nImJjBZ09JDrELrbtoTBXb5tWj/TB8h2ot/+n98Dl89fAjlfmHsJbkoRXRN80UFuS\nCVn1fWmSOjoVHh7iNzEnJ+6Tb/YLGlVUK7BemU50hgvq2mtzzgcR5ysu1QNG8PlC\ncVkgjOCz0rMyyPeqhnVCQWLyczk1kyhTthyxQu8hZ+IR1XdFLW1tiKKV+9bZX7HV\nRVbYHuiFEM0Teb62yKEbAzUyPzln4DJsCTjtC1gqtQrLsKWy40t0mWSqj4hXEJbx\nepYBo5MHaW2T/FpjGsJ22jixs77bXYXrwh9T609AYQKBgQD5RqFOJBMznSmkdF1K\nRlgN4XG4JFiJQSzsEABbQ6nLnraXRoIZLMqGNT9RZhjjksey+DOGQjhyLW2XcByl\ntwva/VX2maVkizsrRQUTr4AjeYdhbxnXG6Yn9LSu8dgipzWwP3l008vBUlQR9qSN\nZ4x6MTHgzeclOx/dA45hU40t+QKBgQDFu4xs1zamDgDa7LOxmEjgRj1J+uNgVm7y\nzL0ze0ZRRTo4PIvqxCRIZhxk/eTtnBMCi6z7VHYtIWT+hGY6/AIGwsHBequiHfBU\naFISHR3I9Rnpn9mqzPa9SCB8SirU8OnyhD6WQBcd2dqmpEtSUOXxkwIbIOTa1xRN\nGa9bIObyWwKBgQC5Is32nTBtqxIchBgta+VGGeQ94TCob/GPOasqHSzkf/IYlFNX\noz6fQrjOGcfubTtIHrMVyeTmV/sG+EsugK6bbIAF8MM303iUgGRu5G+E6WO057EH\nZA+ZqVLwg8oEoq9rQRlRvWOdJyotVUONihR5RERJNGOx8SGPIm8Cte0q8QKBgQCM\n+w7BX6T4Oo3DifcJDeIP/iSexcIuoxHSDcZsmV1mfqxnAkxkY9rWv+9I1nnOLHSl\nYP9B51OnE+NVUQMu1RWAyoWpNJSBL0V2eTbi8V2WNaN3HmDs1dyq0m1PEPZ/AxJa\nto2FRUb2IqkyHXwSwdlhJ4bd3tMtcSJpYoHTwJ7JdwKBgDPCBLDir1qz2ZgBOmTv\nTcCB3rOVTrS6hGPkHgosmKiAtNqD4mjKgHMI9mcQENtr/BrXpNiO0VtM72VhJuxE\npe2WF8TWYtGNa2yIJOsUmY5DrL+2UJd0cig+/IcMi1nKjWQloQ0rpoBrN2TZRPGM\nGS3o3ymJ1tlfWOvl7Fq4G6RH\n-----END PRIVATE KEY-----\n", 6 | "client_email": "73893596983@developer.gserviceaccount.com", 7 | "client_id": "73893596983.apps.googleusercontent.com", 8 | "auth_uri": "https://accounts.google.com/o/oauth2/auth", 9 | "token_uri": "https://accounts.google.com/o/oauth2/token", 10 | "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", 11 | "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/73893596983%40developer.gserviceaccount.com" 12 | } 13 | -------------------------------------------------------------------------------- /app/config/pimcore/hybridauth.example.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'Google' => [ 6 | 'enabled' => true, 7 | 'keys' => [ 8 | 'id' => '655439141282-nfvapxbelfxv8sxv177jg976xxxxxxxx.apps.googleusercontent.com', 9 | 'secret' => 'xGtTcy3knT3YILGRRTgVWwjp' 10 | ] 11 | ], 12 | 'Facebook' => [ 13 | 'enabled' => true, 14 | 'keys' => [ 15 | 'id' => '281810550000000', 16 | 'secret' => '3aec78fdcb5f02cc3e9da95d6xxxxxxx' 17 | ] 18 | ], 19 | 'Twitter' => [ 20 | 'enabled' => true, 21 | 'keys' => [ 22 | 'key' => '8CfXfFFwTFURUFxxxxxxx', 23 | 'secret' => 'vxrqB4KLBBwRLxhKnRkJj52OTDgR2ZwZxhZxxxxxxx' 24 | ] 25 | ] 26 | ] 27 | ]; 28 | -------------------------------------------------------------------------------- /app/config/routing.yml: -------------------------------------------------------------------------------- 1 | _pimcore: 2 | resource: "@PimcoreCoreBundle/Resources/config/routing.yml" 3 | -------------------------------------------------------------------------------- /app/config/routing_dev.yml: -------------------------------------------------------------------------------- 1 | _pimcore_dev: 2 | resource: "@PimcoreCoreBundle/Resources/config/routing_dev.yml" 3 | 4 | _main: 5 | resource: routing.yml 6 | 7 | -------------------------------------------------------------------------------- /app/config/security.yml: -------------------------------------------------------------------------------- 1 | # To get started with security, check out the documentation: 2 | # http://symfony.com/doc/current/security.html 3 | security: 4 | -------------------------------------------------------------------------------- /app/config/services.yml: -------------------------------------------------------------------------------- 1 | services: 2 | # default configuration for services in *this* file 3 | _defaults: 4 | # automatically injects dependencies in your services 5 | autowire: true 6 | # automatically registers your services as commands, event subscribers, etc. 7 | autoconfigure: true 8 | # this means you cannot fetch services directly from the container via $container->get() 9 | # if you need to do this, you can override this setting on individual services 10 | public: false 11 | 12 | # Example custom templating helper 13 | # AppBundle\Templating\Helper\Example: 14 | # # templating helpers need to be public as they 15 | # # are fetched from the container on demand 16 | # public: true 17 | # tags: 18 | # - { name: templating.helper, alias: fooBar } 19 | 20 | # Example event listener for objects 21 | # AppBundle\EventListener\TestListener: 22 | # tags: 23 | # - { name: kernel.event_listener, event: pimcore.dataobject.preUpdate, method: onObjectPreUpdate } 24 | -------------------------------------------------------------------------------- /app/constants.example.php: -------------------------------------------------------------------------------- 1 | run(); 27 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pimcore/demo-basic-twig", 3 | "type": "project", 4 | "license": "GPL-3.0-or-later", 5 | "config": { 6 | "optimize-autoloader": true, 7 | "sort-packages": true 8 | }, 9 | "require": { 10 | "php": ">=7.2", 11 | "wikimedia/composer-merge-plugin": "^1.4", 12 | "pimcore/pimcore": "~6.2.0" 13 | }, 14 | "require-dev": { 15 | "cache/integration-tests": "^0.16.0", 16 | "codeception/codeception": "~2.4.5" 17 | }, 18 | "autoload": { 19 | "psr-4": { 20 | "": ["src/"], 21 | "Pimcore\\Model\\DataObject\\": "var/classes/DataObject", 22 | "Pimcore\\Model\\Object\\": "var/classes/Object", 23 | "Website\\": "legacy/website/lib" 24 | }, 25 | "classmap": [ 26 | "app/AppKernel.php" 27 | ] 28 | }, 29 | "scripts": { 30 | "post-create-project-cmd": "Pimcore\\Composer::postCreateProject", 31 | "post-install-cmd": [ 32 | "Pimcore\\Composer::postInstall", 33 | "@pimcore-scripts" 34 | ], 35 | "post-update-cmd": [ 36 | "Pimcore\\Composer::postUpdate", 37 | "@pimcore-scripts", 38 | "Pimcore\\Composer::executeMigrationsUp", 39 | "@pimcore-scripts" 40 | ], 41 | "pimcore-scripts": [ 42 | "Pimcore\\Composer::clearCache", 43 | "Pimcore\\Composer::installAssets" 44 | ] 45 | }, 46 | "extra": { 47 | "symfony-app-dir": "app", 48 | "symfony-bin-dir": "bin", 49 | "symfony-var-dir": "var", 50 | "symfony-web-dir": "web", 51 | "symfony-tests-dir": "tests", 52 | "symfony-assets-install": "relative", 53 | "merge-plugin": { 54 | "include": [ 55 | "composer.local.json" 56 | ], 57 | "recurse": true, 58 | "replace": true, 59 | "merge-dev": true, 60 | "merge-extra": false, 61 | "merge-extra-deep": false, 62 | "merge-scripts": false 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /dump/create-dump.php: -------------------------------------------------------------------------------- 1 | $_SERVER['argv'][1], 21 | 'wrapperClass' => '\Pimcore\Db\Connection' 22 | ]; 23 | $db = \Doctrine\DBAL\DriverManager::getConnection($connectionParams, $config); 24 | } 25 | 26 | $tablesRaw = $db->fetchAll('SHOW FULL TABLES'); 27 | 28 | $views = []; 29 | $tables = []; 30 | 31 | foreach ($tablesRaw as $table) { 32 | if ($table['Table_type'] == 'VIEW') { 33 | $views[] = current($table); 34 | } else { 35 | $tables[] = current($table); 36 | } 37 | } 38 | 39 | $dumpData = "\nSET NAMES utf8mb4;\n\n"; 40 | 41 | // dump table schema, without the tables in install.sql 42 | foreach ($tables as $name) { 43 | if (in_array($name, $existingTables)) { 44 | continue; 45 | } 46 | 47 | $dumpData .= "\n\n"; 48 | $dumpData .= 'DROP TABLE IF EXISTS `' . $name . '`;'; 49 | $dumpData .= "\n"; 50 | 51 | $tableData = $db->fetchRow('SHOW CREATE TABLE ' . $name); 52 | 53 | $dumpData .= $tableData['Create Table'] . ';'; 54 | 55 | $dumpData .= "\n\n"; 56 | } 57 | 58 | $dumpData .= "\n\n"; 59 | 60 | // dump data 61 | foreach ($tables as $name) { 62 | if (in_array($name, ['tracking_events', 'cache', 'cache_tags', 'http_error_log', 'versions', 'edit_lock', 'locks', 'email_log', 'tmp_store'])) { 63 | continue; 64 | } 65 | 66 | $tableColumns = []; 67 | $data = $db->fetchAll('SHOW COLUMNS FROM ' . $name); 68 | foreach ($data as $dataRow) { 69 | $tableColumns[] = $db->quoteIdentifier($dataRow['Field']); 70 | } 71 | 72 | $tableData = $db->fetchAll('SELECT * FROM ' . $name); 73 | 74 | foreach ($tableData as $row) { 75 | $cells = []; 76 | foreach ($row as $cell) { 77 | if (is_string($cell)) { 78 | $cell = $db->quote($cell); 79 | } elseif ($cell === null) { 80 | $cell = 'NULL'; 81 | } 82 | 83 | $cells[] = $cell; 84 | } 85 | 86 | $dumpData .= sprintf( 87 | "INSERT INTO %s (%s) VALUES (%s);\n", 88 | $name, 89 | implode(',', $tableColumns), 90 | implode(',', $cells) 91 | ); 92 | } 93 | } 94 | 95 | foreach ($views as $name) { 96 | // dump view structure 97 | $dumpData .= "\n\n"; 98 | $dumpData .= 'DROP VIEW IF EXISTS `' . $name . '`;'; 99 | $dumpData .= "\n"; 100 | 101 | try { 102 | $viewData = $db->fetchRow('SHOW CREATE VIEW ' . $name); 103 | $dumpData .= $viewData['Create View'] . ';'; 104 | } catch (\Exception $e) { 105 | echo $e->getMessage() . "\n"; 106 | } 107 | } 108 | 109 | // remove user specific data 110 | $dumpData = preg_replace('/DEFINER(.*)DEFINER/i', '', $dumpData); 111 | $dumpData .= "\n"; 112 | 113 | $finalDest = __DIR__ . '/data.sql'; 114 | file_put_contents($finalDest, $dumpData); 115 | 116 | echo 'Dump is here: ' . $finalDest . "\n"; 117 | -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | tests 9 | 10 | 11 | 12 | 13 | src 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/src/.gitkeep -------------------------------------------------------------------------------- /src/AppBundle/AppBundle.php: -------------------------------------------------------------------------------- 1 | setName('app:awesome') 15 | ->setDescription('Awesome command'); 16 | } 17 | 18 | protected function execute(InputInterface $input, OutputInterface $output) 19 | { 20 | $this->output->writeln('Hello, world!'); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/AppBundle/Controller/Category/ExampleController.php: -------------------------------------------------------------------------------- 1 | addResponseHeader('X-Custom-Header3', ['foo', 'bar']); 34 | 35 | $this->view->isPortal = true; 36 | } 37 | 38 | public function thumbnailsAction() 39 | { 40 | } 41 | 42 | public function websiteTranslationsAction() 43 | { 44 | } 45 | 46 | public function editableRoundupAction() 47 | { 48 | } 49 | 50 | public function simpleFormAction(Request $request) 51 | { 52 | // we directly use the form builder here, but it's recommended to create a dedicated 53 | // form type class for your forms (see forms on advanced examples) 54 | // see http://symfony.com/doc/current/forms.html 55 | 56 | /** @var Form $form */ 57 | $form = $this->createFormBuilder() 58 | ->add('firstname', TextType::class, [ 59 | 'label' => 'Firstname', 60 | 'required' => true 61 | ]) 62 | ->add('lastname', TextType::class, [ 63 | 'label' => 'Lastname', 64 | 'required' => true 65 | ]) 66 | ->add('email', EmailType::class, [ 67 | 'label' => 'E-Mail', 68 | 'required' => true, 69 | 'attr' => [ 70 | 'placeholder' => 'example@example.com' 71 | ] 72 | ]) 73 | ->add('checkbox', CheckboxType::class, [ 74 | 'label' => 'Check me out' 75 | ]) 76 | ->add('submit', SubmitType::class, [ 77 | 'label' => 'Submit' 78 | ]) 79 | ->getForm(); 80 | 81 | $form->handleRequest($request); 82 | 83 | $success = false; 84 | if ($form->isSubmitted()) { 85 | if ($form->isValid()) { 86 | $success = true; 87 | 88 | // we just assign the data to the view for now 89 | // of course you can store the data here into an object, or send a mail, ... do whatever you want or need 90 | $this->view->getParameters()->add($form->getData()); 91 | } 92 | } 93 | 94 | // add success state and form view to the view 95 | $this->view->success = $success; 96 | $this->view->form = $form->createView(); 97 | } 98 | 99 | /** 100 | * @param Request $request 101 | * 102 | * @return Response 103 | */ 104 | public function galleryRenderletAction(Request $request) 105 | { 106 | if ($request->get('id') && $request->get('type') === 'asset') { 107 | $this->view->asset = Asset::getById($request->get('id')); 108 | } 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /src/AppBundle/Controller/DefaultController.php: -------------------------------------------------------------------------------- 1 | setViewAutoRender($event->getRequest(), true, 'twig'); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/AppBundle/Controller/NewsController.php: -------------------------------------------------------------------------------- 1 | setOrderKey('date'); 16 | $newsList->setOrder('DESC'); 17 | 18 | $paginator = new Paginator($newsList); 19 | $paginator->setCurrentPageNumber($request->get('page')); 20 | $paginator->setItemCountPerPage(5); 21 | 22 | $this->view->news = $paginator; 23 | } 24 | 25 | public function detailAction(Request $request) 26 | { 27 | // alternatively type hint the method with $id to get the route match injected 28 | $id = $request->get('id'); 29 | 30 | // "id" is the named parameters in "Static Routes" 31 | $news = News::getById($id); 32 | 33 | if (!$news instanceof News || !$news->isPublished()) { 34 | // this will trigger a 404 error response 35 | throw $this->createNotFoundException('Invalid request'); 36 | } 37 | 38 | $this->view->news = $news; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/AppBundle/Controller/SecureController.php: -------------------------------------------------------------------------------- 1 | getLastAuthenticationError(); 22 | 23 | // last username entered by the user 24 | $lastUsername = $authenticationUtils->getLastUsername(); 25 | 26 | $formData = [ 27 | '_username' => $lastUsername, 28 | '_target_path' => '/' . $request->getLocale() 29 | ]; 30 | 31 | $form = $this->createForm(LoginFormType::class, $formData, [ 32 | 'action' => $this->generateUrl('demo_login'), 33 | ]); 34 | 35 | return [ 36 | 'hideLeftNav' => true, 37 | 'showBreadcrumbs' => false, 38 | 'form' => $form->createView(), 39 | 'error' => $error, 40 | 'availableUsers' => $this->loadAvailableUsers() 41 | ]; 42 | } 43 | 44 | /** 45 | * This is only for DEMO purposes - show a list of available users. Obviously you do NOT want 46 | * this in your real application. 47 | * 48 | * @return array 49 | */ 50 | private function loadAvailableUsers() 51 | { 52 | /** @var User[] $users */ 53 | $users = User::getList(); 54 | 55 | $result = []; 56 | foreach ($users as $user) { 57 | $result[] = [ 58 | 'username' => $user->getUsername(), 59 | 'roles' => $user->getRoles(), 60 | 'password' => 'doe' 61 | ]; 62 | } 63 | 64 | return $result; 65 | } 66 | 67 | /** 68 | * Sample route which can only be seen by logged in users. 69 | * 70 | * @Route("/{_locale}/secure/user", name="demo_secure_user") 71 | * @Template("Secure/secure.html.twig") 72 | * @Security("has_role('ROLE_USER')") 73 | */ 74 | public function secureUserAction() 75 | { 76 | return [ 77 | 'showBreadcrumbs' => false, 78 | ]; 79 | } 80 | 81 | /** 82 | * Sample route which can only be seen by logged in admin users. 83 | * 84 | * @Route("/{_locale}/secure/admin", name="demo_secure_admin") 85 | * @Template("Secure/secure.html.twig") 86 | */ 87 | public function secureAdminAction() 88 | { 89 | // there are multiple ways to control authorization (= what a user is allowed to do): 90 | // 91 | // * access_control in your security.yml (see Symfony Security docs) 92 | // * @Security annotation (see secureUserAction) 93 | // * isGranted() or denyAccessUnlessGranted() calls in your controller (see Symfony\Bundle\FrameworkBundle\Controller\Controller) 94 | // 95 | 96 | // this is the same as adding a @Security("has_role('ROLE_ADMIN')") annotation, but gives you more control when 97 | // to check and what to do 98 | $this->denyAccessUnlessGranted('ROLE_ADMIN'); 99 | 100 | // another possibility 101 | if (!$this->isGranted('ROLE_ADMIN')) { 102 | throw new AccessDeniedHttpException('No no'); 103 | } 104 | 105 | return [ 106 | 'admin' => true 107 | ]; 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /src/AppBundle/Controller/Web2printController.php: -------------------------------------------------------------------------------- 1 | document->getAllChildren(); 16 | 17 | $this->view->allChildren = $allChildren; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/AppBundle/DependencyInjection/AppExtension.php: -------------------------------------------------------------------------------- 1 | load('services.yml'); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/AppBundle/Document/Areabrick/AbstractAreabrick.php: -------------------------------------------------------------------------------- 1 | 'onObjectPreUpdate' 18 | ]; 19 | } 20 | 21 | public function onObjectPreUpdate(DataObjectEvent $event) 22 | { 23 | // do with the object whatever you want ;-) 24 | $object = $event->getObject(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/AppBundle/Form/ContactFormType.php: -------------------------------------------------------------------------------- 1 | add('gender', ChoiceType::class, [ 23 | 'label' => 'Gender', 24 | 'required' => true, 25 | 'choices' => [ 26 | 'Female' => 'female', 27 | 'Male' => 'male' 28 | ] 29 | ]) 30 | ->add('firstname', TextType::class, [ 31 | 'label' => 'Firstname', 32 | 'required' => true 33 | ]) 34 | ->add('lastname', TextType::class, [ 35 | 'label' => 'Lastname', 36 | 'required' => true 37 | ]) 38 | ->add('email', EmailType::class, [ 39 | 'label' => 'E-Mail', 40 | 'required' => true, 41 | 'attr' => [ 42 | 'placeholder' => 'example@example.com' 43 | ] 44 | ]) 45 | ->add('message', TextareaType::class, [ 46 | 'label' => 'Message', 47 | 'required' => true 48 | ]) 49 | ->add('submit', SubmitType::class, [ 50 | 'label' => 'Submit' 51 | ]); 52 | } 53 | 54 | /** 55 | * @inheritDoc 56 | */ 57 | public function configureOptions(OptionsResolver $resolver) 58 | { 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/AppBundle/Form/LoginFormType.php: -------------------------------------------------------------------------------- 1 | add('_username', TextType::class, [ 24 | 'label' => 'Username' 25 | ]) 26 | ->add('_password', PasswordType::class, [ 27 | 'label' => 'Password' 28 | ]) 29 | ->add('_target_path', HiddenType::class) 30 | ->add('_submit', SubmitType::class, [ 31 | 'label' => 'Login' 32 | ]); 33 | } 34 | 35 | /** 36 | * @inheritDoc 37 | */ 38 | public function getBlockPrefix() 39 | { 40 | // we need to set this to an empty string as we want _username as input name 41 | // instead of login_form[_username] to work with the form authenticator out 42 | // of the box 43 | return ''; 44 | } 45 | 46 | /** 47 | * @inheritDoc 48 | */ 49 | public function configureOptions(OptionsResolver $resolver) 50 | { 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/AppBundle/Form/Newsletter/SubscriptionFormType.php: -------------------------------------------------------------------------------- 1 | add('gender', ChoiceType::class, [ 24 | 'label' => 'Gender', 25 | 'required' => true, 26 | 'choices' => [ 27 | 'Female' => 'female', 28 | 'Male' => 'male' 29 | ] 30 | ]) 31 | ->add('firstname', TextType::class, [ 32 | 'label' => 'Firstname', 33 | 'required' => true 34 | ]) 35 | ->add('lastname', TextType::class, [ 36 | 'label' => 'Lastname', 37 | 'required' => true 38 | ]) 39 | ->add('email', EmailType::class, [ 40 | 'label' => 'E-Mail', 41 | 'required' => true, 42 | 'attr' => [ 43 | 'placeholder' => 'example@example.com' 44 | ] 45 | ]) 46 | ->add('submit', SubmitType::class, [ 47 | 'label' => 'Submit' 48 | ]); 49 | } 50 | 51 | /** 52 | * @inheritDoc 53 | */ 54 | public function configureOptions(OptionsResolver $resolver) 55 | { 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/AppBundle/Form/Newsletter/UnsubscriptionFormType.php: -------------------------------------------------------------------------------- 1 | add('email', EmailType::class, [ 22 | 'label' => 'E-Mail', 23 | 'required' => true, 24 | 'attr' => [ 25 | 'placeholder' => 'example@example.com' 26 | ] 27 | ]) 28 | ->add('submit', SubmitType::class, [ 29 | 'label' => 'Submit' 30 | ]); 31 | } 32 | 33 | /** 34 | * @inheritDoc 35 | */ 36 | public function configureOptions(OptionsResolver $resolver) 37 | { 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/AppBundle/Form/PersonInquiryType.php: -------------------------------------------------------------------------------- 1 | add('gender', ChoiceType::class, [ 25 | 'label' => 'Gender', 26 | 'required' => true, 27 | 28 | // when working with objects, you could fetch the available 29 | // choices from the field definition - we kept it hardcoded 30 | // here for simplicity 31 | 'choices' => [ 32 | 'Female' => 'female', 33 | 'Male' => 'male' 34 | ] 35 | ]) 36 | ->add('firstname', TextType::class, [ 37 | 'label' => 'Firstname', 38 | 'required' => true, 39 | 'constraints' => [ // validation constraints 40 | new Length(['min' => 5]) 41 | ] 42 | ]) 43 | ->add('lastname', TextType::class, [ 44 | 'label' => 'Lastname', 45 | 'required' => true 46 | ]) 47 | ->add('email', EmailType::class, [ 48 | 'label' => 'E-Mail', 49 | 'required' => true, 50 | 'attr' => [ 51 | 'placeholder' => 'example@example.com' 52 | ] 53 | ]) 54 | ->add('message', TextareaType::class, [ 55 | 'label' => 'Message', 56 | 'required' => true 57 | ]) 58 | ->add('terms', CheckboxType::class, [ 59 | 'label' => 'I accept the terms of use', 60 | 'required' => true 61 | ]) 62 | ->add('submit', SubmitType::class, [ 63 | 'label' => 'Submit' 64 | ]); 65 | } 66 | 67 | /** 68 | * @inheritDoc 69 | */ 70 | public function configureOptions(OptionsResolver $resolver) 71 | { 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/AppBundle/LinkGenerator/NewsLinkGenerator.php: -------------------------------------------------------------------------------- 1 | router = $router; 43 | } 44 | 45 | public function generate(Concrete $object, array $params = []): string 46 | { 47 | if (!$object instanceof News) { 48 | throw new \InvalidArgumentException(sprintf('Object must be an instance of %s', News::class)); 49 | } 50 | 51 | $language = $this->resolveLanguage($params); 52 | $prefix = $this->getPrefix($language); 53 | 54 | $routeParams = [ 55 | 'id' => $object->getId(), 56 | 'text' => $object->getTitle($language), 57 | 'prefix' => $prefix, 58 | ]; 59 | 60 | $referenceType = $params['referenceType'] ?? UrlGenerator::ABSOLUTE_PATH; 61 | 62 | return $this->router->generate('news', $routeParams, $referenceType); 63 | } 64 | 65 | /** 66 | * Resolves language to use from multiple locations. Uses a language parameter if 67 | * set and falls back to _locale from the request and the website default language. 68 | * 69 | * @param array $params 70 | * 71 | * @return string 72 | */ 73 | private function resolveLanguage(array $params): string 74 | { 75 | $language = null; 76 | if (isset($params['language'])) { 77 | $language = $params['language']; 78 | } else { 79 | $locale = $this->router->getContext()->getParameter('_locale'); 80 | if (!empty($locale)) { 81 | $language = $locale; 82 | } 83 | } 84 | 85 | if (empty($language)) { 86 | $language = Tool::getDefaultLanguage(); 87 | } 88 | 89 | if (empty($language)) { 90 | throw new \RuntimeException('Unable to resolve language for News link generator.'); 91 | } 92 | 93 | return $language; 94 | } 95 | 96 | /** 97 | * Builds prefix for a language by fetching the language root (e.g. /en) and reading the "news" property from there 98 | * which points to the document containing the news and acting as prefix. 99 | * 100 | * @param string $language 101 | * 102 | * @return mixed 103 | */ 104 | private function getPrefix(string $language) 105 | { 106 | if (isset($this->prefixes[$language])) { 107 | return $this->prefixes[$language]; 108 | } 109 | 110 | $languageRoot = Document::getByPath('/' . $language); 111 | if (!$languageRoot) { 112 | throw new \RuntimeException(sprintf('Failed to find language root for language "%s"', $language)); 113 | } 114 | 115 | $newsDocument = $languageRoot->getProperty('news'); 116 | if (!$newsDocument instanceof Document) { 117 | throw new \RuntimeException(sprintf('Failed to find news document for language "%s"', $language)); 118 | } 119 | 120 | $this->prefixes[$language] = $newsDocument->getFullPath(); 121 | 122 | return $this->prefixes[$language]; 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /src/AppBundle/Model/DataObject/User.php: -------------------------------------------------------------------------------- 1 | getClass()->getFieldDefinition('password'); 34 | $field->getDataForResource($this->getPassword(), $this); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/AppBundle/Resources/config/pimcore/config.yml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: security.yml } 3 | 4 | pimcore: 5 | # we override the generated user model with a custom class which implements the UserInterface 6 | models: 7 | class_overrides: 8 | 'Pimcore\Model\DataObject\User': 'AppBundle\Model\DataObject\User' 9 | 10 | sitemaps: 11 | generators: 12 | app_news: AppBundle\Sitemaps\NewsGenerator 13 | -------------------------------------------------------------------------------- /src/AppBundle/Resources/config/pimcore/routing.yml: -------------------------------------------------------------------------------- 1 | app: 2 | resource: "@AppBundle/Controller/" 3 | type: annotation 4 | -------------------------------------------------------------------------------- /src/AppBundle/Resources/config/pimcore/security.yml: -------------------------------------------------------------------------------- 1 | # To get started with security, check out the documentation: 2 | # http://symfony.com/doc/current/security.html 3 | # 4 | # Note: the names demo_cms_provider and demo_cms_fw were only used to clarify what is used. You can safely name them 5 | # both demo_cms or anything else. Just make sure the firewall is configured to use your desired user provider. 6 | 7 | pimcore: 8 | security: 9 | # the encoder factory as defined in services.yml 10 | encoder_factories: 11 | AppBundle\Model\DataObject\User: app.security.password_encoder_factory 12 | 13 | security: 14 | providers: 15 | # we use a custom user provider which loads users from the User class 16 | # the user provider is defined as service in services.yml 17 | demo_cms_provider: 18 | id: app.security.user_provider 19 | 20 | firewalls: 21 | # demo_cms firewall is valid for the whole site 22 | demo_cms_fw: 23 | anonymous: ~ 24 | # the provider defined above 25 | provider: demo_cms_provider 26 | form_login: 27 | login_path: demo_login 28 | check_path: demo_login 29 | logout: 30 | path: demo_logout 31 | target: demo_login 32 | 33 | # optional: to keep logins of other firewalls (like admin) 34 | invalidate_session: false 35 | logout_on_user_change: true 36 | 37 | # ROLE_ADMIN inherits ROLE_USER (is allowed everything a user is allowed) 38 | role_hierarchy: 39 | ROLE_ADMIN: [ROLE_USER] 40 | -------------------------------------------------------------------------------- /src/AppBundle/Sitemaps/NewsGenerator.php: -------------------------------------------------------------------------------- 1 | setOrderKey('date'); 48 | $newsList->setOrder('DESC'); 49 | 50 | $languages = Tool::getValidLanguages(); 51 | 52 | /** @var News $news */ 53 | foreach ($newsList as $news) { 54 | foreach ($languages as $language) { 55 | // context contains metadata which can be consumed from filters 56 | // e.g. with this context it would be possible to filter entries by 57 | // language 58 | $context = new GeneratorContext($urlContainer, $section, [ 59 | 'language' => $language 60 | ]); 61 | 62 | // only add element if it is not filtered 63 | if (!$this->canBeAdded($news, $context)) { 64 | continue; 65 | } 66 | 67 | $url = $this->generateUrl($news, $language); 68 | 69 | // run URL through registered processors 70 | $url = $this->process($url, $news, $context); 71 | 72 | if (null === $url) { 73 | continue; 74 | } 75 | 76 | $urlContainer->addUrl($url, $section); 77 | } 78 | } 79 | } 80 | 81 | /** 82 | * Generates an Url object which can be added to the sitemap 83 | * 84 | * @param News $news 85 | * @param string $language 86 | * 87 | * @return Url|null 88 | */ 89 | private function generateUrl(News $news, string $language) 90 | { 91 | if (null === $this->linkGenerator) { 92 | $this->linkGenerator = $news->getClass()->getLinkGenerator(); 93 | 94 | if (null === $this->linkGenerator) { 95 | throw new \RuntimeException('Link generator for News class is not defined.'); 96 | } 97 | } 98 | 99 | $url = $this->linkGenerator->generate($news, [ 100 | 'language' => $language, 101 | 'referenceType' => UrlGeneratorInterface::ABSOLUTE_URL 102 | ]); 103 | 104 | return new UrlConcrete($url); 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /src/AppBundle/Sitemaps/Processor/NewsImageProcessor.php: -------------------------------------------------------------------------------- 1 | urlGenerator = $urlGenerator; 45 | } 46 | 47 | public function process(Url $url, AbstractElement $element, GeneratorContextInterface $context) 48 | { 49 | if (!$element instanceof News) { 50 | return $url; 51 | } 52 | 53 | /** @var Image[] $images */ 54 | $images = [ 55 | $element->getImage_1(), 56 | $element->getImage_2(), 57 | $element->getImage_3(), 58 | ]; 59 | 60 | // filter nulls 61 | $images = array_filter($images); 62 | if (empty($images)) { 63 | return $url; 64 | } 65 | 66 | $language = $context->get('language'); 67 | 68 | $urlImage = new GoogleImageUrlDecorator($url); 69 | foreach ($images as $image) { 70 | $urlImage->addImage($this->createGoogleImage($image, $language)); 71 | } 72 | 73 | return $urlImage; 74 | } 75 | 76 | private function createGoogleImage(Image $image, string $language = null): GoogleImage 77 | { 78 | $path = $image->getThumbnail()->getPath(); 79 | 80 | $url = $this->urlGenerator->generateUrl($path); 81 | $url = new GoogleImage($url); 82 | 83 | $title = $image->getMetadata('title', $language); 84 | if (!empty($title)) { 85 | $url->setTitle($title); 86 | } 87 | 88 | return $url; 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /src/AppBundle/Templating/Helper/LanguageSwitcher.php: -------------------------------------------------------------------------------- 1 | documentService = $documentService; 35 | } 36 | 37 | /** 38 | * @inheritDoc 39 | */ 40 | public function getName() 41 | { 42 | return 'languageSwitcher'; 43 | } 44 | 45 | public function getLocalizedLinks(Document $document): array 46 | { 47 | $translations = $this->documentService->getTranslations($document); 48 | 49 | $links = []; 50 | foreach (Tool::getValidLanguages() as $language) { 51 | $target = '/' . $language; 52 | 53 | if (isset($translations[$language])) { 54 | $localizedDocument = Document::getById($translations[$language]); 55 | if ($localizedDocument) { 56 | $target = $localizedDocument->getFullPath(); 57 | } 58 | } 59 | 60 | $links[$target] = \Locale::getDisplayLanguage($language); 61 | } 62 | 63 | return $links; 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/AppBundle/Twig/LanguageSwitcherExtension.php: -------------------------------------------------------------------------------- 1 | documentService = $documentService; 21 | } 22 | 23 | public function getLocalizedLinks(Document $document): array 24 | { 25 | $translations = $this->documentService->getTranslations($document); 26 | 27 | $links = []; 28 | foreach (Tool::getValidLanguages() as $language) { 29 | $target = '/' . $language; 30 | 31 | if (isset($translations[$language])) { 32 | $localizedDocument = Document::getById($translations[$language]); 33 | if ($localizedDocument) { 34 | $target = $localizedDocument->getFullPath(); 35 | } 36 | } 37 | 38 | $links[$target] = \Locale::getDisplayLanguage($language); 39 | } 40 | 41 | return $links; 42 | } 43 | 44 | /** 45 | * @inheritDoc 46 | */ 47 | public function getFunctions(): array 48 | { 49 | return [ 50 | new \Twig_Function('get_localized_links', [$this, 'getLocalizedLinks']) 51 | ]; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/AppBundle/Twig/UniqidExtension.php: -------------------------------------------------------------------------------- 1 | [ 5 | "name" => "Content-Page", 6 | "module" => "", 7 | "controller" => "content", 8 | "action" => "default", 9 | "template" => "", 10 | "type" => "page", 11 | "priority" => "0", 12 | "creationDate" => "0", 13 | "modificationDate" => "0", 14 | "id" => "1" 15 | ], 16 | 2 => [ 17 | "name" => "Standard-Teaser", 18 | "module" => "", 19 | "controller" => "", 20 | "action" => "", 21 | "template" => "/snippets/standard-teaser.php", 22 | "type" => "snippet", 23 | "priority" => "0", 24 | "creationDate" => "0", 25 | "modificationDate" => "0", 26 | "id" => "2" 27 | ], 28 | 3 => [ 29 | "name" => "Sidebar", 30 | "module" => "", 31 | "controller" => "", 32 | "action" => "", 33 | "template" => "/includes/sidebar.php", 34 | "type" => "snippet", 35 | "priority" => "0", 36 | "creationDate" => "0", 37 | "modificationDate" => "0", 38 | "id" => "3" 39 | ], 40 | 4 => [ 41 | "name" => "Standard-Mail", 42 | "module" => "", 43 | "controller" => "newsletter", 44 | "action" => "standard-mail", 45 | "template" => "", 46 | "type" => "email", 47 | "priority" => "0", 48 | "creationDate" => "1388409343", 49 | "modificationDate" => "1388409359", 50 | "id" => "4" 51 | ] 52 | ]; -------------------------------------------------------------------------------- /var/config/extensions.php: -------------------------------------------------------------------------------- 1 | [ 5 | "standard-teaser-row" => TRUE, 6 | "wysiwyg" => TRUE, 7 | "featurette" => TRUE, 8 | "video" => TRUE, 9 | "pdf" => TRUE, 10 | "gallery-folder" => TRUE, 11 | "gallery-single-images" => TRUE, 12 | "image" => TRUE, 13 | "blockquote" => TRUE, 14 | "image-hotspot" => TRUE, 15 | "image-hotspot-marker" => TRUE, 16 | "gallery-carousel" => TRUE, 17 | "headlines" => TRUE, 18 | "text-accordion" => TRUE, 19 | "horizontal-line" => TRUE, 20 | "icon-teaser-row" => TRUE, 21 | "tabbed-slider-text" => TRUE, 22 | "wysiwyg-with-images" => TRUE 23 | ] 24 | ]; 25 | -------------------------------------------------------------------------------- /var/config/predefined-properties.php: -------------------------------------------------------------------------------- 1 | [ 5 | "name" => "Left Navigation Start Node", 6 | "description" => "Where the tree of the left navigation should start", 7 | "key" => "leftNavStartNode", 8 | "type" => "document", 9 | "data" => "", 10 | "config" => "", 11 | "ctype" => "document", 12 | "inheritable" => "1", 13 | "creationDate" => "0", 14 | "modificationDate" => "0", 15 | "id" => "1" 16 | ], 17 | 2 => [ 18 | "name" => "Hide Left Navigation", 19 | "description" => "", 20 | "key" => "leftNavHide", 21 | "type" => "bool", 22 | "data" => "true", 23 | "config" => "", 24 | "ctype" => "document", 25 | "inheritable" => "0", 26 | "creationDate" => "0", 27 | "modificationDate" => "0", 28 | "id" => "2" 29 | ], 30 | 3 => [ 31 | "name" => "Header Color", 32 | "description" => "", 33 | "key" => "headerColor", 34 | "type" => "select", 35 | "data" => "", 36 | "config" => "orange,blue,green", 37 | "ctype" => "document", 38 | "inheritable" => "1", 39 | "creationDate" => "0", 40 | "modificationDate" => "0", 41 | "id" => "3" 42 | ], 43 | 4 => [ 44 | "name" => "Sidebar", 45 | "description" => "", 46 | "key" => "sidebar", 47 | "type" => "document", 48 | "data" => "", 49 | "config" => "", 50 | "ctype" => "document", 51 | "inheritable" => "1", 52 | "creationDate" => "0", 53 | "modificationDate" => "0", 54 | "id" => "4" 55 | ], 56 | 5 => [ 57 | "id" => 5, 58 | "name" => "Symfony", 59 | "description" => "Render document in symfony mode", 60 | "key" => "symfony", 61 | "type" => "bool", 62 | "data" => NULL, 63 | "config" => NULL, 64 | "ctype" => "document", 65 | "inheritable" => TRUE, 66 | "creationDate" => 1482501247, 67 | "modificationDate" => 1482501278 68 | ] 69 | ]; 70 | -------------------------------------------------------------------------------- /var/config/qrcode.php: -------------------------------------------------------------------------------- 1 | [ 5 | "description" => "", 6 | "url" => "/en/introduction", 7 | "foreColor" => "", 8 | "backgroundColor" => "", 9 | "googleAnalytics" => TRUE, 10 | "id" => "example" 11 | ] 12 | ]; -------------------------------------------------------------------------------- /var/config/staticroutes.php: -------------------------------------------------------------------------------- 1 | [ 5 | "name" => "news", 6 | "pattern" => "/(.*)_n([\\d]+)/", 7 | "reverse" => "%prefix/%text_n%id", 8 | "module" => "", 9 | "controller" => "news", 10 | "action" => "detail", 11 | "variables" => "text,id", 12 | "defaults" => "", 13 | "siteId" => "0", 14 | "priority" => "1", 15 | "creationDate" => "0", 16 | "modificationDate" => "0", 17 | "id" => "1" 18 | ], 19 | 2 => [ 20 | "name" => "blog", 21 | "pattern" => "/(.*)_b([\\d]+)/", 22 | "reverse" => "%prefix/%text_b%id", 23 | "module" => "", 24 | "controller" => "blog", 25 | "action" => "detail", 26 | "variables" => "text,id", 27 | "defaults" => "", 28 | "siteId" => "0", 29 | "priority" => "1", 30 | "creationDate" => "1388391249", 31 | "modificationDate" => "1388391368", 32 | "id" => "2" 33 | ], 34 | 3 => [ 35 | "name" => "category-example", 36 | "pattern" => "@/category\\-example@", 37 | "reverse" => "/en/category-example", 38 | "module" => "", 39 | "controller" => "Category\\Example", 40 | "action" => "test", 41 | "variables" => NULL, 42 | "defaults" => NULL, 43 | "siteId" => NULL, 44 | "priority" => "1", 45 | "creationDate" => "1419933908", 46 | "modificationDate" => "1419933931", 47 | "id" => "3" 48 | ], 49 | 4 => [ 50 | "id" => 4, 51 | "name" => "demo_login", 52 | "pattern" => "@^/(de|en)/secure/login\$@", 53 | "reverse" => "/%_locale/secure/login", 54 | "module" => "AppBundle", 55 | "controller" => "Secure", 56 | "action" => "login", 57 | "variables" => "_locale", 58 | "defaults" => "_locale=en", 59 | "siteId" => [ 60 | ], 61 | "priority" => 0, 62 | "legacy" => FALSE, 63 | "creationDate" => 1490874634, 64 | "modificationDate" => 1490874753 65 | ], 66 | 5 => [ 67 | "id" => 5, 68 | "name" => "demo_logout", 69 | "pattern" => "@^/(de|en)/secure/logout\$@", 70 | "reverse" => "/%_locale/secure/logout", 71 | "module" => "AppBundle", 72 | "controller" => "Secure", 73 | "action" => "logout", 74 | "variables" => "_locale", 75 | "defaults" => "_locale=en", 76 | "siteId" => [ 77 | 78 | ], 79 | "priority" => 0, 80 | "legacy" => FALSE, 81 | "creationDate" => 1490874774, 82 | "modificationDate" => 1490874774 83 | ], 84 | ]; 85 | -------------------------------------------------------------------------------- /var/config/system.template.yml: -------------------------------------------------------------------------------- 1 | pimcore: 2 | general: 3 | timezone: Europe/Berlin 4 | php_cli: '' 5 | domain: '' 6 | redirect_to_maindomain: false 7 | language: en 8 | theme: '' 9 | contactemail: '' 10 | debug: false 11 | debug_ip: '' 12 | http_auth: 13 | username: '' 14 | password: '' 15 | debug_admin_translations: false 16 | devmode: false 17 | show_cookie_notice: false 18 | valid_languages: 'en,de' 19 | fallback_languages: 20 | en: '' 21 | de: '' 22 | disable_usage_statistics: false 23 | instance_identifier: '' 24 | documents: 25 | versions: 26 | days: null 27 | steps: 10 28 | error_pages: 29 | default: /error 30 | allowcapitals: 'no' 31 | wkhtmltoimage: '' 32 | wkhtmltopdf: '' 33 | create_redirect_when_moved: false 34 | allow_trailing_slash: 'no' 35 | generate_preview: true 36 | objects: 37 | versions: 38 | days: null 39 | steps: 10 40 | assets: 41 | versions: 42 | days: null 43 | steps: 10 44 | icc_rgb_profile: '' 45 | icc_cmyk_profile: '' 46 | hide_edit_image: false 47 | services: 48 | google: 49 | client_id: 655439141282-tic94n6q3j7ca5c5as132sspeftu5pli.apps.googleusercontent.com 50 | email: 655439141282-tic94n6q3j7ca5c5as132sspeftu5pli@developer.gserviceaccount.com 51 | simple_api_key: AIzaSyCo9Wj49hYJWW2WgOju4iMYNTvdcBxmyQ8 52 | browser_api_key: AIzaSyBJX16kWAmUVEz1c1amzp2iKqAfumbcoQQ 53 | cache: 54 | enabled: false 55 | lifetime: null 56 | exclude_patterns: '' 57 | exclude_cookie: '' 58 | webservice: 59 | enabled: true 60 | httpclient: 61 | adapter: Socket 62 | proxy_host: '' 63 | proxy_port: '' 64 | proxy_user: '' 65 | proxy_pass: '' 66 | email: 67 | sender: 68 | name: '' 69 | email: '' 70 | return: 71 | name: '' 72 | email: '' 73 | method: sendmail 74 | debug: 75 | email_addresses: '' 76 | newsletter: 77 | sender: 78 | name: '' 79 | email: '' 80 | return: 81 | name: '' 82 | email: '' 83 | method: sendmail 84 | use_specific: '' 85 | pimcore_admin: 86 | branding: 87 | login_screen_custom_image: '' 88 | swiftmailer: 89 | mailers: 90 | pimcore_mailer: 91 | transport: sendmail 92 | delivery_addresses: { } 93 | host: '' 94 | username: '' 95 | password: '' 96 | port: '' 97 | encryption: null 98 | auth_mode: null 99 | newsletter_mailer: 100 | transport: sendmail 101 | delivery_addresses: { } 102 | host: '' 103 | username: '' 104 | password: '' 105 | port: '' 106 | encryption: null 107 | auth_mode: null -------------------------------------------------------------------------------- /var/config/video-thumbnails.php: -------------------------------------------------------------------------------- 1 | [ 5 | "items" => [ 6 | [ 7 | "method" => "scaleByWidth", 8 | "arguments" => [ 9 | "width" => "870" 10 | ] 11 | ] 12 | ], 13 | "description" => "", 14 | "videoBitrate" => 450, 15 | "audioBitrate" => 128, 16 | "id" => "content" 17 | ], 18 | "featurerette" => [ 19 | "items" => [ 20 | [ 21 | "method" => "scaleByWidth", 22 | "arguments" => [ 23 | "width" => "512" 24 | ] 25 | ] 26 | ], 27 | "description" => "", 28 | "videoBitrate" => 450, 29 | "audioBitrate" => 128, 30 | "id" => "featurerette" 31 | ] 32 | ]; -------------------------------------------------------------------------------- /web/app.php: -------------------------------------------------------------------------------- 1 | handle($request); 37 | $response->send(); 38 | 39 | $kernel->terminate($request, $response); 40 | -------------------------------------------------------------------------------- /web/static/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/static/bootstrap/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /web/static/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/static/bootstrap/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /web/static/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/static/bootstrap/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /web/static/bootstrap/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/static/bootstrap/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /web/static/bootstrap/js/npm.js: -------------------------------------------------------------------------------- 1 | // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. 2 | require('../../js/transition.js') 3 | require('../../js/alert.js') 4 | require('../../js/button.js') 5 | require('../../js/carousel.js') 6 | require('../../js/collapse.js') 7 | require('../../js/dropdown.js') 8 | require('../../js/modal.js') 9 | require('../../js/tooltip.js') 10 | require('../../js/popover.js') 11 | require('../../js/scrollspy.js') 12 | require('../../js/tab.js') 13 | require('../../js/affix.js') -------------------------------------------------------------------------------- /web/static/css/editmode.css: -------------------------------------------------------------------------------- 1 | 2 | .editmode-label { 3 | margin-bottom: 3px; 4 | } 5 | 6 | .editmode-label label { 7 | padding-right: 5px; 8 | } 9 | 10 | 11 | .teaser { 12 | text-align: left; 13 | } 14 | 15 | .area-gallery-single-images .pimcore_block_entry { 16 | float:left; 17 | clear: none; 18 | width: 22%; 19 | height: 180px; 20 | } 21 | 22 | .area-gallery-single-images .pimcore_block_entry .col-md-3 { 23 | width: 95%; 24 | } 25 | 26 | .editable-roundup h2 27 | { 28 | font-size: 30px; 29 | margin-top: 20px; 30 | margin-bottom: 10px; 31 | } 32 | 33 | #content h1, #myCarousel h1 { 34 | font-size: 36px; 35 | margin-top: 20px; 36 | margin-bottom: 10px; 37 | } 38 | 39 | #content h2, .teaser h2 { 40 | font-size: 30px; 41 | margin-top: 20px; 42 | margin-bottom: 10px; 43 | } 44 | 45 | .jumbotron h2 { 46 | font-size: 30px; 47 | } 48 | 49 | .teaser { 50 | text-align: center; 51 | } 52 | 53 | .gallery .carousel-inner .item img { 54 | min-width: 100%; 55 | height: auto; 56 | } 57 | 58 | .teaser-icon > .icon > .image { 59 | line-height: normal; 60 | padding-top: 20px; 61 | } 62 | 63 | .teaser-icon .icon .pimcore_tag_select { 64 | position: absolute; 65 | right: -30px; 66 | top: 25px; 67 | } 68 | 69 | .teaser-icon .icon .image input { 70 | visibility: hidden; 71 | } 72 | 73 | .glyphicon-selection .x-combo-list-item, .glyphicon-selection .x-boundlist-item { 74 | font-family: 'Glyphicons Halflings' !important; 75 | font-size: 25px !important; 76 | } 77 | 78 | .carousel-caption .pimcore_tag_image { 79 | position: absolute; 80 | top: 0px; 81 | } -------------------------------------------------------------------------------- /web/static/css/print.css: -------------------------------------------------------------------------------- 1 | .navbar-wrapper, .sidebar, .filters, .pagination, .breadcrumb-footer , footer { 2 | display: none; 3 | } 4 | a { 5 | color: #337ab7; 6 | } 7 | body { 8 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 9 | font-size: 14px; 10 | line-height: 1.42857143; 11 | } -------------------------------------------------------------------------------- /web/static/img/de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/static/img/de.png -------------------------------------------------------------------------------- /web/static/img/en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/static/img/en.png -------------------------------------------------------------------------------- /web/static/img/logo-overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/static/img/logo-overlay.png -------------------------------------------------------------------------------- /web/static/img/logo-standard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/static/img/logo-standard.png -------------------------------------------------------------------------------- /web/static/img/logo-white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 12 | 15 | 18 | 19 | 22 | 27 | 30 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /web/static/img/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 12 | 15 | 18 | 19 | 22 | 27 | 30 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /web/static/img/mask-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/static/img/mask-example.png -------------------------------------------------------------------------------- /web/static/img/social-icons/facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/static/img/social-icons/facebook.png -------------------------------------------------------------------------------- /web/static/img/social-icons/google.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/static/img/social-icons/google.png -------------------------------------------------------------------------------- /web/static/img/social-icons/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/static/img/social-icons/twitter.png -------------------------------------------------------------------------------- /web/static/img/social-icons/youtube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/static/img/social-icons/youtube.png -------------------------------------------------------------------------------- /web/static/img/transparent-background-placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/static/img/transparent-background-placeholder.png -------------------------------------------------------------------------------- /web/static/js/html5shiv.js: -------------------------------------------------------------------------------- 1 | /* 2 | HTML5 Shiv v3.7.0 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed 3 | */ 4 | (function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag(); 5 | a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/[\w\-]+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x"; 6 | c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| 7 | "undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:"3.7.0",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f); 8 | if(g)return a.createDocumentFragment();for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d #mq-test-1 { width: 42px; }',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;bn){continue}if(f&&f>r){continue}if(l&&l>i){continue}e.src=u}}if("srcset"in t.createElement("img"))return true;var n=e.innerWidth>0?e.innerWidth:screen.width,r=e.innerHeight>0?e.innerHeight:screen.height,i=e.devicePixelRatio||1;var o=t.getElementsByTagName("img");for(var u=0;u 00:04.110 4 | Captions describe all relevant audio for the hearing impaired. 5 | [ Heroic music playing for a seagull ] 6 | 7 | 00:04.500 --> 00:05.000 8 | [ Splash!!! ] 9 | 10 | 00:05.100 --> 00:06.000 11 | [ Sploosh!!! ] 12 | 13 | 00:08.000 --> 00:09.225 14 | [ Splash...splash...splash splash splash ] 15 | 16 | 00:10.525 --> 00:11.255 17 | [ Splash, Sploosh again ] 18 | 19 | 00:13.500 --> 00:14.984 20 | Dolphin: eeeEEEEEeeee! 21 | 22 | 00:14.984 --> 00:16.984 23 | Dolphin: Squawk! eeeEEE? 24 | 25 | 00:25.000 --> 00:28.284 26 | [ A whole ton of splashes ] 27 | 28 | 00:29.500 --> 00:31.000 29 | Mine. Mine. Mine. 30 | 31 | 00:34.300 --> 00:36.000 32 | Shark: Chomp 33 | 34 | 00:36.800 --> 00:37.900 35 | Shark: CHOMP!!! 36 | 37 | 00:37.861 --> 00:41.193 38 | EEEEEEOOOOOOOOOOWHALENOISE 39 | 40 | 00:42.593 --> 00:45.611 41 | [ BIG SPLASH ] -------------------------------------------------------------------------------- /web/static/lib/video-js/demo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Video.js | HTML5 Video Player 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 | 17 | 18 | 19 | 20 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /web/static/lib/video-js/font/vjs.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/static/lib/video-js/font/vjs.eot -------------------------------------------------------------------------------- /web/static/lib/video-js/font/vjs.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/static/lib/video-js/font/vjs.ttf -------------------------------------------------------------------------------- /web/static/lib/video-js/font/vjs.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/static/lib/video-js/font/vjs.woff -------------------------------------------------------------------------------- /web/static/lib/video-js/lang/de.js: -------------------------------------------------------------------------------- 1 | videojs.addLanguage("de",{ 2 | "Play": "Wiedergabe", 3 | "Pause": "Pause", 4 | "Current Time": "Aktuelle Uhrzeit", 5 | "Duration Time": "Laufzeit", 6 | "Remaining Time": "Verbleibende Zeit", 7 | "Stream Type": "Streamtyp", 8 | "LIVE": "LIVE", 9 | "Loaded": "Geladen", 10 | "Progress": "Status", 11 | "Fullscreen": "Vollbild", 12 | "Non-Fullscreen": "Kein Vollbild", 13 | "Mute": "Ton aus", 14 | "Unmuted": "Ton ein", 15 | "Playback Rate": "Wiedergaberate", 16 | "Subtitles": "Untertitel", 17 | "subtitles off": "Untertitel aus", 18 | "Captions": "Geschlossene Untertitel", 19 | "captions off": "Geschlossene Untertitel aus", 20 | "Chapters": "Kapitel", 21 | "You aborted the video playback": "Sie haben die Videowiedergabe abgebrochen.", 22 | "A network error caused the video download to fail part-way.": "Der Videodownload ist aufgrund eines Netzwerkfehlers fehlgeschlagen.", 23 | "The video could not be loaded, either because the server or network failed or because the format is not supported.": "Das Video konnte nicht geladen werden, da entweder ein Server- oder Netzwerkfehler auftrat oder das Format nicht unterstützt wird.", 24 | "The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "Die Videowiedergabe wurde entweder wegen eines Problems mit einem beschädigten Video oder wegen verwendeten Funktionen, die vom Browser nicht unterstützt werden, abgebrochen.", 25 | "No compatible source was found for this video.": "Für dieses Video wurde keine kompatible Quelle gefunden." 26 | }); -------------------------------------------------------------------------------- /web/static/lib/video-js/lang/es.js: -------------------------------------------------------------------------------- 1 | videojs.addLanguage("es",{ 2 | "Play": "Reproducción", 3 | "Pause": "Pausa", 4 | "Current Time": "Tiempo reproducido", 5 | "Duration Time": "Duración total", 6 | "Remaining Time": "Tiempo restante", 7 | "Stream Type": "Tipo de secuencia", 8 | "LIVE": "DIRECTO", 9 | "Loaded": "Cargado", 10 | "Progress": "Progreso", 11 | "Fullscreen": "Pantalla completa", 12 | "Non-Fullscreen": "Pantalla no completa", 13 | "Mute": "Silenciar", 14 | "Unmuted": "No silenciado", 15 | "Playback Rate": "Velocidad de reproducción", 16 | "Subtitles": "Subtítulos", 17 | "subtitles off": "Subtítulos desactivados", 18 | "Captions": "Subtítulos especiales", 19 | "captions off": "Subtítulos especiales desactivados", 20 | "Chapters": "Capítulos", 21 | "You aborted the video playback": "Ha interrumpido la reproducción del vídeo.", 22 | "A network error caused the video download to fail part-way.": "Un error de red ha interrumpido la descarga del vídeo.", 23 | "The video could not be loaded, either because the server or network failed or because the format is not supported.": "No se ha podido cargar el vídeo debido a un fallo de red o del servidor o porque el formato es incompatible.", 24 | "The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "La reproducción de vídeo se ha interrumpido por un problema de corrupción de datos o porque el vídeo precisa funciones que su navegador no ofrece.", 25 | "No compatible source was found for this video.": "No se ha encontrado ninguna fuente compatible con este vídeo." 26 | }); -------------------------------------------------------------------------------- /web/static/lib/video-js/lang/fr.js: -------------------------------------------------------------------------------- 1 | videojs.addLanguage("fr",{ 2 | "Play": "Lecture", 3 | "Pause": "Pause", 4 | "Current Time": "Temps actuel", 5 | "Duration Time": "Durée", 6 | "Remaining Time": "Temps restant", 7 | "Stream Type": "Type de flux", 8 | "LIVE": "EN DIRECT", 9 | "Loaded": "Chargé", 10 | "Progress": "Progression", 11 | "Fullscreen": "Plein écran", 12 | "Non-Fullscreen": "Fenêtré", 13 | "Mute": "Sourdine", 14 | "Unmuted": "Son activé", 15 | "Playback Rate": "Vitesse de lecture", 16 | "Subtitles": "Sous-titres", 17 | "subtitles off": "Sous-titres désactivés", 18 | "Captions": "Sous-titres", 19 | "captions off": "Sous-titres désactivés", 20 | "Chapters": "Chapitres", 21 | "You aborted the video playback": "Vous avez interrompu la lecture de la vidéo.", 22 | "A network error caused the video download to fail part-way.": "Une erreur de réseau a interrompu le téléchargement de la vidéo.", 23 | "The video could not be loaded, either because the server or network failed or because the format is not supported.": "Cette vidéo n'a pas pu être chargée, soit parce que le serveur ou le réseau a échoué ou parce que le format n'est pas reconnu.", 24 | "The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "La lecture de la vidéo a été interrompue à cause d'un problème de corruption ou parce que la vidéo utilise des fonctionnalités non prises en charge par votre navigateur.", 25 | "No compatible source was found for this video.": "Aucune source compatible n'a été trouvée pour cette vidéo." 26 | }); -------------------------------------------------------------------------------- /web/static/lib/video-js/lang/it.js: -------------------------------------------------------------------------------- 1 | videojs.addLanguage("it",{ 2 | "Play": "Play", 3 | "Pause": "Pausa", 4 | "Current Time": "Orario attuale", 5 | "Duration Time": "Durata", 6 | "Remaining Time": "Tempo rimanente", 7 | "Stream Type": "Tipo del Streaming", 8 | "LIVE": "LIVE", 9 | "Loaded": "Caricato", 10 | "Progress": "Stato", 11 | "Fullscreen": "Schermo intero", 12 | "Non-Fullscreen": "Chiudi schermo intero", 13 | "Mute": "Muto", 14 | "Unmuted": "Audio", 15 | "Playback Rate": "Tasso di riproduzione", 16 | "Subtitles": "Sottotitoli", 17 | "subtitles off": "Senza sottotitoli", 18 | "Captions": "Sottotitoli non udenti", 19 | "captions off": "Senza sottotitoli non udenti", 20 | "Chapters": "Capitolo", 21 | "You aborted the video playback": "La riproduzione del filmato è stata interrotta.", 22 | "A network error caused the video download to fail part-way.": "Il download del filmato è stato interrotto a causa di un problema rete.", 23 | "The video could not be loaded, either because the server or network failed or because the format is not supported.": "Il filmato non può essere caricato a causa di un errore nel server o nella rete o perché il formato non viene supportato.", 24 | "The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "La riproduzione del filmato è stata interrotta a causa di un file danneggiato o per l’utilizzo di impostazioni non supportate dal browser.", 25 | "No compatible source was found for this video.": "Non ci sono fonti compatibili per questo filmato." 26 | }); -------------------------------------------------------------------------------- /web/static/lib/video-js/lang/ja.js: -------------------------------------------------------------------------------- 1 | videojs.addLanguage("ja",{ 2 | "Play": "再生", 3 | "Pause": "一時停止", 4 | "Current Time": "現在の時間", 5 | "Duration Time": "長さ", 6 | "Remaining Time": "残りの時間", 7 | "Stream Type": "ストリームの種類", 8 | "LIVE": "ライブ", 9 | "Loaded": "ロード済み", 10 | "Progress": "進行状況", 11 | "Fullscreen": "フルスクリーン", 12 | "Non-Fullscreen": "フルスクリーン以外", 13 | "Mute": "ミュート", 14 | "Unmuted": "ミュート解除", 15 | "Playback Rate": "再生レート", 16 | "Subtitles": "サブタイトル", 17 | "subtitles off": "サブタイトル オフ", 18 | "Captions": "キャプション", 19 | "captions off": "キャプション オフ", 20 | "Chapters": "チャプター", 21 | "You aborted the video playback": "動画再生を中止しました", 22 | "A network error caused the video download to fail part-way.": "ネットワーク エラーにより動画のダウンロードが途中で失敗しました", 23 | "The video could not be loaded, either because the server or network failed or because the format is not supported.": "サーバーまたはネットワークのエラー、またはフォーマットがサポートされていないため、動画をロードできませんでした", 24 | "The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "破損の問題、またはお使いのブラウザがサポートしていない機能が動画に使用されていたため、動画の再生が中止されました", 25 | "No compatible source was found for this video.": "この動画に対して互換性のあるソースが見つかりませんでした" 26 | }); -------------------------------------------------------------------------------- /web/static/lib/video-js/lang/ko.js: -------------------------------------------------------------------------------- 1 | videojs.addLanguage("ko",{ 2 | "Play": "재생", 3 | "Pause": "일시중지", 4 | "Current Time": "현재 시간", 5 | "Duration Time": "지정 기간", 6 | "Remaining Time": "남은 시간", 7 | "Stream Type": "스트리밍 유형", 8 | "LIVE": "라이브", 9 | "Loaded": "로드됨", 10 | "Progress": "진행", 11 | "Fullscreen": "전체 화면", 12 | "Non-Fullscreen": "전체 화면 해제", 13 | "Mute": "음소거", 14 | "Unmuted": "음소거 해제", 15 | "Playback Rate": "재생 비율", 16 | "Subtitles": "서브타이틀", 17 | "subtitles off": "서브타이틀 끄기", 18 | "Captions": "자막", 19 | "captions off": "자막 끄기", 20 | "Chapters": "챕터", 21 | "You aborted the video playback": "비디오 재생을 취소했습니다.", 22 | "A network error caused the video download to fail part-way.": "네트워크 오류로 인하여 비디오 일부를 다운로드하지 못 했습니다.", 23 | "The video could not be loaded, either because the server or network failed or because the format is not supported.": "비디오를 로드할 수 없습니다. 서버 혹은 네트워크 오류 때문이거나 지원되지 않는 형식 때문일 수 있습니다.", 24 | "The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "비디오 재생이 취소됐습니다. 비디오가 손상되었거나 비디오가 사용하는 기능을 브라우저에서 지원하지 않는 것 같습니다.", 25 | "No compatible source was found for this video.": "비디오에 호환되지 않는 소스가 있습니다." 26 | }); -------------------------------------------------------------------------------- /web/static/lib/video-js/lang/pt-BR.js: -------------------------------------------------------------------------------- 1 | videojs.addLanguage("pt-BR",{ 2 | "Play": "Tocar", 3 | "Pause": "Pause", 4 | "Current Time": "Tempo", 5 | "Duration Time": "Duração", 6 | "Remaining Time": "Tempo Restante", 7 | "Stream Type": "Tipo de Stream", 8 | "LIVE": "AO VIVO", 9 | "Loaded": "Carregado", 10 | "Progress": "Progressão", 11 | "Fullscreen": "Tela Cheia", 12 | "Non-Fullscreen": "Tela Normal", 13 | "Mute": "Mudo", 14 | "Unmuted": "Habilitar Som", 15 | "Playback Rate": "Velocidade", 16 | "Subtitles": "Legendas", 17 | "subtitles off": "Sem Legendas", 18 | "Captions": "Anotações", 19 | "captions off": "Sem Anotações", 20 | "Chapters": "Capítulos", 21 | "You aborted the video playback": "Você parou a execução de vídeo.", 22 | "A network error caused the video download to fail part-way.": "Um erro na rede fez o vídeo parar parcialmente.", 23 | "The video could not be loaded, either because the server or network failed or because the format is not supported.": "O vídeo não pode ser carregado, ou porque houve um problema com sua rede ou pelo formato do vídeo não ser suportado.", 24 | "The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "A Execução foi interrompida por um problema com o vídeo ou por seu navegador não dar suporte ao seu formato.", 25 | "No compatible source was found for this video.": "Não foi encontrada fonte de vídeo compatível." 26 | }); -------------------------------------------------------------------------------- /web/static/lib/video-js/video-js.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/static/lib/video-js/video-js.swf -------------------------------------------------------------------------------- /web/static/screenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/static/screenshots/1.png -------------------------------------------------------------------------------- /web/static/screenshots/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/static/screenshots/2.png -------------------------------------------------------------------------------- /web/static/screenshots/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/static/screenshots/3.png -------------------------------------------------------------------------------- /web/var/assets/documents/example-excel.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/documents/example-excel.xlsx -------------------------------------------------------------------------------- /web/var/assets/documents/example.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/documents/example.docx -------------------------------------------------------------------------------- /web/var/assets/documents/example.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/documents/example.pptx -------------------------------------------------------------------------------- /web/var/assets/documents/pimcore_t-mobile.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/documents/pimcore_t-mobile.pdf -------------------------------------------------------------------------------- /web/var/assets/examples/italy/dsc04344.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/examples/italy/dsc04344.jpg -------------------------------------------------------------------------------- /web/var/assets/examples/italy/dsc04346.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/examples/italy/dsc04346.jpg -------------------------------------------------------------------------------- /web/var/assets/examples/italy/dsc04399.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/examples/italy/dsc04399.jpg -------------------------------------------------------------------------------- /web/var/assets/examples/italy/dsc04462.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/examples/italy/dsc04462.jpg -------------------------------------------------------------------------------- /web/var/assets/examples/panama/img_0037.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/examples/panama/img_0037.jpg -------------------------------------------------------------------------------- /web/var/assets/examples/panama/img_0089.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/examples/panama/img_0089.jpg -------------------------------------------------------------------------------- /web/var/assets/examples/panama/img_0117.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/examples/panama/img_0117.jpg -------------------------------------------------------------------------------- /web/var/assets/examples/panama/img_0160.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/examples/panama/img_0160.jpg -------------------------------------------------------------------------------- /web/var/assets/examples/panama/img_0201.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/examples/panama/img_0201.jpg -------------------------------------------------------------------------------- /web/var/assets/examples/panama/img_0399.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/examples/panama/img_0399.jpg -------------------------------------------------------------------------------- /web/var/assets/examples/panama/img_0410.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/examples/panama/img_0410.jpg -------------------------------------------------------------------------------- /web/var/assets/examples/panama/img_0411.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/examples/panama/img_0411.jpg -------------------------------------------------------------------------------- /web/var/assets/examples/singapore/dsc03778.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/examples/singapore/dsc03778.jpg -------------------------------------------------------------------------------- /web/var/assets/examples/singapore/dsc03807.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/examples/singapore/dsc03807.jpg -------------------------------------------------------------------------------- /web/var/assets/examples/singapore/dsc03835.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/examples/singapore/dsc03835.jpg -------------------------------------------------------------------------------- /web/var/assets/examples/south-africa/img_0322.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/examples/south-africa/img_0322.jpg -------------------------------------------------------------------------------- /web/var/assets/examples/south-africa/img_0391.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/examples/south-africa/img_0391.jpg -------------------------------------------------------------------------------- /web/var/assets/examples/south-africa/img_1414.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/examples/south-africa/img_1414.jpg -------------------------------------------------------------------------------- /web/var/assets/examples/south-africa/img_1544.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/examples/south-africa/img_1544.jpg -------------------------------------------------------------------------------- /web/var/assets/examples/south-africa/img_1739.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/examples/south-africa/img_1739.jpg -------------------------------------------------------------------------------- /web/var/assets/examples/south-africa/img_1752.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/examples/south-africa/img_1752.jpg -------------------------------------------------------------------------------- /web/var/assets/examples/south-africa/img_1842.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/examples/south-africa/img_1842.jpg -------------------------------------------------------------------------------- /web/var/assets/examples/south-africa/img_1920.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/examples/south-africa/img_1920.jpg -------------------------------------------------------------------------------- /web/var/assets/examples/south-africa/img_2133.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/examples/south-africa/img_2133.jpg -------------------------------------------------------------------------------- /web/var/assets/examples/south-africa/img_2155.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/examples/south-africa/img_2155.jpg -------------------------------------------------------------------------------- /web/var/assets/examples/south-africa/img_2240.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/examples/south-africa/img_2240.jpg -------------------------------------------------------------------------------- /web/var/assets/portal-sujets/slide-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/portal-sujets/slide-01.jpg -------------------------------------------------------------------------------- /web/var/assets/portal-sujets/slide-02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/portal-sujets/slide-02.jpg -------------------------------------------------------------------------------- /web/var/assets/portal-sujets/slide-03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/portal-sujets/slide-03.jpg -------------------------------------------------------------------------------- /web/var/assets/screenshots/e-commerce1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/screenshots/e-commerce1.png -------------------------------------------------------------------------------- /web/var/assets/screenshots/glossary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/screenshots/glossary.png -------------------------------------------------------------------------------- /web/var/assets/screenshots/objects-forms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/screenshots/objects-forms.png -------------------------------------------------------------------------------- /web/var/assets/screenshots/pim1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/screenshots/pim1.png -------------------------------------------------------------------------------- /web/var/assets/screenshots/properties-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/screenshots/properties-1.png -------------------------------------------------------------------------------- /web/var/assets/screenshots/properties-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/screenshots/properties-2.png -------------------------------------------------------------------------------- /web/var/assets/screenshots/properties-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/screenshots/properties-3.png -------------------------------------------------------------------------------- /web/var/assets/screenshots/tag-snippet-management.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/screenshots/tag-snippet-management.png -------------------------------------------------------------------------------- /web/var/assets/screenshots/thumbnail-configuration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/screenshots/thumbnail-configuration.png -------------------------------------------------------------------------------- /web/var/assets/screenshots/website-translations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/screenshots/website-translations.png -------------------------------------------------------------------------------- /web/var/assets/videos/home-trailer-english.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/demo-basic-twig/7f90c255fabaf2070e2e36dc1b569575224f7819/web/var/assets/videos/home-trailer-english.mp4 --------------------------------------------------------------------------------