frank: artikelsortierung ändern

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

  1. 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

    1. 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

      1. 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

        1. 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

          1. 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

      2. 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

        1. 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

          1. 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

            --
            Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"
  2. 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;
    }

    --
    Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.