Hi Shaun, Last year I lead a project, for a major on-line ticket company, which is currently being used to select and sell seats to sporting events. The approach used there, was to maintain all of the seats in a single array (ArrayCollection). Each seat has a unique id field; so that updating the server and checking availability was simplified. In order to know where the seats were located, in relationship to each other, a reference x/y point was used to position (draw) each individual seat. This reference point was contained in the data. For each seat, a custom UIComponent was drawn on the seat-map canvas; when the data was returned from the server. This allowed for easy manipulation of the seat's state; for user interactions like mouse over and select. This approach also allows the client to easily customize the layout of the seat-maps; in a wysiwyg venue builder application. Hope that this gives you some ideas.
-TH --- In [email protected], "smccran" <[EMAIL PROTECTED]> wrote: > > Hi all, > > I'm trying to produce a booking form, where users can select their > seat. The seats are laid out in a square. I'm currently doing this > with 4 arrays, one for each side of the square. This is proving very > complicated tho, as I have a remote object from a cfc returning the > results from all 4 arrays, and its proving a nightmare to map the > results back to the images? (full code below. > > Anyone have any thoughts on how they would approach this? > > Thanks > Shaun > > -------- > > <?xml version="1.0"?> > <!-- Simple example to demonstrate the Repeater class. --> > <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" > layout="absolute" backgroundColor="#000000" > backgroundGradientColors="[#222222, #222222]" creationComplete="init > ()"> > > <mx:Style source="style.css" /> > > <mx:Script> > <![CDATA[ > import mx.formatters.CurrencyFormatter; > import mx.controls.FormItemLabel; > import mx.rpc.events.ResultEvent; > import mx.controls.Alert; > > [Bindable] > private var glowTarget:*; > > [Bindable] > private var topRow:Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, > 10, 11]; > > [Bindable] > private var rightCol:Array = [12, 13, 14, 15, 16, 17, 18, > 19, 20, 21, 22]; > > [Bindable] > private var bottomRow:Array = [33, 32, 31, 30, 29, 28, > 27, 26, 25, 24, 23]; > > [Bindable] > private var leftCol:Array = [44, 43, 42, 41, 40, 39, 38, > 37, 36, 35, 34]; > > private var _ukFormatter:CurrencyFormatter; > > private function init():void > { > seatsManager.getAllSeats(); > > // hide all the elements > resUserName.visible = false > resButton.visible = false > reserved.visible = false > reserved2.visible = false > reserved3.visible = false > createAccountButton.visible = false > > reserveLabel.visible = false > reservedText1.visible = false > reservedText2.visible = false > > payLabel.visible = false > payText1.visible = false > priceText.visible = false > payButton.visible = false > > } > > private function changeDisplay(event:Event):void > { > var chosenSeatNo:String = > event.currentTarget.getRepeaterItem(); > //Alert.show(String > (event.currentTarget.getRepeaterItem())); > > // build the txt strings > centerLabel.text = 'Seat No. ' + chosenSeatNo; > payLabel.text = 'Pay for Seat No. ' + chosenSeatNo; > reserveLabel.text = 'Reserve Seat No. ' + > chosenSeatNo; > > // control glow of buttons > glowImage.end(); > glowTarget = event.currentTarget; > glowImage.target = glowTarget; > glowImage.play(); > > // do function call > seatsManager.getChosenSeat > (chosenSeatNo) > } > > private function handleFetchResult(event:ResultEvent):void > { > var seatNo:String = String > (event.result.intSeatNumber); > var intId:String = String(event.result.intId); > var intPrice:String = String(event.result.intPrice); > var intReserved:Boolean = > event.result.intReserved; > var usr_alias:String = > event.result.usr_alias; > var intPaid:Boolean = > event.result.intPaid; > > _ukFormatter = new CurrencyFormatter > (); > _ukFormatter.currencySymbol = "£"; > _ukFormatter.precision = 2; > _ukFormatter.decimalSeparatorFrom > = "."; > _ukFormatter.decimalSeparatorTo = "."; > _ukFormatter.useNegativeSign = true; > _ukFormatter.useThousandsSeparator = > true; > _ukFormatter.alignSymbol = "left"; > > intPrice = _ukFormatter.format > (intPrice); > priceText.text = 'Price for this seat > is ' + intPrice; > > //seat is already paid for > if (intPaid) > { > // change values of text > thats visible > reserved.text = 'This seat > is unavailable.' > reserved2.text = 'It has been > booked by ' + usr_alias; > > reserved.visible = true > reserved2.visible = true > > // set other elements to > hidden > reserved3.visible = false > resUserName.visible = false > resButton.visible = false > createAccountButton.visible = > false > payLabel.visible = false > payText1.visible = false > payButton.visible = false > > reserveLabel.visible = false > reservedText1.visible = false > reservedText2.visible = false > priceText.visible = false > > } > > // not paid for > else > { > > // if reserved > if (intReserved) > { > // change text > reserved.text = 'This > seat is reserved by ' + usr_alias; > reserved2.text > = 'This reservation can be removed, if you book this place now!' > > // show elements > reserved.visible = > true > > // hide reservation > options > reserveLabel.visible > = false > reservedText1.visible > = false > reservedText2.visible > = false > resUserName.visible = > false > > > } > > // not reserved > else > { > > reserved.text = 'This > seat is available, you can reserve it, or book it.' > reserved2.text = 'You > must have an account to do this.' > > // show all elements > resUserName.visible = true > resButton.visible = true > reserved.visible > = true > reserved2.visible > = true > reserved3.visible > = true > > createAccountButton.visible = true > > reserveLabel.visible > = true > reservedText1.visible > = true > reservedText2.visible > = true > > payLabel.visible > = true > payText1.visible > = true > priceText.visible > = true > payButton.visible > = true > } > > } > } > > private function handleAllResult(event:ResultEvent):void > { > var result:Array = event.result as Array; > > /* Create a new object */ > var UpdateVO:Object = new Object(); > > /* Create an array to house the > objects */ > var UpdateResult:Array = new Array(); > > /* Loop over result array and populate new array with > objects */ > for(var i:int=0; i < result.length; i++){ > UpdateVO = result[i]; > trace(i) > trace("no= " + UpdateVO.intSeatNumber > + "reserved=" + UpdateVO.intReserved) > > if (UpdateVO.intReserved == 1) > { > topImage > [UpdateVO.intSeatNumber] = "assets/reserved.gif"; > trace(topImage > [UpdateVO.intSeatNumber]) > > } > else > { > topImage > [UpdateVO.intSeatNumber].source = "assets/pc.gif"; > } > //x[UpdateVO.intSeatNumber-1].toolTip > = "Seat reserved, buy now to secure it."; > > > > > // leftImage[UpdateVO.intSeatNumber- > 1].source = "assets/reserved.gif"; > > /* > if (UpdateVO.intPaid == 1) > { > topImage > [UpdateVO.intSeatNumber].source = "assets/paidfor.gif"; > topImage > [UpdateVO.intSeatNumber].toolTip = "Seat Booked"; > } > else > { > if (UpdateVO.intReserved > == 1) > { > trace > (UpdateVO.intSeatNumber, UpdateVO.intReserved) > topImage > [UpdateVO.intSeatNumber-1].source = "assets/reserved.gif"; > topImage > [UpdateVO.intSeatNumber-1].toolTip = "Seat reserved, buy now to > secure it."; > } > } > */ > //UpdateResult.push(UpdateVO); > } > } > > > ]]> > </mx:Script> > > <mx:RemoteObject destination="ColdFusion" > id="seatsManager" > fault="Alert.show > (event.fault.message)" > source="langame.seats" > showBusyCursor="true"> > > <mx:method name="getAllSeats" result="handleAllResult > (event)" fault="Alert.show(event.fault.message)"/> > <mx:method name="getChosenSeat" result="handleFetchResult > (event)" fault="Alert.show(event.fault.message)"/> > > </mx:RemoteObject> > > <!-- Glow effect --> > <mx:Glow id="glowImage" blurXFrom="15.0" blurXTo="15.0" > blurYFrom="15.0" blurYTo="15.0" duration="2000" repeatCount="0" > color="0xFF0000" /> > > <!-- Holding canvas --> > <mx:Canvas x="10" y="10" width="1000" height="780"> > > <!-- top row --> > <mx:HBox x="10" y="10"> > <mx:Repeater id="top" dataProvider="{topRow}"> > <!-- <mx:Button height="49" width="50" > label="{String(rp.currentItem)}" > click="Alert.show(String > (event.currentTarget.getRepeaterItem()) + ' pressed')"/> > --> > <mx:VBox> > <mx:Image id="topImage" > styleName="reservedSeat" width="35" x="102" y="131" height="28" > click="changeDisplay(event);" useHandCursor="true" > buttonMode="true" /> > <mx:Text text="Seat {top.currentItem}" /> > </mx:VBox> > > </mx:Repeater> > </mx:HBox> > > <!-- left col --> > <mx:VBox x="10" y="70"> > <mx:Repeater id="lcol" dataProvider="{leftCol}"> > > <mx:Image id="leftImage" styleName="reservedSeat" > x="102" y="131" click="changeDisplay(event);" width="35" height="28" > buttonMode="true" useHandCursor="true" /> > <mx:Text text="" /><!-- text="Seat {String > (lcol.currentItem)}" --> > > </mx:Repeater> > </mx:VBox> > > <!-- right col --> > <mx:VBox x="572" y="70"> > <mx:Repeater id="rcol" dataProvider="{rightCol}"> > > <mx:Image id="rightImage" x="102" y="131" > click="changeDisplay(event);" width="35" height="28" > buttonMode="true" useHandCursor="true" /> > <mx:Text text="Seat {String > (rcol.currentItem)}" /> > > </mx:Repeater> > </mx:VBox> > > <!-- bottom row --> > <mx:HBox x="10" y="718"> > <mx:Repeater id="bottom" dataProvider="{bottomRow}"> > > <mx:VBox x="21" y="403"> > <mx:Image id="bottomImage" x="102" y="131" > click="changeDisplay(event);" width="35" height="28" > buttonMode="true" useHandCursor="true"/> > <mx:Text text="Seat {String > (bottom.currentItem)}" /> > </mx:VBox> > > </mx:Repeater> > </mx:HBox> > > <!-- Start of center canvas --> > <mx:Canvas x="102" y="101" width="462" height="459" > backgroundColor="#222222"> > <mx:Label id="centerLabel" x="10" y="10" text="Select a > seat to view the details about it." /> > > <mx:Text id="priceText" text="priceText" x="10" y="400"/> > <mx:Text id="reserved" x="10" y="41" /> > <mx:Text id="reserved2" x="10" y="68" /> > <mx:Text id="reserved3" x="10" y="95" text="Don't have an > account?"/> > <mx:Button x="10" y="122" label="Create Account" > id="createAccountButton"/> > > <mx:Label x="10" y="163" id="reserveLabel" text="reserved > label"/> > <mx:Text x="10" y="194" text="Reserved places are not > guaranteed." id="reservedText1"/> > <mx:Text x="10" y="221" text="If you want to guarantee your > space, then pay for it now!" id="reservedText2"/> > <mx:TextInput id="resUserName" x="10" y="248"/> > <mx:Button id="resButton" x="10" y="278" label="Reserve"/> > > <mx:Label x="10" y="342" text="paylabel" > id="payLabel"/> > <mx:Text x="10" y="373" text="To guarantee your place, pay > online now!" id="payText1"/> > <mx:Button x="10" y="427" label="Pay online using PayPal" > id="payButton"/> > > </mx:Canvas> > > </mx:Canvas> > </mx:Application> >

