CS
Craig Saunders 6 years ago
Should this be separate document?
- 06. Reactor Development Tutorial
- Section A: BlackBox Management
- 1. BlackBox Files
- 2. BlackBoxes Functions and Parameters
- 3. Compiling and Previewing
- FR Toolbox and Talking With FileMaker
- 1. Introduction to FRToolBox and Asynchronicity
- 2. Using parameters
- 3. Pulling records from your found set
- 2. Pulling a single record
- 5. Updating a record
- 6. Creating a new record
- 7. Deleting a record
- 8. Polling For Changes
- 9. Running a script
- 10. Pull Container Images
- 11. Using The Starting Template
- 12. Debugging
Section A: BlackBox Management
FR Toolbox and Talking With FileMaker
<!–– This is the main HTML for the BlackBox ––>
<?Reactor $MyParameter Reactor?>
FMLink = 'FM.link';
MyField = '<?Reactor bbdev_Field( $MyField ) Reactor?>';
FMTableOccurrenceName = '<?Reactor bbdev_TO( $MyField ) Reactor?>';
FunctionWhereClause = '<?Reactor bbdev_Relationship( bbdev_TO( $MyField ) ) Reactor?>';
var RecordsObj = new Object;
function GetData() {
QueryData = FRTB.find(
FMTableOccurrenceName + '::' + MyField
).where(FunctionWhereClause).send(InitData);
}
function InitData( response ) {
AllData = Array();
for ( var i=0; i < response.data.length; i++) {
Record = new Object;
Record.MyField = response.data[i][FMTableOccurrenceName + '::' + MyField];
AllData.push(Record);
}
RecordsObj = AllData;
}
document.write(Record.MyField + "<br>");
FMLink = 'FM.link';
MyField = '<?Reactor bbdev_Field( $MyField ) Reactor?>';
FMTableOccurrenceName = '<?Reactor bbdev_TO( $MyField ) Reactor?>';
FunctionWhereClause = '<?Reactor bbdev_Relationship( bbdev_TO( $MyField ) ) Reactor?>';
var RecordsObj = new Object;
function GetData() {
QueryData = FRTB.find(
FMTableOccurrenceName + '::' + MyField
).where(FunctionWhereClause).send(InitData);
}
function InitData( response ) {
AllData = Array();
for ( var i=0; i < response.data.length; i++) {
Record = new Object;
Record.MyField = response.data[i][FMTableOccurrenceName + '::' + MyField];
AllData.push(Record);
document.write(Record.MyField + "<br>");
}
RecordsObj = AllData;
}
GetData();
FMLink = 'FM.link';
QueryValue = '<?Reactor $QueryValue Reactor?>';
FMTableOccurrenceName = '<?Reactor bbdev_TO( $PlanetNameField ) Reactor?>';
PlanetNameField = '<?Reactor bbdev_Field( $PlanetNameField ) Reactor?>';
PlanetDescriptionField = '<?Reactor bbdev_Field( $PlanetDescriptionField ) Reactor?>';
//This is what is used to retrieve data from FileMaker
function GetData() {
QueryData = FRTB.find(
FMTableOccurrenceName + '::' + PlanetDescriptionField
).where(PlanetNameField + "='" + QueryValue + "'").send(function(response){
ResultValue = response.data[0][FMTableOccurrenceName + '::' + PlanetDescriptionField];
document.write(QueryValue + " is known as " + ResultValue + "<br>");
});
}
GetData();
FMLink = 'FM.link';
PlanetNameField = '<?Reactor bbdev_Field( $PlanetNameField ) Reactor?>';
PlanetDescriptionField = '<?Reactor bbdev_Field( $PlanetDescriptionField ) Reactor?>';
FMTableOccurrenceName = '<?Reactor bbdev_TO( $PlanetNameField ) Reactor?>';
FunctionWhereClause = '<?Reactor bbdev_Relationship( bbdev_TO( $PlanetNameField ) ) Reactor?>';
function GetData() {
QueryData = FRTB.find(
FMTableOccurrenceName + '::' + PlanetNameField,
FMTableOccurrenceName + '::' + PlanetDescriptionField
).where(FunctionWhereClause).send(function(response){
for ( var i=0; i < response.data.length; i++) {
planetname = response.data[i][FMTableOccurrenceName + '::' + PlanetNameField];
planetdescription = response.data[i][FMTableOccurrenceName + '::' + PlanetDescriptionField];
document.write(planetname + ": " + planetdescription + "<br>");
}
});
}
GetData();
FMLink = 'FM.link';
PlanetName = '<?Reactor $PlanetName Reactor?>';
NewDescription = '<?Reactor $NewDescription Reactor?>';
PlanetNameField = '<?Reactor bbdev_Field( $PlanetNameField ) Reactor?>';
PlanetDescriptionField = '<?Reactor bbdev_Field( $PlanetDescriptionField ) Reactor?>';
FMTableOccurrenceName = '<?Reactor bbdev_TO( $PlanetNameField ) Reactor?>';
FunctionWhereClause = '<?Reactor bbdev_Relationship( bbdev_TO( $PlanetNameField ) ) Reactor?>';
function UpdateRecord() {
FRTB.update(
[FMTableOccurrenceName + '::' + PlanetDescriptionField, NewDescription]
).filter(
FMTableOccurrenceName + '::' + PlanetNameField + '=' + PlanetName
).send(function() {
document.write("Done!");
});
}
<div onclick=UpdateRecord() style="width:116px;height:20px;background-color:#529028;color:white;padding:10px;font-family:Helvetica,arial;text-align:center;cursor:pointer;">Update Record
</div>
<myform>
<div class=myform>
<label>Planet Name:</label><input id='name' type="text"><br><br>
<label>Planet Description:</label><input id='description' type="text"><br><br>
<button type="button" onclick="addPlanet();">Add Planet!</button>
</div>
</myform>
.myform {
width: 300px;
clear: both;
}
label {
padding-bottom:5px;
}
.myform input {
clear: both;
width: 100%;
height:30px;
font-size:14px;
}
button {
background-color:green;
color:white;
border:none;
padding:10px;
width: 200px;
font-size:14px;
cursor:pointer;
}
<button type="button" onclick="addPlanet();">Add Planet!</button>
function addPlanet() {
FMLink = 'FM.link';
PlanetNameField = '<?Reactor bbdev_Field( $PlanetNameField ) Reactor?>';
PlanetDescriptionField = '<?Reactor bbdev_Field( $PlanetDescriptionField ) Reactor?>';
FMTableOccurrenceName = '<?Reactor bbdev_TO( $PlanetNameField ) Reactor?>';
PlanetNameField_Full = FMTableOccurrenceName + "::" + PlanetNameField;
PlanetDescriptionField_Full = FMTableOccurrenceName + "::" + PlanetDescriptionField;
newPlanetName = document.getElementById('name').value;
newPlanetDescription = document.getElementById('description').value;
if (newPlanetName=="" || newPlanetDescription=="") {
alert ("You need to provide a name and description");
return
}
var Data = new Object;
Data[PlanetNameField_Full] = newPlanetName;
Data[PlanetDescriptionField_Full] = newPlanetDescription;
FRTB.create(Data).send({'onsuccess': function() {
alert ("Planet added!");
}});
}
<select id="planetlist"></select><br>
<button type="button" onclick="DeletePlanet();">Delete Planet!</button>
button {
background-color:green;
color:white;
border:none;
padding:10px;
width: 200px;
font-size:14px;
cursor:pointer;
margin-top:10px;
}
FMLink = 'FM.link';
PlanetIDField = '<?Reactor bbdev_Field( $PlanetIDField ) Reactor?>';
PlanetNameField = '<?Reactor bbdev_Field( $PlanetNameField ) Reactor?>';
FMTableOccurrenceName = '<?Reactor bbdev_TO( $PlanetIDField ) Reactor?>';
FunctionWhereClause = '<?Reactor bbdev_Relationship( bbdev_TO( $PlanetIDField ) ) Reactor?>';
function GetData() {
QueryData = FRTB.find(
FMTableOccurrenceName + '::' + PlanetNameField,
FMTableOccurrenceName + '::' + PlanetIDField
).where(FunctionWhereClause).send(function(response){
for ( var i=0; i < response.data.length; i++) {
planetname = response.data[i][FMTableOccurrenceName + '::' + PlanetNameField];
planetid = response.data[i][FMTableOccurrenceName + '::' + PlanetIDField];
x = document.getElementById("planetlist")
var option = document.createElement("option");
option.text = planetname;
option.id = planetid;
x.add(option);
}
});
}
function DeletePlanet() {
planetid = document.getElementById("planetlist").options[document.getElementById("planetlist").selectedIndex].id;
planetname = document.getElementById("planetlist").options[document.getElementById("planetlist").selectedIndex].value;
if (planetid=="" || planetname=="") {
alert ("You need to specify a planet to delete");
return
}
FRTB.remove(FMTableOccurrenceName).where(PlanetIDField + "='" + planetid + "'").send(function() {
var i;
for(i = document.getElementById("planetlist").options.length - 1 ; i >= 0 ; i--) {
document.getElementById("planetlist").remove(i);
}
GetData();
alert(planetname + " has been deleted");
});
}
GetData();
<table id="planettable" style="width:100%"></table>
FMLink = 'FM.link';
// This is where variables are set from the given parameters
var RecordsObj = new Object;
FMTableOccurrenceName = '<?Reactor bbdev_TO( $PlanetNameField ) Reactor?>';
FunctionWhereClause = '<?Reactor bbdev_Relationship( bbdev_TO( $PlanetNameField ) ) Reactor?>';
PlanetNameField = '<?Reactor bbdev_Field( $PlanetNameField ) Reactor?>';
PlanetDescriptionField = '<?Reactor bbdev_Field( $PlanetDescriptionField ) Reactor?>';
//This is what is used to retrieve data from FileMaker
function GetData() {
QueryData = FRTB.find(
FMTableOccurrenceName + '::' + PlanetNameField,
FMTableOccurrenceName + '::' + PlanetDescriptionField
).where(FunctionWhereClause).poll(PollChanges).send(function(response) {
var table = document.getElementById("planettable");
for ( var i=0; i < response.data.length; i++) {
planetname = response.data[i][FMTableOccurrenceName + '::' + PlanetNameField];
planetdescription = response.data[i][FMTableOccurrenceName + '::' + PlanetDescriptionField];
rowid = response.data[i][FMTableOccurrenceName + '::rowid'];
var row = table.insertRow(i);
row.id = rowid;
var cell1 = row.insertCell(0);
var cell2 = row.insertCell(1);
cell1.innerHTML = planetname;
cell2.innerHTML = planetdescription;
}
});
}
function PollChanges(results) {
// Deleted
for( var i=0; i<results.remove.length; i++ ){
for( var j=0; j<document.getElementById("planettable").rows.length; j++ ){
if (document.getElementById("planettable").rows[j].id == results.remove[i]) {
document.getElementById("planettable").deleteRow(j);
}
}
}
// Changed
for( var i=0; i<results.update.length; i++ ){
QueryData = FRTB.find(
FMTableOccurrenceName + '::' + PlanetNameField,
FMTableOccurrenceName + '::' + PlanetDescriptionField
).where("rowid="+results.update[i]).send(function(response) {
planetname = response.data[i][FMTableOccurrenceName + '::' + PlanetNameField];
planetdescription = response.data[i][FMTableOccurrenceName + '::' + PlanetDescriptionField];
for( var j=0; j<document.getElementById("planettable").rows.length; j++ ){
if (document.getElementById("planettable").rows[j].id == results.update[i]) {
document.getElementById("planettable").rows[j].cells[0].innerHTML = planetname;
document.getElementById("planettable").rows[j].cells[1].innerHTML = planetdescription;
}
}
});
}
// New
for( var i=0; i<results.create.length; i++ ){
var table = document.getElementById("planettable");
var row = table.insertRow(document.getElementById("planettable").rows.length);
row.id = results.create[i];
var cell1 = row.insertCell(0);
var cell2 = row.insertCell(1);
QueryData = FRTB.find(
FMTableOccurrenceName + '::' + PlanetNameField,
FMTableOccurrenceName + '::' + PlanetDescriptionField
).where(FunctionWhereClause).poll(PollChanges).send();
}
}
Please select a planet:
<br/><br/>
<ul id='planetlist'></ul>
FMLink = 'FM.link';
PlanetNameField = '<?Reactor bbdev_Field( $PlanetNameField ) Reactor?>';
PlanetDescriptionField = '<?Reactor bbdev_Field( $PlanetDescriptionField ) Reactor?>';
ScriptName = '<?Reactor $ScriptName Reactor?>';
FMTableOccurrenceName = '<?Reactor bbdev_TO( $PlanetNameField ) Reactor?>';
FunctionWhereClause = '<?Reactor bbdev_Relationship( bbdev_TO( $PlanetNameField ) ) Reactor?>';
function GetData() {
QueryData = FRTB.find(
FMTableOccurrenceName + '::' + PlanetNameField,
FMTableOccurrenceName + '::' + PlanetDescriptionField
).where(FunctionWhereClause).send(function(response){
for ( var i=0; i < response.data.length; i++) {
planetname = response.data[i][FMTableOccurrenceName + '::' + PlanetNameField];
planetdescription = response.data[i][FMTableOccurrenceName + '::' + PlanetDescriptionField];
var ul = document.getElementById("planetlist");
var li = document.createElement("li");
li.appendChild(document.createTextNode(planetname));
li.setAttribute("description", planetdescription);
li.setAttribute("onclick", "RunScript('" + planetname + "','" + planetdescription + "');");
ul.appendChild(li);
}
});
}
function RunScript(planetname,planetdescription) {
FRTB.script(ScriptName,planetname).send();;
}
GetData();
ul {
padding:0;
width:200px;
}
li {
list-style-type:none;
border:#539129 solid;
margin-bottom:5px;
padding:5px;
color:#0d260d;
}
li:hover {
background-color:#539129;
color:white;
cursor:pointer;
}
Planet = new Object();
Planet.name = planetname;
Planet.description = planetdescription;
Planet_JSON = JSON.stringify(Planet);
FRTB.script(ScriptName,Planet_JSON).send();;
<div id='Images'>
<?reactor bbdev_LoadImages( $PlanetImageField ; $PlanetImageField ; $com.reactorize.env.loadedfilepath ) reactor?>
</div id='Images'>
<img src="mercury.png.png" />
<img src="venus.png.png" />
<img src="earth.png.png" />
<img src="mars.png.png" />
<img src="jupiter.png.png" />
<img src="saturn.png.png" />
<img src="uranus.png.png" />
<img src="neptune.png.png" />
<img src="Pluto-transparent.png.png" />
<div id='Images' style='display:none'>
<?reactor bbdev_LoadImages( $PlanetImageField ; $PlanetNameField ; $com.reactorize.env.loadedfilepath ) reactor?>
</div id='Images'>
<select id="planetlist" onchange="ChangeImage();"></select><br/><br/>
<img id="planetimage"></img>
<div id='Images' style='display:none'>
<?reactor bbdev_LoadImages( $PlanetImageField ; $PlanetNameField ; $com.reactorize.env.loadedfilepath ) reactor?>
</div id='Images'>
FMLink = 'FM.link';
PlanetNameField = '<?Reactor bbdev_Field( $PlanetNameField ) Reactor?>';
FMTableOccurrenceName = '<?Reactor bbdev_TO( $PlanetNameField ) Reactor?>';
FunctionWhereClause = '<?Reactor bbdev_Relationship( bbdev_TO( $PlanetNameField ) ) Reactor?>';
function GetData() {
QueryData = FRTB.find(
FMTableOccurrenceName + '::' + PlanetNameField
).where(FunctionWhereClause).send(function(response){
for ( var i=0; i < response.data.length; i++) {
planetname = response.data[i][FMTableOccurrenceName + '::' + PlanetNameField];
x = document.getElementById("planetlist")
var option = document.createElement("option");
option.text = planetname;
x.add(option);
}
ChangeImage();
});
}
function ChangeImage() {
planetname = document.getElementById("planetlist").options[document.getElementById("planetlist").selectedIndex].value;
document.getElementById("planetimage").src = planetname + ".png";
}
GetData();