Ok so,
We start with this:
/**
* Sets chrome ids, whose indexes are gadget instance ids (starting from 0).
* @param {Array} gadgetIdToChromeIdMap Gadget id to chrome id map
*/
gadgets.StaticLayoutManager.prototype.setGadgetChromeIds =
function(gadgetChromeIds) {
this.gadgetChromeIds_ = gadgetChromeIds;
};
which only suites the case where all the gadgetChromeIds are available
all at the same time. This doesn't work for us. I add this method, so I
could add the chromes without having to do it all together:
gadgets.StaticLayoutManager.prototype.addGadgetChromeId =
function(gadgetChromeId) {
if (this.gadgetChromeIds_ &&
gadgets.util.isArray(this.gadgetChromeIds_)) {
this.gadgetChromeIds_.push(gadgetChromeId);
}
else {
this.gadgetChromeIds_ = [gadgetChromeId];
}
};
This worked exactly like we want and didn't break anything.
Later, due to the numerical gadget.id issue, I changed it to
gadgets.StaticLayoutManager.prototype.addGadgetChromeId = function(gadgetId,
gadgetChromeId) {
if (!this.gadgetChromeIds_) {
this.gadgetChromeIds_ = [];
}
this.gadgetChromeIds_[gadgetId] = gadgetChromeId;
};
So, my code for loading a given gadget is:
<script type="text/javascript">
jQuery(
function() {
var gadget = gadgets.container.createGadget({<%= gadgetParams
%>});
gadget.id = '<portlet:namespace />';
gadget.secureToken = ['<%= ownerId %>',
themeDisplay.getUserId(), "<portlet:namespace />gadget", "liferay"].join(":");
gadget.setServerBase('<%= renderRequest.getContextPath() %>/');
gadgets.container.addGadget(gadget);
gadgets.container.layoutManager.addGadgetChromeId(gadget.id,
'<portlet:namespace />gadget-chrome');
}
);
</script>
Then I had a look through HttpGadgetContext which has an Integer type
moduleId
public HttpGadgetContext(HttpServletRequest request) {
...
moduleId = getModuleId(request);
...
}
but everywhere the moduleId is used it is essentially converted back to
a string and the only reference I find of the integer aspect being used
is line 120 of UrlGenerator
...
if (context.getModuleId() != 0) {
...
which could just as easily be a string check...
So, can we change the context moduleId to a string rather than an int?
Note that I haven't looked at the PHP implementation, so I don't know
how it might be affected by the change (though unless the PHP impl is
using strict casting, I doubt it would require a change at all).
Ray
On Tue, 2008-04-08 at 23:33 -0400, Raymond Auge wrote:
> Hey All,
>
> I'm seeing a bug in our container with respect to positioning of a
> gadget on the page.
>
> Currently, the gadget.id is simply a numerically incremented value that
> is assigned based on the ordering of the gadget on the page. Moving the
> gadget to a different position causes the prefs to be lost if the
> ordering of rendering changes. Since we have drag and drop positioning
> this is a little annoying.
>
> I'm going to be overriding the container's default addGadget function
> with an implementation which allows setting the gadget.id distinctly
> rather than relying on an incremented value. Looking through the code it
> doesn't appear that it really matters if the id is numerical or a
> string.
>
> So, I'm tempted to do this
>
>
> gadgets.Container.prototype.addGadget = function(gadget) {
> if (!gadget.id) {
> gadget.id = this.getNextGadgetInstanceId();
> }
> gadget.setUserPrefs(this.userPrefStore.getPrefs(gadget));
> this.gadgets_[this.getGadgetKey_(gadget.id)] = gadget;
> };
>
>
> This way I can set the gadget.id prior to passing it to
> gadgets.container.addGadget(gadget).
>
> Any reason why this shouldn't be done?
>
>
> Raymond Augé
> Software Engineer
> Liferay, Inc.
> Enterprise. Open Source. For Life.
Raymond Augé
Software Engineer
Liferay, Inc.
Enterprise. Open Source. For Life.