[Mapguide_users] Re: OnSelection Event?
Kori Maleski
kmale at telus.net
Sun Jan 7 00:59:48 EST 2007
This would apply to all applications as it is.
You would have to write code to handle each application in the mainframe.templ
function. For instance, you could handle it by MAPNAME (pardon my crude IF
statements):
function SendSelection() {
if(mapFrame.GetMapName()= 'MyMap'){
var selCount = mapFrame.GetSelectedCount();
if(selCount != 0){
if(hasTaskpane != 0){
GetTaskFrame().GetTaskPane().location.href =
homePage.replace("/MapGuide/MapViewerNet/","") + "?SESSION=" +
mapFrame.GetSessionId() + "&LOCALE=" + locale + "&MAPNAME=" +
encodeURIComponent(mapFrame.GetMapName()) + "&SELECTION=" +
mapFrame.GetSelectionXML();
}
}
}
}
Otherwise you could write a handler page that handles it within each of your
applications.
Or you could put a variable in the mainframe.templ:
var mapSendSelection = false
Have your specific application that you want this to work in set this to true
when it loads, then have your function do the following:
function SendSelection() {
if(mapSendSelection){
var selCount = mapFrame.GetSelectedCount();
if(selCount != 0){
if(hasTaskpane != 0){
GetTaskFrame().GetTaskPane().location.href =
homePage.replace("/MapGuide/MapViewerNet/","") + "?SESSION=" +
mapFrame.GetSessionId() + "&LOCALE=" + locale + "&MAPNAME=" +
encodeURIComponent(mapFrame.GetMapName()) + "&SELECTION=" +
mapFrame.GetSelectionXML();
}
}
}
}
I havent tested, but if it works for you let me know.
Cheers,
Kori Maleski
Quoting Jim O'Leary <joleary.public at gmail.com>:
>
> Does this code refresh the task pane each time a selection is made? I only
> want this to happen for this application. If you are going to put a hook
> into OnSelectionChanged(), would it not be better to have one that the
> application can implement or not as it chooses?
>
> At any rate, I understand from your example that you can pass the output of
> getSelectionXML() on the client to the server, and instantiate a MGSelection
> object with it. Using the MGSelection superclass method GetLayers(), you
> then retrieve references to all of the layers that have been selected. With
> that you can drive the API down to the properties. Here is my implementation
> in PHP, using the getSelectionXML method of markupeditor.php in the recent
> samples. The output of getSelectionXML() on the client is assigne to a form
> variable with the name "selectionXML". Then on the server...
>
> $selection = new MgSelection($map,$_REQUEST['selectionXML']);
> $selectedLayers = $selection->GetLayers();
> $numberLayers = $selectedLayers->GetCount();
> $wktReaderWriter = new MgWktReaderWriter(); //for getPropertyValue
> $agfReaderWriter = new MgAgfReaderWriter(); // for getPropertyValue
> $featureService =
> $this->site->CreateService(MgServiceType::FeatureService);
>
> for ($i = 0; $i < $numberLayers; $i++)
> {
> $layer = $selectedLayers->GetItem($i);
> $layerName = $layer->GetName();
> // markupmanager.php has $markupLayer->SetName('_' .
> $markupLayerResId->GetName());
> // so slice off the beginning _ to get the actual layer name in
> the repository
> $layerName = substr($layerName,1);
> $resourceIdentifier = new
> MgResourceIdentifier("Library://Wildlife/Data/$layerName.FeatureSource");
> $featureReader =
> $featureService->SelectFeatures
($resourceIdentifier,"MarkupSchema:Markup",$noQueryOptions);//
> no query options
> while ($featureReader->ReadNext())
> {
> $propCount = $featureReader->GetPropertyCount();
> for($j=0; $j<$propCount; $j++)
> {
> $propertyName = $featureReader->GetPropertyName($j);
> $boolVal = $featureReader->IsNull($propertyName);
> if ($boolVal)
> {
> continue;
> }// end if
> $propertyType =
> $featureReader->GetPropertyType($propertyName);
> // GetPropertyValue is based on the
> printPropertyValueFromFeatReader sample code in
> // the MgFeatureReader Class Reference in Web API
> Reference. See below.
> $propertyValue =
> getPropertyValue($featureReader,$propertyType,$propertyName);
> }// end propcount for
> }// end ReadNext while
> }// end numberLayers for
>
>
> //-------------------------getPropertyValue
> BEGINS---------------------------
> /**
> * Gets data for a layer property
> */
> function getPropertyValue(&$featureReader, $propertyType, $propertyName)
> {
> global $agfReaderWriter;
> global $wktReaderWriter;
> switch ($propertyType)
> {
> case MgPropertyType::Null :
> break;
> case MgPropertyType::Boolean :
> $val = $featureReader->GetBoolean($propertyName);
> $valStr = printBoolean($val);
> break;
> case MgPropertyType::Byte :
> $val = $featureReader->GetByte($propertyName);
> break;
> case MgPropertyType::DateTime :
> $val = $featureReader->GetDateTime($propertyName);
> break;
> case MgPropertyType::Single :
> $val = $featureReader->GetSingle($propertyName);
> break;
> case MgPropertyType::Double :
> $val = $featureReader->GetDouble($propertyName);
> break;
> case MgPropertyType::Int16 :
> $val = $featureReader->GetInt16($propertyName);
> break;
> case MgPropertyType::Int32 :
> $val = $featureReader->GetInt32($propertyName);
> break;
> case MgPropertyType::Int64 :
> $val = $featureReader->GetInt64($propertyName);
> break;
> case MgPropertyType::String :
> $val = $featureReader->GetString($propertyName);
> break;
> case MgPropertyType::Blob :
> fwrite($logFileHandle, "$propertyName is blobn");
> break;
> case MgPropertyType::Clob :
> break;
> case MgPropertyType::Feature :
> $val = $featureReader->GetFeatureObject($propertyName);
> break;
> case MgPropertyType::Geometry :
> break;
> case MgPropertyType::Raster :
> $val = $featureReader->GetRaster($propertyName);
> break;
> }// end switch
> return $val;
> }//end of getPropertyValue
> //------------------------------getPropertyValue
> ENDS------------------------
>
> Thanks for your help.
>
>
>
> Kori Maleski-2 wrote:
> >
> >
> >
> > Jim,
> >
> > The following descripe the methods I use:
> >
> > In the mainframe.templ, insert a function call in the OneSelectionChanged
> > Event:
> >
> > function OnSelectionChanged() {
> >
> > var selCount = mapFrame.GetSelectedCount();
> >
> > SendSelection(); //Ã------------------My new function call
> >
> > if(hasStatusbar == 1)
> >
> > sbFrame.SetFeatureSelectedMsg(FormatMessage((selCount >
> > 1? "__#FEATURESSELECTED#__": "__#FEATURESELECTED#__"), new Array
> > (selCount, "unused")));
> >
> > var stateChanged = false;
> >
> > for(var i = 0; i < selectionAwareCmds.length; i++)
> >
> > ...
> >
> >
> > Then add your new function:
> >
> > function SendSelection() {
> >
> > var selCount = mapFrame.GetSelectedCount();
> >
> > if(selCount != 0){
> >
> > if(hasTaskpane != 0){
> >
> > GetTaskFrame().GetTaskPane().location.href =
> > homePage.replace
> > ("/MapGuide/MapViewerNet/","") + "?SESSION=" + mapFrame.GetSessionId()
> > + "&LOCALE=" + locale + "&MAPNAME=" +
> > encodeURIComponent(mapFrame.GetMapName
> > ()) + "&SELECTION=" + mapFrame.GetSelectionXML();
> >
> > }
> >
> > }
> > }
> >
> >
> > In this instance, the designated homepage of the taskpane will be sent the
>
> > specified UR parameters.
> >
> > Following the edits to mainframe.templ Â
> >
> > RESTART THE MAPGUIDE SERVER SERVICE Â you may have to restart IIS or
> > whatever
> > webserver you are using.
> >
> >
> > In your recipient page (.NET flavour here:
> >
> >
> > Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
>
> > Handles MyBase.Load
> >
> >
> > Dim l_sSelect As String
> > Dim l_sMapName As String
> > Dim l_sSession As String
> >
> > l_sMapName = Request("MAPNAME")
> > l_sSession = Request("SESSION")
> > l_sSelect = Request("SELECTION")
> >
> > If l_sSelect <> "" Then
> >
> > 'connect to the site
> > Dim l_oCred As New MgUserInformation(l_sSession)
> > Dim l_oSite As New MgSiteConnection()
> > l_oSite.Open(l_oCred)
> > 'create services
> > Dim l_oFeatureSrvc As MgFeatureService =
> > l_oSite.CreateService
> > (MgServiceType.FeatureService)
> > Dim l_oResourceSrvc As MgResourceService =
> > l_oSite.CreateService(MgServiceType.ResourceService)
> > 'Create a temporary map runtime object, locate the layer
> > Dim l_oMap As New MgMap()
> > l_oMap.Open(l_oResourceSrvc, l_sMapName)
> > 'Create a Selection object for the selection XML
> > Dim l_oSel As MgSelection = New MgSelection(l_oMap,
> > l_sSelect)
> > Dim l_cSelLayers As MgReadOnlyLayerCollection =
> > l_oSel.GetLayers()
> >
> > ...
> >
> >
> > Then use the API to read the features as required.
> >
> >
> > Cheers,
> >
> > Kori Maleski
> >
> >
> >
> > Quoting Jim O'Leary <joleary.public at gmail.com>:
> >
> >>
> >> Has anyone come up with a solution to the original question in this
> >> thread?
> >> How do you extract property names and values from the XML string that you
> >> get either from GetSelectionXML?
> >>
> >> Jason's clever code (May 4, 2006) captures the map's OnSelectionChanged
> >> event. You can then get the selections on the client side using
> >> GetSelectionXML(), which yields something like:
> >>
> >> <?xml version="1.0" encoding="UTF-8"?><FeatureSet
> >> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> >> xsi:noNamespaceSchemaLocation="FeatureSet-1.0.0.xsd"> <Layer
> >> id="ea15105a-ffff-ffff-8003-00a0d13b3329"> <Class
> >> id="MarkupSchema:Markup">
> >>
> >> <ID>AQAAAA==</ID> </Class> </Layer></FeatureSet>
> >>
> >> I'm assuming that you put the keys and values in this string in a query
> >> string and submit a form to the server to recreate this XML string. You
> >> could also write this XML to a uniquely named file and then pass the
> >> filename to the server.
> >>
> >> Assuming that you can recreate this XML string one way or the other on
> >> the
> >> server, how do you then extract name = value pairs from the feature(s)
> >> that
> >> you have selected?
> >>
> >> Thanks.
> >>
> >>
> >> Willem Schwarte wrote:
> >> >
> >> > I've just read the dev manual and want to try to create a little test
> >> > program, to get me started on understanding the flow of events etc..
> >> >
> >> >
> >> >
> >> > What I want is:
> >> >
> >> >
> >> >
> >> > When something gets selected, read a property and call an asp-page in
> >> > another frame (in short).
> >> >
> >> >
> >> >
> >> > But how can I tell if something is selected?
> >> >
> >> > I suppose there is no onSelectionChanged event like in MG6.5. So this
> >> > would be done on a onClick? Where would I put the code for this?
> >> >
> >> >
> >> >
> >> > Willem
> >> >
> >> >
> >> >
> >> >
> >> >
> >>
> >> --
> >> View this message in context:
> >> http://www.nabble.com/OnSelection-Event--tf1561860.html#a8199139
> >> Sent from the MapGuide Users mailing list archive at Nabble.com.
> >>
> >> _______________________________________________
> >> Mapguide_users mailing list
> >> Mapguide_users at lists.osgeo.org
> >> http://lists.osgeo.org/mailman/listinfo/mapguide_users
> >>
> >
> >
> > _______________________________________________
> > Mapguide_users mailing list
> > Mapguide_users at lists.osgeo.org
> > http://lists.osgeo.org/mailman/listinfo/mapguide_users
> >
> >
>
> --
> View this message in context:
> http://www.nabble.com/OnSelection-Event--tf1561860.html#a8201792
> Sent from the MapGuide Users mailing list archive at Nabble.com.
>
> _______________________________________________
> Mapguide_users mailing list
> Mapguide_users at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/mapguide_users
>
More information about the Mapguide-users
mailing list