留言板

Theming Best Practices

thumbnail
Johann Daberger,修改在7 年前。

Theming Best Practices

New Member 帖子: 24 加入日期: 16-1-19 最近的帖子
Hello,

I just installed LR 7 - I am pretty new to liferay in general und would like to ask the experienced LR people about some best practices.

I like the LR 7 default theme and it seems to me to be a good base for getting a modern look and feel of a project. But how do you guys work with Liferay?

Do you all create your own themes for every project or do you simply put your own CSS in the Custom CSS textfield (I mean in Navigation -> public pages -> configuration -> Look and Feel -> CSS)

And my second question to be a bit more detailed just as a simple example. I would like to have the chance to make full width sections on my pages, like Liferay.com also has and most modern websites generally. How would you Liferay pros do this? Would you create a custom theme to implement this? Or would you create new layout templates for this? Or would you just inject some custom CSS?

Would be glad to see your suggestions! Thanks a lot in advance!
Johann
thumbnail
David H Nebinger,修改在7 年前。

RE: Theming Best Practices

Liferay Legend 帖子: 14916 加入日期: 06-9-2 最近的帖子
Always use a theme for styling. The look and feel option gets old quick when you need to copy to new pages, make minor changes across all pages, etc.

For full width, the layout templates use styles from the theme to handle rendering. Enabling full width is therefore also a theme change.
thumbnail
Johann Daberger,修改在7 年前。

RE: Theming Best Practices

New Member 帖子: 24 加入日期: 16-1-19 最近的帖子
Hello David,

thank you very much for your reply!

Ok, I understand that everyone beginning to create a website/portal with liferay should first dive into theme development!

Two things on this:

Is the Theme development tutorial (https://dev.liferay.com/develop/learning-paths/themes) still valid for LR 7?

Is this the reason why there are only a very few themes in the marketplace - for Liferay 7 even nothing at all?

My problem is simply that I am really not a CSS and styling guy! And I am wondering if all other liferay beginners are good enough in CSS and theme styling to build a custom theme from ground up! I am a little afraid of stepping into this theme developing process and completely get lost on the way... I also do not have any serious Java coding experience...

Thank you very much!
Johann
thumbnail
David H Nebinger,修改在7 年前。

RE: Theming Best Practices

Liferay Legend 帖子: 14916 加入日期: 06-9-2 最近的帖子
Well LR7 is still pretty new, I know that much of the documentation etc is probably still being worked on. I would start here for learning about LR7 theming: https://dev.liferay.com/develop/tutorials/-/knowledge_base/7-0/themes-and-layout-templates.

As to why there aren't themes yet in the marketplace for LR7? Well I think that's due to how new LR7 is. I think it was released less than a month ago. I'm sure as more of the community moves to LR7, more themes and other plugins will become available in the marketplace.

I understand your hesitation with the theme stuff. Myself, I've always been more of a backend developer and never feel totally comfortable with my front end skills. Heck, things change so quickly on the front end I always feel I'm lagging behind true front end devs. That said, all of the basic rules still apply and even a novice who knows the rules can become successful.

I'd suggest starting small, testing often, and use a good browser which can allow you to inspect elements and change styles live. I'll usually hammer something out in the browser before I put it into the theme for deployment.

I also like to remember how you might eat an elephant - one small, manageable bite at a time...
thumbnail
Andrew Jardine,修改在7 年前。

RE: Theming Best Practices

Liferay Legend 帖子: 2416 加入日期: 10-12-22 最近的帖子
And make sure to use FREE MARKER! emoticon
thumbnail
David H Nebinger,修改在7 年前。

RE: Theming Best Practices

Liferay Legend 帖子: 14916 加入日期: 06-9-2 最近的帖子
Andrew Jardine:
And make sure to use FREE MARKER! emoticon


Well, Liferay did say for years that FM was preferred over Velocity, but there was never any "push" to go along with the recommendation. I guess now the "push" has been added...

emoticon
thumbnail
Johann Daberger,修改在7 年前。

RE: Theming Best Practices

New Member 帖子: 24 加入日期: 16-1-19 最近的帖子
Thanks for the push... emoticon

But to be honest: At the moment I had no idea why to prefer the one over the other! emoticon

In other words: I know neither the one nor the other! But somewhere I have already seen this recommendation...
thumbnail
David H Nebinger,修改在7 年前。

RE: Theming Best Practices

Liferay Legend 帖子: 14916 加入日期: 06-9-2 最近的帖子
Don't worry, Johann, on the surface they're easy to pick up...

Each one is a template language for generating HTML, so most of what you will have in them is the HTML fragments. Things start getting more complicated as you add in the template directives, but ultimately they serve to generate appropriate HTML.

I've always found the existing templates to be a great reference. You have the simple case such as portal_normal, but you have the more complex case for navigation. Between the two, they should provide all of the resource material you'll need.
thumbnail
Johann Daberger,修改在7 年前。

RE: Theming Best Practices

New Member 帖子: 24 加入日期: 16-1-19 最近的帖子
David, thank you so much for helping me to find the path through theme developing...

But to be honest, I am still worried! I have been developing with php for many years (more backend stuff, of course), last 6 years more doing .NET stuff. But I think I know how hard it is to create a nice and modern look and feel of a page from scratch - only thinking on all the hassles with responsiveness and browser compatibilities! I know Wordpress and drupal pretty good and from my experience I can say: no coder or admin (except designated theme developers) would have the idea to create his own theme.

Maybe I am wrong but I guess it takes weeks of struggling with theming before writing only one line of productive code. What a pity that no other liferay beginners share their experiences on this here in this thread!

I installed all the stuff (theme creator, etc) and after some trials (ok, lets say several hours) I finally got my first theme installed (without any custom changes at this point). It was obviously based on the "styled" theme and I pretty soon was wondering how I could make a theme based on the Liferay 7 classic theme. I did not find any help on how to do this!

So, if I would ask you what your custom themes are based on, I think I can guess your answer: probably nothing else than "styled" - or mybe even the unstyled! Am I right? emoticon I mean, even the styled base theme contains nearly nothing and I guess it needs a fair amount of CSS and front end experience to know where to put your hands on!

To cut the long story short: Do all the liferay pro's out there really begin every new project with the (still pretty naked) "styled" theme? To me this really seems like a real nightmare... emoticon
thumbnail
Olaf Kock,修改在7 年前。

RE: Theming Best Practices

Liferay Legend 帖子: 6403 加入日期: 08-9-23 最近的帖子
Johann Daberger:
To cut the long story short: Do all the liferay pro's out there really begin every new project with the (still pretty naked) "styled" theme? To me this really seems like a real nightmare... emoticon


This is quite a nice conversation you guys have going. Please let me chime in, even though I'm definitely not the best resource on front end questions. "styled" gives you the most flexibility - e.g. normalizes everything to "neutral" and has no opinion as to where your navigation should be, how much room it should take and if it's horizontal, vertical, collapsed etc. - for that reason it's the most generic way to start. Typically you have your own layout either "in your head" or "in photoshop" - My experience (even though I'm not really at home on the front end) is that it's pretty quick to go from styled to something vaguely mimicing the overall layout, and from then on it's working on the nitty gritty details (30-90min "in the rough", 4h-10d "details").

I have to admit that - other than internal training a while ago - I haven't yet been in deeper contact with the theming side of Liferay 7, but back then I had the impression that this assumption still holds. You only need to add the time to install the zoo of frontend tools that are now required for frontend development. Gulp, blubber, yo, npm, jpm, CP/M, nomnom, and others (pun intended). Luckily at least the learning curve for vanilla-js is not steep. ;)
thumbnail
Johann Daberger,修改在7 年前。

RE: Theming Best Practices

New Member 帖子: 24 加入日期: 16-1-19 最近的帖子
Thanks for your input, Olaf!

I only can still state that this whole process is pretty frustrating!

I created a theme, created the template folder in the src folder, copied the portal-normal.ftl over to it and even without changing anything, I get an exception when I do gulp deploy:

12:17:31,696 INFO  [fileinstall-/Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/bundles/osgi/war][BaseAutoDeployListener:50] Themes for /Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/bundles/tomcat-8.0.32/temp/20160429121730116HSLPYCKK/de-homepage-theme.war copied successfully
12:17:33,241 INFO  [fileinstall-/Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/bundles/osgi/war][BaseAutoDeployListener:42] Copying themes for /Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/bundles/tomcat-8.0.32/temp/20160429121730116HSLPYCKK/de-homepage-theme.war
12:17:33,310 INFO  [fileinstall-/Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/bundles/osgi/war][BaseDeployer:860] Deploying de-homepage-theme.war
12:17:33,312 INFO  [fileinstall-/Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/bundles/osgi/war][BaseDeployer:965] Updating De Homepage from version 7.0.0 to version 7.0.0
12:17:34,418 INFO  [fileinstall-/Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/bundles/osgi/war][BaseAutoDeployListener:50] Themes for /Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/bundles/tomcat-8.0.32/temp/20160429121730116HSLPYCKK/de-homepage-theme.war copied successfully
12:17:35,821 INFO  [Refresh Thread: Equinox Container: a03ee000-fa0d-0016-1dce-dd50cc80a7ac][BundleStartStopLogger:35] STARTED de-homepage-theme_7.0.0 [491]
12:17:36,267 INFO  [Refresh Thread: Equinox Container: a03ee000-fa0d-0016-1dce-dd50cc80a7ac][HotDeployImpl:222] Deploying de-homepage-theme from queue
12:17:36,267 INFO  [Refresh Thread: Equinox Container: a03ee000-fa0d-0016-1dce-dd50cc80a7ac][PluginPackageUtil:1006] Reading plugin package for de-homepage-theme
29-Apr-2016 12:17:36.272 INFO [Refresh Thread: Equinox Container: a03ee000-fa0d-0016-1dce-dd50cc80a7ac] org.apache.catalina.core.ApplicationContext.log Initializing Spring root WebApplicationContext
12:17:36,281 INFO  [Refresh Thread: Equinox Container: a03ee000-fa0d-0016-1dce-dd50cc80a7ac][ThemeHotDeployListener:94] Registering themes for de-homepage-theme
12:17:37,355 INFO  [Refresh Thread: Equinox Container: a03ee000-fa0d-0016-1dce-dd50cc80a7ac][ThemeHotDeployListener:109] 1 theme for de-homepage-theme is available for use
12:17:37,378 ERROR [liferay/hot_deploy-1][SerialDestination:61] Unable to process message {destinationName=liferay/hot_deploy, response=null, responseDestinationName=null, responseId=null, payload=null, values={companyId=0, groupId=0, command=deploy, servletContextName=de-homepage-theme}}
com.liferay.portal.kernel.messaging.MessageListenerException: java.lang.NullPointerException
	at com.liferay.portal.kernel.messaging.BaseMessageListener.receive(BaseMessageListener.java:32)
	at com.liferay.portal.kernel.messaging.InvokerMessageListener.receive(InvokerMessageListener.java:74)
	at com.liferay.portal.kernel.messaging.SerialDestination$1.run(SerialDestination.java:58)
	at com.liferay.portal.kernel.concurrent.ThreadPoolExecutor$WorkerTask._runTask(ThreadPoolExecutor.java:756)
	at com.liferay.portal.kernel.concurrent.ThreadPoolExecutor$WorkerTask.run(ThreadPoolExecutor.java:667)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
	at com.liferay.exportimport.resources.importer.util.FileSystemImporter.setUpAssets(FileSystemImporter.java:1822)
	at com.liferay.exportimport.resources.importer.util.FileSystemImporter.doImportResources(FileSystemImporter.java:1332)
	at com.liferay.exportimport.resources.importer.util.ResourceImporter.importResources(ResourceImporter.java:49)
	at com.liferay.exportimport.resources.importer.messaging.ResourcesImporterHotDeployMessageListener._importResources(ResourcesImporterHotDeployMessageListener.java:156)
	at com.liferay.exportimport.resources.importer.messaging.ResourcesImporterHotDeployMessageListener.initialize(ResourcesImporterHotDeployMessageListener.java:88)
	at com.liferay.exportimport.resources.importer.messaging.ResourcesImporterHotDeployMessageListener.onDeploy(ResourcesImporterHotDeployMessageListener.java:101)
	at com.liferay.portal.kernel.messaging.HotDeployMessageListener.doReceive(HotDeployMessageListener.java:55)
	at com.liferay.portal.kernel.messaging.BaseMessageListener.receive(BaseMessageListener.java:26)
	... 5 more



This is so unbelievable frustrating! If I had not to learn LR for my new company - I never would touch LR voluntarily! Sorry to say this...

I really wonder how other beginners manage their LR journey!
thumbnail
Johann Daberger,修改在7 年前。

RE: Theming Best Practices

New Member 帖子: 24 加入日期: 16-1-19 最近的帖子
And now, again without changing anything, suddenly I get:

12:40:28,790 WARN [http-nio-8080-exec-9][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.

and the new theme now is not deployed at all!

Sorry, do not want to spam the forum - it is just an experience of someone who is forced to somehow get into liferay! This whole liferay thing is simply a nightmare - at least for newcomers! emoticon
thumbnail
Olaf Kock,修改在7 年前。

RE: Theming Best Practices

Liferay Legend 帖子: 6403 加入日期: 08-9-23 最近的帖子
Sorry, do not want to spam the forum ...


it's ok - we're here to help with the problems. And you give good descriptions. I'll step aside due to the reason given above, but I've summoned for help. Give them a while to materialize.

Remember that the learning curve in every new technology can be quite steep. Especially when the basics are as different as they are between PHP and Java. Once you're through that hump, I hope that it pays back.
thumbnail
Andrew Jardine,修改在7 年前。

RE: Theming Best Practices

Liferay Legend 帖子: 2416 加入日期: 10-12-22 最近的帖子
Hey Johann,

I just wanted to show some moral support here. I had the same frustrations when I first started with Liferay -- and have been experiencing some of them again now trying to figure out and work with LR7. What Olaf says though is bang on -- once you get to a certain point, and yes it does take time, it becomes so much easier. The problem right now is that the only real "experts" with LR7 are the LR employees and they've been working hard to get LR7 out the door so that, I suspect, is why the documentation is light. I imagine that within a few weeks, a few months for sure, you will find that a lot more details, both here and outside of this site, will start to emerge. Being at the type of the bade yourself (no pun intended!), try to temper your frustrations with a couple of silver linings.

1. Not having the answer given to you forces you to dig through the source and understand the inner workings (this is so important to be able to troubleshoot all manner of problems)

2. Think of all the great help you will be able to offer to the next set of people facing your troubles!

.. I know neither of those are very silver in nature, but they should count for something. Whenever I am working with LR and start to get frustrated I think of Uncle Ben from Spider Man emoticon
thumbnail
Andrew Jardine,修改在7 年前。

RE: Theming Best Practices

Liferay Legend 帖子: 2416 加入日期: 10-12-22 最近的帖子
You might be able to fix this one by disabling (removing) the resources-importer. At this stage you aren't using it anyway so if you remove it then it will disable the message listener that runs when you deploy themes. In 6.2 you would disable this plugin by simply deleting it from the webapps folder, but I think in 7 you need to disable it in the OSGi thinga-ma-bob. Alternatively, you might be able to disable it from the Control Panel > Apps section.
thumbnail
Johann Daberger,修改在7 年前。

RE: Theming Best Practices

New Member 帖子: 24 加入日期: 16-1-19 最近的帖子
A small dose of moral support really helps me not too heavily bang my head against the wall, Andrew... emoticon

A small glimmer of hope was David, mentioning that he also usually uses the classic theme as the base theme for his custom theming stuff! But as formerly mentioned: How do I set the classic theme as the base theme in LR 7???

And concerning the resources importer: Nor do I have it in my apps manager nor do I see it somewhere in my bundles/osgi folder! emoticon
thumbnail
Travis Cory,修改在7 年前。

RE: Theming Best Practices

Junior Member 帖子: 73 加入日期: 13-6-4 最近的帖子
Hey Johann,

I am sorry for your frustrations. I have been using resources importer with Liferay 7. There are been plenty of frustrations with it but Liferay as a company is aware of the issues and is trying to fix the problems we are encountering.

Regarding the issue you are encountering with the theme generator, I believe the problem is fixed with this commit. The generator was chopping off any 'e' that came before '-theme'. Go ahead and delete your 'node_modules' folder from your theme and run
npm install
once more.

To double check if this is the issue navigate to the theme/build/WEB-INF/ directory and open your 'liferay-look-and-feel.xml'. From here you can confirm if the last letter 'e' is being chopped off from your theme!

Regarding getting rid of the resources importer from your bundle. You can use the GoGo shell to stop that OSGi module. After running
telnet localhost 11311
from any command line go ahead and run
lb
and find the resources import bundle. Once you find 'Liferay Export Import Resources Importer' go ahead and run
stop ID_NUMBER
where ID_NUMBER is the id of the resources importer module.

Let me know if this helps!
thumbnail
David H Nebinger,修改在7 年前。

RE: Theming Best Practices

Liferay Legend 帖子: 14916 加入日期: 06-9-2 最近的帖子
Johann Daberger:
To cut the long story short: Do all the liferay pro's out there really begin every new project with the (still pretty naked) "styled" theme? To me this really seems like a real nightmare... emoticon


I don't do a lot of theme work, but when I do I use "classic" as my parent theme. It gives me a general layout thing to start with and I can begin by addressing colors, backgrounds, etc.

For heavy duty theme development, yeah I think the real theme guys start from styled and build it all out. I think they would argue that once they've done one, most other themes will have the same sort of requirements so they are basically building a baseline and use it as their own parent going forward. Each one off addresses colors and backgrounds and whatever other tweaks are needed.
thumbnail
Johann Daberger,修改在7 年前。

RE: Theming Best Practices

New Member 帖子: 24 加入日期: 16-1-19 最近的帖子
Thanks, David - this is a good news! I actually wanted to do the same - but was wondering if it is a good idea and good practice!

But then I again have to ask: How do I change the base theme when I create the theme with the new theme generator? The documentation is pretty spare on this!
thumbnail
Andrew Jardine,修改在7 年前。

RE: Theming Best Practices

Liferay Legend 帖子: 2416 加入日期: 10-12-22 最近的帖子
I personally use the _styled theme as my base. The classic works as well of course but I have found in the past that it requires me to write more CSS overrides to "undo" things that the classic one does. I haven't yet worked with the new themes (but I promise to try soon to be a little more helpful) -- in 6.2 there was a file in the project called look-and-feel.xml --

Do you have that file in your project?
thumbnail
Andrew Jardine,修改在7 年前。

RE: Theming Best Practices

Liferay Legend 帖子: 2416 加入日期: 10-12-22 最近的帖子
Hi Johann,
I just created my first LR7 theme (using the theme-generator). In the main directory I can see a package.json file and in there a reference to the base theme --

...
"liferayTheme": {
		"baseTheme": "styled",
		"screenshot": "",
		"rubySass": false,
		"templateLanguage": "ftl",
		"version": "7.0"
	},
...


So perhaps that is how you change the parent theme? Update that value and try rebuilding to see if you get the css from the classic.
thumbnail
Andrew Jardine,修改在7 年前。

RE: Theming Best Practices

Liferay Legend 帖子: 2416 加入日期: 10-12-22 最近的帖子
Pfft -- it's even easier! go into the root of your theme project and run this command --

gulp extend


It will then start the process that let's you change the parent theme.
thumbnail
Johann Daberger,修改在7 年前。

RE: Theming Best Practices

New Member 帖子: 24 加入日期: 16-1-19 最近的帖子
@Andrew: oh, I also tried gulp extend. But it only showed me styled and unstyled and two other options where it asks for where to look for modules. But in both selections it showed me that there are no themes in it. Arghh... Why does it work for you and here it fails...

@Travis: I tried your fix but in the end I got the same error and now the new theme again does not get deployed:

14:58:22,977 WARN  [http-nio-8080-exec-5][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
14:58:45,186 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
thumbnail
Andrew Jardine,修改在7 年前。

RE: Theming Best Practices

Liferay Legend 帖子: 2416 加入日期: 10-12-22 最近的帖子
Hi Johann,

I got the same thing. I tried to do the npm search options but they didn't return anything for me. I suspect that this is because I haven't registered any themes -- so those results I expected. Where the default theme that LR uses is hiding I am not sure. The documentation says --

Globally installed npm modules searches globally accessible npm modules on your computer. Selecting npm registry searches for published modules on npm


... and since we haven't "registered" the new classic theme, I suspect that is why we can't find it. How you register it though I don't know ...maybe someone from LR can advise us.
thumbnail
Johann Daberger,修改在7 年前。

RE: Theming Best Practices

New Member 帖子: 24 加入日期: 16-1-19 最近的帖子
No, Andrew - I did not register the classic theme! I even have no clue how a theme gets registered at all! emoticon
thumbnail
Travis Cory,修改在7 年前。

RE: Theming Best Practices

Junior Member 帖子: 73 加入日期: 13-6-4 最近的帖子
Hey Johann,

Did you check to see if you were experiencing the issue of the 'e' being cut off? If you are able to view your DB I'd check to see what the your theme ID is being saved as, just as a sanity check emoticon

Sorry for all the difficulties.
thumbnail
Nate Cavanaugh,修改在7 年前。

RE: Theming Best Practices

Junior Member 帖子: 94 加入日期: 06-11-27 最近的帖子
Hi Everyone,
I'm both really happy and really sad reading this. Really happy because there are so many people who are passionate and willing to help, but also really sad because there are obviously some areas where we can improve things on the theming level.

I'll try to answer some of the questions in here, but also provide some explanations (that hopefully won't sound defensive ;)).
And sorry if they seem scattered... the thread is pretty large, and there's a lot I'd like to address.

1. How do I set the parent theme to Classic?
Dont do it. Seriously... do not. By all means, copy everything and anything you want from Classic. Copy it wholesale if you like.
But please don't extend it.
The reason why (and we advocate this in our trainings) is because we WILL change Classic in the next version of the product, and if you extend it, you WILL hate us and wish us harm because your upgrade will be a nightmare.
This is something we've had a lot of discussions about internally, which is, that a good number of people in the community do it anyways, so why not just go with the grain and make it easier to do?
My strong belief is that as a platform, at the very least, our job is to not make it easy for people to shoot themselves in the foot... even if it means a little more discomfort right now.

However, now that we have the new theme tools for LR7, we've tried to make it easier to share and reuse pieces of a theme without extending them.
And I think in that way, we could probably publish Classic either as a themelet, or a theme that we tell people is meant for copying, but not extending.

Now, something I would like to discuss:
To cut the long story short: Do all the liferay pro's out there really begin every new project with the (still pretty naked) "styled" theme? To me this really seems like a real nightmare...

and
My problem is simply that I am really not a CSS and styling guy! And I am wondering if all other liferay beginners are good enough in CSS and theme styling to build a custom theme from ground up!


One thing I'd like to mention here is that this really exemplifies the wide audience that we're trying to address and you can argue how successfully we balance it all out.
But within any organization, and within our community, there is a vast difference in the skillsets and experiences of people trying to build on the platform.
There are Java developers who have zero frontend experience (and just as much frontend interest), but get roped into working on a theme. There are hardcore frontend developers who get roped into working on some backend code, and there are developers like yourself who are a hybrid developer, but still fairly new to Liferay and frontend.
And there are a million other variations of skills and backgrounds that are a mix of those.

With regard to the "styled" theme, this has LONG been a constant back and forth balance between what to include and what not to include in styled.

Originally, styled was pretty much Classic, and people building themes grew quite frustrated because 60% of the code in their theme was to reset what was in styled, and when we changed that look and feel in the upgrade, their themes we're pretty much worthless.
Then we quickly went the other direction, which was to strip out everything they would possibly reset, and let them just introduce their own styling.

There was always some level of discomfort though because everyone has different goals. For some people, it was just a matter of:
"Hey, look, I just need a decent looking site, and just need to tweak a few colors, or at the very least, not look like there's no styling on the page".
For others it was:
"We have a custom site, Liferay's CSS is getting in our way".

What we've landed on with styled (and are always still iterating on), is to include some styling so things work and are generally structured the way they should be, but avoid having too much "skin", such as colors, fonts, etc.
However, we do provide variables for places where we do need to apply *some* level of skinning.

All of that to say, we do want to make cases like yours as easy as possible, and try to keep cases where we stay out of the way for people who need to more deeply customize.

Also, what Olaf said above is spot on.

Regarding his joking comment:
You only need to add the time to install the zoo of frontend tools that are now required for frontend development. Gulp, blubber, yo, npm, jpm, CP/M, nomnom, and others (pun intended). Luckily at least the learning curve for vanilla-js is not steep. ;)


I actually share this general attitude, even as a frontender, because when it comes to the actual *initial* developer experience, it makes it far more of a pain to get going than to just have a one and done package, and therefore, many more steps where things can break.

However, I have grown a lot more appreciation for the modular approach simply because it offers the most flexibility.
Also, the other huge benefit is that when we need to make improvements, it's far easier to get the updates out to you.

There are other projects though, like Liferay Workspace that allow you to use everything through a single tool (it's setup so that gradle will run the node based tools).
A lot of it just depends on what you're comfortable with.

With LR7, we have invested a lot of time into trying to make the new theme tools as easy as possible for frontend developers. But for someone like yourself, who I'm guessing is more of a hybrid developer, some of the value may not be as immediately apparent.

When I joined Liferay, my background was also in PHP, and to be honest, even though I'm now definitively on the JS side, I find PHP a much more enjoyable language to work in than Java (okay, let the language bashing begin ;)).

While I'm not as active in the PHP community as I once was, I do know there has been a lot of work done around modularization with things like Composer, and even modular frameworks like Laravel.

I say that because while the new theme tools mainly target frontenders who feel comfortable with Node, I could see a case where there could be tooling made to make it easier for PHP developers to get started with themes and portlets.
It would need to be community driven by someone like yourself who both feels the frustrations and knows the way they'd prefer it, but I can tell you that as an organization, we would very happily promote and work with any such project emoticon

One last thing I'd like to address is the resources importer.
I'm hoping I don't get slammed for this one... but Liferay's culture has always been about transparency and openness, even when it's painful.
But I HATE the resources importer.
To completely abuse Churchill's quote:
It's the worst tool in the world, except for all of the others

;)
I say that because I know what need it was solving, and I know that there are many cases where it comes in handy. But that doesn't mean I have to like it emoticon

In your case, you don't need it, and I'll look into removing that from the theme generator by default (and possibly either have it generated when you pass a flag, or some other mechanism to create it).

We're looking at other ways to improve the resources importer to solve the same use cases with less hassle, so if anyone has any ideas on what they would like, please let us know.

Okay, so it seems I've addressed a wide range of points (some of which probably weren't even asked for emoticon), but hopefully at least some of it was helpful, if for no other reason than to have the comfort of knowing that your frustration wasn't caused by sadistic strangers for no reason.

But, if there are things you still wish to know, please let me know and I'll try to address them.

One thing you could do (or really anyone here), would be to reply to this post with a concise list of points where things got in your way.
I will start a list of points here that I think I've picked up on, and if any are missing, please reply with the missing pieces.

Even more importantly, and more helpful, would be if you could list off the ways you would prefer it to be. Like I mentioned, everyone comes from a different background and has a different skillset, but I think there's a way the transition could be a lot easier.

So the points I've observed, if I'm reading the right are:

  • Themes are too polarizing. It's either absolutely nothing (unstyled), functional but not production read (styled), and production level, but not extendable (Classic)
  • Documentation needs to be greatly improved (we have been working on this, but it can always get better)
  • The theme shouldn't be generated with resources importer by default (the problem with this one is on the backend side, but resources importer shouldn't even be a consideration until you absolutely need it)
  • There should be a way to kick off a production level theme for you to tweak to your hearts content


There are probably more, but this post has gone on long enough emoticon
I'll definitely respond to this as well once we have some ideas for you guys to consider.

Thanks for persevering through this process, your feedback, and for all of the people in here who responded and helped out.
thumbnail
Travis Cory,修改在7 年前。

RE: Theming Best Practices

Junior Member 帖子: 73 加入日期: 13-6-4 最近的帖子
Nate,
thumbnail
Johann Daberger,修改在7 年前。

RE: Theming Best Practices

New Member 帖子: 24 加入日期: 16-1-19 最近的帖子
Hi Nate,

thank you so much for taking the time to clearify your, respectively Liferays position! I really appreciate your efforts and it makes me feeling better and less frustrated to see that you, Nate, and the other guys in this thread really are willing to help! This is awesome, really!

So, let me try to somehow sort my thoughts and put them into a reasonable order! I promise, I'll do my best... emoticon

First of all is, that I never wanted to criticize your and all the Liferay and community members jobs! I am a pretty self-critical person and I am pretty sure that many of the liferay users/coders/admins/whatsoever surely often are much more talented and maybe have a much better background for having a much more seemless start with liferay as for me and my background! Maybe I got lost in the really big amount of liferay documentation and did not find the right order to dive into! But even with facing all my problems at the moment, I see that you guys did a really great job! Thank you very much for this!

I also fully understand your considerations for making the styled theme the starting point for beginning with custom theming. Maybe it was not the best time for me to begin theming as Liferay 7 is so brand new!

Apart from my installation problems I am pretty sure that the best solution for my anxiousness concerning theme developing would have been if there would be an updated version of the Developing a liveray theme tutorial - maybe with a slightly more modern/bootstrap-like looking example! emoticon This is actually really, really a perfect learning resource!! Bootstrap also for more backend backgrounded people like me is easy to use and easy to adapt!

Unfortunately even if there would have been an updated version of this tutorial, I wouldn't have been coming to the point of stepping through this really good tutorial since my installation problems, I mentioned in this thread.

For me Liferay is really a complete new programming universe, so it is really helpful to have some step by step tutorials - like the above mentioned tutorial! It seems like a perfect starting point - but seems not to work for LR 7.

Now coming back to my current problems! emoticon Meanwhile I suppose that there is something wrong with the watch task! If I only use gulp deploy then everything seems to work. If I use gulp watch, then I get tons of exceptions, the deploy fails and the theme gets unregistered - maybe it helps if I show you the latest content of my console in eclipse (I hope you don't mind me posting a pretty long log excerpt):


	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.jsoncontenttype.JSONContentTypeFilter.processFilter(JSONContentTypeFilter.java:42)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter.doFilter(InvokerFilter.java:115)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:720)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:466)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:391)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:318)
	at com.liferay.portal.struts.StrutsUtil.forward(StrutsUtil.java:71)
	at com.liferay.portal.struts.PortalRequestProcessor.doForward(PortalRequestProcessor.java:276)
	at org.apache.struts.tiles.TilesRequestProcessor.processTilesDefinition(TilesRequestProcessor.java:271)
	at org.apache.struts.tiles.TilesRequestProcessor.internalModuleRelativeForward(TilesRequestProcessor.java:370)
	at org.apache.struts.action.RequestProcessor.processForward(RequestProcessor.java:566)
	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:212)
	at com.liferay.portal.struts.PortalRequestProcessor.process(PortalRequestProcessor.java:169)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
	at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
	at com.liferay.portal.servlet.MainServlet.callParentService(MainServlet.java:569)
	at com.liferay.portal.servlet.MainServlet.service(MainServlet.java:546)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:119)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.monitoring.internal.servlet.filter.MonitoringFilter.processFilter(MonitoringFilter.java:180)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.uploadservletrequest.UploadServletRequestFilter.processFilter(UploadServletRequestFilter.java:93)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.strip.StripFilter.processFilter(StripFilter.java:336)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.secure.SecureFilter.processFilter(SecureFilter.java:301)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.jsoncontenttype.JSONContentTypeFilter.processFilter(JSONContentTypeFilter.java:42)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter.doFilter(InvokerFilter.java:115)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:720)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:466)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:391)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:318)
	at com.liferay.portal.util.PortalImpl.sendError(PortalImpl.java:6660)
	at com.liferay.portal.kernel.util.PortalUtil.sendError(PortalUtil.java:2169)
	at com.liferay.portal.servlet.ComboServlet.doService(ComboServlet.java:157)
	at com.liferay.portal.servlet.ComboServlet.service(ComboServlet.java:86)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:119)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:188)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.security.sso.ntlm.internal.servlet.filter.NtlmPostFilter.processFilter(NtlmPostFilter.java:107)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:188)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.uploadservletrequest.UploadServletRequestFilter.processFilter(UploadServletRequestFilter.java:93)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.language.LanguageFilter.processFilter(LanguageFilter.java:82)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.gzip.GZipFilter.processFilter(GZipFilter.java:125)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.jsoncontenttype.JSONContentTypeFilter.processFilter(JSONContentTypeFilter.java:42)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.sharepoint.SharepointFilter.processFilter(SharepointFilter.java:88)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.virtualhost.VirtualHostFilter.processFilter(VirtualHostFilter.java:260)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:188)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:168)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:168)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:188)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter.doFilter(InvokerFilter.java:115)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:745)
Caused by: javax.servlet.jsp.JspException: com.liferay.portal.kernel.template.TemplateException: Unable to process template de-homepage-theme_SERVLET_CONTEXT_/templates/portlet.ftl
	at com.liferay.taglib.theme.WrapPortletTag.doEndTag(WrapPortletTag.java:108)
	at freemarker.ext.jsp.TagTransformModel$TagWriter.endEvaluation(TagTransformModel.java:380)
	at freemarker.ext.jsp.TagTransformModel$TagWriter.afterBody(TagTransformModel.java:360)
	... 177 more
Caused by: com.liferay.portal.kernel.template.TemplateException: Unable to process template de-homepage-theme_SERVLET_CONTEXT_/templates/portlet.ftl
	at com.liferay.portal.template.AbstractSingleResourceTemplate.processTemplate(AbstractSingleResourceTemplate.java:83)
	at com.liferay.taglib.util.ThemeUtil.doIncludeFTL(ThemeUtil.java:287)
	at com.liferay.taglib.util.ThemeUtil.doDispatch(ThemeUtil.java:158)
	at com.liferay.taglib.util.ThemeUtil.includeFTL(ThemeUtil.java:101)
	at com.liferay.taglib.util.ThemeUtil.include(ThemeUtil.java:83)
	at com.liferay.taglib.theme.WrapPortletTag.doEndTag(WrapPortletTag.java:101)
	... 179 more
Caused by: freemarker.core._TemplateModelException: Error while invoking the "icon-options" JSP custom tag; see cause exception

----
FTL stack trace ("~" means nesting-related):
	- Failed at: @liferay_portlet["icon-options"]  [in template "de-homepage-theme_SERVLET_CONTEXT_/templates/portlet.ftl" at line 26, column 33]
----
	at freemarker.ext.jsp.JspTagModelBase.toTemplateModelExceptionOrRethrow(JspTagModelBase.java:154)
	at freemarker.ext.jsp.TagTransformModel$TagWriter.afterBody(TagTransformModel.java:371)
	at freemarker.core.Environment.visitAndTransform(Environment.java:427)
	at freemarker.core.UnifiedCall.accept(UnifiedCall.java:107)
	at freemarker.core.Environment.visitByHiddingParent(Environment.java:345)
	at freemarker.core.IfBlock.accept(IfBlock.java:48)
	at freemarker.core.Environment.visit(Environment.java:324)
	at freemarker.core.MixedContent.accept(MixedContent.java:54)
	at freemarker.core.Environment.visit(Environment.java:324)
	at freemarker.core.Environment.process(Environment.java:302)
	at freemarker.template.Template.process(Template.java:325)
	at com.liferay.portal.template.freemarker.FreeMarkerTemplate.processTemplate(FreeMarkerTemplate.java:121)
	at com.liferay.portal.template.AbstractSingleResourceTemplate.processTemplate(AbstractSingleResourceTemplate.java:78)
	... 184 more
Caused by: javax.servlet.jsp.JspException: java.lang.NullPointerException
	at com.liferay.taglib.util.IncludeTag.doEndTag(IncludeTag.java:92)
	at freemarker.ext.jsp.TagTransformModel$TagWriter.endEvaluation(TagTransformModel.java:380)
	at freemarker.ext.jsp.TagTransformModel$TagWriter.afterBody(TagTransformModel.java:368)
	... 195 more
Caused by: java.lang.NullPointerException
	at com.liferay.portlet.configuration.icon.locator.LegacyConfigurationIconLocator.getPath(LegacyConfigurationIconLocator.java:49)
	at com.liferay.portal.kernel.portlet.configuration.icon.PortletConfigurationIconTracker.getPaths(PortletConfigurationIconTracker.java:106)
	at com.liferay.portal.kernel.portlet.configuration.icon.PortletConfigurationIconTracker.getPortletConfigurationIcons(PortletConfigurationIconTracker.java:48)
	at com.liferay.portal.kernel.portlet.configuration.icon.PortletConfigurationIconTracker.getPortletConfigurationIcons(PortletConfigurationIconTracker.java:73)
	at com.liferay.taglib.portletext.IconOptionsTag.getPortletConfigurationIcons(IconOptionsTag.java:45)
	at com.liferay.taglib.portletext.IconOptionsTag.setAttributes(IconOptionsTag.java:107)
	at com.liferay.taglib.util.IncludeTag.callSetAttributes(IncludeTag.java:169)
	at com.liferay.taglib.util.IncludeTag.doEndTag(IncludeTag.java:73)
	... 197 more
30-Apr-2016 13:08:06.795 SEVERE [http-nio-8080-exec-9] org.apache.catalina.core.ApplicationDispatcher.invoke Servlet.service() for servlet jsp threw exception
 java.lang.NullPointerException
	at com.liferay.portlet.configuration.icon.locator.LegacyConfigurationIconLocator.getPath(LegacyConfigurationIconLocator.java:49)
	at com.liferay.portal.kernel.portlet.configuration.icon.PortletConfigurationIconTracker.getPaths(PortletConfigurationIconTracker.java:106)
	at com.liferay.portal.kernel.portlet.configuration.icon.PortletConfigurationIconTracker.getPortletConfigurationIcons(PortletConfigurationIconTracker.java:48)
	at com.liferay.portal.kernel.portlet.configuration.icon.PortletConfigurationIconTracker.getPortletConfigurationIcons(PortletConfigurationIconTracker.java:73)
	at com.liferay.taglib.portletext.IconOptionsTag.getPortletConfigurationIcons(IconOptionsTag.java:45)
	at com.liferay.taglib.portletext.IconOptionsTag.setAttributes(IconOptionsTag.java:107)
	at com.liferay.taglib.util.IncludeTag.callSetAttributes(IncludeTag.java:169)
	at com.liferay.taglib.util.IncludeTag.doEndTag(IncludeTag.java:73)
	at freemarker.ext.jsp.TagTransformModel$TagWriter.endEvaluation(TagTransformModel.java:380)
	at freemarker.ext.jsp.TagTransformModel$TagWriter.afterBody(TagTransformModel.java:368)
	at freemarker.core.Environment.visitAndTransform(Environment.java:427)
	at freemarker.core.UnifiedCall.accept(UnifiedCall.java:107)
	at freemarker.core.Environment.visitByHiddingParent(Environment.java:345)
	at freemarker.core.IfBlock.accept(IfBlock.java:48)
	at freemarker.core.Environment.visit(Environment.java:324)
	at freemarker.core.MixedContent.accept(MixedContent.java:54)
	at freemarker.core.Environment.visit(Environment.java:324)
	at freemarker.core.Environment.process(Environment.java:302)
	at freemarker.template.Template.process(Template.java:325)
	at com.liferay.portal.template.freemarker.FreeMarkerTemplate.processTemplate(FreeMarkerTemplate.java:121)
	at com.liferay.portal.template.AbstractSingleResourceTemplate.processTemplate(AbstractSingleResourceTemplate.java:78)
	at com.liferay.taglib.util.ThemeUtil.doIncludeFTL(ThemeUtil.java:287)
	at com.liferay.taglib.util.ThemeUtil.doDispatch(ThemeUtil.java:158)
	at com.liferay.taglib.util.ThemeUtil.includeFTL(ThemeUtil.java:101)
	at com.liferay.taglib.util.ThemeUtil.include(ThemeUtil.java:83)
	at com.liferay.taglib.theme.WrapPortletTag.doEndTag(WrapPortletTag.java:101)
	at freemarker.ext.jsp.TagTransformModel$TagWriter.endEvaluation(TagTransformModel.java:380)
	at freemarker.ext.jsp.TagTransformModel$TagWriter.afterBody(TagTransformModel.java:360)
	at freemarker.core.Environment.visitAndTransform(Environment.java:427)
	at freemarker.core.UnifiedCall.accept(UnifiedCall.java:107)
	at freemarker.core.Environment.visit(Environment.java:324)
	at freemarker.core.MixedContent.accept(MixedContent.java:54)
	at freemarker.core.Environment.visitByHiddingParent(Environment.java:345)
	at freemarker.core.IfBlock.accept(IfBlock.java:48)
	at freemarker.core.Environment.visit(Environment.java:324)
	at freemarker.core.MixedContent.accept(MixedContent.java:54)
	at freemarker.core.Environment.visit(Environment.java:324)
	at freemarker.core.Environment.process(Environment.java:302)
	at freemarker.template.Template.process(Template.java:325)
	at com.liferay.portal.template.freemarker.FreeMarkerTemplate.processTemplate(FreeMarkerTemplate.java:121)
	at com.liferay.portal.template.AbstractSingleResourceTemplate.processTemplate(AbstractSingleResourceTemplate.java:78)
	at com.liferay.taglib.util.ThemeUtil.doIncludeFTL(ThemeUtil.java:287)
	at com.liferay.taglib.util.ThemeUtil.doDispatch(ThemeUtil.java:158)
	at com.liferay.taglib.util.ThemeUtil.includeFTL(ThemeUtil.java:101)
	at com.liferay.taglib.util.ThemeUtil.include(ThemeUtil.java:83)
	at com.liferay.taglib.theme.IncludeTag.doEndTag(IncludeTag.java:34)
	at org.apache.jsp.html.common.themes.portal_jsp._jspx_meth_liferay_002dtheme_005finclude_005f1(portal_jsp.java:758)
	at org.apache.jsp.html.common.themes.portal_jsp._jspService(portal_jsp.java:695)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:119)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.uploadservletrequest.UploadServletRequestFilter.processFilter(UploadServletRequestFilter.java:93)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.jsoncontenttype.JSONContentTypeFilter.processFilter(JSONContentTypeFilter.java:42)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter.doFilter(InvokerFilter.java:115)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:720)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:466)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:391)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:318)
	at com.liferay.portal.struts.StrutsUtil.forward(StrutsUtil.java:71)
	at com.liferay.portal.struts.PortalRequestProcessor.doForward(PortalRequestProcessor.java:276)
	at org.apache.struts.tiles.TilesRequestProcessor.processTilesDefinition(TilesRequestProcessor.java:271)
	at org.apache.struts.tiles.TilesRequestProcessor.internalModuleRelativeForward(TilesRequestProcessor.java:370)
	at org.apache.struts.action.RequestProcessor.processForward(RequestProcessor.java:566)
	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:212)
	at com.liferay.portal.struts.PortalRequestProcessor.process(PortalRequestProcessor.java:169)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
	at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
	at com.liferay.portal.servlet.MainServlet.callParentService(MainServlet.java:569)
	at com.liferay.portal.servlet.MainServlet.service(MainServlet.java:546)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:119)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.monitoring.internal.servlet.filter.MonitoringFilter.processFilter(MonitoringFilter.java:180)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.uploadservletrequest.UploadServletRequestFilter.processFilter(UploadServletRequestFilter.java:93)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.strip.StripFilter.processFilter(StripFilter.java:336)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.secure.SecureFilter.processFilter(SecureFilter.java:301)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.jsoncontenttype.JSONContentTypeFilter.processFilter(JSONContentTypeFilter.java:42)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter.doFilter(InvokerFilter.java:115)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:720)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:466)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:391)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:318)
	at com.liferay.portal.util.PortalImpl.sendError(PortalImpl.java:6660)
	at com.liferay.portal.kernel.util.PortalUtil.sendError(PortalUtil.java:2169)
	at com.liferay.portal.servlet.ComboServlet.doService(ComboServlet.java:157)
	at com.liferay.portal.servlet.ComboServlet.service(ComboServlet.java:86)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:119)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:188)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.security.sso.ntlm.internal.servlet.filter.NtlmPostFilter.processFilter(NtlmPostFilter.java:107)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:188)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.uploadservletrequest.UploadServletRequestFilter.processFilter(UploadServletRequestFilter.java:93)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.language.LanguageFilter.processFilter(LanguageFilter.java:82)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.gzip.GZipFilter.processFilter(GZipFilter.java:125)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.jsoncontenttype.JSONContentTypeFilter.processFilter(JSONContentTypeFilter.java:42)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.sharepoint.SharepointFilter.processFilter(SharepointFilter.java:88)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.virtualhost.VirtualHostFilter.processFilter(VirtualHostFilter.java:260)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:188)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:168)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:168)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:188)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter.doFilter(InvokerFilter.java:115)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:745)

13:08:06,797 ERROR [http-nio-8080-exec-9][error_jsp:665] User ID 31022
13:08:06,797 ERROR [http-nio-8080-exec-9][error_jsp:666] Current URL /combo/init.es.js.map
13:08:06,798 ERROR [http-nio-8080-exec-9][error_jsp:667] Referer null
13:08:06,798 ERROR [http-nio-8080-exec-9][error_jsp:668] Remote address 127.0.0.1
13:08:06,799 ERROR [http-nio-8080-exec-9][error_jsp:670] javax.servlet.ServletException: javax.servlet.jsp.JspException: com.liferay.portal.kernel.template.TemplateException: Unable to process template de-homepage-theme_SERVLET_CONTEXT_/templates/portal_normal.ftl
javax.servlet.ServletException: javax.servlet.jsp.JspException: com.liferay.portal.kernel.template.TemplateException: Unable to process template de-homepage-theme_SERVLET_CONTEXT_/templates/portal_normal.ftl
	at org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:905)
	at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:838)
	at com.liferay.taglib.servlet.PageContextWrapper.handlePageException(PageContextWrapper.java:164)
	at org.apache.jsp.html.common.themes.portal_jsp._jspService(portal_jsp.java:720)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:119)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.uploadservletrequest.UploadServletRequestFilter.processFilter(UploadServletRequestFilter.java:93)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.jsoncontenttype.JSONContentTypeFilter.processFilter(JSONContentTypeFilter.java:42)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter.doFilter(InvokerFilter.java:115)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:720)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:466)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:391)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:318)
	at com.liferay.portal.struts.StrutsUtil.forward(StrutsUtil.java:71)
	at com.liferay.portal.struts.PortalRequestProcessor.doForward(PortalRequestProcessor.java:276)
	at org.apache.struts.tiles.TilesRequestProcessor.processTilesDefinition(TilesRequestProcessor.java:271)
	at org.apache.struts.tiles.TilesRequestProcessor.internalModuleRelativeForward(TilesRequestProcessor.java:370)
	at org.apache.struts.action.RequestProcessor.processForward(RequestProcessor.java:566)
	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:212)
	at com.liferay.portal.struts.PortalRequestProcessor.process(PortalRequestProcessor.java:169)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
	at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
	at com.liferay.portal.servlet.MainServlet.callParentService(MainServlet.java:569)
	at com.liferay.portal.servlet.MainServlet.service(MainServlet.java:546)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:119)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.monitoring.internal.servlet.filter.MonitoringFilter.processFilter(MonitoringFilter.java:180)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.uploadservletrequest.UploadServletRequestFilter.processFilter(UploadServletRequestFilter.java:93)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.strip.StripFilter.processFilter(StripFilter.java:336)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.secure.SecureFilter.processFilter(SecureFilter.java:301)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.jsoncontenttype.JSONContentTypeFilter.processFilter(JSONContentTypeFilter.java:42)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter.doFilter(InvokerFilter.java:115)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:720)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:466)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:391)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:318)
	at com.liferay.portal.util.PortalImpl.sendError(PortalImpl.java:6660)
	at com.liferay.portal.kernel.util.PortalUtil.sendError(PortalUtil.java:2169)
	at com.liferay.portal.servlet.ComboServlet.doService(ComboServlet.java:157)
	at com.liferay.portal.servlet.ComboServlet.service(ComboServlet.java:86)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:119)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:188)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.security.sso.ntlm.internal.servlet.filter.NtlmPostFilter.processFilter(NtlmPostFilter.java:107)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:188)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.uploadservletrequest.UploadServletRequestFilter.processFilter(UploadServletRequestFilter.java:93)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.language.LanguageFilter.processFilter(LanguageFilter.java:82)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.gzip.GZipFilter.processFilter(GZipFilter.java:125)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.jsoncontenttype.JSONContentTypeFilter.processFilter(JSONContentTypeFilter.java:42)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.sharepoint.SharepointFilter.processFilter(SharepointFilter.java:88)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:142)
	at com.liferay.portal.servlet.filters.virtualhost.VirtualHostFilter.processFilter(VirtualHostFilter.java:260)
	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:188)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:168)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:168)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:188)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter.doFilter(InvokerFilter.java:115)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:745)
Caused by: com.liferay.portal.kernel.template.TemplateException: Unable to process template de-homepage-theme_SERVLET_CONTEXT_/templates/portal_normal.ftl
	at com.liferay.portal.template.AbstractSingleResourceTemplate.processTemplate(AbstractSingleResourceTemplate.java:83)
	at com.liferay.taglib.util.ThemeUtil.doIncludeFTL(ThemeUtil.java:287)
	at com.liferay.taglib.util.ThemeUtil.doDispatch(ThemeUtil.java:158)
	at com.liferay.taglib.util.ThemeUtil.includeFTL(ThemeUtil.java:101)
	at com.liferay.taglib.util.ThemeUtil.include(ThemeUtil.java:83)
	at com.liferay.taglib.theme.IncludeTag.doEndTag(IncludeTag.java:34)
	at org.apache.jsp.html.common.themes.portal_jsp._jspx_meth_liferay_002dtheme_005finclude_005f1(portal_jsp.java:758)
	at org.apache.jsp.html.common.themes.portal_jsp._jspService(portal_jsp.java:695)
	... 157 more
Caused by: freemarker.core._TemplateModelException: Error while invoking the "wrap-portlet" JSP custom tag; see cause exception__----_FTL stack trace ("~" means nesting-related):_	- Failed at: @liferay_theme["wrap-portlet"] page="...  [in template "de-homepage-theme_SERVLET_CONTEXT_/templates/portal_normal.ftl" at line 62, column 25]_---- [Sanitized]
	at freemarker.ext.jsp.JspTagModelBase.toTemplateModelExceptionOrRethrow(JspTagModelBase.java:154)
	at freemarker.ext.jsp.TagTransformModel$TagWriter.afterBody(TagTransformModel.java:371)
	at freemarker.core.Environment.visitAndTransform(Environment.java:427)
	at freemarker.core.UnifiedCall.accept(UnifiedCall.java:107)
	at freemarker.core.Environment.visit(Environment.java:324)
	at freemarker.core.MixedContent.accept(MixedContent.java:54)
	at freemarker.core.Environment.visitByHiddingParent(Environment.java:345)
	at freemarker.core.IfBlock.accept(IfBlock.java:48)
	at freemarker.core.Environment.visit(Environment.java:324)
	at freemarker.core.MixedContent.accept(MixedContent.java:54)
	at freemarker.core.Environment.visit(Environment.java:324)
	at freemarker.core.Environment.process(Environment.java:302)
	at freemarker.template.Template.process(Template.java:325)
	at com.liferay.portal.template.freemarker.FreeMarkerTemplate.processTemplate(FreeMarkerTemplate.java:121)
	at com.liferay.portal.template.AbstractSingleResourceTemplate.processTemplate(AbstractSingleResourceTemplate.java:78)
	... 164 more
Caused by: javax.servlet.jsp.JspException: com.liferay.portal.kernel.template.TemplateException: Unable to process template de-homepage-theme_SERVLET_CONTEXT_/templates/portlet.ftl
	at com.liferay.taglib.theme.WrapPortletTag.doEndTag(WrapPortletTag.java:108)
	at freemarker.ext.jsp.TagTransformModel$TagWriter.endEvaluation(TagTransformModel.java:380)
	at freemarker.ext.jsp.TagTransformModel$TagWriter.afterBody(TagTransformModel.java:360)
	... 177 more
Caused by: com.liferay.portal.kernel.template.TemplateException: Unable to process template de-homepage-theme_SERVLET_CONTEXT_/templates/portlet.ftl
	at com.liferay.portal.template.AbstractSingleResourceTemplate.processTemplate(AbstractSingleResourceTemplate.java:83)
	at com.liferay.taglib.util.ThemeUtil.doIncludeFTL(ThemeUtil.java:287)
	at com.liferay.taglib.util.ThemeUtil.doDispatch(ThemeUtil.java:158)
	at com.liferay.taglib.util.ThemeUtil.includeFTL(ThemeUtil.java:101)
	at com.liferay.taglib.util.ThemeUtil.include(ThemeUtil.java:83)
	at com.liferay.taglib.theme.WrapPortletTag.doEndTag(WrapPortletTag.java:101)
	... 179 more
Caused by: freemarker.core._TemplateModelException: Error while invoking the "icon-options" JSP custom tag; see cause exception__----_FTL stack trace ("~" means nesting-related):_	- Failed at: @liferay_portlet["icon-options"]  [in template "de-homepage-theme_SERVLET_CONTEXT_/templates/portlet.ftl" at line 26, column 33]_---- [Sanitized]
	at freemarker.ext.jsp.JspTagModelBase.toTemplateModelExceptionOrRethrow(JspTagModelBase.java:154)
	at freemarker.ext.jsp.TagTransformModel$TagWriter.afterBody(TagTransformModel.java:371)
	at freemarker.core.Environment.visitAndTransform(Environment.java:427)
	at freemarker.core.UnifiedCall.accept(UnifiedCall.java:107)
	at freemarker.core.Environment.visitByHiddingParent(Environment.java:345)
	at freemarker.core.IfBlock.accept(IfBlock.java:48)
	at freemarker.core.Environment.visit(Environment.java:324)
	at freemarker.core.MixedContent.accept(MixedContent.java:54)
	at freemarker.core.Environment.visit(Environment.java:324)
	at freemarker.core.Environment.process(Environment.java:302)
	at freemarker.template.Template.process(Template.java:325)
	at com.liferay.portal.template.freemarker.FreeMarkerTemplate.processTemplate(FreeMarkerTemplate.java:121)
	at com.liferay.portal.template.AbstractSingleResourceTemplate.processTemplate(AbstractSingleResourceTemplate.java:78)
	... 184 more
Caused by: javax.servlet.jsp.JspException: java.lang.NullPointerException
	at com.liferay.taglib.util.IncludeTag.doEndTag(IncludeTag.java:92)
	at freemarker.ext.jsp.TagTransformModel$TagWriter.endEvaluation(TagTransformModel.java:380)
	at freemarker.ext.jsp.TagTransformModel$TagWriter.afterBody(TagTransformModel.java:368)
	... 195 more
Caused by: java.lang.NullPointerException
	at com.liferay.portlet.configuration.icon.locator.LegacyConfigurationIconLocator.getPath(LegacyConfigurationIconLocator.java:49)
	at com.liferay.portal.kernel.portlet.configuration.icon.PortletConfigurationIconTracker.getPaths(PortletConfigurationIconTracker.java:106)
	at com.liferay.portal.kernel.portlet.configuration.icon.PortletConfigurationIconTracker.getPortletConfigurationIcons(PortletConfigurationIconTracker.java:48)
	at com.liferay.portal.kernel.portlet.configuration.icon.PortletConfigurationIconTracker.getPortletConfigurationIcons(PortletConfigurationIconTracker.java:73)
	at com.liferay.taglib.portletext.IconOptionsTag.getPortletConfigurationIcons(IconOptionsTag.java:45)
	at com.liferay.taglib.portletext.IconOptionsTag.setAttributes(IconOptionsTag.java:107)
	at com.liferay.taglib.util.IncludeTag.callSetAttributes(IncludeTag.java:169)
	at com.liferay.taglib.util.IncludeTag.doEndTag(IncludeTag.java:73)
	... 197 more
13:23:54,409 INFO  [Thread-93][ThemeHotDeployListener:152] Unregistering themes for de-homepage-theme
13:23:54,412 INFO  [Thread-93][ThemeHotDeployListener:184] 1 theme for de-homepage-theme was unregistered
30-Apr-2016 13:23:54.416 INFO [Thread-93] org.apache.catalina.core.ApplicationContext.log Closing Spring root WebApplicationContext
13:23:54,418 INFO  [Thread-93][PluginPackageUtil:1006] Reading plugin package for de-homepage-theme
13:23:54,610 INFO  [Thread-93][BundleStartStopLogger:38] STOPPED de-homepage-theme_7.0.0 [515]
13:24:59,546 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,564 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,564 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,571 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,572 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,576 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,578 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,581 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,582 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,583 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,583 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,584 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,585 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,586 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,586 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,587 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,587 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,595 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,596 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,597 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,598 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,598 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,599 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,600 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,600 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,643 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,654 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,655 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,661 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,663 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,674 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,687 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,691 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,692 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,693 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,700 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,708 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,710 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,712 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,713 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,714 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,714 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,715 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,716 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,717 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,717 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,718 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,718 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,722 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,724 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,725 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,725 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,726 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,727 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,727 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,728 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,738 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,746 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,747 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,750 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,751 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,755 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,764 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,768 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,769 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,770 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,780 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,781 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,794 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,795 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,801 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,803 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,804 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,808 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,809 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,812 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,813 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,814 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,819 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,820 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,821 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,822 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,822 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,823 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,824 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,827 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,828 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,829 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,834 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,836 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,836 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,838 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,838 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,839 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,840 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,847 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,848 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,849 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,850 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,851 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,852 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,852 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,853 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,854 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,854 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,855 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,856 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,856 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,857 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,858 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,859 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,860 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,860 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,861 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,863 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,864 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,865 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,866 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,875 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,876 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,883 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,884 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,894 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,895 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,896 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,897 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,897 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,898 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,899 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,900 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,901 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,902 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,902 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,903 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,904 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,904 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,905 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,906 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,906 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,907 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,908 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,911 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,912 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,942 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,943 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,951 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:24:59,952 WARN  [http-nio-8080-exec-10][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:25:08,305 WARN  [http-nio-8080-exec-4][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:25:08,308 WARN  [http-nio-8080-exec-4][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:25:08,308 WARN  [http-nio-8080-exec-4][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:25:08,309 WARN  [http-nio-8080-exec-4][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:25:08,310 WARN  [http-nio-8080-exec-4][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:25:08,311 WARN  [http-nio-8080-exec-4][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:25:08,312 WARN  [http-nio-8080-exec-4][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:25:08,312 WARN  [http-nio-8080-exec-4][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:25:08,313 WARN  [http-nio-8080-exec-4][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:25:08,314 WARN  [http-nio-8080-exec-4][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:25:08,314 WARN  [http-nio-8080-exec-4][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:25:08,315 WARN  [http-nio-8080-exec-4][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:25:08,374 WARN  [http-nio-8080-exec-4][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:25:08,376 WARN  [http-nio-8080-exec-4][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:25:08,804 WARN  [http-nio-8080-exec-3][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:25:08,809 WARN  [http-nio-8080-exec-3][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:25:08,809 WARN  [http-nio-8080-exec-3][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:25:12,211 WARN  [http-nio-8080-exec-9][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:25:12,213 WARN  [http-nio-8080-exec-9][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:25:12,214 WARN  [http-nio-8080-exec-9][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:25:12,218 WARN  [http-nio-8080-exec-9][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:25:12,221 WARN  [http-nio-8080-exec-9][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:25:12,230 WARN  [http-nio-8080-exec-9][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.
13:25:12,231 WARN  [http-nio-8080-exec-9][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.


Does anybody have an idea of whats going wrong in my installation?

Ah, concerning the resources importer: to be honest, I do not know what it has to do with my problem, sorry! So I have no idea if I need it and what it is for! emoticon

Nate, you wrote that taking classic as the base theme is not a good idea, instead one should take styled and then add the changes to it - if I understood you correctly. But lets say, I like classic very much: where can I see the source code of the classic theme to somehow "clone" it in my own custom "styled" based theme?

Ok, to come to the end I again want to express my highest appreciation for all the work, you guys at Liferay are doing! I will do my best to find my way of learning it - and I saw that there are so many nice people trying to help newbies like me! Thank you so much, guys!

Johann
thumbnail
Nate Cavanaugh,修改在7 年前。

RE: Theming Best Practices

Junior Member 帖子: 94 加入日期: 06-11-27 最近的帖子
Hi Johann,
Thanks so much for the response as well as your patience in getting familiar with Liferay.
Liferay, as part of our company culture, is also pretty self-critical internally, and we really want to eliminate as much as possible any friction which gets in the way of people being productive with Liferay.

I know that when you're in the midst of a problem, whether it's just getting started, or trying to get a final product out the door, that when you ask for help, and developers start "explaining" reasons, it can get pretty frustrating.
Or, to quote one of my favorite movies, I know that many times our reasons can often make developers feel like:


Regarding documentation, more is coming, I promise, but I like your idea of using a Bootstrap theme, and doing that as a basic tutorial as well. Either I, or one of the guys on the team, can work on doing that. It may just start as a blog post, but I could see it being beneficial for users.

There are a few details that won't work as well if you follow the tutorials for 6.2 with 7, but the overall concepts will be the same (but of course, we're updating that so as NOT to lead you down a tunnel you might not know the way out of emoticon)

About your error, it's very strange that it works on deploy, but not on watch...
However, it appears there's an error in one of your templates.

Looking through your stacktrace, it looks like something from the backend is throwing a null pointer exception (it just happens to be coming through the theme, because the theme uses that taglib, so the error is bubbling up through it, as far as I can tell).

Can you list the following:
The version of Liferay you're using
The version of the theme tools you're using. If you're using *nix, OSX or on Windows, Cygwin or Git Bash, you can see this with:
npm ls -g --depth=1 2>/dev/null | grep generator-liferay-theme

Also, if you could list any modifications to the theme you've made (maybe files you've overwritten, etc).
And lastly, if the page contains any custom portlets on the page as well (if it does, try seeing if the error happens with no portlets on the page).

Nate, you wrote that taking classic as the base theme is not a good idea, instead one should take styled and then add the changes to it - if I understood you correctly. But lets say, I like classic very much: where can I see the source code of the classic theme to somehow "clone" it in my own custom "styled" based theme?


We discussed this on Friday, and the way I think we're going to handle this using a new gulp task (which I'll explain below).

First, a (hopefully) small detour to explain how the theme extensions work (in the new theme tools as well as the plugins SDK) to contrast the difference with extending a theme. We encourage theme developers to only store their modifications to a theme, and not the entire theme (which is why we generally encourage only modifying certain files and not touching others unless critical). This allows it so that new features and bug fixes work when upgrading and minimizes the surface area of the theme that the theme developer has to keep up to date.

When we build a theme, we loop through every parent of a theme, starting at "unstyled", copying over "styled", and then copying over any themes you've extended, or just copying over your changes.
It's literally just a sequence of copies. Whatever was copied last will overwrite anything copied before it on a per-file basis (directories are merged).

However, as I mentioned, since we know that Classic WILL change between every version and break API compatibility, we don't think it's a good idea to extend it.

But, what we've decided to do is to create a new gulp task in the tools, I believe it was going to be either something like "gulp bootstrap" or "gulp kickstart" (or some variation).
What it would do would be to copy the files from Classic (or, ideally, any theme you wished to start off with) and place them into your src directory.

So the difference here would be that instead of you extending Classic, you're essentially making a copy of Classic and storing the files yourself.

This will make it so that, even if we've modified Classic on the next version, the files you're depending on will still be there. This isn't the ideal workflow for maintainability, but since you're using it as a way to "kickstart" a theme, it at least saves you a lot of headache.

We should be pushing this out this week (I believe, but I'll have to double check if it's possible, given our other tasks... but it should be either this week or next at the latest).

If you want to just view the source of Classic, you can see it here.

Hopefully that answers your questions, but of course, any others you might have, don't hesitate to let us know emoticon

Thanks again for your patience and comments. They're very much appreciated emoticon
thumbnail
Johann Daberger,修改在7 年前。

RE: Theming Best Practices

New Member 帖子: 24 加入日期: 16-1-19 最近的帖子
Thanks, Nate, for all your efforts in helping me and jumping down to the bottomland of my small and limited newbie world! emoticon

To be honest, I really was thinking a lot if I should write down the idea of a small tutorial for making a bootstrap based theme! I am really glad that you like the idea - and hey, if it is a blog entry about how to get a very basic bootstrap based theme up and running: AWESOME! As I said: bootstrap is familiar to most of us webdevelopers, even the not so front end focussed guys! More detailed problems which may arise can be discussed as they appear! I will watch out for it every single day, believe me! emoticon

Here the result I get when executing your described command:
├─┬ generator-liferay-theme@7.1.7

And concerning your question on what I have changed in the newly created theme: Nothing! Really, I only created the theme, created the image/js/templates folders and copied over just the init_custom.ftl, portal_normal.ftl and navigation.ftl files. I changed nothing!

Does this help to get an idea of whats going wrong here?

BTW: what is the movie where the scene is from? emoticon
thumbnail
Nate Cavanaugh,修改在7 年前。

RE: Theming Best Practices

Junior Member 帖子: 94 加入日期: 06-11-27 最近的帖子
Hi Johann,
Not a problem at all emoticon

When you say you copied over init_custom.ftl, portal_normal.ftl and navigation.ftl, can you tell me where you copied them from? It could be something in one of those templates that's broken.

Could you remove the templates (you just need move the templates folder out of the src directory), and try gulp watch again, and see if it has the same problem?

We're also going to try to reproduce it on our end as well, but we've never seen a situation where it threw errors only on gulp watch, but not on deploy... very strange.
Also, do you know what version of Liferay you're using? Is it 7.0 CE GA1?

Thanks Johann,

PS: The movie is As Good As It Gets. If you haven't seen it, I highly recommend it emoticon
thumbnail
Johann Daberger,修改在7 年前。

RE: Theming Best Practices

New Member 帖子: 24 加入日期: 16-1-19 最近的帖子
Hi Nate,

I copied the three files from the build/templates folder to my src/templates folder.

And the LR version I installed was the newest (at least some days ago): 7.0 CE GA1.

I now deleted those three files and I could activate the theme (with no custom changes at this point). But as soon as I make a simply css entry in the src/css/_custom.scss file, the theme gets unregistered and I find my lifery console in eclipse full with those "theme not found" warnings.

14:58:22,977 WARN  [http-nio-8080-exec-5][ThemeLocalServiceImpl:237] No theme found for specified theme id dehomepage_WAR_dehomepagetheme. Returning the default theme.


Does this help tracking down the issue?

Thanks again for your help
Johann

PS: "As Good As It Gets" is on my watchlist! Good movie tips are always welcome! emoticon emoticon
thumbnail
Robert Frampton,修改在7 年前。

RE: Theming Best Practices

New Member 帖子: 12 加入日期: 12-9-26 最近的帖子
Hey Johann,

Sorry for the issues you've run into. Can you run this command from the root of your theme and let us know what it returns? The theme build tools are updated with bug fixes fairly frequently, and I just want to check and see if your theme has the newest version installed.

npm list liferay-theme-tasks


If liferay-theme-tasks is older than v1.1.0, then you should update it. One way to update is to just clear out the node_modules directory in your theme and run this command from the root of your theme.

npm install


Or if you don't want to delete the node_modules directory you can try...

npm update liferay-theme-tasks


But sometimes npm has issues with that one.

Let me know what the result is, I want to make sure we get this resolved for you emoticon
Thanks,

Rob
thumbnail
Johann Daberger,修改在7 年前。

RE: Theming Best Practices

New Member 帖子: 24 加入日期: 16-1-19 最近的帖子
Hi Robert,

first of all a big sorry for the late response. I had been some days off the office. But now back with full power! ;)

Ok, at once to your questions!

Johanns-MacBook-Pro:de-homepage-theme johann$ npm list liferay-theme-tasks
de-homepage-theme@1.0.0 /Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/myThemes/de-homepage-theme
└── liferay-theme-tasks@1.1.0 


npm install gives me back the following - do you see a problem there?


Johanns-MacBook-Pro:de-homepage-theme johann$ npm install
npm WARN deprecated graceful-fs@3.0.8: graceful-fs v3.0.0 and before will fail on node releases >= v7.0. Please update to graceful-fs@^4.0.0 as soon as possible. Use 'npm ls graceful-fs' to find it in the tree.
npm WARN deprecated lodash@1.0.2: lodash@<3.0.0 is no longer maintained. Upgrade to lodash@^4.0.0.
npm WARN deprecated graceful-fs@1.2.3: graceful-fs v3.0.0 and before will fail on node releases >= v7.0. Please update to graceful-fs@^4.0.0 as soon as possible. Use 'npm ls graceful-fs' to find it in the tree.
npm WARN deprecated lodash@1.2.1: lodash@<3.0.0 is no longer maintained. Upgrade to lodash@^4.0.0.
npm WARN prefer global coffee-script@1.10.0 should be installed with -g
npm WARN prefer global liferay-r2@0.4.4 should be installed with -g
npm WARN prefer global node-gyp@3.3.1 should be installed with -g

> node-sass@3.7.0 install /Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/myThemes/de-homepage-theme/node_modules/node-sass
> node scripts/install.js

Binary downloaded and installed at /Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/myThemes/de-homepage-theme/node_modules/node-sass/vendor/darwin-x64-47/binding.node

> liferay-theme-deps-7.0@0.0.3 install /Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/myThemes/de-homepage-theme/node_modules/liferay-theme-deps-7.0
> node scripts/install.js


> node-sass@3.7.0 postinstall /Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/myThemes/de-homepage-theme/node_modules/node-sass
> node scripts/build.js

"/Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/myThemes/de-homepage-theme/node_modules/node-sass/vendor/darwin-x64-47/binding.node" exists. 
 testing binary.
Binary is fine; exiting.
de-homepage-theme@1.0.0 /Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/myThemes/de-homepage-theme
├─┬ gulp@3.9.1 
│ ├── archy@1.0.0 
│ ├─┬ chalk@1.1.3 
.
.
.


After the node install I restarted the server in debug mode and got the following execption in the console:


13:43:39,295 INFO  [fileinstall-/Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/bundles/osgi/war][ThemeHotDeployListener:94] Registering themes for de-software-und-control-theme
java.io.FileNotFoundException: /Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/bundles/tomcat-8.0.32/work/Catalina/localhost/ROOT/proxytemp/hc_371335275/sprite/images/application/_sprite.png (No such file or directory)
	at java.io.RandomAccessFile.open(Native Method)
	at java.io.RandomAccessFile.<init>(RandomAccessFile.java:236)
	at javax.imageio.stream.FileImageOutputStream.<init>(FileImageOutputStream.java:69)
	at com.sun.imageio.spi.FileImageOutputStreamSpi.createOutputStreamInstance(FileImageOutputStreamSpi.java:55)
	at javax.imageio.ImageIO.createImageOutputStream(ImageIO.java:419)
	at javax.imageio.ImageIO.write(ImageIO.java:1530)
	at com.liferay.portal.image.SpriteProcessorImpl.generate(SpriteProcessorImpl.java:222)
	at com.liferay.portal.kernel.image.SpriteProcessorUtil.generate(SpriteProcessorUtil.java:40)
	at com.liferay.portal.service.impl.ThemeLocalServiceImpl._setSpriteImages(ThemeLocalServiceImpl.java:915)
	at com.liferay.portal.service.impl.ThemeLocalServiceImpl._setSpriteImages(ThemeLocalServiceImpl.java:893)
	at com.liferay.portal.service.impl.ThemeLocalServiceImpl._readThemes(ThemeLocalServiceImpl.java:855)
	at com.liferay.portal.service.impl.ThemeLocalServiceImpl.init(ThemeLocalServiceImpl.java:333)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:483)
	at com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.proceed(ServiceBeanMethodInvocation.java:153)
	at com.liferay.portal.spring.transaction.DefaultTransactionExecutor.execute(DefaultTransactionExecutor.java:85)
	at com.liferay.portal.spring.transaction.TransactionInterceptor.invoke(TransactionInterceptor.java:58)
	at com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.proceed(ServiceBeanMethodInvocation.java:127)
	at com.liferay.portal.spring.aop.ChainableMethodAdvice.invoke(ChainableMethodAdvice.java:56)
	at com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.proceed(ServiceBeanMethodInvocation.java:127)
	at com.liferay.portal.spring.aop.ServiceBeanAopProxy.invoke(ServiceBeanAopProxy.java:173)
	at com.sun.proxy.$Proxy164.init(Unknown Source)
	at com.liferay.portal.kernel.service.ThemeLocalServiceUtil.init(ThemeLocalServiceUtil.java:129)
	at com.liferay.portal.deploy.hot.ThemeHotDeployListener.doInvokeDeploy(ThemeHotDeployListener.java:99)
	at com.liferay.portal.deploy.hot.ThemeHotDeployListener.invokeDeploy(ThemeHotDeployListener.java:51)
	at com.liferay.portal.deploy.hot.HotDeployImpl.doFireDeployEvent(HotDeployImpl.java:233)
	at com.liferay.portal.deploy.hot.HotDeployImpl.fireDeployEvent(HotDeployImpl.java:102)
	at com.liferay.portal.kernel.deploy.hot.HotDeployUtil.fireDeployEvent(HotDeployUtil.java:28)
	at com.liferay.portal.kernel.servlet.PluginContextListener.fireDeployEvent(PluginContextListener.java:164)
	at com.liferay.portal.kernel.servlet.PluginContextListener.doPortalInit(PluginContextListener.java:154)
	at com.liferay.portal.kernel.util.BasePortalLifecycle.portalInit(BasePortalLifecycle.java:44)
	at com.liferay.portal.kernel.util.PortalLifecycleUtil.register(PortalLifecycleUtil.java:74)
	at com.liferay.portal.kernel.util.PortalLifecycleUtil.register(PortalLifecycleUtil.java:58)
	at com.liferay.portal.kernel.util.BasePortalLifecycle.registerPortalLifecycle(BasePortalLifecycle.java:54)
	at com.liferay.portal.kernel.servlet.PluginContextListener.contextInitialized(PluginContextListener.java:116)
	at com.liferay.portal.osgi.web.wab.extender.internal.adapter.ServletContextListenerExceptionAdapter.contextInitialized(ServletContextListenerExceptionAdapter.java:51)
	at sun.reflect.GeneratedMethodAccessor465.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:483)
	at org.eclipse.equinox.http.servlet.internal.registration.ListenerRegistration$EventListenerInvocationHandler.invoke(ListenerRegistration.java:132)
	at com.sun.proxy.$Proxy498.contextInitialized(Unknown Source)
	at org.eclipse.equinox.http.servlet.internal.context.ContextController.doAddListenerRegistration(ContextController.java:359)
	at org.eclipse.equinox.http.servlet.internal.context.ContextController.addListenerRegistration(ContextController.java:312)
	at org.eclipse.equinox.http.servlet.internal.customizer.ContextListenerTrackerCustomizer.addingService(ContextListenerTrackerCustomizer.java:67)
	at org.eclipse.equinox.http.servlet.internal.customizer.ContextListenerTrackerCustomizer.addingService(ContextListenerTrackerCustomizer.java:1)
	at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:941)
	at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:1)
	at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256)
	at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:229)
	at org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:901)
	at org.eclipse.osgi.internal.serviceregistry.FilteredServiceListener.serviceChanged(FilteredServiceListener.java:109)
	at org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:917)
	at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
	at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
	at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEventPrivileged(ServiceRegistry.java:862)
	at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEvent(ServiceRegistry.java:801)
	at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.register(ServiceRegistrationImpl.java:127)
	at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.registerService(ServiceRegistry.java:225)
	at org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(BundleContextImpl.java:464)
	at org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(BundleContextImpl.java:482)
	at org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(BundleContextImpl.java:1001)
	at com.liferay.portal.osgi.web.wab.extender.internal.WabBundleProcessor.initListeners(WabBundleProcessor.java:570)
	at com.liferay.portal.osgi.web.wab.extender.internal.WabBundleProcessor.init(WabBundleProcessor.java:160)
	at com.liferay.portal.osgi.web.wab.extender.internal.WebBundleDeployer.doStart(WebBundleDeployer.java:86)
	at com.liferay.portal.osgi.web.wab.extender.internal.WabFactory$WABExtension.start(WabFactory.java:200)
	at org.apache.felix.utils.extender.AbstractExtender.createExtension(AbstractExtender.java:259)
	at org.apache.felix.utils.extender.AbstractExtender.modifiedBundle(AbstractExtender.java:232)
	at org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:482)
	at org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:1)
	at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:232)
	at org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(BundleTracker.java:444)
	at org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:905)
	at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
	at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
	at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEventPrivileged(EquinoxEventPublisher.java:165)
	at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:75)
	at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:67)
	at org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor.publishModuleEvent(EquinoxContainerAdaptor.java:102)
	at org.eclipse.osgi.container.Module.publishEvent(Module.java:461)
	at org.eclipse.osgi.container.Module.start(Module.java:452)
	at org.eclipse.osgi.internal.framework.EquinoxBundle.start(EquinoxBundle.java:402)
	at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundle(DirectoryWatcher.java:1252)
	at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundles(DirectoryWatcher.java:1224)
	at org.apache.felix.fileinstall.internal.DirectoryWatcher.doProcess(DirectoryWatcher.java:512)
	at org.apache.felix.fileinstall.internal.DirectoryWatcher.process(DirectoryWatcher.java:361)
	at org.apache.felix.fileinstall.internal.DirectoryWatcher.run(DirectoryWatcher.java:313)
13:43:39,740 ERROR [fileinstall-/Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/bundles/osgi/war][ThemeLocalServiceImpl:340] java.lang.NullPointerException
java.lang.NullPointerException
	at javax.imageio.ImageIO.write(ImageIO.java:1538)
	at com.liferay.portal.image.SpriteProcessorImpl.generate(SpriteProcessorImpl.java:222)
	at com.liferay.portal.kernel.image.SpriteProcessorUtil.generate(SpriteProcessorUtil.java:40)
	at com.liferay.portal.service.impl.ThemeLocalServiceImpl._setSpriteImages(ThemeLocalServiceImpl.java:915)
	at com.liferay.portal.service.impl.ThemeLocalServiceImpl._setSpriteImages(ThemeLocalServiceImpl.java:893)
	at com.liferay.portal.service.impl.ThemeLocalServiceImpl._readThemes(ThemeLocalServiceImpl.java:855)
	at com.liferay.portal.service.impl.ThemeLocalServiceImpl.init(ThemeLocalServiceImpl.java:333)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:483)
	at com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.proceed(ServiceBeanMethodInvocation.java:153)
	at com.liferay.portal.spring.transaction.DefaultTransactionExecutor.execute(DefaultTransactionExecutor.java:85)
	at com.liferay.portal.spring.transaction.TransactionInterceptor.invoke(TransactionInterceptor.java:58)
	at com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.proceed(ServiceBeanMethodInvocation.java:127)
	at com.liferay.portal.spring.aop.ChainableMethodAdvice.invoke(ChainableMethodAdvice.java:56)
	at com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.proceed(ServiceBeanMethodInvocation.java:127)
	at com.liferay.portal.spring.aop.ServiceBeanAopProxy.invoke(ServiceBeanAopProxy.java:173)
	at com.sun.proxy.$Proxy164.init(Unknown Source)
	at com.liferay.portal.kernel.service.ThemeLocalServiceUtil.init(ThemeLocalServiceUtil.java:129)
	at com.liferay.portal.deploy.hot.ThemeHotDeployListener.doInvokeDeploy(ThemeHotDeployListener.java:99)
	at com.liferay.portal.deploy.hot.ThemeHotDeployListener.invokeDeploy(ThemeHotDeployListener.java:51)
	at com.liferay.portal.deploy.hot.HotDeployImpl.doFireDeployEvent(HotDeployImpl.java:233)
	at com.liferay.portal.deploy.hot.HotDeployImpl.fireDeployEvent(HotDeployImpl.java:102)
	at com.liferay.portal.kernel.deploy.hot.HotDeployUtil.fireDeployEvent(HotDeployUtil.java:28)
	at com.liferay.portal.kernel.servlet.PluginContextListener.fireDeployEvent(PluginContextListener.java:164)
	at com.liferay.portal.kernel.servlet.PluginContextListener.doPortalInit(PluginContextListener.java:154)
	at com.liferay.portal.kernel.util.BasePortalLifecycle.portalInit(BasePortalLifecycle.java:44)
	at com.liferay.portal.kernel.util.PortalLifecycleUtil.register(PortalLifecycleUtil.java:74)
	at com.liferay.portal.kernel.util.PortalLifecycleUtil.register(PortalLifecycleUtil.java:58)
	at com.liferay.portal.kernel.util.BasePortalLifecycle.registerPortalLifecycle(BasePortalLifecycle.java:54)
	at com.liferay.portal.kernel.servlet.PluginContextListener.contextInitialized(PluginContextListener.java:116)
	at com.liferay.portal.osgi.web.wab.extender.internal.adapter.ServletContextListenerExceptionAdapter.contextInitialized(ServletContextListenerExceptionAdapter.java:51)
	at sun.reflect.GeneratedMethodAccessor465.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:483)
	at org.eclipse.equinox.http.servlet.internal.registration.ListenerRegistration$EventListenerInvocationHandler.invoke(ListenerRegistration.java:132)
	at com.sun.proxy.$Proxy498.contextInitialized(Unknown Source)
	at org.eclipse.equinox.http.servlet.internal.context.ContextController.doAddListenerRegistration(ContextController.java:359)
	at org.eclipse.equinox.http.servlet.internal.context.ContextController.addListenerRegistration(ContextController.java:312)
	at org.eclipse.equinox.http.servlet.internal.customizer.ContextListenerTrackerCustomizer.addingService(ContextListenerTrackerCustomizer.java:67)
	at org.eclipse.equinox.http.servlet.internal.customizer.ContextListenerTrackerCustomizer.addingService(ContextListenerTrackerCustomizer.java:1)
	at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:941)
	at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:1)
	at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256)
	at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:229)
	at org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:901)
	at org.eclipse.osgi.internal.serviceregistry.FilteredServiceListener.serviceChanged(FilteredServiceListener.java:109)
	at org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:917)
	at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
	at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
	at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEventPrivileged(ServiceRegistry.java:862)
	at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEvent(ServiceRegistry.java:801)
	at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.register(ServiceRegistrationImpl.java:127)
	at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.registerService(ServiceRegistry.java:225)
	at org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(BundleContextImpl.java:464)
	at org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(BundleContextImpl.java:482)
	at org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(BundleContextImpl.java:1001)
	at com.liferay.portal.osgi.web.wab.extender.internal.WabBundleProcessor.initListeners(WabBundleProcessor.java:570)
	at com.liferay.portal.osgi.web.wab.extender.internal.WabBundleProcessor.init(WabBundleProcessor.java:160)
	at com.liferay.portal.osgi.web.wab.extender.internal.WebBundleDeployer.doStart(WebBundleDeployer.java:86)
	at com.liferay.portal.osgi.web.wab.extender.internal.WabFactory$WABExtension.start(WabFactory.java:200)
	at org.apache.felix.utils.extender.AbstractExtender.createExtension(AbstractExtender.java:259)
	at org.apache.felix.utils.extender.AbstractExtender.modifiedBundle(AbstractExtender.java:232)
	at org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:482)
	at org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:1)
	at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:232)
	at org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(BundleTracker.java:444)
	at org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:905)
	at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
	at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
	at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEventPrivileged(EquinoxEventPublisher.java:165)
	at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:75)
	at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:67)
	at org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor.publishModuleEvent(EquinoxContainerAdaptor.java:102)
	at org.eclipse.osgi.container.Module.publishEvent(Module.java:461)
	at org.eclipse.osgi.container.Module.start(Module.java:452)
	at org.eclipse.osgi.internal.framework.EquinoxBundle.start(EquinoxBundle.java:402)
	at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundle(DirectoryWatcher.java:1252)
	at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundles(DirectoryWatcher.java:1224)
	at org.apache.felix.fileinstall.internal.DirectoryWatcher.doProcess(DirectoryWatcher.java:512)
	at org.apache.felix.fileinstall.internal.DirectoryWatcher.process(DirectoryWatcher.java:361)
	at org.apache.felix.fileinstall.internal.DirectoryWatcher.run(DirectoryWatcher.java:313)
13:43:39,746 INFO  [fileinstall-/Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/bundles/osgi/war][ThemeHotDeployListener:114] 0 themes for de-software-und-control-theme are available for use
13:43:39,897 INFO  [fileinstall-/Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/bundles/osgi/war][BundleStartStopLogger:35] STARTED user-vertical-theme_7.0.0 [529]
13:43:40,218 INFO  [fileinstall-/Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/bundles/osgi/war][HotDeployImpl:222] Deploying user-vertical-theme from queue
13:43:40,218 INFO  [fileinstall-/Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/bundles/osgi/war][PluginPackageUtil:1006] Reading plugin package for user-vertical-theme
10-May-2016 13:43:40.224 INFO [fileinstall-/Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/bundles/osgi/war] org.apache.catalina.core.ApplicationContext.log Initializing Spring root WebApplicationContext
13:43:40,233 INFO  [fileinstall-/Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/bundles/osgi/war][ThemeHotDeployListener:94] Registering themes for user-vertical-theme
13:43:43,680 INFO  [fileinstall-/Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/bundles/osgi/war][ThemeHotDeployListener:109] 1 theme for user-vertical-theme is available for use
13:43:43,839 INFO  [fileinstall-/Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/bundles/osgi/war][BundleStartStopLogger:35] STARTED de-homepage-theme_7.0.0 [531]
13:43:44,133 INFO  [fileinstall-/Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/bundles/osgi/war][HotDeployImpl:222] Deploying de-homepage-theme from queue
13:43:44,134 INFO  [fileinstall-/Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/bundles/osgi/war][PluginPackageUtil:1006] Reading plugin package for de-homepage-theme
10-May-2016 13:43:44.139 INFO [fileinstall-/Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/bundles/osgi/war] org.apache.catalina.core.ApplicationContext.log Initializing Spring root WebApplicationContext
13:43:44,148 INFO  [fileinstall-/Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/bundles/osgi/war][ThemeHotDeployListener:94] Registering themes for de-homepage-theme
13:43:46,111 INFO  [fileinstall-/Users/johann/Google Drive/Programmieren/liferay/DescWorkspace/bundles/osgi/war][ThemeHotDeployListener:109] 1 theme for de-homepage-theme is available for use
</init></init>


But the server is running at this point. So far without any changes in the theme, except the creation of some empty folders (images, js, templates).

Now I run gulp watch and, according to this tutorial, I copy some files from the build folder to my src folder.

Still everything is working, but I get a ton of such warnings:

...
Warning: css/aui/lexicon/atlas-theme/mixins/_buttons.scss modified in the future.
Warning: css/aui/lexicon/atlas-theme/mixins/_forms.scss modified in the future.
...


Simple changes in the _custom.scss, like changing body background color to green, don't have any effect. Wenn I stop gulp watch and make a gulp deploy, then after a reload I see my green background.

Now I make a simple change in the portal_normal.ftl - this worked. But from now on no changes take effect - I still use gulp deploy. With gulp watch I get:


14:25:01,446 INFO  [Thread-88][ThemeHotDeployListener:152] Unregistering themes for de-homepage-theme
14:25:01,449 INFO  [Thread-88][ThemeHotDeployListener:184] 1 theme for de-homepage-theme was unregistered
10-May-2016 14:25:01.450 INFO [Thread-88] org.apache.catalina.core.ApplicationContext.log Closing Spring root WebApplicationContext
14:25:01,450 INFO  [Thread-88][PluginPackageUtil:1006] Reading plugin package for de-homepage-theme
14:25:01,514 INFO  [Thread-88][BundleStartStopLogger:38] STOPPED de-homepage-theme_7.0.0 [531]


... and the theme is not available in the config area anymore (I can not assign the theme to my page - it is not listed as theme).

Does this help? So sorry for bothering you guys - I hope that I am not the only one facing these problems.

Thanks again
Johann
thumbnail
Johann Daberger,修改在7 年前。

RE: Theming Best Practices

New Member 帖子: 24 加入日期: 16-1-19 最近的帖子
Oh dear... meanwhile my posts are classified as spam and an admin has to approve... emoticon
thumbnail
Robert Frampton,修改在7 年前。

RE: Theming Best Practices

New Member 帖子: 12 加入日期: 12-9-26 最近的帖子
Hey Johann,

The npm install looks fine, the warnings shouldn't cause any real issues.

It sounds like you may be running into caching issues, there are certain portal properties you can set to disable theme caching for development purposes.

One way is to turn on developer mode which includes an ext file with those properties already set.

Or you can set those properties in your portal-ext.properties file.

I would recommend turning on developer mode and running just gulp deploy a number of times to make sure that portal is showing your changes. Then once that's established try a gulp watch and test the same thing.

In regards to the theme disappearing from configuration, when you go from a gulp watch back to a full deploy, it has to unregister the "watch" bundle, and re-register the "normal" bundle, and it takes a little bit for registration to happen, so it will not show for a bit and then pop back up. If it never came back, then that's an issue.

Hope this helps. Let me know what happens after turning on developer mode. Thanks,

Rob
thumbnail
Johann Daberger,修改在7 年前。

RE: Theming Best Practices

New Member 帖子: 24 加入日期: 16-1-19 最近的帖子
Hey Rob - I have the developer mode turned on since I began experimenting, as I read it somewhere in the docs. So this can not be the issue.

And concerning the disappearing theme. The theme was not disappearing when changing from gulp deploy to gulp watch or vice versa. Instead it disappears after saving a file during gulp watch - and does not reappear in the list.

Thanks
Johann
thumbnail
Johann Daberger,修改在7 年前。

RE: Theming Best Practices

New Member 帖子: 24 加入日期: 16-1-19 最近的帖子
Ok, Rob - I definitely could live without gulp watch and instead using gulp deploy! No problem. emoticon

The other issue was that I could not get the classic theme as the base theme working. If you simply would tell me that this will be fixed in the next LR version or by an updated theme generator package or so: let me know and I will be happy to not longer steal your time and try to get my things done with the "styled" theme as the parent theme! Maybe it is the best way to learn LR theming, anyway! emoticon

Johann
thumbnail
Robert Frampton,修改在7 年前。

RE: Theming Best Practices

New Member 帖子: 12 加入日期: 12-9-26 最近的帖子
Hey Johann,

I actually found the issue you experienced with the watch task, and it will be fixed in a future release of Portal.

In regards to basing off of classic theme, we still don't recommend doing so as it will complicate future upgrades. However, the gulp kickstart task will be published soon which will allow you to copy classic theme's source files into your own theme which will allow you to start theming with a more "production ready" look and feel.

I will let you know when that task is published. In the meantime you can always just copy classic theme's files from source into your theme if you like. Hope that helps,

Rob
Gunnar Brinkmann,修改在6 年前。

RE: Theming Best Practices

Junior Member 帖子: 53 加入日期: 11-12-2 最近的帖子
Let me throw some java developer notes into this last year's discussion:

I've got some experience with layout and design, and the things I've learned over the years are

- Layout (structure) and design (fonts, colors, "cosmetics") are always major time consuming aspects, not to mention the big plan how an ergonomic, robust, responsive UI could and should look like.

- When you're a developer (and not just a layouter/designer/graphics specialist), it is nearly impossible to do lots of layout and design without massive influence on project planning, efforts and expenses.

- Many developers often think they understand and can rate frameworks just by looking at it and coding with the try and error pattern. The old "rtfm".

- On the other hand developers often underrate the importance of an ergonomic, robust, responsive UI regarding user experience and acceptance.

- So: Never think like "it's just HTML and CSS, kiddy stuff, let me code this quick". Either provide a huge project (time) planning percentage for layout and design - or let someone else do it, it could be more expensive when the developer does it himself :-)

- My personal conclusion after switching to DXP EE: We've let a liferay partner do the custom theme structure job (layout) and I'm just doing some cosmetics (design) on top of that.

Regarding effective DXP theming:

- we're using the theme generator
- it's still in development and not supported
- that means for example that there is still just an old node-dependency "liferay-theme-deps-7.0" available
- I'm under Windows and I don't do any python or windows tools installations as mentioned in the theme generator documentation (maybe because I have also cygwin installed, but I build the theme in Windows, not in a cygwin bash).
- but building works fine
- we're using a global node installation, so we don't have (except for some json config files in the theme src root) any node-related stuff in our theme project (what I've descibed here, my problem regarding the question was just a too old java for the maven call of "gulp build")