I would like to use the NotesXSPDocument property/ method currentDocument.isNewNote() with Expression Language but without success.
SSJS (works fine):
<xp:text escape="true" id="cfSSJS" value="#{javascript:currentDocument.isNewNote()}"></xp:text>
EL (no success):
<xp:text escape="true" id="cfEL" value="#{currentDocument.newNote}"></xp:text>
Hint: I am working with a Domino 8.5.3 FP6 Server environment
Thanks in advance
It looks like isNewNote() is not exposed to EL. Even explicitly referencing the datasource variable explicitly doesn't work.
Related
In XPages you can access the value(s) of an input control (e.g. xp:inputText) on the server side in three (see answer of Sven Hasselbach) different ways:
Use javax.faces.component.UIComponent to get the base object for a UI component in combination with an appropriate getter (e.g. getComponent("txtRootFolder") .getValueAsString())
Use a Scope Variable (e.g. requestScope.rootfolder)
I know the usage/purpose of scope variables, that's not the questions here.
I want to know what are the main differences (advantages/ disadvantages, best practices, etc.) between this two possible solutions?
There is a third way which I prefer: Add a binding to your component.
Then you can access the component and it's value directly.
Here is simple example:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:inputText id="inputText1" binding="#{myValue}" />
<xp:label value="#{myValue.value}" id="label1" />
<xp:button value="Label" id="button1">
<xp:eventHandler event="onclick" submit="true" refreshMode="partial" />
</xp:button>
</xp:view>
The general idea: your components represent a view on your data, while your variables represent the model. When you use value= you decouple the view from the model. Your variable doesn't need to know WHAT component did update it. So when you change the UI or decide that the variable will get updated from code only, nothing in your (controller) code needs to change.
When you use binding (which has very valid use cases) you are dealing with a specific type of component, not only the value anymore. This is good when you need to manipulate the component (eg dynamic dropdown values), but overkill when you only need the value.
So IMHO use bound values any time unless you have a good justification to do otherwise.
Bonus tip: instead of scattering values around in scopes use a managed bean to keep them. This will make controller logic easier and consistent.
This is weird.
I've logged in here as Admin Mustermann, but when I try to determine the user's roles, I get nothing:
current user:
<xp:text
escape="true"
id="computedField4"
value="#{javascript:context.getUser()}">
</xp:text>
roles:
<xp:text
escape="true"
id="computedField5"
value="#{javascript:context.getUser().getRoles()}">
</xp:text>
And if I open my XPages Debug Toolbar, it tells me I'm Anonymous.
This is my ACL which confirms Admin Mustermann should have at least three roles:
I'm stumped.
I'd prefer to use database.queryAccessRoles(session.getEffectiveUserName()) instead of using the context.
I created a bean for getting a lot of ACL and user informations as a snippet: http://openntf.org/XSnippets.nsf/snippet.xsp?id=sysinfouser-acl-info-custom-control-java-bean
Oddly, #UserRoles is more reliable. Try using this instead:
roles:
<xp:text
escape="true"
id="computedField5"
value="#{javascript:session.evaluate("#UserRoles");}">
</xp:text>
We had a problem with context.getUser().getRoles() failing when using XPages in the Notes Client on local when not disconnected. You can reconfigure your location document in some manner to avoid this, but I never figured that one out. Using the old formula language stuff was suggested during a PMR and it works even if the coinfiguration is, like mine, wrong.
may be someone helps :)
I don't know much about Apache-Reverse-Server
I have a simple X-Page, see the code bellow.
If I open the xpage via
http: //domain1.de/e.nsf/test.xsp
and press the button, in log.nsf i see my print-out "Button is clicked"
If I open the xpage via
https: //example1.someproxy/rp/sproxy/http$domain1.de$80$/e.nsf/test.xsp
and press the button, in log.nsf i DON'T see my print-out "Button is clicked"
The Proxy-Server is installed and configured not by me.
<?xml version="1.0" encoding="UTF-8"?><xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:link escape="true" id="link1" disableTheme="true">
<xp:image id="image1" url="/btn.jpg"></xp:image>
<xp:eventHandler event="onclick" submit="true" refreshMode="complete" >
<xp:this.action><![CDATA[#{javascript:print("Button is clicked");}]]></xp:this.action>
</xp:eventHandler>
</xp:link>
What could be the problem, that the SSJS-code is not started via Reverse-Proxy at all?
Is reverse proxy the problem? Or is the problem that your code is not triggering?
I can't tell from your user id how experienced with XPages you are, but bear in mind a number of steps are performed on the server before it gets to your print statement. One of the key ones is conversion and validation. So if anything on your XPage throws a validation error, it won't run SSJS code.
Do you have a Display Errors control on the XPage and, more importantly, inside the refresh area? If not, add one. We've all spent hours in our early XPages life because validation or data conversion has failed and we didn't add anything to let us know. Once you get more confident, a PhaseListener is another useful tool for checking any or all lifecycle phases are running.
I'm using the Extension Library and XPages to build a web based workflow application. One feature is to prompt a dialog and select the next approver before submitting it forward.
For new documents, the dialog appears, and it also appears when in read mode. It never opens for a saved document. I need it to work in SSJS, though the dialog does open in CSJS. Here is some of the code:
xpMain.xsp contains two custom controls: ccButtons and ccWFloDialogs.
ccButtons "Submit" button:
getComponent('dlgNextOwner').show();
ccWFloDialogs "dlgNextOwner" dialog:
<xe:dialog id="dlgNextOwner" title="Select Supervisor">
<xe:formTable id="ftDlgNextOwner" formTitle="Select Supervisor"
formDescription="You may select a different supervisor."
disableErrorSummary="true">
<xp:this.facets>
<xe:formRow id="formRow1" xp:key="footer" for="txtWFloNextOwner"
labelWidth="125px">
<xp:inputText id="txtWFloNextOwner" style="width:200px"
value="#{viewScope.nextOwner}">
</xp:inputText>
<xe:namePicker id="npNextOwner" dialogTitle="Select Supervisor"
for="txtWFloNextOwner">
<xe:this.dataProvider>
<xe:dominoNABNamePicker addressBookSel="all-public"></xe:dominoNABNamePicker>
</xe:this.dataProvider>
</xe:namePicker>
</xe:formRow>
</xp:this.facets>
</xe:formTable>
</xe:dialog>
In CSJS, I can use the following code and it successfully opens the dialog:
XSP.openDialog("#{id:dlgNextOwner}");
I'm also using Mark Hughes' picklist from the extension library, and if I remove the panel which contains the control and data source, the dialog shows up in SSJS! The code is in a custom control, although, if it's directly in the XPage, the problem is the same. Here is the code for the panel:
<xp:panel
id="vendorDiv">
<xp:this.data>
<xp:dominoView
var="nvVend"
viewName="V_Vend"
ignoreRequestParams="true"
databaseName="other/lookupdb.nsf"
startKeys="#{javascript:viewScope.srchVend}">
</xp:dominoView>
</xp:this.data>
<xe:formTable
id="ftGetVendor"
disableErrorSummary="true"
labelPosition="above">
<xe:formRow
id="frVendor"
for="cfVendorName"
label="Name of the Vendor:">
<xp:text
escape="true"
id="cfVendorName"
value="#{currentDocument.VendorName}"
style="width:200px">
</xp:text>
<xc:viewpicklist
rowsPerPage="15"
buttonImage="./add.png"
tableClass="tablecellgreen"
headerClass="headerclass"
rowClass="odd, even"
searchBar="false"
searchButtonText="Search"
searchButtonClass="button2"
searchBarClass="headerclass"
pagerStyleFirst="navbutton1"
pagerStylePrevious="navbutton2"
pagerStyleCurrent="navbutton4"
pagerStyleNext="navbutton2"
pagerStyleLast="navbutton3"
typeAheadBar="true"
select="Column"
onReturn="Set Scope Value"
bottomBarClass="bottomround headerclass"
cancelButtonText="Cancel"
cancelButtonClass="button2 floatthisright"
type="Single Value"
finishButtonText="Finish"
finishButtonClass="button2 floatthisright"
multiSelectButtonAddImg="./add.png"
multiSelectButtonRemoveImg="./delete.png"
picklistButtonClass="button"
openDialogWith="Link"
picklistLinkImg="./add.png"
multiSelectLinkAddImg="./add.png"
multiSelectLinkRemoveImg="./delete.png"
selectWith="Link"
clearSearchImg="./cross.png"
SelectCellWidth="30px"
dialogID="dlgVend"
dialogTitle="Select a Vendor"
dialogWidth="80%"
refreshID="vendorDiv"
ssjsSelectFunction="getVendorInfo"
varName="viewScope.vendorInfo"
datasrc="nvVend"
selectColumn="4"
linkImg="./add.png"
typeAheadVar="viewScope.srchVend">
<xc:this.viewColumn>
<xp:value>0</xp:value>
<xp:value>1</xp:value>
<xp:value>2</xp:value>
<xp:value>3</xp:value>
</xc:this.viewColumn>
</xc:viewpicklist>
</xe:formRow>
<xe:formRow
id="frVendorStatus"
for="cfVendorStatus"
label="Vendor Registration Status:">
<xp:text
escape="true"
id="cfVendorStatus"
value="#{currentDocument.VendorStatus}">
</xp:text>
</xe:formRow>
<xe:formRow
id="frVendorCountry"
for="cfVendorCountry"
label="Country Name:">
<xp:text
escape="true"
id="cfVendorCountry"
value="#{currentDocument.VendorCountry}">
</xp:text>
</xe:formRow>
</xe:formTable>
</xp:panel>
The requested vendor information populates the fields, without any problem or errors. However, something here seems to prevent dialogs from opening up using SSJS.
Can anyone see anything obvious I'm missing? The data source is in the panel, ignoreRequestParams is true (otherwise it doesn't work).
The main data source is in the entire XPage context. I tried to add the ccWFloDialog custom control outside the main panel, and change the data source to the panel, but that didn't work.
Any ideas?
Forget the dialog for now. This is probably data source related. Suggest you get it working just on the xpage first. With visible fields. then maybe use the rendered property to get it working on the xpage similar to how the dialog would appear. Once you have that working then you should be good to apply to dialog. This idea is to just take the dialog out of the equation first to make sure it works normally.
Instead, I decided to open the dialogs using CSJS, instead of SSJS. I've changed some of logic, and will have a bit more to do to finish this part of the project. Thanks to all!
I seem to be having an issue with the extensions library dialog box either not refreshing or caching values.
Please see the very simplified example below. Basically the button pops up an extension library dialog box. Contained in the dialog box is a computed field with #Unique() as it's value. On our prod server the number is not being updated when the button is pressed. It works on the first button press but subsequent presses do not update the number.
This occurs only in production and a similar issue has only started occurring in the past couple of weeks. It still works fine on our Dev and QA servers.
My admin contacts are out right now so I don't know the differences in versions between the servers but I will post them when I learn that information.
Here is the code:
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"
xmlns:xc="http://www.ibm.com/xsp/custom"
xmlns:xe="http://www.ibm.com/xsp/coreex">
<xp:this.resources>
<xp:script src="/Validation_SSJS.jss" clientSide="false"></xp:script>
</xp:this.resources>
<xp:br></xp:br>
<xp:br></xp:br>
<xe:dialog id="dlgMsg2" title="Message" style="width:400px;">
<xp:text escape="true" id="computedField1" value="#{javascript:return #Unique();}">
</xp:text>
</xe:dialog><xp:br></xp:br>
<xp:br></xp:br>
<xp:br></xp:br>
<xp:button value="Popup Message" id="button1">
<xp:eventHandler event="onclick" submit="true"
refreshMode="complete">
<xp:this.action><![CDATA[#{javascript:var dlg = getComponent("dlgMsg2");
dlg.show();}]]></xp:this.action>
</xp:eventHandler></xp:button>
</xp:view>
Update: The issue is occurring in both IE and Firefox so it does not appear to be browser related. I am guessing it is not Pistolstar related either as I had a previous issue with PS and Xpages. Pistolstar has discovered that issue and I will update my previous post when I get more details
Update: I checked and our QA and Prod servers are have version 8.5.3.20111208-0717 of the extension library.
I came up with a "workaround" to fix this issue. I added a refresh event handler for the onShow event of the dialog box.
<xe:dialog id="dlgMsg2" title="Message" style="width:400px;">
<xp:text escape="true" id="computedField1" value="#{javascript:return #Unique();}">
</xp:text>
<xp:eventHandler event="onShow" submit="true"
refreshMode="partial" refreshId="computedField1">
</xp:eventHandler></xe:dialog>
It would still be interesting to know the underlying issue.
In the All Properties section of the dialog there is a property called 'RefreshOnShow'.
When set to true the contents of the panel will be refreshed every time the panel goes from a hidden state to a visible state. This should resolve the issue that you are seeing.
It may be unlikely, but page persistence options in the xsp.properties could alter the way the page behaves across environments. There is the xsp.properties on the database and on the server. XPages Portable Command Guide has more details on the different settings, but settings could change what gets retained between requests.