Forum : AllgemeinesTitel : "makemeCnameCheckArray"© 2004-2012 www.exv2.de http://www.exv2.de
URL dieser Diskussion
http://www.exv2.de/modules/newbb_plus/viewtopic.php?topic_id=4234&forum=8
|
molli :
| 14.12.2008 00:49 |
Hallo zusammen, ich sitze hier wieder mal vor einem für mich unlösbaren Problem und bitte euch deshalb einmal mehr um eure Hilfe. Und zwar versuche ich verzweifelt eine Funktion wie die "makeCnameSelectArray" in der "func_makeCnameSelectArray.php" hinzukriegen. Allerdings sollen die Kategorien nicht als Select-Felder sondern mit checkboxen dargestellt bzw. ausgewählt werden können, das ist der Sinn der Sache. Ich habe also die "func_makeCnameSelectArray.php" kopiert und in "func_makeCnameCheckArray.php" umbenannt sowie die Funktionen in "makeCnameCheckArray" und getChildCArray. Alles was verdächtig nach Selectfeld aussah, hab ich entfernt (Sorry das ich wie ein Metzger und nicht wie ein Chirurg vorgeh, bin und bleib halt ein blutiger Anfänger). Das ganze funktioniert auch soweit ganz gut, spreche ich die Funktion in einer form mit einer checkbox an, ist sie nicht abgeneigt nur wenn's zur Sache geht, zickt sie rum (wie im wahren Leben) d. h. ich bekomm die Kategorien als Liste mit Checkboxen aber der array wird nicht übernommen bzw. behalten. Wenn mir also jemand da draussen helfen kann und will schon mal vielen Dank im Voraus
Gruß Oli |
|
|
Nobse :
| 14.12.2008 13:20 |
Entweder mal hier den Code Posten von der Function und dem teil des Forms oder wo kann man sich das ansehen |
|
|
bama :
| 14.12.2008 18:28 |
Hi Oli,
die function makeCnameSelectArray gibt ein array zurück, und kein selectfeld Zitat:Alles was verdächtig nach Selectfeld aussah, hab ich entfernt
Select gehört aber hier zur Datenbankabfrage
wie Nobse schon sagte, etwas mehr input bräuchten wir schon, vor allem, was als Ergebnis raus kommen soll z.B.
1.Kategoriename () 1.Child () 2.Child
soll alles mit Checkboxen versehen sein, oder nur die Child? |
|
|
molli :
| 14.12.2008 23:47 |
Hallo Nobse, hallo Hans,
also Childs (ich vermute, das sind in meinem Fall die csid's) hab ich keine angelegt. Sinn und Zweck ist es, eine Auswahl von mehreren Kategorien zu ermöglichen.
hier noch der Code:
Code:So wird die Kategorienliste im form aufgerufen:
$catarray = inc_function("makeCnameCheckArray", array("boogy_cat","title","sort","cid","csid","","",0),""); $temp = ExoopsFormProducer::f_checkbox("", "cid", $cid, $catarray); $form .= $temp->render();
Die Funktion "makeCnameCheckArray" funktioniert insofern, dass die Kategorienliste mit den Auswahlkästchen dargestellt wird. Man kann auch die einzelnen Kategorien auswählen und wenn man jetzt direkt speichert, wird's auch in die DB übernommen. Mein Problem ist aber, dass ich noch über eine weitere "form" und noch eine preview.form muss, bis die Daten gesendet werden. Die Funktion "f_hidden(""cid", $cid);" hab ich eingebunden bringt aber auch nichts, nach dem ersten submit ist alles weg.
function makeCnameCheckArray($table, $title, $order="", $t_id="", $s_id="", $c_id=0, $ex_child=0, $ausw=1) { global $db, $myts; $sql = "SELECT ".$t_id.", ".$title." FROM ".$db->prefix($table)." WHERE "; if ($c_id > 0){ $sql .= "cid = ".$c_id." and "; } $sql .= $s_id."=0"; if ($order != "") { $sql .= " ORDER BY ".$order; } //echo $sql; $result = $db->query($sql); if($ausw == 1){ $ret = array(); }else{ $ret = array(); } while ( list($catid, $name) = $db->fetch_row($result) ) { if ($ex_child == 0){ $ret[$catid] = $myts->makeTboxData4Show($name); } $arr = getChildCArray($table, $t_id, $s_id, $catid, $order); foreach ($arr as $option) { $option['prefix'] = str_replace(".", "--", $option['prefix']); $catpath = $option['prefix']." ".$myts->makeTboxData4Show($option[$title]); $ret[$option[$t_id]] = $myts->makeTboxData4Show($catpath); } } return $ret; } function getChildCArray($table, $t_id, $s_id, $sel_id=0, $order="", $parray = array(), $r_prefix="") { global $db; $sql = "SELECT * FROM ".$db->prefix($table)." WHERE ".$s_id."=".$sel_id.""; if ($order != "") { $sql .= " ORDER BY ".$order." "; } //echo $sql; $result = $db->query($sql); $count = $db->num_rows($result); if ($count == 0) { return $parray; } while ( $row = $db->fetch_array($result) ) { $row['prefix'] = $r_prefix."."; array_push($parray, $row); $parray = getChildCArray($table, $t_id, $s_id, $row[$t_id], $order, $parray, $row['prefix']); } return $parray; }
Vielen Dank und viele Grüße Oli |
|
|
bama :
| 15.12.2008 12:06 |
Zitat:Mein Problem ist aber, dass ich noch über eine weitere "form" und noch eine preview.form muss
schau dir mal die register.php an, da gibt es ein Feld: user_intrest register.php wird auch mehrmals aufgerufen, die Daten werden vor und zurück geschickt ich habe das mit einem String gelöst, diesen kannst du einfach über hidden weitergeben |
|
|
molli :
| 22.12.2008 01:41 |
Hallo Hans,
erstmal ein dickes "DANKESCHÖN" , ohne Dich hätte ich mich bestimmt schon vor den Zug gelegt!
DANKE!
Es hat zwar etwas gedauert, doch jetzt hab ich's endlich hinbekommen. Allerdings ist das bisschen Stolz, der da mal kurz aufkam, schon wieder umgeschlagen in ein tiefe Depression – ICH KRIEG DIE DATEN NICHT MEHR AUSGELESEN - verflixt, verflixt, verflixt.
Ich weiß ich verlange Euch viel ab, wenn ich euch schon wieder um Hilfe bitte, aber vielleicht habt ihr in dieser besinnlichen Zeit noch etwas Barmherzigkeit für mich übrig.
Mein Problem ist folgendes:
bekommt man z.B. den/die Array/Variable $cid=3 geliefert (das Modul basiert auf ViSo)
dann soll die SQL Abfrage die Kategorienamen bzw. die Kategorieeinträge (je nach dem welche Tabelle angesprochen wird) ausgeben, die in der cid-Spalte den Wert 3 enthalten.
steht jetzt in der Zelle nur eine 3, funktioniert das ganze wie gewohnt; steht jetzt aber 2|3 oder 2|3|4|5 funktioniert's natürlich nicht mehr.
Ich habe versucht das irgendwie so zu lösen
Code:function index() { ob_start();
global $db, $boogyConfig, $sortBlock, $orderby, $debut, $xoopsConfig, $xoopsUser, $myts, $meta;
$mytree = new XoopsArbre($db->prefix("boogy_kat"),"cid","csid"); isset($_GET['cid']) ? $cid=$_GET['cid']:$cid="0"; isset($_GET['orderby']) ? $orderby = $_GET['orderby']:$orderby = "tid DESC, date DESC"; isset($_GET['sort']) ? $sort = $_GET['sort']:$sort = "";
if ($debut=="") { $debut=0; } $tableContent = ""; $value = $cid;
$cid = explode('|',$cid['cid']); $value0 = $cid[0]; $value1 = $cid[1]; $value2 = $cid[2]; $value3 = $cid[3]; $value4 = $cid[4]; $value5 = $cid[5]; $value6 = $cid[6];
$sql = "SELECT lid, cid, title, tid, description, date, valid FROM ".$db->prefix("boogy_desc")." WHERE (valid='Yes') AND cid='$value0' OR cid='$value1' OR cid='$value2' OR cid='$value3' OR cid='$value4' OR cid='$value5' OR cid='$value6'"; $result=$db->query($sql);
$numrows = $db->num_rows($result);
list($numrows) = $db->fetch_row($db->query("SELECT COUNT(*) FROM ".$db->prefix("boogy_desc")." WHERE valid='Yes'and cid='$value0' OR cid='$value1' OR cid='$value2' OR cid='$value3' OR cid='$value4' OR cid='$value5' OR cid='$value6'")); $tableContent .= boogyOpenTable();
$cid = $value; $tableContent .= table_listsortb($result,$cid,$orderby,$sort,$debut); $tableContent .= boogyCloseTable(); $tableContent .= infoBlock($debut, $boogyConfig['nb_affichage'], $numrows, $orderby, $sort);
$tableContent .= boogyOpenTable(); $tableContent .= table_listb($result,$cid,$orderby,$sort,$debut); $tableContent .= boogyCloseTable(); $tableContent .= boogyOpenTable(); $tableContent .= boogyCloseTable();
if($numrows >= $boogyConfig['nb_affichage']){
$tableContent .= boogyOpenTable(); $pagenav = new XoopsPageNav($numrows, $boogyConfig['nb_affichage'], $debut, "cid=$cid&orderby=$orderby&sort=$sort&debut", ""); $tableContent .= $pagenav->renderNav(10, 3); $tableContent .= boogyCloseTable(); }
echo $tableContent; }
wie gesagt – versucht.
Viele Grüße
Oli |
|
|
Nobse :
| 22.12.2008 11:58 |
Hoffe hab dich richtig verstanden
dein $cid ist vom GET und hat den Wert 1|3|4 z.B
in der tabellenfeld cid steht immer nur ein wert z.B 3
dann kannst das so abfragen
WHERE cid in (1,3,4)
brauchst also blos von deinem GET die | durch , ersetzen und dann
WHERE cid in $cid |
|
|
bama :
| 22.12.2008 14:55 |
probiere doch mal die Datenbankabfrage wie folgt:
PHP Code:1: <?php 2: $cid = isset($_GET['cid']) ? $_GET['cid'] : "0"; 3: $orderby = isset($_GET['orderby']) ? $_GET['orderby'] : "tid DESC, date DESC"; 4: $sort = isset($_GET['sort']) ? $_GET['sort']: ""; 5: $start = isset($_GET['start']) ? intval($_GET['start']) : 0; 6: $limit = isset($_GET['limit']) ? intval($_GET['limit']) : 0; 7: 8: $where_query = ""; 9: if ( is_array($cid) && count($cid) > 0 ) { 10: $where_query = " WHERE valid='Yes' AND ("; 11: foreach ( $cid as $c ) { 12: $where_query .= " cid='$c' OR"; 13: } 14: $where_query = substr($where_query, 0, -3); 15: $where_query .= ")"; 16: }elseif($cid > 0){ 17: $where_query = " WHERE valid='Yes' AND cid='".$cid."' "; 18: }else{ 19: $where_query = " WHERE valid='Yes'"; 20: } 21: 22: $sql = "SELECT lid, cid, title, tid, description, date, valid FROM ".$db->prefix("boogy_desc")."".$where_query." ORDER BY ".$orderby." "; 23: 24: $numrows = $db->num_rows($db->query($sql)); 25: 26: $result=$db->query($sql,$limit,$start); 27: while ( $myrow = $db->fetch_array($result) ) { 28: //hier dann deine "eiterverarbeitung 29: $xxxxx = $myts->makeTboxData4Show($myrow['title']); 30: // usw. 31: } 32: ?>
$start und $limit benötigst du dann für XoopsPageNav $orderby und $sort musst du noch anpassen, im default von $orderby hast du ja die Sortierung schon drinnen |
|
|
molli :
| 23.12.2008 00:47 |
Hallo Nobse, hallo Hans,
erstmal noch ein herzliches Dankeschön für Eure Hilfe und die damit verbundene Mühen. Leider ist es noch nicht ganz das was mir weiter hilft. Ich hab beide Varianten ausprobiert die auch funktionieren allerdings nur dann wenn ein einziger Wert in der sql Zelle steht. Ich versuch's nochmal etwas genauer zu erklären.
Also die cid3 die über get kommt ist die Kategorien-id z.B. (KategorieA hat die cid=1, KategorieB cid=2 und KategorieC cid=3) diese id's sind einzigartig und kommen aus der Tabelle boogy_cat.
In der Tabelle boogy_desc liegen die Einträge und je nachdem welche Kategorie bzw. Kategorien gewählt wurden, können jetzt in der Spalte cid dieser Tabelle folgende Werte stehen z.B.( 3 wenn nur die KategorieC gewählt wurde, 2|3 wenn KategorieB + C und 1|2|3 wenn KategorieA + B +C gewählt wurden usw.).
Die sql Abfrage müsste also irgendwie so aussehen:
KategorieC = $cid= 3
gehe her wähle lid, cid, title, tid, description, date, valid von Tabelle boogy_desc schau in der Spalte cid nach einer 3
Da das ganz aber noch etwas dümmer ist als ich, wird er – wenn z.B. die 1|2|3 drin steht – das als ganzen Wert ansehen und die 3 darin nicht erkennen. Ich hatte schon versucht die cid's auszulesen und zu exploden und anschließen zu vergleichen – naja funktioniert hat's nicht – nur für den Fall, dass das doch möglich ist, würde sich das auf die Suchgeschwindigkeit auswirken? Wichtig wäre noch, dass das $result wenn es vielleicht irgendwie zustande kommt, so "robust" ist, dass man die funktionen table_listsortb und table_listb weiterhin ansprechen kann.
Ich doch nix verstehen.
Viele Grüße
Oli |
|
|
bama :
| 23.12.2008 11:15 |
sorry, hatte nicht mehr dran gedacht, dass bei dir $cid als String besteht, nicht als array, wie normal von einem check array
$cid = isset($_GET['cid']) ? explode("|",$_GET['cid']) : array(0); |
|
|
Nobse :
| 23.12.2008 20:25 |
Ich hab das anders verstanden
in der DB im feld cid kann stehen 3 1|3 1|2|3 usw.
in der $_GET['cid'] nur ein Wert 1 2 oder 3
das könnte man dann über LIKE abfrage
WHERE cid LIKE '%$cid%' |
|
|
molli :
| 24.12.2008 12:38 |
Vielen Dank ihr zwei!! Beide Lösungen funktionieren fantastisch. Ihr habt mir damit das schönste Weihnachtsgeschenk beschert (zumindest bis jetzt ).
Wünsche Euch frohe Weihnachten und einen guten Rutsch ins neue Jahr.
Viele Grüße
Oli |
|
|
|