SELECT a.lid, b.login_name FROM web.wsess a, web.wlogin b WHERE sid = $sess_id AND a.lid = b.lid
Mittwoch, 20. Januar 2010
COMA: Angemeldeten User ermitteln
COMA: Bild dynamisch erzeugen
Hier als Makro umgesetzt, welches so aufgerufen wird:
[§fcreatePic§]
function createPic() {
if(isset($_REQUEST['getpic']) &&
Header("Content-type: image/jpeg");
$width = "300";
$height = "50";
// neues Bild erzeugen
$image = ImageCreateTrueColor($width, $height);
// Farben definieren
$col1 = ImageColorAllocate($image, 255, 255, 200);
$col2 = ImageColorAllocate($image, 0, 0, 0);
// Hintergrund mit Farbe füllen
ImageFill($image, 0, 0, $col1);
// Text dazu
ImageString ($image, 5, 20, 20,
"Coded bei FIAE", $col2);
// Grafik ausgeben
ImageJPEG($image);
// Speicher wieder frei geben
ImageDestroy($image);
}
else {
return "<img src=\"{$_SERVER["REQUEST_URI"]}&getpic\">";
}
}
Dienstag, 19. Januar 2010
COMA: Oracle-Blob als Image-Stream
Hier als Makro umgesetzt, welches z.B. so aufgerufen wird:
[§fpicStream_13404§]
Als Parameter wird die gewünschte Bild-ID übergeben.
function picStream($conn, $param) {
if(isset($_REQUEST['getpic']) &&
is_numeric($param)) {
$sql = "select pics_blob from web.wpics
where pics_id=$param";
$stmt = OCIparse($conn, $sql) ;
OCIExecute($stmt,OCI_DEFAULT) ;
$check = OCIFetchInto($stmt, $row, OCI_ASSOC);
if($check == 1)
echo $row["PICS_BLOB"]->load();
}
else {
return "<img src=\"{$_SERVER["REQUEST_URI"]}&getpic\">";
}
}
Donnerstag, 14. Januar 2010
COMA: LDAP per PHP durchsuchen
function search_user_ldap($string) {
$filter =
"(&
// aktiviert, deaktiviert, alle
(nsrole=*roleself*)
(objectclass=ufzperson)
// Attribut nach dem wir suchen (sn=Surname)
(sn=".$string."*)
)";
// Attribute die geliefert werden sollen
$attr = array("sn");
// Menge der Suchergebnisse (0=unbegrenzt)
$count = 0;
// Ergebnisarray
$search = array();
if(cldap_Search("", &$search, $filter, $attr, $count)) {
$search = cldap_DeleteCount($search, 1);
foreach($search as $val) {
$ret[] = $val[$attr[0]][0];
}
}
return $ret;
}
COMA: Oracle-Tabellen zwischen Instanzen kopieren
Beispiel 1: von SERVICE nach INTERNET
create table WEB.WTR_UFZ as select * from WEB.WTR_UFZ@testsystem
Beispiel 2: von INTERNET nach SERVICE
create table WEB.WTR_UFZ as select * from WEB.WTR_UFZ@internet
Dienstag, 12. Januar 2010
Javascript: Objektorientierung und Drag and Drop (Teil 2)
Vererbung
Im zweiten Teil geht es um die Vererbung, ich habe u.a. in den Kommentaren den Begriff Klassen verwendet (natürlich gibt es in Javascript keine Klassen in dem Sinne), da ich aber versucht habe Strukturen nachzubilden, wie sie aus Java bzw. C# bekannt sind, erklärt sich das Ganze so besser.
Ob eine Verkettung der drei definierten Klassen möglich ist, gilt es noch auszutesten!
Javascript im HEAD (u.a. Objektinstanzierung):
window.onload = Init;
function Init() {
// neues Objekt der Subklasse instanzieren
var dragObj = new DragById("dragable_1");
// weiterere moegliche Instanzierung
//var dragObj = new DragInFrame(316, 92);
// Events öffentlichen Methoden aus
// dem instanziertem Objekt zuweisen
document.getElementById("dragpanel").onmousedown =
dragObj.startDrag;
document.getElementById("dragpanel").onmousemove =
dragObj.Drag;
document.getElementById("dragpanel").onmouseup =
dragObj.endDrag;
}
Javascript im HEAD (die Basisklasse):
function DragObj() {
// Variable zur Rückgabe
// von öffentlichen Methoden (Pattern)
var that = {};
// Objektvariablen
this.movie = null;
this.startX = 0;
this.startY = 0;
this.start_drag = false;
// öffentliche Methoden
that.startDrag = function(e) {
// Browserweiche
if(!e) { // IE
e = window.event;
this.movie = e.srcElement;
}
else
this.movie = e.target;
this.startY =
e.screenY - parseInt(this.movie.style.top);
this.startX =
e.screenX - parseInt(this.movie.style.left);
this.start_drag = true;
}
that.Drag = function(e) {
if(this.start_drag) {
if(!e)
e = window.event;
var newX = e.screenX - this.startX;
var newY = e.screenY - this.startY;
this.movie.style.left = newX + "px";
this.movie.style.top = newY + "px";
document.title = "X: " + newX + " Y: " + newY;
}
}
that.endDrag = function() {
this.start_drag = false;
}
return that;
}
Javascript im HEAD (die Subklassen):
function DragById(objId) {
// Konstruktor der Basisklasse aufrufen
this.constructor();
// öffentliche Methode der Basisklasse überschreiben
this.startDrag = function(e) {
if(document.getElementById(objId)) {
this.movie = document.getElementById(objId);
this.startY =
e.screenY - parseInt(this.movie.style.top);
this.startX =
e.screenX - parseInt(this.movie.style.left);
this.start_drag = true;
}
}
}
// Initialisierung der Vererbung
DragById.prototype = new DragObj();
// weitere abgeleitete Klasse definieren
function DragInFrame(frameWidth, frameHeight) {
// Konstruktor der Basisklasse aufrufen
this.constructor();
// öffentliche Methode der Basisklasse überschreiben
this.Drag = function(e) {
if(this.start_drag) {
if(!e)
e = window.event;
var newX = e.screenX - this.startX;
var newY = e.screenY - this.startY;
if(newX > 0 && newX < frameWidth)
this.movie.style.left = newX + "px";
if(newY > 0 && newY < frameHeight)
this.movie.style.top = newY + "px";
document.title = "X: " + newX + " Y: " + newY;
}
}
}
// Initialisierung der Vererbung
DragInFrame.prototype = new DragObj();
HTML im BODY:
<img src="html.gif" style="position:absolute; top:0; left:0;" onmousedown="return false;" onmousemove="return false;" width="129" height="108" id="dragable_1" />
Freitag, 8. Januar 2010
AJAX: HTML-Element für Autovervollständigung
Nachdem ich nach einigem Suchen kein stabiles Element für eine AJAX-Autocomplete Funktion gefunden habe, hier mein Mix aus einem Text- und Listenfeld.
Zum Test einfach etwas eingeben (ohne Datenanbindung).
var charCode = 0; // Tastencode aus beiden Steuerelementen
var optText = null; // Textfeld
var optList = null; // Listenfeld
var topOpt = false; // Hilfsvariable zum Steuern des Uebergangs
var oldText = ""; // Vorwert aus Textbox merken
function Init(obj) {
if(optList) // Falls noch andere Liste offen
//CloseList(false); // IE hängt sich auf
optList.style.display = 'none';
optText = obj;
optList = GetSelect(optText); // SELECT-Element ermitteln
// geerbte Breite des Eingabefeldes an SELECT-Element weitergebn
optList.style.width = optText.offsetWidth + "px";
// Variable charCode setzen
document.onkeydown = GetKeyCode;
}
function OpenList() {
oldText = optText.value; // Wert für Abbruch merken
if(charCode == 27) { // ESC
optList.style.display = 'none'; // Liste wieder zu machen
return;
}
if(charCode == 13) { // ESC
optList.style.display = 'none'; // Liste wieder zu machen
// Event valuefixed auslösen
return;
}
if(optText.value.length > 0) { // ist etwas im Textfeld
topOpt = true; // Pfeiltaste nach oben soll Textfeld aktivieren
with(optList) {
// bei diesen Tasten Liste anzeigen
if(
charCode == 8 || // Backspace
charCode == 40 || // Pfeil nach unten
charCode == 46 || // Delete
(charCode >= 48 && charCode <= 57) || // 0-9
(charCode >= 65 && charCode <= 90) || // a-z
charCode == 109 || // -
charCode == 190 || // .
charCode == 59 || // ü
charCode == 192 || // ö
charCode == 219 || // ß
charCode == 222 // ä
) {
style.display = 'block'; // Liste anzeigen
selectedIndex = -1; // nichts auswaehlen
}
}
}
else
CloseList(false); // wurde z.B. alles geloescht, Liste schliessen
// Übergang zur Liste bei...
if(charCode == 40 && // ... Pfeiltaste nach unten
optList.style.display == 'block') { // und Liste offen
optText.value = optList.options[0].value; // Textbox aktualisieren
optList.focus(); // Liste aktivieren
optList.selectedIndex = 0; // ersten Eintrag auswählen
}
}
function CloseList(setOpt) {
if(setOpt && (optList.options.length != optList.selectedIndex + 1)) {
optText.value = optList.value; // Listenwert ins Textfeld
// Event valuefixed auslösen
}
else {
optText.value = oldText;
oldText = null;
}
optText.focus(); // Textfeld aktivieren
optList.style.display = 'none'; // Liste ausschalten
}
function CancelSelect() {
optList.style.display = 'none'; // Liste ausschalten
optText.value = oldText; // gemerkten Text einsetzen
optText.focus(); // Textfeld aktivieren
}
function CtrlList() {
if(charCode == 13) // Enter
CloseList(true);
if(charCode == 27) // ESC
CancelSelect();
if((charCode == 38 || charCode == 40) && // Pfeiltaste oben unten
optList.options.length != optList.selectedIndex + 1) // nicht letzte Option
optText.value = optList.value;
if(charCode != 38) // nicht Pfeiltaste nach oben
topOpt = false;
// Pfeiltaste nach oben und oberster Eintrag ausgewaehlt
if(charCode == 38 && optList.selectedIndex == 0) {
if(topOpt) { // beim ersten Mal noch nichts machen
optList.style.display = 'none'; // Liste ausschalten
optText.focus(); // Textfeld aktivieren
}
else
topOpt = true; // um beim zweiten Pfeiltaste nach oben
} // Steuerelement zu wechseln
}
function GetKeyCode(e) {
if (!e)
e = window.event;
charCode = e.keyCode;
}
function GetSelect(obj) {
var count = 0;
do {
var elem = obj.nextSibling;
obj = elem;
count++;
if(count > 3) break;
} while(elem.type != "select-one")
return elem;
}
function FixValue() {
// TODO: Event valuefixed auslösen
// aktives Element oder Tastencodes prüfen
}
CSS im HEAD:
input.autocomplete {
width: inherit;
}
input.autocomplete {
display: block;
}
select.autocomplete {
display: none;
position: absolute;
}
#autocomplete1 {
float: left;
width: 200px;
}
#autocomplete2 {
float: left;
width: 200px;
}
.lastopt {
background-color: lightgray;
}
HTML im BODY:
<div id="autocomplete1">
<input type="text" name="autocomplete2" class="autocomplete" onclick="this.focus();" onfocus="Init(this)" onkeyup="OpenList();" onblur="FixValue();" tabindex="2" />
<select size="4" class="autocomplete" onclick="CloseList(true);" onkeyup="CtrlList();">
<option value="Peter">Peter</option>
<option value="Peters">Peters</option>
<option value="Petersen">Petersen</option>
<option value="Petersohn">Petersohn</option>
<option class="lastopt" title="Schließen">⇑</option>
</select>
</div>
COMA: AJAX-Response ohne Content
if(isset($_GET['ajax'])) {
echo utf8_encode("Hallo AJAX!");
die(); // ohne die() wird der komplette Kontent
} // mit zurückgegeben