* Examples added

git-svn-id: trunk@15333 -
This commit is contained in:
michael 2010-05-27 14:06:12 +00:00
parent 6a5318f1b9
commit ef213e67d6
71 changed files with 4194 additions and 0 deletions

70
.gitattributes vendored
View File

@ -2169,6 +2169,76 @@ packages/fcl-res/xml/versiontypes.xml svneol=native#text/plain
packages/fcl-res/xml/winpeimagereader.xml svneol=native#text/plain
packages/fcl-web/Makefile svneol=native#text/plain
packages/fcl-web/Makefile.fpc svneol=native#text/plain
packages/fcl-web/examples/webdata/demo/createusers.lpi svneol=native#text/plain
packages/fcl-web/examples/webdata/demo/createusers.lpr svneol=native#text/plain
packages/fcl-web/examples/webdata/demo/extgrid-json.html svneol=native#text/plain
packages/fcl-web/examples/webdata/demo/extgrid-json.js svneol=native#text/plain
packages/fcl-web/examples/webdata/demo/extgrid-xml.html svneol=native#text/plain
packages/fcl-web/examples/webdata/demo/extgrid-xml.js svneol=native#text/plain
packages/fcl-web/examples/webdata/demo/extgrid.lpi svneol=native#text/plain
packages/fcl-web/examples/webdata/demo/extgrid.lpr svneol=native#text/plain
packages/fcl-web/examples/webdata/demo/lazwebdata.pas svneol=native#text/plain
packages/fcl-web/examples/webdata/demo/reglazwebdata.pp svneol=native#text/plain
packages/fcl-web/examples/webdata/demo/wmusers.lfm svneol=native#text/plain
packages/fcl-web/examples/webdata/demo/wmusers.lrs svneol=native#text/plain
packages/fcl-web/examples/webdata/demo/wmusers.pp svneol=native#text/plain
packages/fcl-web/examples/webdata/demo2/extgrid-json.html svneol=native#text/plain
packages/fcl-web/examples/webdata/demo2/extgrid-json.js svneol=native#text/plain
packages/fcl-web/examples/webdata/demo2/extgrid-xml.html svneol=native#text/plain
packages/fcl-web/examples/webdata/demo2/extgrid-xml.js svneol=native#text/plain
packages/fcl-web/examples/webdata/demo2/extgrid.lpi svneol=native#text/plain
packages/fcl-web/examples/webdata/demo2/extgrid.lpr svneol=native#text/plain
packages/fcl-web/examples/webdata/demo2/wmusers.lfm svneol=native#text/plain
packages/fcl-web/examples/webdata/demo2/wmusers.lrs svneol=native#text/plain
packages/fcl-web/examples/webdata/demo2/wmusers.pp svneol=native#text/plain
packages/fcl-web/examples/webdata/demo3/extgrid-json.html svneol=native#text/plain
packages/fcl-web/examples/webdata/demo3/extgrid-json.js svneol=native#text/plain
packages/fcl-web/examples/webdata/demo3/extgrid-xml.html svneol=native#text/plain
packages/fcl-web/examples/webdata/demo3/extgrid-xml.js svneol=native#text/plain
packages/fcl-web/examples/webdata/demo3/extgrid.lpi svneol=native#text/plain
packages/fcl-web/examples/webdata/demo3/extgrid.lpr svneol=native#text/plain
packages/fcl-web/examples/webdata/demo3/tralala.lfm svneol=native#text/plain
packages/fcl-web/examples/webdata/demo3/tralala.lrs svneol=native#text/plain
packages/fcl-web/examples/webdata/demo3/tralala.pp svneol=native#text/plain
packages/fcl-web/examples/webdata/demo3/wmusers.lfm svneol=native#text/plain
packages/fcl-web/examples/webdata/demo3/wmusers.lrs svneol=native#text/plain
packages/fcl-web/examples/webdata/demo3/wmusers.pp svneol=native#text/plain
packages/fcl-web/examples/webdata/demo4/dmusers.lfm svneol=native#text/plain
packages/fcl-web/examples/webdata/demo4/dmusers.lrs svneol=native#text/plain
packages/fcl-web/examples/webdata/demo4/dmusers.pp svneol=native#text/plain
packages/fcl-web/examples/webdata/demo4/extgrid-json.html svneol=native#text/plain
packages/fcl-web/examples/webdata/demo4/extgrid-json.js svneol=native#text/plain
packages/fcl-web/examples/webdata/demo4/extgrid-xml.html svneol=native#text/plain
packages/fcl-web/examples/webdata/demo4/extgrid-xml.js svneol=native#text/plain
packages/fcl-web/examples/webdata/demo4/extgrid.lpi svneol=native#text/plain
packages/fcl-web/examples/webdata/demo4/extgrid.lpr svneol=native#text/plain
packages/fcl-web/examples/webdata/demo4/wmjsonusers.lfm svneol=native#text/plain
packages/fcl-web/examples/webdata/demo4/wmjsonusers.lrs svneol=native#text/plain
packages/fcl-web/examples/webdata/demo4/wmjsonusers.pp svneol=native#text/plain
packages/fcl-web/examples/webdata/demo4/wmxmlusers.lfm svneol=native#text/plain
packages/fcl-web/examples/webdata/demo4/wmxmlusers.lrs svneol=native#text/plain
packages/fcl-web/examples/webdata/demo4/wmxmlusers.pp svneol=native#text/plain
packages/fcl-web/examples/webdata/demo5/extgrid-json.html svneol=native#text/plain
packages/fcl-web/examples/webdata/demo5/extgrid-json.js svneol=native#text/plain
packages/fcl-web/examples/webdata/demo5/extgrid-xml.html svneol=native#text/plain
packages/fcl-web/examples/webdata/demo5/extgrid-xml.js svneol=native#text/plain
packages/fcl-web/examples/webdata/demo5/extgrid.lpi svneol=native#text/plain
packages/fcl-web/examples/webdata/demo5/extgrid.lpr svneol=native#text/plain
packages/fcl-web/examples/webdata/demo5/wmusers.lfm svneol=native#text/plain
packages/fcl-web/examples/webdata/demo5/wmusers.lrs svneol=native#text/plain
packages/fcl-web/examples/webdata/demo5/wmusers.pp svneol=native#text/plain
packages/fcl-web/examples/webdata/demo6/extgrid-json.html svneol=native#text/plain
packages/fcl-web/examples/webdata/demo6/extgrid-json.js svneol=native#text/plain
packages/fcl-web/examples/webdata/demo6/extgrid-xml.html svneol=native#text/plain
packages/fcl-web/examples/webdata/demo6/extgrid-xml.js svneol=native#text/plain
packages/fcl-web/examples/webdata/demo6/extgrid.ini svneol=native#text/plain
packages/fcl-web/examples/webdata/demo6/extgrid.lpi svneol=native#text/plain
packages/fcl-web/examples/webdata/demo6/extgrid.lpr svneol=native#text/plain
packages/fcl-web/examples/webdata/demo6/wmusers.lfm svneol=native#text/plain
packages/fcl-web/examples/webdata/demo6/wmusers.lrs svneol=native#text/plain
packages/fcl-web/examples/webdata/demo6/wmusers.pp svneol=native#text/plain
packages/fcl-web/examples/webdata/demos.txt svneol=native#text/plain
packages/fcl-web/examples/webdata/users.dbf -text
packages/fcl-web/fpmake.pp svneol=native#text/plain
packages/fcl-web/fptemplate.txt svneol=native#text/plain
packages/fcl-web/src/base/README.txt svneol=native#text/plain

View File

@ -0,0 +1,77 @@
<?xml version="1.0"?>
<CONFIG>
<ProjectOptions>
<Version Value="7"/>
<General>
<Flags>
<MainUnitHasCreateFormStatements Value="False"/>
<MainUnitHasTitleStatement Value="False"/>
</Flags>
<MainUnit Value="0"/>
<TargetFileExt Value=""/>
<Icon Value="0"/>
<UseXPManifest Value="True"/>
</General>
<VersionInfo>
<ProjectVersion Value=""/>
<Language Value=""/>
<CharSet Value=""/>
</VersionInfo>
<PublishOptions>
<Version Value="2"/>
<IgnoreBinaries Value="False"/>
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
<ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
</PublishOptions>
<RunParams>
<local>
<FormatVersion Value="1"/>
<LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
</local>
</RunParams>
<Units Count="2">
<Unit0>
<Filename Value="createusers.lpr"/>
<IsPartOfProject Value="True"/>
<UnitName Value="createusers"/>
<CursorPos X="16" Y="35"/>
<TopLine Value="15"/>
<UsageCount Value="20"/>
</Unit0>
<Unit1>
<Filename Value="../../fpc/packages/fcl-db/src/dbase/dbf.pas"/>
<UnitName Value="dbf"/>
<CursorPos X="3" Y="1477"/>
<TopLine Value="1436"/>
<UsageCount Value="10"/>
</Unit1>
</Units>
<JumpHistory Count="0" HistoryIndex="-1"/>
</ProjectOptions>
<CompilerOptions>
<Version Value="8"/>
<Target>
<Filename Value="createusers"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)/"/>
<UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Other>
<CompilerPath Value="$(CompPath)"/>
</Other>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,136 @@
program createusers;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils, dbf, CustApp, db
{ you can add units after this };
type
{ TMyApplication }
TMyApplication = class(TCustomApplication)
private
procedure CreateUsers(DS: TDataset);
protected
procedure DoRun; override;
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
procedure WriteHelp; virtual;
end;
{ TMyApplication }
Type
TUserRecord = Record
L,N,E : string;
end;
Const
UserCount = 8;
Users : Array[1..UserCount] of TUserRecord = (
(L:'Daniel';N:'Daniel mantione'; E:'daniel@freepascal.org'),
(L:'Florian';N:'Florian Klaempfl'; E:'florian@freepascal.org'),
(L:'Joost';N:'Joost van der Sluis'; E:'joost@freepascal.org'),
(L:'Jonas';N:'Jonas Maebe'; E:'jonas@freepascal.org'),
(L:'Michael';N:'Michael van canneyt'; E:'michael@freepascal.org'),
(L:'Marco';N:'Marco Van De Voort'; E:'marco@freepascal.org'),
(L:'Pierre';N:'Pierre Muller'; E:'pierre@freepascal.org'),
(L:'Tomas';N:'Tomas Hajny'; E:'tomas@freepascal.org')
) ;
procedure TMyApplication.CreateUsers(DS : TDataset);
Var
I : integer;
begin
For I:=1 to UserCount do
begin
DS.Append;
DS.FieldByName('Login').AsString:=Users[i].L;
DS.FieldByName('Name').AsString:=Users[i].N;
DS.FieldByName('Email').AsString:=Users[i].E;
If Random(2)<1 then
DS.FieldByname('LastLogin').AsDatetime:=Date-Random(10);
DS.Post;
end;
end;
procedure TMyApplication.DoRun;
var
ErrorMsg: String;
DB : TDBF;
begin
// quick check parameters
ErrorMsg:=CheckOptions('h','help');
if ErrorMsg<>'' then begin
ShowException(Exception.Create(ErrorMsg));
Terminate;
Exit;
end;
// parse parameters
if HasOption('h','help') then begin
WriteHelp;
Terminate;
Exit;
end;
{ add your program here }
DB:=TDBF.Create(Self);
try
With DB.FieldDefs do
begin
Add('ID',ftAutoInc,0,True);
Add('Login',ftString,30,true);
Add('Name',ftString,50,True);
Add('Email',ftString,50,False);
Add('LastLogin',ftDate,0,False);
end;
DB.TableName:='users.dbf';
DB.TableLevel:=7;
DB.CreateTable;
DB.Open;
CreateUsers(DB);
finally
DB.Free;
end;
// stop program loop
Terminate;
end;
constructor TMyApplication.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
StopOnException:=True;
end;
destructor TMyApplication.Destroy;
begin
inherited Destroy;
end;
procedure TMyApplication.WriteHelp;
begin
{ add your help code here }
writeln('Usage: ',ExeName,' -h');
end;
var
Application: TMyApplication;
{$IFDEF WINDOWS}{$R createusers.rc}{$ENDIF}
begin
Application:=TMyApplication.Create(nil);
Application.Title:='My Application';
Application.Run;
Application.Free;
end.

View File

@ -0,0 +1,11 @@
<html>
<head>
<title>ExtJS JSON Data demo</title>
<link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css"/>
<script src="/ext/adapter/ext/ext-base.js"></script>
<script src="/ext/ext-all-debug.js"></script>
<script src="extgrid-json.js"></script>
</head>
<body>
</body>
</html>

View File

@ -0,0 +1,95 @@
Ext.ns('FPC');
FPC.ShowPage = function () {
var myproxy = new Ext.data.HttpProxy ( {
api : {
read: "extgrid.cgi/Provider/Read/name/",
update: "extgrid.cgi/Provider/Update/name/",
create: "extgrid.cgi/Provider/Insert/name/",
destroy: "extgrid.cgi/Provider/Delete/name/"
}
});
var myreader = new Ext.data.JsonReader ({
root: "rows",
idProperty: "ID",
messageProperty: 'message', // Must be specified here
fields: ["ID","LOGIN","NAME","EMAIL", "LASTLOGIN"]
});
var mywriter = new Ext.data.JsonWriter({
encode: true,
writeAllFields: true,
idProperty: "ID"
});
var data = new Ext.data.Store({
proxy: myproxy,
reader: myreader,
writer: mywriter,
autoSave: false,
idProperty: "ID",
});
// Listen to errors.
data.addListener('exception', function(proxy, type, action, options, res) {
if (type === 'remote') {
Ext.Msg.show({
title: 'REMOTE EXCEPTION',
msg: res.message,
icon: Ext.MessageBox.ERROR,
buttons: Ext.Msg.OK
});
}
});
data.load({ params:{start: 0, limit: 30}});
var grid = new Ext.grid.EditorGridPanel({
renderTo: Ext.getBody(),
frame: true,
title: "Known users",
height: 600,
width: 800,
store: data,
columns: [
{header: 'ID', dataIndex: "ID", sortable: true, hidden: true},
{header: 'Login', dataIndex: "LOGIN", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Name', dataIndex: "NAME", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Email', dataIndex: "EMAIL", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Last login', dataIndex: "LASTLOGIN", sortable: true, editor: new Ext.form.TextField()},
],
bbar: new Ext.PagingToolbar({
pageSize: 30,
store: data,
displayInfo: true
}),
tbar : [{
text: 'Add',
iconCls: 'icon-add',
handler: function(btn, ev) {
var u = new grid.store.recordType();
grid.stopEditing();
grid.store.insert(0, u);
grid.startEditing(0, 1);
},
scope: grid
}, '-', {
text: 'Delete',
iconCls: 'icon-delete',
handler: function(btn, ev) {
var index = grid.getSelectionModel().getSelectedCell();
if (!index) {
return false;
}
var rec = grid.store.getAt(index[0]);
grid.store.remove(rec);
},
scope: grid
}, '-', {
text: 'Save',
iconCls: 'icon-save',
handler: function(btn, ev) {
grid.store.save();
},
scope: grid
}
]
});
grid.show();
}
Ext.onReady(FPC.ShowPage);

View File

@ -0,0 +1,11 @@
<html>
<head>
<title>ExtJS XML Data demo</title>
<link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css"/>
<script src="/ext/adapter/ext/ext-base.js"></script>
<script src="/ext/ext-all-debug.js"></script>
<script src="extgrid-xml.js"></script>
</head>
<body>
</body>
</html>

View File

@ -0,0 +1,98 @@
Ext.ns('FPC');
FPC.ShowPage = function () {
var myproxy = new Ext.data.HttpProxy ( {
api : {
read: "extgrid.cgi/Provider/Read/name/?format=xml",
update: "extgrid.cgi/Provider/Update/name/?format=xml",
create: "extgrid.cgi/Provider/Insert/name/?format=xml",
destroy: "extgrid.cgi/Provider/Delete/name/?format=xml",
}
});
var myreader = new Ext.data.XmlReader ({
totalProperty: "total",
record: "row",
idProperty: "ID",
successProperty: "success",
messageProperty: "message",
fields: ["ID", "LOGIN", "NAME","EMAIL","LASTLOGIN"]
});
var mywriter = new Ext.data.XmlWriter({
encode: true,
writeAllFields: true,
idProperty: "ID",
root: "records"
});
var data = new Ext.data.Store({
proxy: myproxy,
reader: myreader,
writer: mywriter,
autoSave: false,
idProperty: "ID",
});
// Listen to errors.
data.addListener('exception', function(proxy, type, action, options, res) {
if (type === 'remote') {
Ext.Msg.show({
title: 'REMOTE EXCEPTION',
msg: res.message,
icon: Ext.MessageBox.ERROR,
buttons: Ext.Msg.OK
});
}
});
data.load({ params:{start: 0, limit: 30}});
var grid = new Ext.grid.EditorGridPanel({
renderTo: Ext.getBody(),
frame: true,
title: "Known users",
height: 600,
width: 800,
store: data,
columns: [
{header: 'ID', dataIndex: "ID", sortable: true, hidden: true},
{header: 'Login', dataIndex: "LOGIN", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Name', dataIndex: "NAME", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Email', dataIndex: "EMAIL", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Last login', dataIndex: "LASTLOGIN", sortable: true, editor: new Ext.form.TextField()},
],
bbar: new Ext.PagingToolbar({
pageSize: 30,
store: data,
displayInfo: true
}),
tbar : [{
text: 'Add',
iconCls: 'icon-add',
handler: function(btn, ev) {
var u = new grid.store.recordType();
grid.stopEditing();
grid.store.insert(0, u);
grid.startEditing(0, 1);
},
scope: grid
}, '-', {
text: 'Delete',
iconCls: 'icon-delete',
handler: function(btn, ev) {
var index = grid.getSelectionModel().getSelectedCell();
if (!index) {
return false;
}
var rec = grid.store.getAt(index[0]);
grid.store.remove(rec);
},
scope: grid
}, '-', {
text: 'Save',
iconCls: 'icon-save',
handler: function(btn, ev) {
grid.store.save();
},
scope: grid
}
]
});
grid.show();
}
Ext.onReady(FPC.ShowPage);

View File

@ -0,0 +1,73 @@
<?xml version="1.0"?>
<CONFIG>
<ProjectOptions>
<Version Value="7"/>
<General>
<Flags>
<SaveClosedFiles Value="False"/>
<SaveOnlyProjectUnits Value="True"/>
<MainUnitHasCreateFormStatements Value="False"/>
<Runnable Value="False"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<MainUnit Value="0"/>
<TargetFileExt Value=""/>
<Icon Value="0"/>
<UseXPManifest Value="True"/>
</General>
<VersionInfo>
<ProjectVersion Value=""/>
</VersionInfo>
<PublishOptions>
<Version Value="2"/>
<IgnoreBinaries Value="False"/>
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
<ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
</PublishOptions>
<RunParams>
<local>
<FormatVersion Value="1"/>
<LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
</local>
</RunParams>
<RequiredPackages Count="3">
<Item1>
<PackageName Value="DBFLaz"/>
<MinVersion Minor="1" Release="1" Valid="True"/>
</Item1>
<Item2>
<PackageName Value="WebLaz"/>
</Item2>
<Item3>
<PackageName Value="FCL"/>
</Item3>
</RequiredPackages>
<Units Count="2">
<Unit0>
<Filename Value="extgrid.lpr"/>
<IsPartOfProject Value="True"/>
<UnitName Value="extgrid"/>
</Unit0>
<Unit1>
<Filename Value="wmusers.pp"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="FPWebModule1"/>
<ResourceBaseClass Value="DataModule"/>
<UnitName Value="wmusers"/>
</Unit1>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="8"/>
<Target>
<Filename Value="extgrid.cgi"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)/"/>
<OtherUnitFiles Value="/home/michael/public_html/extjs/"/>
</SearchPaths>
<Other>
<CompilerPath Value="$(CompPath)"/>
</Other>
</CompilerOptions>
</CONFIG>

View File

@ -0,0 +1,14 @@
program extgrid;
{$mode objfpc}{$H+}
uses
fpCGI, wmusers;
{$IFDEF WINDOWS}{$R extgrid.rc}{$ENDIF}
begin
Application.Initialize;
Application.Run;
end.

View File

@ -0,0 +1,22 @@
{ This file was automatically created by Lazarus. do not edit!
This source is only used to compile and install the package.
}
unit lazwebdata;
interface
uses
reglazwebdata, extjsjson, extjsxml, fpextjs, fpwebdata, sqldbwebdata,
LazarusPackageIntf;
implementation
procedure Register;
begin
RegisterUnit('reglazwebdata', @reglazwebdata.Register);
end;
initialization
RegisterPackage('lazwebdata', @Register);
end.

View File

@ -0,0 +1,78 @@
unit reglazwebdata;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, fpwebdata, sqldbwebdata, LazIDEIntf, ProjectIntf, fpextjs, extjsjson, extjsxml;
Type
{ TFileDescWebProviderDataModule }
TFileDescWebProviderDataModule = class(TFileDescPascalUnitWithResource)
public
constructor Create; override;
function GetInterfaceUsesSection: string; override;
function GetLocalizedName: string; override;
function GetLocalizedDescription: string; override;
function GetImplementationSource(const Filename, SourceName, ResourceName: string): string;override;
end;
Procedure Register;
Var
FileDescriptorWebProviderDataModule: TFileDescWebProviderDataModule;
implementation
uses FormEditingIntf;
constructor TFileDescWebProviderDataModule.Create;
begin
inherited Create;
Name:='Web DataProvider Module';
ResourceClass:=TFPWebProviderDataModule;
UseCreateFormStatements:=False;
end;
function TFileDescWebProviderDataModule.GetInterfaceUsesSection: string;
begin
Result:=inherited GetInterfaceUsesSection;
Result:=Result+', HTTPDefs, websession, fpHTTP, fpWeb, fpwebdata';
end;
function TFileDescWebProviderDataModule.GetLocalizedName: string;
begin
Result:='Web DataProvider Module';
end;
function TFileDescWebProviderDataModule.GetLocalizedDescription: string;
begin
Result:='WEB DataProvider Module'#13
+'A datamodule to handle data requests for WEB (HTTP) applications using WebDataProvider components.';
end;
function TFileDescWebProviderDataModule.GetImplementationSource(const Filename,
SourceName, ResourceName: string): string;
begin
Result:=Inherited GetImplementationSource(FileName,SourceName,ResourceName);
Result:=Result+' RegisterHTTPModule(''T'+ResourceName+''',T'+ResourceName+');'+LineEnding;
end;
Procedure Register;
begin
RegisterComponents('fpWeb',[TWebdataInputAdaptor,TFPWebDataProvider, TSQLDBWebDataProvider,
TExtJSJSonWebdataInputAdaptor,TExtJSJSONDataFormatter,
TExtJSXMLWebdataInputAdaptor,TExtJSXMLDataFormatter]);
FileDescriptorWebProviderDataModule:=TFileDescWebProviderDataModule.Create;
RegisterProjectFileDescriptor(FileDescriptorWebProviderDataModule);
FormEditingHook.RegisterDesignerBaseClass(TFPCustomWebProviderDataModule);
FormEditingHook.RegisterDesignerBaseClass(TFPWebProviderDataModule);
end;
end.

View File

@ -0,0 +1,36 @@
object FPWebModule1: TFPWebModule1
OldCreateOrder = False
Actions = <
item
Name = 'Read'
Default = False
OnRequest = TFPWebActions0Request
end
item
Name = 'Insert'
Default = False
OnRequest = TFPWebActions1Request
end
item
Name = 'Update'
Default = False
OnRequest = TFPWebActions2Request
end
item
Name = 'Delete'
Default = False
OnRequest = TFPWebActions3Request
end>
CreateSession = False
Height = 300
HorizontalOffset = 696
VerticalOffset = 366
Width = 400
object Dbf1: TDbf
IndexDefs = <>
TableLevel = 4
FilterOptions = []
left = 23
top = 53
end
end

View File

@ -0,0 +1,12 @@
{ This is an automatically generated lazarus resource file }
LazarusResources.Add('TFPWebModule1','FORMDATA',[
'TPF0'#13'TFPWebModule1'#12'FPWebModule1'#14'OldCreateOrder'#8#7'Actions'#14#1
+#4'Name'#6#4'Read'#7'Default'#8#9'OnRequest'#7#21'TFPWebActions0Request'#0#1
+#4'Name'#6#6'Insert'#7'Default'#8#9'OnRequest'#7#21'TFPWebActions1Request'#0
+#1#4'Name'#6#6'Update'#7'Default'#8#9'OnRequest'#7#21'TFPWebActions2Request'
+#0#1#4'Name'#6#6'Delete'#7'Default'#8#9'OnRequest'#7#21'TFPWebActions3Reques'
+'t'#0#0#13'CreateSession'#8#6'Height'#3','#1#16'HorizontalOffset'#3#184#2#14
+'VerticalOffset'#3'n'#1#5'Width'#3#144#1#0#4'TDbf'#4'Dbf1'#9'IndexDefs'#14#0
+#10'TableLevel'#2#4#13'FilterOptions'#11#0#4'left'#2#23#3'top'#2'5'#0#0#0
]);

View File

@ -0,0 +1,337 @@
unit wmusers;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, HTTPDefs, websession, fpHTTP, fpWeb,
db, dbf, fpwebdata, fpextjs,extjsjson,extjsxml;
type
{ TFPWebModule1 }
TFPWebModule1 = class(TFPWebModule)
Dbf1: TDbf;
procedure TFPWebActions0Request(Sender: TObject; ARequest: TRequest;
AResponse: TResponse; var Handled: Boolean);
procedure TFPWebActions1Request(Sender: TObject; ARequest: TRequest;
AResponse: TResponse; var Handled: Boolean);
procedure TFPWebActions2Request(Sender: TObject; ARequest: TRequest;
AResponse: TResponse; var Handled: Boolean);
procedure TFPWebActions3Request(Sender: TObject; ARequest: TRequest;
AResponse: TResponse; var Handled: Boolean);
private
{ private declarations }
public
{ public declarations }
end;
var
FPWebModule1: TFPWebModule1;
implementation
{$define wmdebug}
{$ifdef wmdebug}
uses dbugintf;
{$endif}
{ TFPWebModule1 }
procedure TFPWebModule1.TFPWebActions0Request(Sender: TObject;
ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
Var
PN : String;
P : TFPWebDataProvider;
F : TExtJSDataFormatter;
DS : TDatasource;
M : TMemoryStream;
L : Text;
begin
// Providername;
PN:=ARequest.GetNextPathInfo;
// P:=GetWebDataProvider(PN);
P:=TFPWebDataProvider.Create(Self);
try
P.Adaptor:=TWebDataInputAdaptor.Create(Self);
P.Adaptor.Request:=ARequest;
If Request.QueryFields.values['format']='xml' then
begin
F:=TExtJSXMLDataFormatter.Create(Self);
TExtJSXMLDataFormatter(F).TotalProperty:='total';
AResponse.ContentType:='text/xml';
end
else
F:=TExtJSJSONDataFormatter.Create(Self);
{$ifdef wmdebug} SendDebug(className+' '+F.ClassName);{$endif}
try
DS:=TDatasource.Create(Self);
try
DBF1.TableName:=ExtractFilePath(ParamStr(0))+'users.dbf';
DS.Dataset:=DBf1;
DBF1.Open;
try
F.ADaptor:=P.Adaptor;
P.Datasource:=DS;
P.Adaptor.Action:=wdaRead;
P.ApplyParams;
F.Provider:=P;
M:=TMemoryStream.Create;
try
F.GetContent(ARequest,M,Handled);
M.Position:=0;
Response.ContentStream:=M;
Response.SendResponse;
Response.ContentStream:=Nil;
With TFileStream.Create('/tmp/data.xml',fmCreate) do
try
CopyFrom(M,0);
finally
Free;
end;
finally
M.Free;
end;
finally
DBF1.Close;
end;
finally
DS.Free;
end;
finally
F.Free;
end;
finally
P.Free;
end;
end;
procedure TFPWebModule1.TFPWebActions1Request(Sender: TObject;
ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
Var
PN : String;
P : TFPWebDataProvider;
F : TExtJSDataFormatter;
DS : TDatasource;
M : TMemoryStream;
L : Text;
begin
// Providername;
PN:=ARequest.GetNextPathInfo;
// P:=GetWebDataProvider(PN);
P:=TFPWebDataProvider.Create(Self);
try
P.IDFieldName:='ID';
If Request.QueryFields.values['format']='xml' then
begin
F:=TExtJSXMLDataFormatter.Create(Self);
AResponse.ContentType:='text/xml';
P.Adaptor:=TWebDataInputAdaptor.Create(Self);
end
else
begin
F:=TExtJSJSONDataFormatter.Create(Self);
P.Adaptor:=TExtJSJSonWebdataInputAdaptor.Create(Self);
end;
P.Adaptor.Request:=ARequest;
{$ifdef wmdebug} SendDebug(className+' '+F.ClassName);{$endif}
try
DS:=TDatasource.Create(Self);
try
DBF1.TableName:=ExtractFilePath(ParamStr(0))+'users.dbf';
DS.Dataset:=DBf1;
DBF1.Open;
try
F.ADaptor:=P.Adaptor;
P.Datasource:=DS;
P.Adaptor.Action:=wdaInsert;
P.ApplyParams;
F.Provider:=P;
M:=TMemoryStream.Create;
try
F.GetContent(ARequest,M,Handled);
M.Position:=0;
Response.ContentStream:=M;
Response.SendResponse;
Response.ContentStream:=Nil;
With TFileStream.Create('/tmp/data.xml',fmCreate) do
try
CopyFrom(M,0);
finally
Free;
end;
finally
M.Free;
end;
finally
DBF1.Close;
end;
finally
DS.Free;
end;
finally
F.Free;
end;
finally
P.Free;
end;
end;
procedure TFPWebModule1.TFPWebActions2Request(Sender: TObject;
ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
Var
PN : String;
P : TFPWebDataProvider;
F : TExtJSDataFormatter;
DS : TDatasource;
M : TMemoryStream;
L : Text;
begin
// Providername;
{$ifdef wmdebug} SendDebug('Update request received');{$endif}
PN:=ARequest.GetNextPathInfo;
// P:=GetWebDataProvider(PN);
P:=TFPWebDataProvider.Create(Self);
try
P.IDFieldName:='ID';
If Request.QueryFields.values['format']='xml' then
begin
{$ifdef wmdebug} SendDebug('Update request received in XML');{$endif}
F:=TExtJSXMLDataFormatter.Create(Self);
AResponse.ContentType:='text/xml';
P.Adaptor:=TWebDataInputAdaptor.Create(Self);
end
else
begin
F:=TExtJSJSONDataFormatter.Create(Self);
P.Adaptor:=TExtJSJSonWebdataInputAdaptor.Create(Self);
end;
P.Adaptor.Request:=ARequest;
{$ifdef wmdebug} SendDebug(className+' '+F.ClassName);{$endif}
try
DS:=TDatasource.Create(Self);
try
DBF1.TableName:=ExtractFilePath(ParamStr(0))+'users.dbf';
DS.Dataset:=DBf1;
DBF1.Open;
try
F.ADaptor:=P.Adaptor;
P.Datasource:=DS;
P.Adaptor.Action:=wdaUpdate;
P.ApplyParams;
F.Provider:=P;
M:=TMemoryStream.Create;
try
F.GetContent(ARequest,M,Handled);
M.Position:=0;
Response.ContentStream:=M;
Response.SendResponse;
Response.ContentStream:=Nil;
With TFileStream.Create('/tmp/data.xml',fmCreate) do
try
CopyFrom(M,0);
finally
Free;
end;
finally
M.Free;
end;
finally
DBF1.Close;
end;
finally
DS.Free;
end;
finally
F.Free;
end;
finally
P.Free;
end;
end;
procedure TFPWebModule1.TFPWebActions3Request(Sender: TObject;
ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
Var
PN : String;
P : TFPWebDataProvider;
F : TExtJSDataFormatter;
DS : TDatasource;
M : TMemoryStream;
L : Text;
begin
// Providername;
PN:=ARequest.GetNextPathInfo;
// P:=GetWebDataProvider(PN);
P:=TFPWebDataProvider.Create(Self);
try
P.IDFieldName:='ID';
If Request.QueryFields.values['format']='xml' then
begin
F:=TExtJSXMLDataFormatter.Create(Self);
AResponse.ContentType:='text/xml';
P.Adaptor:=TWebDataInputAdaptor.Create(Self);
end
else
begin
F:=TExtJSJSONDataFormatter.Create(Self);
P.Adaptor:=TExtJSJSonWebdataInputAdaptor.Create(Self);
end;
P.Adaptor.Request:=ARequest;
{$ifdef wmdebug} SendDebug('className '+F.ClassName);{$endif}
try
DS:=TDatasource.Create(Self);
try
DBF1.TableName:=ExtractFilePath(ParamStr(0))+'users.dbf';
DS.Dataset:=DBf1;
DBF1.Open;
try
F.ADaptor:=P.Adaptor;
P.Datasource:=DS;
P.Adaptor.Action:=wdaDelete;
P.ApplyParams;
F.Provider:=P;
M:=TMemoryStream.Create;
try
F.GetContent(ARequest,M,Handled);
M.Position:=0;
Response.ContentStream:=M;
Response.SendResponse;
Response.ContentStream:=Nil;
With TFileStream.Create('/tmp/data.xml',fmCreate) do
try
CopyFrom(M,0);
finally
Free;
end;
finally
M.Free;
end;
finally
DBF1.Close;
end;
finally
DS.Free;
end;
finally
F.Free;
end;
finally
P.Free;
end;
end;
initialization
{$I wmusers.lrs}
RegisterHTTPModule('Provider', TFPWebModule1);
end.

View File

@ -0,0 +1,11 @@
<html>
<head>
<title>ExtJS JSON Data demo</title>
<link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css"/>
<script src="/ext/adapter/ext/ext-base.js"></script>
<script src="/ext/ext-all-debug.js"></script>
<script src="extgrid-json.js"></script>
</head>
<body>
</body>
</html>

View File

@ -0,0 +1,97 @@
Ext.ns('FPC');
FPC.ShowPage = function () {
var myproxy = new Ext.data.HttpProxy ( {
api : {
read: "extgrid.cgi/Provider/Name/Read/",
update: "extgrid.cgi/Provider/Name/Update/",
create: "extgrid.cgi/Provider/Name/Insert/",
destroy: "extgrid.cgi/Provider/Name/Delete/"
}
});
var myreader = new Ext.data.JsonReader ({
root: "rows",
idProperty: "ID",
messageProperty: 'message', // Must be specified here
fields: ["ID","LOGIN","NAME","EMAIL", "LASTLOGIN"]
});
var mywriter = new Ext.data.JsonWriter({
encode: true,
writeAllFields: true,
idProperty: "ID"
});
var data = new Ext.data.Store({
proxy: myproxy,
reader: myreader,
writer: mywriter,
autoSave: false,
idProperty: "ID",
});
// Listen to errors.
data.addListener('exception', function(proxy, type, action, options, res) {
if (type === 'remote') {
Ext.Msg.show({
title: 'REMOTE EXCEPTION',
msg: res.message,
icon: Ext.MessageBox.ERROR,
buttons: Ext.Msg.OK
});
}
});
data.load({ params:{start: 0, limit: 30}});
var grid = new Ext.grid.EditorGridPanel({
renderTo: Ext.getBody(),
frame: true,
title: "Known users",
height: 600,
width: 800,
store: data,
columns: [
{header: 'ID', dataIndex: "ID", sortable: true, hidden: true},
{header: 'Login', dataIndex: "LOGIN", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Name', dataIndex: "NAME", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Email', dataIndex: "EMAIL", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Last login', dataIndex: "LASTLOGIN", sortable: true, editor: new Ext.form.TextField()},
],
bbar: new Ext.PagingToolbar({
pageSize: 30,
store: data,
displayInfo: true
}),
tbar : [{
text: 'Add',
iconCls: 'icon-add',
handler: function(btn, ev) {
var u = new grid.store.recordType();
grid.stopEditing();
grid.store.insert(0, u);
grid.startEditing(0, 1);
},
scope: grid
}, '-', {
text: 'Delete',
iconCls: 'icon-delete',
handler: function(btn, ev) {
var index = grid.getSelectionModel().getSelectedCell();
if (!index) {
return false;
}
var rec = grid.store.getAt(index[0]);
grid.store.remove(rec);
},
scope: grid
}, '-', {
text: 'Save',
iconCls: 'icon-save',
handler: function(btn, ev) {
grid.store.save();
},
scope: grid
}
]
// F.ContentToStream(M);
});
grid.show();
}
Ext.onReady(FPC.ShowPage);

View File

@ -0,0 +1,11 @@
<html>
<head>
<title>ExtJS XML Data demo</title>
<link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css"/>
<script src="/ext/adapter/ext/ext-base.js"></script>
<script src="/ext/ext-all-debug.js"></script>
<script src="extgrid-xml.js"></script>
</head>
<body>
</body>
</html>

View File

@ -0,0 +1,100 @@
Ext.ns('FPC');
FPC.ShowPage = function () {
var myproxy = new Ext.data.HttpProxy ( {
api : {
read: "extgrid.cgi/Provider/Name/Read/?format=xml",
update: "extgrid.cgi/Provider/Name/Update/?format=xml",
create: "extgrid.cgi/Provider/Name/Insert/?format=xml",
destroy: "extgrid.cgi/Provider/Name/Delete/?format=xml",
}
});
var myreader = new Ext.data.XmlReader ({
totalProperty: "total",
record: "row",
idProperty: "ID",
successProperty: "success",
messageProperty: "message",
fields: ["ID", "LOGIN", "NAME","EMAIL","LASTLOGIN"]
});
var mywriter = new Ext.data.XmlWriter({
encode: true,
writeAllFields: true,
idProperty: "ID",
root: "records"
});
var data = new Ext.data.Store({
proxy: myproxy,
reader: myreader,
writer: mywriter,
autoSave: false,
idProperty: "ID",
});
// Listen to errors.
data.addListener('exception', function(proxy, type, action, options, res) {
if (type === 'remote') {
Ext.Msg.show({
title: 'REMOTE EXCEPTION',
msg: res.message,
icon: Ext.MessageBox.ERROR,
buttons: Ext.Msg.OK
});
}
});
data.load({ params:{start: 0, limit: 30}});
var grid = new Ext.grid.EditorGridPanel({
renderTo: Ext.getBody(),
frame: true,
title: "Known users",
height: 600,
width: 800,
store: data,
columns: [
{header: 'ID', dataIndex: "ID", sortable: true, hidden: true},
{header: 'Login', dataIndex: "LOGIN", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Name', dataIndex: "NAME", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Email', dataIndex: "EMAIL", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Last login', dataIndex: "LASTLOGIN", sortable: true, editor: new Ext.form.TextField()},
],
bbar: new Ext.PagingToolbar({
pageSize: 30,
store: data,
displayInfo: true
}),
tbar : [{
text: 'Add',
iconCls: 'icon-add',
handler: function(btn, ev) {
var u = new grid.store.recordType();
grid.stopEditing();
grid.store.insert(0, u);
grid.startEditing(0, 1);
},
scope: grid
}, '-', {
text: 'Delete',
iconCls: 'icon-delete',
handler: function(btn, ev) {
var index = grid.getSelectionModel().getSelectedCell();
if (!index) {
return false;
}
var rec = grid.store.getAt(index[0]);
grid.store.remove(rec);
},
scope: grid
}, '-', {
text: 'Save',
iconCls: 'icon-save',
handler: function(btn, ev) {
grid.store.save();
},
scope: grid
}
]
// F.ContentToStream(M);
});
grid.show();
}
Ext.onReady(FPC.ShowPage);

View File

@ -0,0 +1,84 @@
<?xml version="1.0"?>
<CONFIG>
<ProjectOptions>
<Version Value="7"/>
<General>
<Flags>
<SaveOnlyProjectUnits Value="True"/>
<MainUnitHasCreateFormStatements Value="False"/>
<Runnable Value="False"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<MainUnit Value="0"/>
<TargetFileExt Value=""/>
<Title Value="ExtJS Grid demo for fpwebdata"/>
<Icon Value="0"/>
<UseXPManifest Value="True"/>
</General>
<VersionInfo>
<ProjectVersion Value=""/>
</VersionInfo>
<PublishOptions>
<Version Value="2"/>
<IgnoreBinaries Value="False"/>
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
<ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
</PublishOptions>
<RunParams>
<local>
<FormatVersion Value="1"/>
<LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
</local>
</RunParams>
<RequiredPackages Count="5">
<Item1>
<PackageName Value="lazwebdata"/>
<MinVersion Valid="True"/>
</Item1>
<Item2>
<PackageName Value="DBFLaz"/>
<MinVersion Minor="1" Release="1" Valid="True"/>
</Item2>
<Item3>
<PackageName Value="WebLaz"/>
</Item3>
<Item4>
<PackageName Value="LCL"/>
</Item4>
<Item5>
<PackageName Value="FCL"/>
</Item5>
</RequiredPackages>
<Units Count="2">
<Unit0>
<Filename Value="extgrid.lpr"/>
<IsPartOfProject Value="True"/>
<UnitName Value="extgrid"/>
</Unit0>
<Unit1>
<Filename Value="wmusers.pp"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="FPWebModule1"/>
<ResourceBaseClass Value="DataModule"/>
<UnitName Value="wmusers"/>
</Unit1>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="8"/>
<Target>
<Filename Value="extgrid.cgi"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)/"/>
</SearchPaths>
<CodeGeneration>
<Optimizations>
<OptimizationLevel Value="0"/>
</Optimizations>
</CodeGeneration>
<Other>
<CompilerPath Value="$(CompPath)"/>
</Other>
</CompilerOptions>
</CONFIG>

View File

@ -0,0 +1,16 @@
program extgrid;
{$mode objfpc}{$H+}
uses
{$ifdef unix}cwstring,xmliconv,{$endif}
fpCGI, wmusers;
{$IFDEF WINDOWS}{$R extgrid.rc}{$ENDIF}
begin
Application.Title:='ExtJS Grid demo for fpwebdata';
Application.Initialize;
Application.Run;
end.

View File

@ -0,0 +1,46 @@
object FPWebModule1: TFPWebModule1
OnCreate = DataModuleCreate
OldCreateOrder = False
Actions = <>
OnRequest = DataModuleRequest
CreateSession = False
Height = 300
HorizontalOffset = 477
VerticalOffset = 302
Width = 400
object Dbf1: TDbf
FilePath = '/home/michael/public_html/extjs/demo2/'
IndexDefs = <>
TableName = 'users.dbf'
TableLevel = 4
FilterOptions = []
left = 51
top = 64
end
object ExtJSJSonWebdataInputAdaptor1: TExtJSJSonWebdataInputAdaptor
left = 146
top = 63
end
object ExtJSJSONDataFormatter1: TExtJSJSONDataFormatter
left = 207
top = 61
end
object ExtJSXMLWebdataInputAdaptor1: TExtJSXMLWebdataInputAdaptor
left = 151
top = 101
end
object ExtJSXMLDataFormatter1: TExtJSXMLDataFormatter
left = 211
top = 100
end
object FPWebDataProvider1: TFPWebDataProvider
DataSource = Datasource1
left = 105
top = 89
end
object Datasource1: TDatasource
DataSet = Dbf1
left = 48
top = 104
end
end

View File

@ -0,0 +1,18 @@
{ This is an automatically generated lazarus resource file }
LazarusResources.Add('TFPWebModule1','FORMDATA',[
'TPF0'#13'TFPWebModule1'#12'FPWebModule1'#8'OnCreate'#7#16'DataModuleCreate'
+#14'OldCreateOrder'#8#7'Actions'#14#0#9'OnRequest'#7#17'DataModuleRequest'#13
+'CreateSession'#8#6'Height'#3','#1#16'HorizontalOffset'#3#221#1#14'VerticalO'
+'ffset'#3'.'#1#5'Width'#3#144#1#0#4'TDbf'#4'Dbf1'#8'FilePath'#6'&/home/micha'
+'el/public_html/extjs/demo2/'#9'IndexDefs'#14#0#9'TableName'#6#9'users.dbf'
+#10'TableLevel'#2#4#13'FilterOptions'#11#0#4'left'#2'3'#3'top'#2'@'#0#0#29'T'
+'ExtJSJSonWebdataInputAdaptor'#29'ExtJSJSonWebdataInputAdaptor1'#4'left'#3
+#146#0#3'top'#2'?'#0#0#23'TExtJSJSONDataFormatter'#23'ExtJSJSONDataFormatter'
+'1'#4'left'#3#207#0#3'top'#2'='#0#0#28'TExtJSXMLWebdataInputAdaptor'#28'ExtJ'
+'SXMLWebdataInputAdaptor1'#4'left'#3#151#0#3'top'#2'e'#0#0#22'TExtJSXMLDataF'
+'ormatter'#22'ExtJSXMLDataFormatter1'#4'left'#3#211#0#3'top'#2'd'#0#0#18'TFP'
+'WebDataProvider'#18'FPWebDataProvider1'#10'DataSource'#7#11'Datasource1'#4
+'left'#2'i'#3'top'#2'Y'#0#0#11'TDatasource'#11'Datasource1'#7'DataSet'#7#4'D'
+'bf1'#4'left'#2'0'#3'top'#2'h'#0#0#0
]);

View File

@ -0,0 +1,86 @@
unit wmusers;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, fpwebdata, extjsjson, extjsxml,
HTTPDefs, websession, fpHTTP, fpWeb, dbf, db;
type
{ TFPWebModule1 }
TFPWebModule1 = class(TFPWebModule)
Datasource1: TDatasource;
Dbf1: TDbf;
ExtJSJSONDataFormatter1: TExtJSJSONDataFormatter;
ExtJSJSonWebdataInputAdaptor1: TExtJSJSonWebdataInputAdaptor;
ExtJSXMLDataFormatter1: TExtJSXMLDataFormatter;
ExtJSXMLWebdataInputAdaptor1: TExtJSXMLWebdataInputAdaptor;
FPWebDataProvider1: TFPWebDataProvider;
procedure DataModuleCreate(Sender: TObject);
procedure DataModuleRequest(Sender: TObject; ARequest: TRequest;
AResponse: TResponse; var Handled: Boolean);
private
{ private declarations }
public
{ public declarations }
end;
var
FPWebModule1: TFPWebModule1;
implementation
uses dbugintf;
{ TFPWebModule1 }
procedure TFPWebModule1.DataModuleRequest(Sender: TObject; ARequest: TRequest;
AResponse: TResponse; var Handled: Boolean);
Var
CP : TCustomHTTPDataContentProducer;
M : TMemoryStream;
A : TCustomWebDataInputAdaptor;
PN : String;
begin
PN:=ARequest.GetNextPathInfo;
If ARequest.QueryFields.values['format']='xml' then
begin
A:=ExtJSXMLWebdataInputAdaptor1;
CP:=ExtJSXMLDataFormatter1;
end
else
begin
A:=ExtJSJSONWebdataInputAdaptor1;
cp:=ExtJSJSONDataFormatter1;
end;
FPWebDataProvider1.Adaptor:=A;
CP.Adaptor:=A;
CP.Adaptor.Request:=ARequest;
CP.Provider:=FPWebDataProvider1;
M:=TmemoryStream.Create;
AResponse.ContentStream:=M;
AResponse.ContentType:=CP.DataContentType;
CP.GetContent(ARequest,M,Handled);
M.Position:=0;
AResponse.SendContent;
end;
procedure TFPWebModule1.DataModuleCreate(Sender: TObject);
begin
DBF1.TableName:=ExtractFilePath(ParamStr(0))+'users.dbf';
DBF1.Open;
With DBF1.FieldByname('ID') do
ProviderFlags:=ProviderFlags+[pfInKey];
end;
initialization
{$I wmusers.lrs}
RegisterHTTPModule('Provider', TFPWebModule1);
end.

View File

@ -0,0 +1,11 @@
<html>
<head>
<title>ExtJS JSON Data demo</title>
<link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css"/>
<script src="/ext/adapter/ext/ext-base.js"></script>
<script src="/ext/ext-all-debug.js"></script>
<script src="extgrid-json.js"></script>
</head>
<body>
</body>
</html>

View File

@ -0,0 +1,97 @@
Ext.ns('FPC');
FPC.ShowPage = function () {
var myproxy = new Ext.data.HttpProxy ( {
api : {
read: "extgrid.cgi/Provider/AName/Read/",
update: "extgrid.cgi/Provider/AName/Update/",
create: "extgrid.cgi/Provider/AName/Insert/",
destroy: "extgrid.cgi/Provider/AName/Delete/"
}
});
var myreader = new Ext.data.JsonReader ({
root: "rows",
idProperty: "ID",
messageProperty: 'message', // Must be specified here
fields: ["ID","LOGIN","NAME","EMAIL", "LASTLOGIN"]
});
var mywriter = new Ext.data.JsonWriter({
encode: true,
writeAllFields: true,
idProperty: "ID"
});
var data = new Ext.data.Store({
proxy: myproxy,
reader: myreader,
writer: mywriter,
autoSave: false,
idProperty: "ID",
});
// Listen to errors.
data.addListener('exception', function(proxy, type, action, options, res) {
if (type === 'remote') {
Ext.Msg.show({
title: 'REMOTE EXCEPTION',
msg: res.message,
icon: Ext.MessageBox.ERROR,
buttons: Ext.Msg.OK
});
}
});
data.load({ params:{start: 0, limit: 30}});
var grid = new Ext.grid.EditorGridPanel({
renderTo: Ext.getBody(),
frame: true,
title: "Known users",
height: 600,
width: 800,
store: data,
columns: [
{header: 'ID', dataIndex: "ID", sortable: true, hidden: true},
{header: 'Login', dataIndex: "LOGIN", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Name', dataIndex: "NAME", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Email', dataIndex: "EMAIL", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Last login', dataIndex: "LASTLOGIN", sortable: true, editor: new Ext.form.TextField()},
],
bbar: new Ext.PagingToolbar({
pageSize: 30,
store: data,
displayInfo: true
}),
tbar : [{
text: 'Add',
iconCls: 'icon-add',
handler: function(btn, ev) {
var u = new grid.store.recordType();
grid.stopEditing();
grid.store.insert(0, u);
grid.startEditing(0, 1);
},
scope: grid
}, '-', {
text: 'Delete',
iconCls: 'icon-delete',
handler: function(btn, ev) {
var index = grid.getSelectionModel().getSelectedCell();
if (!index) {
return false;
}
var rec = grid.store.getAt(index[0]);
grid.store.remove(rec);
},
scope: grid
}, '-', {
text: 'Save',
iconCls: 'icon-save',
handler: function(btn, ev) {
grid.store.save();
},
scope: grid
}
]
// F.ContentToStream(M);
});
grid.show();
}
Ext.onReady(FPC.ShowPage);

View File

@ -0,0 +1,11 @@
<html>
<head>
<title>ExtJS XML Data demo</title>
<link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css"/>
<script src="/ext/adapter/ext/ext-base.js"></script>
<script src="/ext/ext-all-debug.js"></script>
<script src="extgrid-xml.js"></script>
</head>
<body>
</body>
</html>

View File

@ -0,0 +1,100 @@
Ext.ns('FPC');
FPC.ShowPage = function () {
var myproxy = new Ext.data.HttpProxy ( {
api : {
read: "extgrid.cgi/Provider/AName/Read/?format=xml",
update: "extgrid.cgi/Provider/AName/Update/?format=xml",
create: "extgrid.cgi/Provider/AName/Insert/?format=xml",
destroy: "extgrid.cgi/Provider/AName/Delete/?format=xml",
}
});
var myreader = new Ext.data.XmlReader ({
totalProperty: "total",
record: "row",
idProperty: "ID",
successProperty: "success",
messageProperty: "message",
fields: ["ID", "LOGIN", "NAME","EMAIL","LASTLOGIN"]
});
var mywriter = new Ext.data.XmlWriter({
encode: true,
writeAllFields: true,
idProperty: "ID",
root: "records"
});
var data = new Ext.data.Store({
proxy: myproxy,
reader: myreader,
writer: mywriter,
autoSave: false,
idProperty: "ID",
});
// Listen to errors.
data.addListener('exception', function(proxy, type, action, options, res) {
if (type === 'remote') {
Ext.Msg.show({
title: 'REMOTE EXCEPTION',
msg: res.message,
icon: Ext.MessageBox.ERROR,
buttons: Ext.Msg.OK
});
}
});
data.load({ params:{start: 0, limit: 30}});
var grid = new Ext.grid.EditorGridPanel({
renderTo: Ext.getBody(),
frame: true,
title: "Known users",
height: 600,
width: 800,
store: data,
columns: [
{header: 'ID', dataIndex: "ID", sortable: true, hidden: true},
{header: 'Login', dataIndex: "LOGIN", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Name', dataIndex: "NAME", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Email', dataIndex: "EMAIL", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Last login', dataIndex: "LASTLOGIN", sortable: true, editor: new Ext.form.TextField()},
],
bbar: new Ext.PagingToolbar({
pageSize: 30,
store: data,
displayInfo: true
}),
tbar : [{
text: 'Add',
iconCls: 'icon-add',
handler: function(btn, ev) {
var u = new grid.store.recordType();
grid.stopEditing();
grid.store.insert(0, u);
grid.startEditing(0, 1);
},
scope: grid
}, '-', {
text: 'Delete',
iconCls: 'icon-delete',
handler: function(btn, ev) {
var index = grid.getSelectionModel().getSelectedCell();
if (!index) {
return false;
}
var rec = grid.store.getAt(index[0]);
grid.store.remove(rec);
},
scope: grid
}, '-', {
text: 'Save',
iconCls: 'icon-save',
handler: function(btn, ev) {
grid.store.save();
},
scope: grid
}
]
// F.ContentToStream(M);
});
grid.show();
}
Ext.onReady(FPC.ShowPage);

View File

@ -0,0 +1,334 @@
<?xml version="1.0"?>
<CONFIG>
<ProjectOptions>
<Version Value="7"/>
<General>
<Flags>
<MainUnitHasCreateFormStatements Value="False"/>
<Runnable Value="False"/>
</Flags>
<MainUnit Value="0"/>
<TargetFileExt Value=""/>
<Icon Value="0"/>
<UseXPManifest Value="True"/>
<ActiveEditorIndexAtStart Value="3"/>
</General>
<VersionInfo>
<ProjectVersion Value=""/>
</VersionInfo>
<PublishOptions>
<Version Value="2"/>
<IgnoreBinaries Value="False"/>
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
<ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
</PublishOptions>
<RunParams>
<local>
<FormatVersion Value="1"/>
<LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
</local>
</RunParams>
<RequiredPackages Count="5">
<Item1>
<PackageName Value="DBFLaz"/>
<MinVersion Minor="1" Release="1" Valid="True"/>
</Item1>
<Item2>
<PackageName Value="lazwebdata"/>
<MinVersion Valid="True"/>
</Item2>
<Item3>
<PackageName Value="WebLaz"/>
</Item3>
<Item4>
<PackageName Value="LCL"/>
</Item4>
<Item5>
<PackageName Value="FCL"/>
</Item5>
</RequiredPackages>
<Units Count="16">
<Unit0>
<Filename Value="extgrid.lpr"/>
<IsPartOfProject Value="True"/>
<UnitName Value="extgrid"/>
<CursorPos X="24" Y="6"/>
<TopLine Value="1"/>
<EditorIndex Value="3"/>
<UsageCount Value="21"/>
<Loaded Value="True"/>
</Unit0>
<Unit1>
<Filename Value="wmusers.pp"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="FPWebProviderDataModule1"/>
<ResourceBaseClass Value="DataModule"/>
<UnitName Value="wmusers"/>
<CursorPos X="33" Y="60"/>
<TopLine Value="27"/>
<EditorIndex Value="2"/>
<UsageCount Value="21"/>
<Loaded Value="True"/>
</Unit1>
<Unit2>
<Filename Value="../demo2/wmusers.pp"/>
<ComponentName Value="FPWebModule1"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="DataModule"/>
<UnitName Value="wmusers"/>
<CursorPos X="1" Y="80"/>
<TopLine Value="45"/>
<UsageCount Value="10"/>
</Unit2>
<Unit3>
<Filename Value="../fpwebdata.pp"/>
<ComponentName Value="FPWebProviderDataModule"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="DataModule"/>
<UnitName Value="fpwebdata"/>
<CursorPos X="26" Y="1530"/>
<TopLine Value="1526"/>
<EditorIndex Value="4"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit3>
<Unit4>
<Filename Value="wmusers.lfm"/>
<UsageCount Value="10"/>
<SyntaxHighlighter Value="LFM"/>
</Unit4>
<Unit5>
<Filename Value="../demo/reglazwebdata.pp"/>
<UnitName Value="reglazwebdata"/>
<CursorPos X="53" Y="50"/>
<TopLine Value="34"/>
<EditorIndex Value="0"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit5>
<Unit6>
<Filename Value="../../../fpc/rtl/objpas/classes/classesh.inc"/>
<CursorPos X="17" Y="1833"/>
<TopLine Value="1812"/>
<UsageCount Value="10"/>
</Unit6>
<Unit7>
<Filename Value="../../../fpc/rtl/objpas/classes/dm.inc"/>
<CursorPos X="3" Y="18"/>
<TopLine Value="16"/>
<UsageCount Value="10"/>
</Unit7>
<Unit8>
<Filename Value="../../../fpc/packages/fcl-web/src/fphttp.pp"/>
<UnitName Value="fphttp"/>
<CursorPos X="3" Y="105"/>
<TopLine Value="108"/>
<EditorIndex Value="5"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit8>
<Unit9>
<Filename Value="../../../fpc/packages/fcl-web/src/fpweb.pp"/>
<UnitName Value="fpWeb"/>
<CursorPos X="3" Y="421"/>
<TopLine Value="419"/>
<EditorIndex Value="6"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit9>
<Unit10>
<Filename Value="../../../fpc/lazarus/components/fpweb/weblazideintf.pp"/>
<UnitName Value="WebLazIDEIntf"/>
<CursorPos X="52" Y="173"/>
<TopLine Value="145"/>
<UsageCount Value="10"/>
</Unit10>
<Unit11>
<Filename Value="../../../fpc/lazarus/components/fpweb/lazweb.pp"/>
<UnitName Value="lazweb"/>
<CursorPos X="12" Y="7"/>
<TopLine Value="1"/>
<UsageCount Value="10"/>
</Unit11>
<Unit12>
<Filename Value="tralala.pp"/>
<ComponentName Value="FPWebModule1"/>
<ResourceBaseClass Value="DataModule"/>
<UnitName Value="tralala"/>
<CursorPos X="7" Y="11"/>
<TopLine Value="1"/>
<UsageCount Value="20"/>
</Unit12>
<Unit13>
<Filename Value="../fpwebdata.lfm"/>
<CursorPos X="1" Y="1"/>
<TopLine Value="1"/>
<UsageCount Value="10"/>
<SyntaxHighlighter Value="LFM"/>
</Unit13>
<Unit14>
<Filename Value="../../../fpc/packages/fcl-web/src/websession.pp"/>
<UnitName Value="websession"/>
<CursorPos X="20" Y="40"/>
<TopLine Value="20"/>
<EditorIndex Value="1"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit14>
<Unit15>
<Filename Value="../../../fpc/packages/fcl-xml/src/xmliconv.pas"/>
<UnitName Value="xmliconv"/>
<CursorPos X="1" Y="64"/>
<TopLine Value="37"/>
<UsageCount Value="10"/>
</Unit15>
</Units>
<JumpHistory Count="30" HistoryIndex="29">
<Position1>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="385" Column="53" TopLine="364"/>
</Position1>
<Position2>
<Filename Value="../../../fpc/packages/fcl-web/src/websession.pp"/>
<Caret Line="381" Column="25" TopLine="345"/>
</Position2>
<Position3>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="385" Column="51" TopLine="364"/>
</Position3>
<Position4>
<Filename Value="../../../fpc/packages/fcl-web/src/websession.pp"/>
<Caret Line="27" Column="39" TopLine="20"/>
</Position4>
<Position5>
<Filename Value="wmusers.pp"/>
<Caret Line="34" Column="29" TopLine="3"/>
</Position5>
<Position6>
<Filename Value="wmusers.pp"/>
<Caret Line="48" Column="45" TopLine="15"/>
</Position6>
<Position7>
<Filename Value="wmusers.pp"/>
<Caret Line="49" Column="45" TopLine="14"/>
</Position7>
<Position8>
<Filename Value="wmusers.pp"/>
<Caret Line="50" Column="45" TopLine="14"/>
</Position8>
<Position9>
<Filename Value="wmusers.pp"/>
<Caret Line="17" Column="18" TopLine="14"/>
</Position9>
<Position10>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="395" Column="32" TopLine="387"/>
</Position10>
<Position11>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="1066" Column="1" TopLine="1039"/>
</Position11>
<Position12>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="1624" Column="20" TopLine="1606"/>
</Position12>
<Position13>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="955" Column="46" TopLine="933"/>
</Position13>
<Position14>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="956" Column="19" TopLine="933"/>
</Position14>
<Position15>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="957" Column="16" TopLine="933"/>
</Position15>
<Position16>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="971" Column="38" TopLine="933"/>
</Position16>
<Position17>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="975" Column="77" TopLine="954"/>
</Position17>
<Position18>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="985" Column="43" TopLine="954"/>
</Position18>
<Position19>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="1013" Column="66" TopLine="992"/>
</Position19>
<Position20>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="1017" Column="77" TopLine="992"/>
</Position20>
<Position21>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="1042" Column="62" TopLine="1013"/>
</Position21>
<Position22>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="1066" Column="35" TopLine="1055"/>
</Position22>
<Position23>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="1646" Column="22" TopLine="1630"/>
</Position23>
<Position24>
<Filename Value="wmusers.pp"/>
<Caret Line="15" Column="41" TopLine="1"/>
</Position24>
<Position25>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="1655" Column="28" TopLine="1632"/>
</Position25>
<Position26>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="1587" Column="17" TopLine="1565"/>
</Position26>
<Position27>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="414" Column="15" TopLine="393"/>
</Position27>
<Position28>
<Filename Value="extgrid.lpr"/>
<Caret Line="6" Column="36" TopLine="1"/>
</Position28>
<Position29>
<Filename Value="extgrid.lpr"/>
<Caret Line="11" Column="17" TopLine="1"/>
</Position29>
<Position30>
<Filename Value="extgrid.lpr"/>
<Caret Line="6" Column="33" TopLine="1"/>
</Position30>
</JumpHistory>
</ProjectOptions>
<CompilerOptions>
<Version Value="8"/>
<Target>
<Filename Value="extgrid.cgi"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)/"/>
</SearchPaths>
<Other>
<CompilerPath Value="$(CompPath)"/>
</Other>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,16 @@
program extgrid;
{$mode objfpc}{$H+}
uses
{$ifdef unix}cwstring, xmliconv,{$endif}
fpCGI,
wmusers;
{$IFDEF WINDOWS}{$R extgrid.rc}{$ENDIF}
begin
Application.Initialize;
Application.Run;
end.

View File

@ -0,0 +1,9 @@
object FPWebModule1: TFPWebModule1
OldCreateOrder = False
Actions = <>
CreateSession = False
Height = 300
HorizontalOffset = 585
VerticalOffset = 230
Width = 400
end

View File

@ -0,0 +1,7 @@
{ This is an automatically generated lazarus resource file }
LazarusResources.Add('TFPWebModule1','FORMDATA',[
'TPF0'#13'TFPWebModule1'#12'FPWebModule1'#14'OldCreateOrder'#8#7'Actions'#14#0
+#13'CreateSession'#8#6'Height'#3','#1#16'HorizontalOffset'#3'I'#2#14'Vertica'
+'lOffset'#3#230#0#5'Width'#3#144#1#0#0
]);

View File

@ -0,0 +1,28 @@
unit tralala;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, HTTPDefs, websession, fpHTTP, fpWeb;
type
TFPWebModule1 = class(TFPWebModule)
private
{ private declarations }
public
{ public declarations }
end;
var
FPWebModule1: TFPWebModule1;
implementation
initialization
{$I tralala.lrs}
RegisterHTTPModule('TFPWebModule1', TFPWebModule1);
end.

View File

@ -0,0 +1,49 @@
object FPWebProviderDataModule1: TFPWebProviderDataModule1
OnCreate = DataModuleCreate
OldCreateOrder = False
InputAdaptor = ExtJSJSonWebdataInputAdaptor1
ContentProducer = ExtJSJSONDataFormatter1
OnGetContentProducer = DataModuleGetContentProducer
OnGetInputAdaptor = DataModuleGetInputAdaptor
Height = 300
HorizontalOffset = 539
VerticalOffset = 447
Width = 400
object ExtJSJSonWebdataInputAdaptor1: TExtJSJSonWebdataInputAdaptor
left = 176
top = 96
end
object ExtJSJSONDataFormatter1: TExtJSJSONDataFormatter
AllowPageSize = False
left = 176
top = 136
end
object ExtJSXMLWebdataInputAdaptor1: TExtJSXMLWebdataInputAdaptor
left = 216
top = 96
end
object ExtJSXMLDataFormatter1: TExtJSXMLDataFormatter
AllowPageSize = False
left = 216
top = 136
end
object Dbf1: TDbf
FilePath = '/home/michael/public_html/extjs/demo2/'
IndexDefs = <>
TableName = 'users.dbf'
TableLevel = 7
FilterOptions = []
left = 79
top = 92
end
object Datasource1: TDatasource
DataSet = Dbf1
left = 76
top = 132
end
object AName: TFPWebDataProvider
DataSource = Datasource1
left = 133
top = 117
end
end

View File

@ -0,0 +1,21 @@
{ This is an automatically generated lazarus resource file }
LazarusResources.Add('TFPWebProviderDataModule1','FORMDATA',[
'TPF0'#25'TFPWebProviderDataModule1'#24'FPWebProviderDataModule1'#8'OnCreate'
+#7#16'DataModuleCreate'#14'OldCreateOrder'#8#12'InputAdaptor'#7#29'ExtJSJSon'
+'WebdataInputAdaptor1'#15'ContentProducer'#7#23'ExtJSJSONDataFormatter1'#20
+'OnGetContentProducer'#7#28'DataModuleGetContentProducer'#17'OnGetInputAdapt'
+'or'#7#25'DataModuleGetInputAdaptor'#6'Height'#3','#1#16'HorizontalOffset'#3
+#27#2#14'VerticalOffset'#3#191#1#5'Width'#3#144#1#0#29'TExtJSJSonWebdataInpu'
+'tAdaptor'#29'ExtJSJSonWebdataInputAdaptor1'#4'left'#3#176#0#3'top'#2'`'#0#0
+#23'TExtJSJSONDataFormatter'#23'ExtJSJSONDataFormatter1'#13'AllowPageSize'#8
+#4'left'#3#176#0#3'top'#3#136#0#0#0#28'TExtJSXMLWebdataInputAdaptor'#28'ExtJ'
+'SXMLWebdataInputAdaptor1'#4'left'#3#216#0#3'top'#2'`'#0#0#22'TExtJSXMLDataF'
+'ormatter'#22'ExtJSXMLDataFormatter1'#13'AllowPageSize'#8#4'left'#3#216#0#3
+'top'#3#136#0#0#0#4'TDbf'#4'Dbf1'#8'FilePath'#6'&/home/michael/public_html/e'
+'xtjs/demo2/'#9'IndexDefs'#14#0#9'TableName'#6#9'users.dbf'#10'TableLevel'#2
+#7#13'FilterOptions'#11#0#4'left'#2'O'#3'top'#2'\'#0#0#11'TDatasource'#11'Da'
+'tasource1'#7'DataSet'#7#4'Dbf1'#4'left'#2'L'#3'top'#3#132#0#0#0#18'TFPWebDa'
+'taProvider'#5'AName'#10'DataSource'#7#11'Datasource1'#4'left'#3#133#0#3'top'
+#2'u'#0#0#0
]);

View File

@ -0,0 +1,68 @@
unit wmusers;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, HTTPDefs, websession, fpHTTP, fpWeb,
dbf, db, fpwebdata, extjsjson, extjsxml;
type
{ TFPWebProviderDataModule1 }
TFPWebProviderDataModule1 = class(TFPWebProviderDataModule)
Datasource1: TDatasource;
Dbf1: TDbf;
ExtJSJSONDataFormatter1: TExtJSJSONDataFormatter;
ExtJSJSonWebdataInputAdaptor1: TExtJSJSonWebdataInputAdaptor;
ExtJSXMLDataFormatter1: TExtJSXMLDataFormatter;
ExtJSXMLWebdataInputAdaptor1: TExtJSXMLWebdataInputAdaptor;
AName: TFPWebDataProvider;
procedure DataModuleCreate(Sender: TObject);
procedure DataModuleGetContentProducer(Sender: TObject;
var AContentProducer: TCustomHTTPDataContentProducer);
procedure DataModuleGetInputAdaptor(Sender: TObject;
var AInputAdaptor: TCustomWebdataInputAdaptor);
private
{ private declarations }
public
{ public declarations }
end;
var
FPWebProviderDataModule1: TFPWebProviderDataModule1;
implementation
{ TFPWebProviderDataModule1 }
procedure TFPWebProviderDataModule1.DataModuleGetInputAdaptor(Sender: TObject;
var AInputAdaptor: TCustomWebdataInputAdaptor);
begin
If Request.QueryFields.values['format']='xml' then
AInputAdaptor:=ExtJSXMLWebdataInputAdaptor1;
end;
procedure TFPWebProviderDataModule1.DataModuleGetContentProducer(
Sender: TObject; var AContentProducer: TCustomHTTPDataContentProducer);
begin
If Request.QueryFields.values['format']='xml' then
AContentProducer:=ExtJSXMLDataFormatter1;
end;
procedure TFPWebProviderDataModule1.DataModuleCreate(Sender: TObject);
begin
DBF1.TableName:=ExtractFilePath(ParamStr(0))+'users.dbf';
DBF1.Open;
With DBF1.FieldByname('ID') do
ProviderFlags:=ProviderFlags+[pfInKey];
end;
initialization
{$I wmusers.lrs}
RegisterHTTPModule('Provider', TFPWebProviderDataModule1);
end.

View File

@ -0,0 +1,27 @@
object DataModule1: TDataModule1
OnCreate = DataModuleCreate
OldCreateOrder = False
Height = 300
HorizontalOffset = 356
VerticalOffset = 360
Width = 400
object AName: TFPWebDataProvider
DataSource = Datasource1
left = 161
top = 145
end
object Datasource1: TDatasource
DataSet = Dbf1
left = 104
top = 160
end
object Dbf1: TDbf
FilePath = '/home/michael/public_html/extjs/demo2/'
IndexDefs = <>
TableName = 'users.dbf'
TableLevel = 7
FilterOptions = []
left = 107
top = 120
end
end

View File

@ -0,0 +1,12 @@
{ This is an automatically generated lazarus resource file }
LazarusResources.Add('TDataModule1','FORMDATA',[
'TPF0'#12'TDataModule1'#11'DataModule1'#8'OnCreate'#7#16'DataModuleCreate'#14
+'OldCreateOrder'#8#6'Height'#3','#1#16'HorizontalOffset'#3'd'#1#14'VerticalO'
+'ffset'#3'h'#1#5'Width'#3#144#1#0#18'TFPWebDataProvider'#5'AName'#10'DataSou'
+'rce'#7#11'Datasource1'#4'left'#3#161#0#3'top'#3#145#0#0#0#11'TDatasource'#11
+'Datasource1'#7'DataSet'#7#4'Dbf1'#4'left'#2'h'#3'top'#3#160#0#0#0#4'TDbf'#4
+'Dbf1'#8'FilePath'#6'&/home/michael/public_html/extjs/demo2/'#9'IndexDefs'#14
+#0#9'TableName'#6#9'users.dbf'#10'TableLevel'#2#7#13'FilterOptions'#11#0#4'l'
+'eft'#2'k'#3'top'#2'x'#0#0#0
]);

View File

@ -0,0 +1,52 @@
unit dmusers;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, db, dbf,
fpwebdata;
type
{ TDataModule1 }
TDataModule1 = class(TDataModule)
AName: TFPWebDataProvider;
Datasource1: TDatasource;
Dbf1: TDbf;
procedure DataModuleCreate(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
DataModule1: TDataModule1;
implementation
uses dbugintf;
{ TDataModule1 }
procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
senddebug('Creating datamodule 1 '+InTToStr(Ord(WebDataProviderManager.Registering)));
If not WebDataProviderManager.Registering then
begin
DBF1.TableName:=ExtractFilePath(ParamStr(0))+'users.dbf';
DBF1.Open;
With DBF1.FieldByname('ID') do
ProviderFlags:=ProviderFlags+[pfInKey];
DBF1.First;
end;
end;
initialization
{$I dmusers.lrs}
WebDataProviderManager.RegisterDatamodule(TDataModule1)
end.

View File

@ -0,0 +1,11 @@
<html>
<head>
<title>ExtJS JSON Data demo</title>
<link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css"/>
<script src="/ext/adapter/ext/ext-base.js"></script>
<script src="/ext/ext-all-debug.js"></script>
<script src="extgrid-json.js"></script>
</head>
<body>
</body>
</html>

View File

@ -0,0 +1,97 @@
Ext.ns('FPC');
FPC.ShowPage = function () {
var myproxy = new Ext.data.HttpProxy ( {
api : {
read: "extgrid.cgi/JSONProvider/AName/Read/",
update: "extgrid.cgi/JSONProvider/AName/Update/",
create: "extgrid.cgi/JSONProvider/AName/Insert/",
destroy: "extgrid.cgi/JSONProvider/AName/Delete/"
}
});
var myreader = new Ext.data.JsonReader ({
root: "rows",
idProperty: "ID",
messageProperty: 'message', // Must be specified here
fields: ["ID","LOGIN","NAME","EMAIL", "LASTLOGIN"]
});
var mywriter = new Ext.data.JsonWriter({
encode: true,
writeAllFields: true,
idProperty: "ID"
});
var data = new Ext.data.Store({
proxy: myproxy,
reader: myreader,
writer: mywriter,
autoSave: false,
idProperty: "ID",
});
// Listen to errors.
data.addListener('exception', function(proxy, type, action, options, res) {
if (type === 'remote') {
Ext.Msg.show({
title: 'REMOTE EXCEPTION',
msg: res.message,
icon: Ext.MessageBox.ERROR,
buttons: Ext.Msg.OK
});
}
});
data.load({ params:{start: 0, limit: 30}});
var grid = new Ext.grid.EditorGridPanel({
renderTo: Ext.getBody(),
frame: true,
title: "Known users",
height: 600,
width: 800,
store: data,
columns: [
{header: 'ID', dataIndex: "ID", sortable: true, hidden: true},
{header: 'Login', dataIndex: "LOGIN", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Name', dataIndex: "NAME", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Email', dataIndex: "EMAIL", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Last login', dataIndex: "LASTLOGIN", sortable: true, editor: new Ext.form.TextField()},
],
bbar: new Ext.PagingToolbar({
pageSize: 30,
store: data,
displayInfo: true
}),
tbar : [{
text: 'Add',
iconCls: 'icon-add',
handler: function(btn, ev) {
var u = new grid.store.recordType();
grid.stopEditing();
grid.store.insert(0, u);
grid.startEditing(0, 1);
},
scope: grid
}, '-', {
text: 'Delete',
iconCls: 'icon-delete',
handler: function(btn, ev) {
var index = grid.getSelectionModel().getSelectedCell();
if (!index) {
return false;
}
var rec = grid.store.getAt(index[0]);
grid.store.remove(rec);
},
scope: grid
}, '-', {
text: 'Save',
iconCls: 'icon-save',
handler: function(btn, ev) {
grid.store.save();
},
scope: grid
}
]
// F.ContentToStream(M);
});
grid.show();
}
Ext.onReady(FPC.ShowPage);

View File

@ -0,0 +1,11 @@
<html>
<head>
<title>ExtJS XML Data demo</title>
<link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css"/>
<script src="/ext/adapter/ext/ext-base.js"></script>
<script src="/ext/ext-all-debug.js"></script>
<script src="extgrid-xml.js"></script>
</head>
<body>
</body>
</html>

View File

@ -0,0 +1,100 @@
Ext.ns('FPC');
FPC.ShowPage = function () {
var myproxy = new Ext.data.HttpProxy ( {
api : {
read: "extgrid.cgi/XMLProvider/AName/Read/",
update: "extgrid.cgi/XMLProvider/AName/Update/",
create: "extgrid.cgi/XMLProvider/AName/Insert/",
destroy: "extgrid.cgi/XMLProvider/AName/Delete/",
}
});
var myreader = new Ext.data.XmlReader ({
totalProperty: "total",
record: "row",
idProperty: "ID",
successProperty: "success",
messageProperty: "message",
fields: ["ID", "LOGIN", "NAME","EMAIL","LASTLOGIN"]
});
var mywriter = new Ext.data.XmlWriter({
encode: true,
writeAllFields: true,
idProperty: "ID",
root: "records"
});
var data = new Ext.data.Store({
proxy: myproxy,
reader: myreader,
writer: mywriter,
autoSave: false,
idProperty: "ID",
});
// Listen to errors.
data.addListener('exception', function(proxy, type, action, options, res) {
if (type === 'remote') {
Ext.Msg.show({
title: 'REMOTE EXCEPTION',
msg: res.message,
icon: Ext.MessageBox.ERROR,
buttons: Ext.Msg.OK
});
}
});
data.load({ params:{start: 0, limit: 30}});
var grid = new Ext.grid.EditorGridPanel({
renderTo: Ext.getBody(),
frame: true,
title: "Known users",
height: 600,
width: 800,
store: data,
columns: [
{header: 'ID', dataIndex: "ID", sortable: true, hidden: true},
{header: 'Login', dataIndex: "LOGIN", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Name', dataIndex: "NAME", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Email', dataIndex: "EMAIL", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Last login', dataIndex: "LASTLOGIN", sortable: true, editor: new Ext.form.TextField()},
],
bbar: new Ext.PagingToolbar({
pageSize: 30,
store: data,
displayInfo: true
}),
tbar : [{
text: 'Add',
iconCls: 'icon-add',
handler: function(btn, ev) {
var u = new grid.store.recordType();
grid.stopEditing();
grid.store.insert(0, u);
grid.startEditing(0, 1);
},
scope: grid
}, '-', {
text: 'Delete',
iconCls: 'icon-delete',
handler: function(btn, ev) {
var index = grid.getSelectionModel().getSelectedCell();
if (!index) {
return false;
}
var rec = grid.store.getAt(index[0]);
grid.store.remove(rec);
},
scope: grid
}, '-', {
text: 'Save',
iconCls: 'icon-save',
handler: function(btn, ev) {
grid.store.save();
},
scope: grid
}
]
// F.ContentToStream(M);
});
grid.show();
}
Ext.onReady(FPC.ShowPage);

View File

@ -0,0 +1,93 @@
<?xml version="1.0"?>
<CONFIG>
<ProjectOptions>
<Version Value="7"/>
<General>
<Flags>
<SaveClosedFiles Value="False"/>
<SaveOnlyProjectUnits Value="True"/>
<MainUnitHasCreateFormStatements Value="False"/>
<Runnable Value="False"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<MainUnit Value="0"/>
<TargetFileExt Value=""/>
<Icon Value="0"/>
<UseXPManifest Value="True"/>
</General>
<VersionInfo>
<ProjectVersion Value=""/>
</VersionInfo>
<PublishOptions>
<Version Value="2"/>
<IgnoreBinaries Value="False"/>
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
<ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
</PublishOptions>
<RunParams>
<local>
<FormatVersion Value="1"/>
<LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
</local>
</RunParams>
<RequiredPackages Count="5">
<Item1>
<PackageName Value="DBFLaz"/>
<MinVersion Minor="1" Release="1" Valid="True"/>
</Item1>
<Item2>
<PackageName Value="lazwebdata"/>
<MinVersion Valid="True"/>
</Item2>
<Item3>
<PackageName Value="WebLaz"/>
</Item3>
<Item4>
<PackageName Value="LCL"/>
</Item4>
<Item5>
<PackageName Value="FCL"/>
</Item5>
</RequiredPackages>
<Units Count="4">
<Unit0>
<Filename Value="extgrid.lpr"/>
<IsPartOfProject Value="True"/>
<UnitName Value="extgrid"/>
</Unit0>
<Unit1>
<Filename Value="wmjsonusers.pp"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="FPWebProviderDataModule1"/>
<ResourceBaseClass Value="DataModule"/>
<UnitName Value="wmjsonusers"/>
</Unit1>
<Unit2>
<Filename Value="wmxmlusers.pp"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="FPWebProviderDataModule2"/>
<ResourceBaseClass Value="DataModule"/>
<UnitName Value="wmxmlusers"/>
</Unit2>
<Unit3>
<Filename Value="dmusers.pp"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="DataModule1"/>
<ResourceBaseClass Value="DataModule"/>
<UnitName Value="dmusers"/>
</Unit3>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="8"/>
<Target>
<Filename Value="extgrid.cgi"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)/"/>
</SearchPaths>
<Other>
<CompilerPath Value="$(CompPath)"/>
</Other>
</CompilerOptions>
</CONFIG>

View File

@ -0,0 +1,15 @@
program extgrid;
{$mode objfpc}{$H+}
uses
{$ifdef unix}cwstring,xmliconv,{$endif}
fpCGI, wmjsonusers, wmxmlusers, dmusers;
{$IFDEF WINDOWS}{$R extgrid.rc}{$ENDIF}
begin
Application.Initialize;
Application.Run;
end.

View File

@ -0,0 +1,18 @@
object FPWebProviderDataModule1: TFPWebProviderDataModule1
OldCreateOrder = False
InputAdaptor = ExtJSJSonWebdataInputAdaptor1
ContentProducer = ExtJSJSONDataFormatter1
Height = 300
HorizontalOffset = 635
VerticalOffset = 230
Width = 400
object ExtJSJSonWebdataInputAdaptor1: TExtJSJSonWebdataInputAdaptor
left = 204
top = 124
end
object ExtJSJSONDataFormatter1: TExtJSJSONDataFormatter
AllowPageSize = False
left = 204
top = 164
end
end

View File

@ -0,0 +1,11 @@
{ This is an automatically generated lazarus resource file }
LazarusResources.Add('TFPWebProviderDataModule1','FORMDATA',[
'TPF0'#25'TFPWebProviderDataModule1'#24'FPWebProviderDataModule1'#14'OldCreat'
+'eOrder'#8#12'InputAdaptor'#7#29'ExtJSJSonWebdataInputAdaptor1'#15'ContentPr'
+'oducer'#7#23'ExtJSJSONDataFormatter1'#6'Height'#3','#1#16'HorizontalOffset'
+#3'{'#2#14'VerticalOffset'#3#230#0#5'Width'#3#144#1#0#29'TExtJSJSonWebdataIn'
+'putAdaptor'#29'ExtJSJSonWebdataInputAdaptor1'#4'left'#3#204#0#3'top'#2'|'#0
+#0#23'TExtJSJSONDataFormatter'#23'ExtJSJSONDataFormatter1'#13'AllowPageSize'
+#8#4'left'#3#204#0#3'top'#3#164#0#0#0#0
]);

View File

@ -0,0 +1,34 @@
unit wmjsonusers;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, HTTPDefs, websession, fpHTTP, fpWeb,
fpwebdata, extjsjson;
type
{ TFPWebProviderDataModule1 }
TFPWebProviderDataModule1 = class(TFPWebProviderDataModule)
ExtJSJSONDataFormatter1: TExtJSJSONDataFormatter;
ExtJSJSonWebdataInputAdaptor1: TExtJSJSonWebdataInputAdaptor;
private
{ private declarations }
public
{ public declarations }
end;
var
FPWebProviderDataModule1: TFPWebProviderDataModule1;
implementation
initialization
{$I wmjsonusers.lrs}
RegisterHTTPModule('JSONProvider', TFPWebProviderDataModule1);
end.

View File

@ -0,0 +1,18 @@
object FPWebProviderDataModule2: TFPWebProviderDataModule2
OldCreateOrder = False
InputAdaptor = ExtJSXMLWebdataInputAdaptor1
ContentProducer = ExtJSXMLDataFormatter1
Height = 300
HorizontalOffset = 545
VerticalOffset = 399
Width = 400
object ExtJSXMLWebdataInputAdaptor1: TExtJSXMLWebdataInputAdaptor
left = 244
top = 124
end
object ExtJSXMLDataFormatter1: TExtJSXMLDataFormatter
AllowPageSize = False
left = 244
top = 164
end
end

View File

@ -0,0 +1,11 @@
{ This is an automatically generated lazarus resource file }
LazarusResources.Add('TFPWebProviderDataModule2','FORMDATA',[
'TPF0'#25'TFPWebProviderDataModule2'#24'FPWebProviderDataModule2'#14'OldCreat'
+'eOrder'#8#12'InputAdaptor'#7#28'ExtJSXMLWebdataInputAdaptor1'#15'ContentPro'
+'ducer'#7#22'ExtJSXMLDataFormatter1'#6'Height'#3','#1#16'HorizontalOffset'#3
+'!'#2#14'VerticalOffset'#3#143#1#5'Width'#3#144#1#0#28'TExtJSXMLWebdataInput'
+'Adaptor'#28'ExtJSXMLWebdataInputAdaptor1'#4'left'#3#244#0#3'top'#2'|'#0#0#22
+'TExtJSXMLDataFormatter'#22'ExtJSXMLDataFormatter1'#13'AllowPageSize'#8#4'le'
+'ft'#3#244#0#3'top'#3#164#0#0#0#0
]);

View File

@ -0,0 +1,34 @@
unit wmxmlusers;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, HTTPDefs, websession, fpHTTP, fpWeb,
fpwebdata, extjsxml;
type
{ TFPWebProviderDataModule2 }
TFPWebProviderDataModule2 = class(TFPWebProviderDataModule)
ExtJSXMLDataFormatter1: TExtJSXMLDataFormatter;
ExtJSXMLWebdataInputAdaptor1: TExtJSXMLWebdataInputAdaptor;
private
{ private declarations }
public
{ public declarations }
end;
var
FPWebProviderDataModule2: TFPWebProviderDataModule2;
implementation
initialization
{$I wmxmlusers.lrs}
RegisterHTTPModule('XMLProvider', TFPWebProviderDataModule2);
end.

View File

@ -0,0 +1,11 @@
<html>
<head>
<title>ExtJS JSON Data demo</title>
<link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css"/>
<script src="/ext/adapter/ext/ext-base.js"></script>
<script src="/ext/ext-all-debug.js"></script>
<script src="extgrid-json.js"></script>
</head>
<body>
</body>
</html>

View File

@ -0,0 +1,97 @@
Ext.ns('FPC');
FPC.ShowPage = function () {
var myproxy = new Ext.data.HttpProxy ( {
api : {
read: "extgrid.cgi/Provider/AName/Read/",
update: "extgrid.cgi/Provider/AName/Update/",
create: "extgrid.cgi/Provider/AName/Insert/",
destroy: "extgrid.cgi/Provider/AName/Delete/"
}
});
var myreader = new Ext.data.JsonReader ({
root: "rows",
idProperty: "ID",
messageProperty: 'message', // Must be specified here
fields: ["ID","LOGIN","NAME","EMAIL", "LASTLOGIN"]
});
var mywriter = new Ext.data.JsonWriter({
encode: true,
writeAllFields: true,
idProperty: "ID"
});
var data = new Ext.data.Store({
proxy: myproxy,
reader: myreader,
writer: mywriter,
autoSave: false,
idProperty: "ID",
});
// Listen to errors.
data.addListener('exception', function(proxy, type, action, options, res) {
if (type === 'remote') {
Ext.Msg.show({
title: 'REMOTE EXCEPTION',
msg: res.message,
icon: Ext.MessageBox.ERROR,
buttons: Ext.Msg.OK
});
}
});
data.load({ params:{start: 0, limit: 30}});
var grid = new Ext.grid.EditorGridPanel({
renderTo: Ext.getBody(),
frame: true,
title: "Known users",
height: 600,
width: 800,
store: data,
columns: [
{header: 'ID', dataIndex: "ID", sortable: true, hidden: true},
{header: 'Login', dataIndex: "LOGIN", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Name', dataIndex: "NAME", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Email', dataIndex: "EMAIL", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Last login', dataIndex: "LASTLOGIN", sortable: true, editor: new Ext.form.TextField()},
],
bbar: new Ext.PagingToolbar({
pageSize: 30,
store: data,
displayInfo: true
}),
tbar : [{
text: 'Add',
iconCls: 'icon-add',
handler: function(btn, ev) {
var u = new grid.store.recordType();
grid.stopEditing();
grid.store.insert(0, u);
grid.startEditing(0, 1);
},
scope: grid
}, '-', {
text: 'Delete',
iconCls: 'icon-delete',
handler: function(btn, ev) {
var index = grid.getSelectionModel().getSelectedCell();
if (!index) {
return false;
}
var rec = grid.store.getAt(index[0]);
grid.store.remove(rec);
},
scope: grid
}, '-', {
text: 'Save',
iconCls: 'icon-save',
handler: function(btn, ev) {
grid.store.save();
},
scope: grid
}
]
// F.ContentToStream(M);
});
grid.show();
}
Ext.onReady(FPC.ShowPage);

View File

@ -0,0 +1,11 @@
<html>
<head>
<title>ExtJS XML Data demo</title>
<link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css"/>
<script src="/ext/adapter/ext/ext-base.js"></script>
<script src="/ext/ext-all-debug.js"></script>
<script src="extgrid-xml.js"></script>
</head>
<body>
</body>
</html>

View File

@ -0,0 +1,100 @@
Ext.ns('FPC');
FPC.ShowPage = function () {
var myproxy = new Ext.data.HttpProxy ( {
api : {
read: "extgrid.cgi/Provider/AName/Read/?format=xml",
update: "extgrid.cgi/Provider/AName/Update/?format=xml",
create: "extgrid.cgi/Provider/AName/Insert/?format=xml",
destroy: "extgrid.cgi/Provider/AName/Delete/?format=xml",
}
});
var myreader = new Ext.data.XmlReader ({
totalProperty: "total",
record: "row",
idProperty: "ID",
successProperty: "success",
messageProperty: "message",
fields: ["ID", "LOGIN", "NAME","EMAIL","LASTLOGIN"]
});
var mywriter = new Ext.data.XmlWriter({
encode: true,
writeAllFields: true,
idProperty: "ID",
root: "records"
});
var data = new Ext.data.Store({
proxy: myproxy,
reader: myreader,
writer: mywriter,
autoSave: false,
idProperty: "ID",
});
// Listen to errors.
data.addListener('exception', function(proxy, type, action, options, res) {
if (type === 'remote') {
Ext.Msg.show({
title: 'REMOTE EXCEPTION',
msg: res.message,
icon: Ext.MessageBox.ERROR,
buttons: Ext.Msg.OK
});
}
});
data.load({ params:{start: 0, limit: 30}});
var grid = new Ext.grid.EditorGridPanel({
renderTo: Ext.getBody(),
frame: true,
title: "Known users",
height: 600,
width: 800,
store: data,
columns: [
{header: 'ID', dataIndex: "ID", sortable: true, hidden: true},
{header: 'Login', dataIndex: "LOGIN", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Name', dataIndex: "NAME", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Email', dataIndex: "EMAIL", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Last login', dataIndex: "LASTLOGIN", sortable: true, editor: new Ext.form.TextField()},
],
bbar: new Ext.PagingToolbar({
pageSize: 30,
store: data,
displayInfo: true
}),
tbar : [{
text: 'Add',
iconCls: 'icon-add',
handler: function(btn, ev) {
var u = new grid.store.recordType();
grid.stopEditing();
grid.store.insert(0, u);
grid.startEditing(0, 1);
},
scope: grid
}, '-', {
text: 'Delete',
iconCls: 'icon-delete',
handler: function(btn, ev) {
var index = grid.getSelectionModel().getSelectedCell();
if (!index) {
return false;
}
var rec = grid.store.getAt(index[0]);
grid.store.remove(rec);
},
scope: grid
}, '-', {
text: 'Save',
iconCls: 'icon-save',
handler: function(btn, ev) {
grid.store.save();
},
scope: grid
}
]
// F.ContentToStream(M);
});
grid.show();
}
Ext.onReady(FPC.ShowPage);

View File

@ -0,0 +1,75 @@
<?xml version="1.0"?>
<CONFIG>
<ProjectOptions>
<Version Value="7"/>
<General>
<Flags>
<SaveClosedFiles Value="False"/>
<SaveOnlyProjectUnits Value="True"/>
<MainUnitHasCreateFormStatements Value="False"/>
<Runnable Value="False"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<MainUnit Value="0"/>
<TargetFileExt Value=""/>
<Icon Value="0"/>
<UseXPManifest Value="True"/>
</General>
<VersionInfo>
<ProjectVersion Value=""/>
</VersionInfo>
<PublishOptions>
<Version Value="2"/>
<IgnoreBinaries Value="False"/>
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
<ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
</PublishOptions>
<RunParams>
<local>
<FormatVersion Value="1"/>
<LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
</local>
</RunParams>
<RequiredPackages Count="4">
<Item1>
<PackageName Value="lazwebdata"/>
<MinVersion Valid="True"/>
</Item1>
<Item2>
<PackageName Value="WebLaz"/>
</Item2>
<Item3>
<PackageName Value="LCL"/>
</Item3>
<Item4>
<PackageName Value="FCL"/>
</Item4>
</RequiredPackages>
<Units Count="2">
<Unit0>
<Filename Value="extgrid.lpr"/>
<IsPartOfProject Value="True"/>
<UnitName Value="extgrid"/>
</Unit0>
<Unit1>
<Filename Value="wmusers.pp"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="FPWebProviderDataModule2"/>
<ResourceBaseClass Value="DataModule"/>
<UnitName Value="wmusers"/>
</Unit1>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="8"/>
<Target>
<Filename Value="extgrid.cgi"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)/"/>
</SearchPaths>
<Other>
<CompilerPath Value="$(CompPath)"/>
</Other>
</CompilerOptions>
</CONFIG>

View File

@ -0,0 +1,15 @@
program extgrid;
{$mode objfpc}{$H+}
uses
{$ifdef unix}cwstring, xmliconv,{$endif}
fpCGI, wmusers;
{$IFDEF WINDOWS}{$R extgrid.rc}{$ENDIF}
begin
Application.Initialize;
Application.Run;
end.

View File

@ -0,0 +1,29 @@
object FPWebProviderDataModule2: TFPWebProviderDataModule2
OldCreateOrder = False
InputAdaptor = ExtJSJSonWebdataInputAdaptor1
ContentProducer = ExtJSJSONDataFormatter1
OnGetContentProducer = DataModuleGetContentProducer
OnGetInputAdaptor = DataModuleGetInputAdaptor
Height = 300
HorizontalOffset = 538
VerticalOffset = 460
Width = 400
object ExtJSJSonWebdataInputAdaptor1: TExtJSJSonWebdataInputAdaptor
left = 204
top = 124
end
object ExtJSXMLWebdataInputAdaptor1: TExtJSXMLWebdataInputAdaptor
left = 244
top = 124
end
object ExtJSXMLDataFormatter1: TExtJSXMLDataFormatter
AllowPageSize = False
left = 244
top = 164
end
object ExtJSJSONDataFormatter1: TExtJSJSONDataFormatter
AllowPageSize = False
left = 204
top = 164
end
end

View File

@ -0,0 +1,15 @@
{ This is an automatically generated lazarus resource file }
LazarusResources.Add('TFPWebProviderDataModule2','FORMDATA',[
'TPF0'#25'TFPWebProviderDataModule2'#24'FPWebProviderDataModule2'#14'OldCreat'
+'eOrder'#8#12'InputAdaptor'#7#29'ExtJSJSonWebdataInputAdaptor1'#15'ContentPr'
+'oducer'#7#23'ExtJSJSONDataFormatter1'#20'OnGetContentProducer'#7#28'DataMod'
+'uleGetContentProducer'#17'OnGetInputAdaptor'#7#25'DataModuleGetInputAdaptor'
+#6'Height'#3','#1#16'HorizontalOffset'#3#26#2#14'VerticalOffset'#3#204#1#5'W'
+'idth'#3#144#1#0#29'TExtJSJSonWebdataInputAdaptor'#29'ExtJSJSonWebdataInputA'
+'daptor1'#4'left'#3#204#0#3'top'#2'|'#0#0#28'TExtJSXMLWebdataInputAdaptor'#28
+'ExtJSXMLWebdataInputAdaptor1'#4'left'#3#244#0#3'top'#2'|'#0#0#22'TExtJSXMLD'
+'ataFormatter'#22'ExtJSXMLDataFormatter1'#13'AllowPageSize'#8#4'left'#3#244#0
+#3'top'#3#164#0#0#0#23'TExtJSJSONDataFormatter'#23'ExtJSJSONDataFormatter1'
+#13'AllowPageSize'#8#4'left'#3#204#0#3'top'#3#164#0#0#0#0
]);

View File

@ -0,0 +1,85 @@
unit wmusers;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, HTTPDefs, websession, fpHTTP, fpWeb,
db, dbf, fpwebdata, extjsjson, extjsxml;
type
{ TFPWebProviderDataModule2 }
TFPWebProviderDataModule2 = class(TFPWebProviderDataModule)
ExtJSJSONDataFormatter1: TExtJSJSONDataFormatter;
ExtJSJSonWebdataInputAdaptor1: TExtJSJSonWebdataInputAdaptor;
ExtJSXMLDataFormatter1: TExtJSXMLDataFormatter;
ExtJSXMLWebdataInputAdaptor1: TExtJSXMLWebdataInputAdaptor;
procedure DataModuleGetContentProducer(Sender: TObject;
var AContentProducer: TCustomHTTPDataContentProducer);
procedure DataModuleGetInputAdaptor(Sender: TObject;
var AInputAdaptor: TCustomWebdataInputAdaptor);
private
{ private declarations }
public
{ public declarations }
end;
var
FPWebProviderDataModule2: TFPWebProviderDataModule2;
implementation
Type
{ TDBFWebDataProvider }
TDBFWebDataProvider = Class(TFPCustomWebDataProvider)
FDBF : TDBF;
Public
Constructor Create(AOwner : TComponent); override;
Function GetDataset : TDataset; override;
end;
{ TDBFWebDataProvider }
constructor TDBFWebDataProvider.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FDBF:=TDBF.Create(Self);
FDBF.TableName:=ExtractFilePath(ParamStr(0))+'users.dbf';
FDBF.Open;
With FDBF.FieldByname('ID') do
ProviderFlags:=ProviderFlags+[pfInKey];
end;
function TDBFWebDataProvider.GetDataset: TDataset;
begin
Result:=FDBF;
end;
{ TFPWebProviderDataModule2 }
procedure TFPWebProviderDataModule2.DataModuleGetInputAdaptor(Sender: TObject;
var AInputAdaptor: TCustomWebdataInputAdaptor);
begin
If Request.QueryFields.values['format']='xml' then
AInputAdaptor:=ExtJSXMLWebdataInputAdaptor1;
end;
procedure TFPWebProviderDataModule2.DataModuleGetContentProducer(
Sender: TObject; var AContentProducer: TCustomHTTPDataContentProducer);
begin
If Request.QueryFields.values['format']='xml' then
AContentProducer:=ExtJSXMLDataFormatter1;
end;
initialization
{$I wmusers.lrs}
RegisterHTTPModule('Provider', TFPWebProviderDataModule2);
WebDataProviderManager.RegisterProvider('AName',TDBFWebDataProvider);
end.

View File

@ -0,0 +1,11 @@
<html>
<head>
<title>ExtJS JSON Data demo</title>
<link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css"/>
<script src="/ext/adapter/ext/ext-base.js"></script>
<script src="/ext/ext-all-debug.js"></script>
<script src="extgrid-json.js"></script>
</head>
<body>
</body>
</html>

View File

@ -0,0 +1,97 @@
Ext.ns('FPC');
FPC.ShowPage = function () {
var myproxy = new Ext.data.HttpProxy ( {
api : {
read: "extgrid.cgi/Provider/AName/Read/",
update: "extgrid.cgi/Provider/AName/Update/",
create: "extgrid.cgi/Provider/AName/Insert/",
destroy: "extgrid.cgi/Provider/AName/Delete/"
}
});
var myreader = new Ext.data.JsonReader ({
root: "rows",
idProperty: "ID",
messageProperty: 'message', // Must be specified here
fields: ["ID","LOGIN","NAME","EMAIL", "LASTLOGIN"]
});
var mywriter = new Ext.data.JsonWriter({
encode: true,
writeAllFields: true,
idProperty: "ID"
});
var data = new Ext.data.Store({
proxy: myproxy,
reader: myreader,
writer: mywriter,
autoSave: false,
idProperty: "ID",
});
// Listen to errors.
data.addListener('exception', function(proxy, type, action, options, res) {
if (type === 'remote') {
Ext.Msg.show({
title: 'REMOTE EXCEPTION',
msg: res.message,
icon: Ext.MessageBox.ERROR,
buttons: Ext.Msg.OK
});
}
});
data.load({ params:{start: 0, limit: 30}});
var grid = new Ext.grid.EditorGridPanel({
renderTo: Ext.getBody(),
frame: true,
title: "Known users",
height: 600,
width: 800,
store: data,
columns: [
{header: 'ID', dataIndex: "ID", sortable: true, hidden: true},
{header: 'Login', dataIndex: "LOGIN", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Name', dataIndex: "NAME", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Email', dataIndex: "EMAIL", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Last login', dataIndex: "LASTLOGIN", sortable: true, editor: new Ext.form.TextField()},
],
bbar: new Ext.PagingToolbar({
pageSize: 30,
store: data,
displayInfo: true
}),
tbar : [{
text: 'Add',
iconCls: 'icon-add',
handler: function(btn, ev) {
var u = new grid.store.recordType();
grid.stopEditing();
grid.store.insert(0, u);
grid.startEditing(0, 1);
},
scope: grid
}, '-', {
text: 'Delete',
iconCls: 'icon-delete',
handler: function(btn, ev) {
var index = grid.getSelectionModel().getSelectedCell();
if (!index) {
return false;
}
var rec = grid.store.getAt(index[0]);
grid.store.remove(rec);
},
scope: grid
}, '-', {
text: 'Save',
iconCls: 'icon-save',
handler: function(btn, ev) {
grid.store.save();
},
scope: grid
}
]
// F.ContentToStream(M);
});
grid.show();
}
Ext.onReady(FPC.ShowPage);

View File

@ -0,0 +1,11 @@
<html>
<head>
<title>ExtJS XML Data demo</title>
<link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css"/>
<script src="/ext/adapter/ext/ext-base.js"></script>
<script src="/ext/ext-all-debug.js"></script>
<script src="extgrid-xml.js"></script>
</head>
<body>
</body>
</html>

View File

@ -0,0 +1,100 @@
Ext.ns('FPC');
FPC.ShowPage = function () {
var myproxy = new Ext.data.HttpProxy ( {
api : {
read: "extgrid.cgi/Provider/AName/Read/?format=xml",
update: "extgrid.cgi/Provider/AName/Update/?format=xml",
create: "extgrid.cgi/Provider/AName/Insert/?format=xml",
destroy: "extgrid.cgi/Provider/AName/Delete/?format=xml",
}
});
var myreader = new Ext.data.XmlReader ({
totalProperty: "total",
record: "row",
idProperty: "ID",
successProperty: "success",
messageProperty: "message",
fields: ["ID", "LOGIN", "NAME","EMAIL","LASTLOGIN"]
});
var mywriter = new Ext.data.XmlWriter({
encode: true,
writeAllFields: true,
idProperty: "ID",
root: "records"
});
var data = new Ext.data.Store({
proxy: myproxy,
reader: myreader,
writer: mywriter,
autoSave: false,
idProperty: "ID",
});
// Listen to errors.
data.addListener('exception', function(proxy, type, action, options, res) {
if (type === 'remote') {
Ext.Msg.show({
title: 'REMOTE EXCEPTION',
msg: res.message,
icon: Ext.MessageBox.ERROR,
buttons: Ext.Msg.OK
});
}
});
data.load({ params:{start: 0, limit: 30}});
var grid = new Ext.grid.EditorGridPanel({
renderTo: Ext.getBody(),
frame: true,
title: "Known users",
height: 600,
width: 800,
store: data,
columns: [
{header: 'ID', dataIndex: "ID", sortable: true, hidden: true},
{header: 'Login', dataIndex: "LOGIN", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Name', dataIndex: "NAME", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Email', dataIndex: "EMAIL", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
{header: 'Last login', dataIndex: "LASTLOGIN", sortable: true, editor: new Ext.form.TextField()},
],
bbar: new Ext.PagingToolbar({
pageSize: 30,
store: data,
displayInfo: true
}),
tbar : [{
text: 'Add',
iconCls: 'icon-add',
handler: function(btn, ev) {
var u = new grid.store.recordType();
grid.stopEditing();
grid.store.insert(0, u);
grid.startEditing(0, 1);
},
scope: grid
}, '-', {
text: 'Delete',
iconCls: 'icon-delete',
handler: function(btn, ev) {
var index = grid.getSelectionModel().getSelectedCell();
if (!index) {
return false;
}
var rec = grid.store.getAt(index[0]);
grid.store.remove(rec);
},
scope: grid
}, '-', {
text: 'Save',
iconCls: 'icon-save',
handler: function(btn, ev) {
grid.store.save();
},
scope: grid
}
]
// F.ContentToStream(M);
});
grid.show();
}
Ext.onReady(FPC.ShowPage);

View File

@ -0,0 +1,4 @@
[Database]
Path=/wisa/firebird/fpcusers.fb
UserName=WISASOFT
Password=SysteemD

View File

@ -0,0 +1,362 @@
<?xml version="1.0"?>
<CONFIG>
<ProjectOptions>
<Version Value="7"/>
<General>
<Flags>
<MainUnitHasCreateFormStatements Value="False"/>
<Runnable Value="False"/>
</Flags>
<MainUnit Value="0"/>
<TargetFileExt Value=""/>
<Title Value="SQLDBWebDataProvider demo using ExtJS"/>
<UseXPManifest Value="True"/>
<Icon Value="0"/>
<ActiveWindowIndexAtStart Value="0"/>
</General>
<VersionInfo>
<StringTable Comments="" CompanyName="" FileDescription="" FileVersion="0.0.0.0" InternalName="" LegalCopyright="" LegalTrademarks="" OriginalFilename="" ProductName="" ProductVersion=""/>
</VersionInfo>
<PublishOptions>
<Version Value="2"/>
<IgnoreBinaries Value="False"/>
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
<ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
</PublishOptions>
<RunParams>
<local>
<FormatVersion Value="1"/>
<LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
</local>
</RunParams>
<RequiredPackages Count="5">
<Item1>
<PackageName Value="SQLDBLaz"/>
<MinVersion Major="1" Release="1" Valid="True"/>
</Item1>
<Item2>
<PackageName Value="lazwebdata"/>
<MinVersion Valid="True"/>
</Item2>
<Item3>
<PackageName Value="WebLaz"/>
</Item3>
<Item4>
<PackageName Value="LCL"/>
</Item4>
<Item5>
<PackageName Value="FCL"/>
</Item5>
</RequiredPackages>
<Units Count="16">
<Unit0>
<Filename Value="extgrid.lpr"/>
<IsPartOfProject Value="True"/>
<UnitName Value="extgrid"/>
<EditorIndex Value="12"/>
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="33" Y="8"/>
<UsageCount Value="20"/>
<Loaded Value="True"/>
</Unit0>
<Unit1>
<Filename Value="wmusers.pp"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="FPWebProviderDataModule1"/>
<ResourceBaseClass Value="DataModule"/>
<UnitName Value="wmusers"/>
<EditorIndex Value="0"/>
<WindowIndex Value="0"/>
<TopLine Value="78"/>
<CursorPos X="29" Y="86"/>
<UsageCount Value="20"/>
<Loaded Value="True"/>
</Unit1>
<Unit2>
<Filename Value="../demo5/wmusers.pp"/>
<ComponentName Value="FPWebProviderDataModule2"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="DataModule"/>
<UnitName Value="wmusers"/>
<TopLine Value="44"/>
<CursorPos X="1" Y="70"/>
<UsageCount Value="10"/>
</Unit2>
<Unit3>
<Filename Value="../fpwebdata.pp"/>
<ComponentName Value="FPWebProviderDataModule"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="DataModule"/>
<UnitName Value="fpwebdata"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="1"/>
<WindowIndex Value="0"/>
<TopLine Value="1584"/>
<CursorPos X="8" Y="1600"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit3>
<Unit4>
<Filename Value="../sqldbwebdata.pp"/>
<UnitName Value="sqldbwebdata"/>
<EditorIndex Value="3"/>
<WindowIndex Value="0"/>
<TopLine Value="49"/>
<CursorPos X="2" Y="70"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit4>
<Unit5>
<Filename Value="../extjsjson.pp"/>
<UnitName Value="extjsjson"/>
<EditorIndex Value="11"/>
<WindowIndex Value="0"/>
<TopLine Value="25"/>
<CursorPos X="3" Y="45"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit5>
<Unit6>
<Filename Value="../extjsxml.pp"/>
<UnitName Value="extjsxml"/>
<EditorIndex Value="4"/>
<WindowIndex Value="0"/>
<TopLine Value="49"/>
<CursorPos X="13" Y="54"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit6>
<Unit7>
<Filename Value="../../wst/wstmodule.pas"/>
<UnitName Value="wstmodule"/>
<EditorIndex Value="5"/>
<WindowIndex Value="0"/>
<TopLine Value="25"/>
<CursorPos X="48" Y="22"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit7>
<Unit8>
<Filename Value="../../../fpc/packages/fcl-web/src/fphttp.pp"/>
<UnitName Value="fphttp"/>
<EditorIndex Value="8"/>
<WindowIndex Value="0"/>
<TopLine Value="109"/>
<CursorPos X="92" Y="100"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit8>
<Unit9>
<Filename Value="../../../fpc/packages/fcl-web/src/websession.pp"/>
<UnitName Value="websession"/>
<EditorIndex Value="10"/>
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="3" Y="27"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit9>
<Unit10>
<Filename Value="../../../fpc/packages/fcl-web/src/httpdefs.pp"/>
<UnitName Value="HTTPDefs"/>
<EditorIndex Value="7"/>
<WindowIndex Value="0"/>
<TopLine Value="264"/>
<CursorPos X="18" Y="285"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit10>
<Unit11>
<Filename Value="../../../source/wst/tests/apache_module/wst_apache_binding.pas"/>
<UnitName Value="wst_apache_binding"/>
<TopLine Value="142"/>
<CursorPos X="1" Y="178"/>
<UsageCount Value="10"/>
</Unit11>
<Unit12>
<Filename Value="../../../fpc/packages/fcl-web/src/fpweb.pp"/>
<UnitName Value="fpWeb"/>
<EditorIndex Value="2"/>
<WindowIndex Value="0"/>
<TopLine Value="412"/>
<CursorPos X="18" Y="452"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit12>
<Unit13>
<Filename Value="../../../Documents/source/wst/wst_global.inc"/>
<TopLine Value="1"/>
<CursorPos X="30" Y="19"/>
<UsageCount Value="10"/>
</Unit13>
<Unit14>
<Filename Value="../../wst/regwstmodule.pp"/>
<UnitName Value="regwstmodule"/>
<EditorIndex Value="6"/>
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="2" Y="1"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit14>
<Unit15>
<Filename Value="../demo/reglazwebdata.pp"/>
<UnitName Value="reglazwebdata"/>
<EditorIndex Value="9"/>
<WindowIndex Value="0"/>
<TopLine Value="37"/>
<CursorPos X="1" Y="73"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit15>
</Units>
<JumpHistory Count="30" HistoryIndex="29">
<Position1>
<Filename Value="../../wst/wstmodule.pas"/>
<Caret Line="135" Column="3" TopLine="115"/>
</Position1>
<Position2>
<Filename Value="../../wst/wstmodule.pas"/>
<Caret Line="130" Column="16" TopLine="109"/>
</Position2>
<Position3>
<Filename Value="../../wst/wstmodule.pas"/>
<Caret Line="148" Column="1" TopLine="127"/>
</Position3>
<Position4>
<Filename Value="../../wst/wstmodule.pas"/>
<Caret Line="122" Column="92" TopLine="121"/>
</Position4>
<Position5>
<Filename Value="../../wst/wstmodule.pas"/>
<Caret Line="137" Column="1" TopLine="122"/>
</Position5>
<Position6>
<Filename Value="../../wst/wstmodule.pas"/>
<Caret Line="169" Column="26" TopLine="135"/>
</Position6>
<Position7>
<Filename Value="../../wst/wstmodule.pas"/>
<Caret Line="34" Column="1" TopLine="1"/>
</Position7>
<Position8>
<Filename Value="../../wst/wstmodule.pas"/>
<Caret Line="123" Column="17" TopLine="92"/>
</Position8>
<Position9>
<Filename Value="../../wst/wstmodule.pas"/>
<Caret Line="128" Column="36" TopLine="104"/>
</Position9>
<Position10>
<Filename Value="../../wst/wstmodule.pas"/>
<Caret Line="46" Column="48" TopLine="25"/>
</Position10>
<Position11>
<Filename Value="../../wst/wstmodule.pas"/>
<Caret Line="147" Column="1" TopLine="126"/>
</Position11>
<Position12>
<Filename Value="../../wst/wstmodule.pas"/>
<Caret Line="138" Column="6" TopLine="115"/>
</Position12>
<Position13>
<Filename Value="../../wst/wstmodule.pas"/>
<Caret Line="150" Column="1" TopLine="137"/>
</Position13>
<Position14>
<Filename Value="../../wst/wstmodule.pas"/>
<Caret Line="151" Column="3" TopLine="130"/>
</Position14>
<Position15>
<Filename Value="../../wst/wstmodule.pas"/>
<Caret Line="15" Column="1" TopLine="1"/>
</Position15>
<Position16>
<Filename Value="../../wst/wstmodule.pas"/>
<Caret Line="177" Column="37" TopLine="145"/>
</Position16>
<Position17>
<Filename Value="../../wst/wstmodule.pas"/>
<Caret Line="58" Column="1" TopLine="22"/>
</Position17>
<Position18>
<Filename Value="../demo/reglazwebdata.pp"/>
<Caret Line="17" Column="15" TopLine="1"/>
</Position18>
<Position19>
<Filename Value="../../wst/regwstmodule.pp"/>
<Caret Line="55" Column="79" TopLine="16"/>
</Position19>
<Position20>
<Filename Value="../../wst/regwstmodule.pp"/>
<Caret Line="26" Column="3" TopLine="1"/>
</Position20>
<Position21>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="446" Column="14" TopLine="433"/>
</Position21>
<Position22>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="969" Column="79" TopLine="954"/>
</Position22>
<Position23>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="1171" Column="41" TopLine="1154"/>
</Position23>
<Position24>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="1281" Column="32" TopLine="1280"/>
</Position24>
<Position25>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="1296" Column="30" TopLine="1282"/>
</Position25>
<Position26>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="327" Column="14" TopLine="324"/>
</Position26>
<Position27>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="1296" Column="51" TopLine="1280"/>
</Position27>
<Position28>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="1594" Column="19" TopLine="1579"/>
</Position28>
<Position29>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="1606" Column="58" TopLine="1591"/>
</Position29>
<Position30>
<Filename Value="../fpwebdata.pp"/>
<Caret Line="1607" Column="1" TopLine="1592"/>
</Position30>
</JumpHistory>
</ProjectOptions>
<CompilerOptions>
<Version Value="8"/>
<Target>
<Filename Value="extgrid.cgi"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)/"/>
</SearchPaths>
<Other>
<CompilerPath Value="$(CompPath)"/>
</Other>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,16 @@
program extgrid;
{$mode objfpc}{$H+}
uses
{$ifdef unix}cwstring,xmliconv,{$endif}
fpCGI, wmusers;
{$IFDEF WINDOWS}{$R extgrid.rc}{$ENDIF}
begin
Application.Title:='SQLDBWebDataProvider demo using ExtJS';
Application.Initialize;
Application.Run;
end.

View File

@ -0,0 +1,131 @@
object FPWebProviderDataModule1: TFPWebProviderDataModule1
OnCreate = DataModuleCreate
OldCreateOrder = False
InputAdaptor = ExtJSJSonWebdataInputAdaptor1
ContentProducer = ExtJSJSONDataFormatter1
OnGetContentProducer = DataModuleGetContentProducer
OnGetInputAdaptor = DataModuleGetInputAdaptor
Height = 300
HorizontalOffset = 635
VerticalOffset = 230
Width = 400
object ExtJSJSonWebdataInputAdaptor1: TExtJSJSonWebdataInputAdaptor
left = 232
top = 152
end
object ExtJSXMLWebdataInputAdaptor1: TExtJSXMLWebdataInputAdaptor
left = 272
top = 152
end
object ExtJSXMLDataFormatter1: TExtJSXMLDataFormatter
AllowPageSize = False
left = 272
top = 192
end
object ExtJSJSONDataFormatter1: TExtJSJSONDataFormatter
AllowPageSize = False
left = 232
top = 192
end
object ANAME: TSQLDBWebDataProvider
SelectSQL.Strings = (
'SELECT * FROM FPCUSERS'
)
UpdateSQL.Strings = (
'UPDATE FPCUSERS SET'
' NAME=:NAME,'
' LOGIN=:LOGIN,'
' EMAIL=:EMAIL,'
' LASTLOGIN=:LASTLOGIN'
'WHERE'
' (ID=:ID)'
)
DeleteSQL.Strings = (
'DELETE FROM FPCUSERS WHERE (ID=:ID)'
)
InsertSQL.Strings = (
'INSERT INTO FPCUSERS '
'(ID, LOGIN, NAME, EMAIL, LASTLOGIN)'
'VALUES'
'(:ID, :LOGIN, :NAME, :EMAIL, :LASTLOGIN)'
)
Connection = IBConnection1
IDFieldName = 'ID'
OnGetNewID = ANAMEGetNewID
left = 113
top = 120
end
object IBConnection1: TIBConnection
Connected = False
LoginPrompt = False
DatabaseName = '/wisa/firebird/fpcusers.fb'
KeepConnection = False
Password = 'SysteemD'
Transaction = SQLTransaction1
UserName = 'WISASOFT'
left = 72
top = 120
end
object QGetID: TSQLQuery
IndexName = 'DEFAULT_ORDER'
AutoCalcFields = False
Database = IBConnection1
Transaction = SQLTransaction1
ReadOnly = False
SQL.Strings = (
'SELECT GEN_ID(GEN_FPCUSERS,1) AS THEID FROM RDB$DATABASE'
)
Params = <>
left = 155
top = 63
end
object SQLTransaction1: TSQLTransaction
Active = False
Action = caNone
Database = IBConnection1
left = 74
top = 64
end
object SQLQuery1: TSQLQuery
IndexName = 'DEFAULT_ORDER'
AutoCalcFields = False
Database = IBConnection1
Transaction = SQLTransaction1
ReadOnly = False
SQL.Strings = (
'INSERT INTO FPCUSERS'
'(ID, LOGIN, NAME, EMAIL, LASTLOGIN)'
'VALUES'
'(:ID, :LOGIN, :NAME, :EMAIL, :LASTLOGIN)'
''
)
Params = <
item
DataType = ftUnknown
Name = 'ID'
ParamType = ptUnknown
end
item
DataType = ftUnknown
Name = 'LOGIN'
ParamType = ptUnknown
end
item
DataType = ftUnknown
Name = 'NAME'
ParamType = ptUnknown
end
item
DataType = ftUnknown
Name = 'EMAIL'
ParamType = ptUnknown
end
item
DataType = ftUnknown
Name = 'LASTLOGIN'
ParamType = ptUnknown
end>
left = 174
top = 111
end
end

View File

@ -0,0 +1,43 @@
{ This is an automatically generated lazarus resource file }
LazarusResources.Add('TFPWebProviderDataModule1','FORMDATA',[
'TPF0'#25'TFPWebProviderDataModule1'#24'FPWebProviderDataModule1'#8'OnCreate'
+#7#16'DataModuleCreate'#14'OldCreateOrder'#8#12'InputAdaptor'#7#29'ExtJSJSon'
+'WebdataInputAdaptor1'#15'ContentProducer'#7#23'ExtJSJSONDataFormatter1'#20
+'OnGetContentProducer'#7#28'DataModuleGetContentProducer'#17'OnGetInputAdapt'
+'or'#7#25'DataModuleGetInputAdaptor'#6'Height'#3','#1#16'HorizontalOffset'#3
+'{'#2#14'VerticalOffset'#3#230#0#5'Width'#3#144#1#0#29'TExtJSJSonWebdataInpu'
+'tAdaptor'#29'ExtJSJSonWebdataInputAdaptor1'#4'left'#3#232#0#3'top'#3#152#0#0
+#0#28'TExtJSXMLWebdataInputAdaptor'#28'ExtJSXMLWebdataInputAdaptor1'#4'left'
+#3#16#1#3'top'#3#152#0#0#0#22'TExtJSXMLDataFormatter'#22'ExtJSXMLDataFormatt'
+'er1'#13'AllowPageSize'#8#4'left'#3#16#1#3'top'#3#192#0#0#0#23'TExtJSJSONDat'
+'aFormatter'#23'ExtJSJSONDataFormatter1'#13'AllowPageSize'#8#4'left'#3#232#0
+#3'top'#3#192#0#0#0#21'TSQLDBWebDataProvider'#5'ANAME'#17'SelectSQL.Strings'
+#1#6#22'SELECT * FROM FPCUSERS'#0#17'UpdateSQL.Strings'#1#6#19'UPDATE FPCUSE'
+'RS SET'#6#13' NAME=:NAME,'#6#15' LOGIN=:LOGIN,'#6#15' EMAIL=:EMAIL,'#6#22
+' LASTLOGIN=:LASTLOGIN'#6#5'WHERE'#6#10' (ID=:ID)'#0#17'DeleteSQL.Strings'
+#1#6'#DELETE FROM FPCUSERS WHERE (ID=:ID)'#0#17'InsertSQL.Strings'#1#6#21'IN'
+'SERT INTO FPCUSERS '#6'#(ID, LOGIN, NAME, EMAIL, LASTLOGIN)'#6#6'VALUES'#6
+'((:ID, :LOGIN, :NAME, :EMAIL, :LASTLOGIN)'#0#10'Connection'#7#13'IBConnecti'
+'on1'#11'IDFieldName'#6#2'ID'#10'OnGetNewID'#7#13'ANAMEGetNewID'#4'left'#2'q'
+#3'top'#2'x'#0#0#13'TIBConnection'#13'IBConnection1'#9'Connected'#8#11'Login'
+'Prompt'#8#12'DatabaseName'#6#26'/wisa/firebird/fpcusers.fb'#14'KeepConnecti'
+'on'#8#8'Password'#6#8'SysteemD'#11'Transaction'#7#15'SQLTransaction1'#8'Use'
+'rName'#6#8'WISASOFT'#4'left'#2'H'#3'top'#2'x'#0#0#9'TSQLQuery'#6'QGetID'#9
+'IndexName'#6#13'DEFAULT_ORDER'#14'AutoCalcFields'#8#8'Database'#7#13'IBConn'
+'ection1'#11'Transaction'#7#15'SQLTransaction1'#8'ReadOnly'#8#11'SQL.Strings'
+#1#6'9SELECT GEN_ID(GEN_FPCUSERS,1) AS THEID FROM RDB$DATABASE'#0#6'Params'
+#14#0#4'left'#3#155#0#3'top'#2'?'#0#0#15'TSQLTransaction'#15'SQLTransaction1'
+#6'Active'#8#6'Action'#7#6'caNone'#8'Database'#7#13'IBConnection1'#4'left'#2
+'J'#3'top'#2'@'#0#0#9'TSQLQuery'#9'SQLQuery1'#9'IndexName'#6#13'DEFAULT_ORDE'
+'R'#14'AutoCalcFields'#8#8'Database'#7#13'IBConnection1'#11'Transaction'#7#15
+'SQLTransaction1'#8'ReadOnly'#8#11'SQL.Strings'#1#6#20'INSERT INTO FPCUSERS'
+#6'#(ID, LOGIN, NAME, EMAIL, LASTLOGIN)'#6#6'VALUES'#6'((:ID, :LOGIN, :NAME,'
+' :EMAIL, :LASTLOGIN)'#6#0#0#6'Params'#14#1#8'DataType'#7#9'ftUnknown'#4'Nam'
+'e'#6#2'ID'#9'ParamType'#7#9'ptUnknown'#0#1#8'DataType'#7#9'ftUnknown'#4'Nam'
+'e'#6#5'LOGIN'#9'ParamType'#7#9'ptUnknown'#0#1#8'DataType'#7#9'ftUnknown'#4
+'Name'#6#4'NAME'#9'ParamType'#7#9'ptUnknown'#0#1#8'DataType'#7#9'ftUnknown'#4
+'Name'#6#5'EMAIL'#9'ParamType'#7#9'ptUnknown'#0#1#8'DataType'#7#9'ftUnknown'
+#4'Name'#6#9'LASTLOGIN'#9'ParamType'#7#9'ptUnknown'#0#0#4'left'#3#174#0#3'to'
+'p'#2'o'#0#0#0
]);

View File

@ -0,0 +1,107 @@
unit wmusers;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, HTTPDefs, websession, fpHTTP, fpWeb,
IBConnection, sqldb, fpwebdata, extjsjson, extjsxml, sqldbwebdata;
type
{ TFPWebProviderDataModule1 }
TFPWebProviderDataModule1 = class(TFPWebProviderDataModule)
ExtJSJSONDataFormatter1: TExtJSJSONDataFormatter;
ExtJSJSonWebdataInputAdaptor1: TExtJSJSonWebdataInputAdaptor;
ExtJSXMLDataFormatter1: TExtJSXMLDataFormatter;
ExtJSXMLWebdataInputAdaptor1: TExtJSXMLWebdataInputAdaptor;
IBConnection1: TIBConnection;
ANAME: TSQLDBWebDataProvider;
QGetID: TSQLQuery;
SQLQuery1: TSQLQuery;
SQLTransaction1: TSQLTransaction;
procedure ANAMEGetNewID(Sender: TObject; out AID: String);
procedure DataModuleCreate(Sender: TObject);
procedure DataModuleGetContentProducer(Sender: TObject;
var AContentProducer: TCustomHTTPDataContentProducer);
procedure DataModuleGetInputAdaptor(Sender: TObject;
var AInputAdaptor: TCustomWebdataInputAdaptor);
private
{ private declarations }
public
{ public declarations }
end;
var
FPWebProviderDataModule1: TFPWebProviderDataModule1;
implementation
uses inifiles;
{ TFPWebProviderDataModule1 }
procedure TFPWebProviderDataModule1.DataModuleGetContentProducer(
Sender: TObject; var AContentProducer: TCustomHTTPDataContentProducer);
begin
If Request.QueryFields.values['format']='xml' then
AContentProducer:=ExtJSXMLDataFormatter1;
end;
procedure TFPWebProviderDataModule1.DataModuleCreate(Sender: TObject);
Var
FN : String;
Ini : TMemIniFile;
begin
FN:=ChangeFileExt(Paramstr(0),'.ini');
If FileExists(FN) then
begin
Ini:=TMemIniFile.Create(FN);
try
With IBConnection1 do
begin
DatabaseName:=Ini.ReadString('Database','Path',DatabaseName);
UserName:=Ini.ReadString('Database','UserName',UserName);
Password:=Ini.ReadString('Database','Password',Password);
end;
finally
Ini.Free;
end;
end;
IBConnection1.Connected:=True;
end;
procedure TFPWebProviderDataModule1.ANAMEGetNewID(Sender: TObject; out
AID: String);
begin
With QGetID Do
begin
Close;
Open;
try
if (EOF and BOF) then
Raise Exception.Create('No ID generated');
AID:=Fields[0].AsString;
finally
Close;
end;
end;
end;
procedure TFPWebProviderDataModule1.DataModuleGetInputAdaptor(Sender: TObject;
var AInputAdaptor: TCustomWebdataInputAdaptor);
begin
If Request.QueryFields.values['format']='xml' then
AInputAdaptor:=ExtJSXMLWebdataInputAdaptor1;
end;
initialization
{$I wmusers.lrs}
RegisterHTTPModule('Provider', TFPWebProviderDataModule1);
end.

View File

@ -0,0 +1,40 @@
The demo directories demonstrate the use of the TFPWebDataProvider
components, using ExtJS. It demonstrates the use of JSON and XML
communitation between a ExtJS Datastore and the webdataprovider.
ExtJS must be installed, it can be downloaded for free from
http://www.extjs.com/
The examples assume that it is reachable through /ext/
Demo1 shows how to use the component with a plain webdatamodule,
using actions, and creating all components on the fly.
Demo2 shows how to use the components by dropping them on a plain
webdatamodule, and handling all in the OnRequest handler of the
webdatamodule.
Demo3 shows how to use the components in combination with a
WebProviderDatamodule.
Demo4 shows how webdataprovider components can be dropped
on plain datamodules, and how these modules can be made
available to the webdatamodule.
Demo5 shows how to register your own TWebdataProvider instances, which
are created on the fly to perform their action.
Demo6 demonstrates the use of the TSQLDBWebDataProvider component.
All demos except Demo6 use CGI and a TDBF component to feed data to
the webpage, which means they are not very suitable for real life
situations due to file locking etc.
To try a demo, compile one of the appropriate CGI apps, and open
the extgrid-json.html or extgrid-xml.html page in your browser
through the webserver, something like:
http://localhost/~myuser/extjs/demo2/extgrid-json.html

Binary file not shown.