Use an AEM component from another site - aem

I have an AEM instance which serves multiple sites. One site has a component in use. I want to use this component on another site. I don't want to copy and paste the component files over to the second site and split the codebase like that. Does anyone know a way to use this component on another site?

Say you have two webistes site1 and site2. Components for site1 would be in component group Group1 and components for site2 would be in component group Group2.
Using component groups (quickest and dirtiest)
All you would need to do is add the Group2 component group to the site1 component you want to use.
Using policies (less quick and dirty)
In your page templates for site2, define a policy that allows the authors to use components from component group Group2 but also any chose components from Group1
Using inheritence (sexy)
As Oliver mentioned, extract the shared components and put them in a third site (eg: sitecore, siteshare or something similar). This website is for organizing your components, not for adding and publishing content.
Then in site1 and site2, create components that simply reference those in sitecore using the sling:resourceSuperType property. Your site1 and site2 components will inherit all the the properties and edit dialogs of the referenced components.
If you want to override the cq:dialog or CSS of your inherited components you can do that too, to give each site a slightly different look-and-feel or behavior.

You can use each component on any site usually. There are several ways to organize your dependencies if you are also having several projects (or several folders in /apps).
Make sure to make use of inheritance (resourcecSuperType) and wrapper components if you are planning to do some project specific changes to some of the reused components.
In order to have a clean dependency hierarchy it might also be useful to extract components that are used in more than one project to a "base" or "foundation" project.
Have a lookt at wcm core and we-retail. We-retail is reusing the wcm core components.
HTH.

Related

How to use the reference component in AEM Template

am having a requirement to use a common content in all the pages. So I decided to use the reference component in AEM. I have created a new page and authored the content. How can this content can be used in the templates, so that it will appear in all pages without re-authoring.
As you are using AEM 6 version, you can utilize the concept of design dialogs in components in static templates. You create a component, add design dialog and choose the fields in the design dialog, which once is authored will reflect in all pages created with that template.
The only activity you have to do while authoring is, you need to add and author the component in a page created with specific template.
If you are using the AEM 6.3 or more, Experience Fragments can be used, you can configure the experience fragment in the template and can be seen across all the pages.
You can use the experience fragment in individual pages as well.
https://docs.adobe.com/content/help/en/experience-manager-learn/sites/experience-fragments/experience-fragments-feature-video-use.html

Design Dialogs for different locales in a multi-locale site

How to change design dialog content in specific locale?Example the design specific constructs that would be different accross locales were logo, branding elements etc... Please suggest various alternatives and best approaches?
Design dialog are not locale or site specific in case of multisites rolled out on same instance of AEM. Design dialog properties gets stored on template/component basis in designs (/etc/designs/<your-site>/jcr:content/<path/page component name>/<component>). You can look at the sample for geometrixx site # /etc/designs/geometrixx/jcr:content/page/logo
For the scenarios where in the content/imagery that needs to change per site/locales you should use normal dialogs.
For components like header and footer which needs to stay consistent across site and usually the requirement is that they should be authored once and not be edited every time a new page is created, you could use iparsys component for the inheritance of these sections to pages in the hierarchy. This would require the inheritance system to be setup on a base page/template from which other templates extend so that inheritance get extended to all templates.

how properties are stored in /etc/designs for design dialog

I'm new to CQ5 and working on a project that deals with refactoring code that uses design dialogs.
Currently, I have a property declared as part of design dialog of my component. It creates a folder in /etc/designs/ for each template my component is used on. Is there a way we can make sure that those property values are stored at one particular configuration in /etc/design(as opposed to multiple)? I need to make sure only one set of configurations is used for all pages that use my component.
Thanks in advance!
Pallavi
The designs are linked to the template and not the whole site.
Hence whenever you configure the component in design mode, the values are stored within the corresponding template under the jcr:content of the configured design page or under /etc/designs/default/jcr:content in case no design is configured.
As far as I know, there is no way to tell AEM to store all the design configurations under one single path, unless you are using absolute paths in your dialog / page configurations.
If you are using multiple templates in your site, there must be one master template (which render global components eg. header/logo/navigation & footer), and all other templates should extend master template to get these global components and change pagelayout for content section.
Saying so, if templates are structured & inherited properly, you should be able to set design dialog property on home page (created using master template) and all internal pages will be able to access those design property OOB. Though child pages (created using other template) can override those design property (if needed for that template) to break inheritance.

Adobe CQ5 component properties for templates

It seems to be quite basic problem, but I still cannot find a nice solution.
I made a component that uses a dialog property.
How could I avoid setting this property for every single page if this component is used also in template?
What I already have tried:
I set name attribute in dialog.xml to absolute path - Component stops working as standalone (dropped into parsys).
Move it to design_dialog.xml - First of all it's conceptually content, so I do not like such move, and again it doeas not make much sense for standalone versions.
Change resource path to absolute, while including in template:
<cq:include path="/content/site/somepage" resourceType="/apps/portal/components/myComponent" />
For the first look it was almost it. Instances included via parsys has it's own path, and Content for template is fetched from single resource... But where to store it, to make template code independent from pages tree structure?
Is there any other nice way to do so? or at least way to improve 3.?
To the original poster, the functionality you are looking for is now supported by Shared Component Properties in ACS AEM Commons (http://adobe-consulting-services.github.io/acs-aem-commons/features/shared-component-properties.html)
Compared to your suggested solutions:
No need for absolute property path required for SCP
Agreed these are "content" properties, so they should be stored as "content" instead of "design". SCP stores these values under the homepage node of a site, making them as genuine of content as any other piece of content.
Agreed that it is bad to have a template hard-coded to a content path of a single site, especially since this makes a multi-site implementation impossible without creating a bunch of templates. SCP does not have this problem, because each site has its own homepage under which the properties are stored.
If I understand correctly, you have a component which may work in two modes:
it may be included statically in the main page renderer via <cq:include>
it may be also dropped into some parsys.
In the first mode component should have some common configuration for all pages and in the second mode it should be configured separately per-instance. The problem is how to create such common configuration.
I think your 3rd solution is perfectly fine assuming that the component configuration is shared by all sites in your CQ instance. At some point it may be too strong assumption, eg. you may have a 3 language branches under /content/site-en, /content/site-fr and /content/site-de and you'd like to make a separate configuration for each branch.
I'd suggest following improvement to the 3rd solution: you may create the shared component under some relative path which will be the same for all pages, like /content/.../configuration/shared-component (where ... may be site1, site2 or site3). Then take first two parts of the current page path, add the /configuration/shared-component suffix and use <cq:include> to include path created in such way.
You may also take a different approach and create a common configuration page referenced by all statically included components. These components may try to find their configuration automatically (via the relative path as above) or they may have a single pathfield that references configuration page.
If you don't like these options (as they assume some site structure or they need some minimal configuration for each component), consider using HierarchyNodeInheritanceValueMap. It allows you to get property from the current resource and if there is no such property, it'll look into the same resource on ancestor pages. Using this you could configure your component just once, in the site root page and inherit configuration across the whole site.

Difference between components, modules, extensions and plugins in Joomla

What is the difference between Joomla components, modules, extensions and plugins?
Plugins
Plugins enable you to execute code in response to certain events, either Joomla core events or custom events that are triggered from your own code. This is a powerful way of extending the basic Joomla functionality.
Components
Components are the main functional units that display in your template, like the content management system, contact forms, Web Links and the like. They are usually displayed in the center of the main content area of a template (depending on the template).
Modules
A more lightweight and flexible extension used for page rendering is a module. Modules are used for small bits of the page that are generally less complex and able to be seen across different components. Sometimes modules are linked to a component such as the core latest news module.
Extensions
Components, languages, modules, plugins and templates collectively known as Extensions.
Quickstart tutorial for free.
Components
A component is a separate application. You can think of a component as something that has its own functionality, its own database and its own presentation.
So, if you install a component, you add an application to your website. Examples of components are
a forum
a newsletter
a community system
a photo gallery
You could think of all of these as being a separate application. Each of these would make perfectly sense as a stand-alone system.
A component will be shown in the main part of your website and only one component will be shown. A menu is then nothing more than a switch between different components. You can compare it a bit with your windows taskbar, where you see a tab for each open application.
Modules
Modules are extensions which present certain pieces of information on your site. It's a way of presenting information that is already present. This can add a new function to an application, which was already part of your website.
Think about
latest article modules
login module
a menu
Typically, you'll have a number of modules on each web page.
The difference between a component and a module is not always very clear. A module doesn't make sense as a standalone application, it will just present information or add a function to an existing application.
Take a newsletter for instance. A newsletter is a component. You can have a website which is used as a newsletter only. That makes perfectly sense. Although a newsletter component probably will have a subscription page integrated, you might want to add a subscription module on a sidebar on every page of your website. You can put this subscribe module anywhere on your site. You'll probably agree with me that a site with just a subscription module and no actual newsletter component would be rather ridiculous.
Plugins
They used to be called mambots in Joomla 1.0.x, but since Joomla 1.5.x they're called plugins. A plugin is a function which is performed on a part of Joomla before this part is shown. This part can be on content, on the editor, on the complete system, etc. This might seem a bit abstract, but you'll understand it with an example.
Let's take one of the plugins of Ulti Joomla as an example: Ulti Reflection. This is a plugin which can make a reflection of the images you use in your content articles. To use this you just have to put something like
inside your content. Before the content is shown to the user, the Ulti Reflection plugin will scan the content to find the {reflection} tag. If it finds the tag, it will replace the tag with the image and its reflection.
Be carefull not to put to many plugins one your website, because some of them can really slow down your site.
If the difference between the three types of extensions is still not completely clear, then I advice you to go to admin pages of your joomla installation and check the components menu, the module manager and the plugin manager. Joomla comes with a number of core components, modules and plugins. By checking what they're doing, the difference between the three types of building blocks should become clear. You can also check out the official Joomla extensions page. Browse through the extension categories and you'll be amazed about the extension possiblities you have for your site.
Modules and components are displayed on a page.
Plugins operate behind the scenes and can do a multitude of things, like replacing content with other content, perform searches, perform login/logout functions, or anything really tricky that you can imagine.
There can only ever be one component on a page. When you choose menu items, you are actually choosing the component that you wish a page to display. The variables for the component are stored once (in the database), so you can't have multiple instances of the component!
On the other hand, modules are added multiple times. You can have many modules on the one page. In fact, you could have 100 instances of the same module on the one page. The variables for a module are stored against each instance. (in the database).
This is why joomla templates have one place holder for a component, and many place holders for modules.
A module can be added to an individual page (menu item) , or seleceted pages, or all pages.
Remember that a menu item is indeed a component choice. Each menu item does store variables in the database, so it is possible to feed the component display details. E.g. what page id the content component is to display.
In the back end, components can have many backend settings and functions, and "do" many more things than a module.
Examples of a component are:
com_content (displays articles...)
a bulletin board
a forum
a sitemap
Examples of a module:
a countdown clock
top 10 most read content
a poll
Unless you understand the difference between a module and a component, you will find it very difficult to administer your Joomla installation.
Modules
Modules are usually small pieces of functionality designed to present information in your site. They can appear a number of times, on a number of pages in various positions. On the contrary components are a full blown application, usually quite complex and are to the main body if a page. Also each module can be viewed in various pages, and the position of each module can be easily changed. You are allowed to select the menu items where a module is displayed. A good example of the usage of this functionality is targeted advertising. If your site has various sections, you can create module for each section. Each module will contain a targeted advert for the section. Now instead of showing all the modules, all the time, you customise the visibility of the module such that each advert is displayed only in the relevant menu links. Typical examples of standard Joomla modules are : Main / User / Top and other menus, Latest News, Popular Articles, Polls, Login Form, Syndication Details etc.
Components
On the other hand, a Joomla component is typically more complex, with extensive functionality and capabilities. A component can only be displayed in the main area of a page, and can only be displayed in a single page (usually). Links to components are usually done by creating menu items. Components usually have a particular page or pages for their configuration.
Extensions
Joomla extensions extend the functionality of Joomla websites. Five types of extensions may be distinguished: components, modules, plugins, templates, and languages. Each of these extensions handles a specific function.
Comdev is a Joomla development services provider, which provides varirties of extensions like: JomOffers, JomDirectory, JomHoliday 3, JomEstate, JomEvents.
Source: http://comdevjoomla.blogspot.com/