artikelsortierung ändern
frank
- php
hallo.
ich habe ein kleines cms programmiert und möchte dies auch auf meine homepage einsetzten. die artikel die ausgegeben werden, werden nach id ausgelesen und dargestellt.
dies ist nicht immer sinnvoll da manche artikel in der priorität wechseln sollten.
wie kann ich es nun im adminbereich realisieren artikel up/down zu stellen.
man müsst ja die id des artikels und aller anderen artikel auch ändern. hat das schon mal jemand gemacht und kann mir hier weiterhelfen.
tschau frank
Hi
ich habe ein kleines cms programmiert und möchte dies auch auf meine homepage einsetzten. die artikel die ausgegeben werden, werden nach id ausgelesen und dargestellt.
dies ist nicht immer sinnvoll da manche artikel in der priorität wechseln sollten.
Inwiefern?
wie kann ich es nun im adminbereich realisieren artikel up/down zu stellen.
man müsst ja die id des artikels und aller anderen artikel auch ändern. hat das schon mal jemand gemacht und kann mir hier weiterhelfen.
Ohne deine Datenstruktur zu kennen würde ich sagen, dass du beim Holen der Datensätze aus der DB einfach sortieren solltest, denn ORDER BY ermöglicht ja nach mehreren Präferenzen zu ordnen.
SELECT FROM table WHERE CLASS = $class ORDER BY bla,blub,hups
Fabian
hallo
SELECT FROM table WHERE CLASS = $class ORDER BY bla,blub,hups
die datensätze werden beim auslesen nach der id geordnet.
ich möchte diese ids aber im backend also im cms bereits ändern könnnen.
mfg frank
Hi
SELECT FROM table WHERE CLASS = $class ORDER BY bla,blub,hups
die datensätze werden beim auslesen nach der id geordnet.
ich möchte diese ids aber im backend also im cms bereits ändern könnnen.
Wenn es sich um AutoIncrement-IDs handelt hast du einen konzeptionellen fehler gemacht und das geht nicht.
(Nein, dass die ID autoincrment ist, ist richtig, aber man muss sich nunmal _vorher_ überlegen, welche Daten man braucht.)
Und selbst wenn es geht, dann solltest du ein Feld PRIORITY oder so ähnlich einbauen, dass du ändern kannst, denn an IDs spielt man nicht rum...
Fabian
Hi
SELECT FROM table WHERE CLASS = $class ORDER BY bla,blub,hups
nein ich habe kein ID autoincrment eingebaut. die ids werden bei mir vom system vergeben.
was soll das priority feld bewirken?
kann mir nur vorstellenn das du da wiederum id/namen reinschreibst die dann per order by xyz ausgelesen werden.
mfg frank
Hi
SELECT FROM table WHERE CLASS = $class ORDER BY bla,blub,hups
nein ich habe kein ID autoincrment eingebaut. die ids werden bei mir vom system vergeben.
*rotfl* You made my day... >;)
was soll das priority feld bewirken?
kann mir nur vorstellenn das du da wiederum id/namen reinschreibst die dann per order by xyz ausgelesen werden.
Nein, du schreibst die prioritätsstufe rein (z.B. SET oder ENUM). Die kannst du dann bequem für jeden Datensatz ändern.
Fabian
hallo Frank!
die datensätze werden beim auslesen nach der id geordnet.
ich möchte diese ids aber im backend also im cms bereits ändern könnnen.
Füge ein Feld order, ranking o.ä. ein, welches du verändern kannst - dann kannst du hiernach sie Ausgabe sortieren...
Gruss Sven
hallo sven,
kannst du mal ein beispiel bringen wie du das meinst,
theoretisch ist mir das schon klar, leider habe ich grad keinen wirklichen praktischen ansatz für dieses prbelm. kannst du mir mal ein code-beispiel post?
mfg.
frank
Moin Moin !
Komm, bring mal etwas Schwung in die grauen Zellen!
Tabelle alt:
ID Artikeltext Autor Datum
Tabelle neu:
ID Artikeltext Autor Datum Prioritaet
Abfrage alt:
Select * from tabelle order by datum
Abfrage neu:
Select * from tabelle order by prioritaet, datum
Alexander
Hallo Frank,
Erst einmal: ich habe den Eindruck, dass Dich bisher keiner wirklich verstanden hat, (vor allem in dem Sinn, wie weit Du schon in Gedanken warst) obwohl die Fragestellung _sehr_ deutlich war. Seltsam.
wie kann ich es nun im adminbereich realisieren artikel up/down zu stellen.
man müsst ja die id des artikels und aller anderen artikel auch ändern. hat das schon mal jemand gemacht und kann mir hier weiterhelfen.
Also: Ich habe das mit einem sehr simplen, jedoch komplett ineffizienten Algorithmus gelöst. Es gibt mit _Sicherheit_ effizientere Algorithmen »da draußen«. Aber der folgende funktioniert, und ich hatte nicht viel Zeit, daher hab' ich mich damit begnügt. (Über etwas effizienteres würde ich selbst mich sehr freuen :-))
»Angehäng« habe ich eine Funktion, die das neu sortieren durchführt. Sie erwartet 3 Paramter: 1. Die ID des Menüeintrages, der umsortiert werden soll. (ich hab's bei mir für das Menü verwendet, aber Du kannst es ruhig für Deine Artikel verwenden, musst es nur anpassen ;-)) 2. Die ID des Menüeintrages, der als »Referenzpunkt« dienen soll. 3. Soll der Menüeintrag _vor_ (3. Parameter <= 0) oder _nach_ (3. Paramter > 0) dem »Referenzeintrag« einsortiert werden.
Ich verwende desweiteren PEAR::DB um auf die Datenbank zuzugreifen, und executeMultiple führt nichts anderes als lauter Anfragen auf einmal aus. Ich empfehle zum Verständnis http://pear.php.net/manual/en/core.db.tut_execute.php.
Ich hoffe, der Code hilft Dir weiter, wenn Du etwas nicht verstehst, frag' nach. (Ich habe nur keine Lust, eine ellenlange Erklärung zu schreiben, wenn Du auf Anhieb aus dem Code kapierst, was ich meine, wenn Du ihn aber nicht sofort kapierst, dann bin ich gerne bereit, das nachzuholen (das gilt auch für jeden anderen Mitleser))
Christian
_____________________________________________________________________
// resort menu list - put a menu in front or behind of another
// where > 0 => after, where <= 0 => before
// returns: DB_OK if successful, false if one of the entries doesn't exist or the parent is not identical
// or DB_Error object
function resort ($to_put, $reference, $where) {
// import database connection
global $db_conn;
// import configuration
global $global_config;
// see if first entry exists
$tp_res = Menu::getInfo ($to_put);
// oops - something went really wrong...
if (DB::isError($tp_res)) {
return $tp_res;
}
// if the entry doesn't exist, return false
if ($tp_res === null) {
return false;
}
// see if second entry exists
$r_res = Menu::getInfo ($reference);
// oops - something went really wrong...
if (DB::isError($r_res)) {
return $r_res;
}
// if the entry doesn't exist, return false
if ($r_res === null) {
return false;
}
// if parents are not equal, return false
if ($r_res['parentid'] != $tp_res['parentid']) {
return false;
}
// get list
$list = Menu::getEntries ($r_res['parentid']);
// now if there's an error, return it
if (DB::isError($list)) {
return $list;
}
// if the list contains less than two entries, somethings really weired
if (count($list) < 2) {
return false;
}
// init arrays for sorting
$new_arr = array ();
// init counter
$ctr = 0;
// go through the list and set new range
foreach ($list as $entry) {
// if the entry is the entry to put, ignore it
if ($entry['menuid'] == $to_put) {
continue;
}
// if the entry is the reference
if ($entry['menuid'] == $reference && $where <= 0) {
// add to array
$new_arr[] = array ($ctr, $to_put);
// increment counter
$ctr++;
}
// add item to array
$new_arr[] = array ($ctr, $entry['menuid']);
// increment counter
$ctr++;
// if the entry is the reference
if ($entry['menuid'] == $reference && $where > 0) {
// add to array
$new_arr[] = array ($ctr, $to_put);
// increment counter
$ctr++;
}
}
// now build up update sentence
$update = 'UPDATE ' . $global_config['database']['table_prefix'] . '_menu';
$update .= ' SET sortid = ? WHERE menuid = ?';
// prepare the statement
$sth = $db_conn->prepare ($update);
// run the query
$res = $db_conn->executeMultiple ($sth, $new_arr);
// return the result
return $res;
}