function getItems( $config, $alleVelden = false, $filter = array(), $sorteer = array()) { // Zoek uit welke velden getoond moeten worden if ( count( $config ) == 0 ) { return array(); } $velden = array( $config[ 'primary_key' ] ); // Bij gewone items is er ook een timestamp // Dan is de categorie_id ook 'id' en iig niet 'cat_id' // Timestamps in mysql worden teruggegeven als YmdHis // Die datum moet wordne omgezet naar normale timestamps if ( $config[ 'primary_key' ] != "cat_id" ) { $velden[] = " UNIX_TIMESTAMP( `_timestamp` ) as _timestamp "; } $velden[] = " _rang "; foreach( $config[ 'velden' ] as $veld => $info ) { if ( $alleVelden || !isset( $info[ 'tonen' ] ) || $info[ 'tonen' ] == 1 ) { $velden[] = $veld; } } // Bouw de SQL query op $sql = "SELECT " . implode( ", ", $velden ) . " FROM " . $config[ 'tabel' ]; $filterArr = array( " 1 = 1 " ); $velden = array(); foreach( $filter as $veld => $waarde ) { $filterArr[] = " `$veld` = ? "; $velden[] = $waarde; } $sql .= " WHERE " . implode( " AND ", $filterArr ); // Sorteer de gegevens if(is_array($sorteer) && count($sorteer) > 0) { $sql .= " ORDER BY ". implode(", ", $sorteer); } else { if ( isset( $config[ "zelf_sorteren" ] ) && $config[ "zelf_sorteren" ] != "" ) { $sql .= " ORDER BY _rang"; } elseif ( isset( $config[ "sorteren" ] ) && trim( $config[ "sorteren" ] ) != "" && !is_numeric( $config[ "sorteren" ] ) ) { $sql .= " ORDER BY `" . $config[ "sorteren" ] . "`"; if (isset($config["sort_type"])) { $sql .= " ".$config["sort_type"]; } } } // Voer de query uit $q = $this->dba->db->query( $sql, $velden ); if ( DB::isError( $q ) ) { raiseError( "De gegevens kunnen niet uit de database worden gelezen: " . $q->getMessage(), __FILE__, __LINE__, F_ERROR ); } // Lees de gegevens uit $items = array(); while( $item = $q->fetchRow() ) { $item = $this->prepareFieldValuesForShow($config, $item); $items[] = $item; } return $items; } function moveItem( $config, $item_id, $difference ) { // Zoek het huidige item op $current_item = $this->getItem( $config, $item_id ); $categorie_id = $parent_id = -1; // Check of het item in een categorie zit if ( array_key_exists( "categorie", $current_item ) ) { $categorie_id = $current_item[ "categorie" ]; } elseif ( array_key_exists( "parent", $current_item ) ) { // Het is van subcategorieen binnen een categorie $parent_id = $current_item[ 'parent' ]; } //haal alle items op die nodig zijn om de sortering te kunnen doen $items = array(); //order de items bij de huidige _rang $orderby = array(); $orderby[] = "_rang ASC"; if ( $categorie_id != -1 ) { $items = $this->getItems( $config, true, array("categorie" => $categorie_id), $orderby ); } elseif( $parent_id != -1 ) { $items = $this->getItems( $config, true, array("parent" => $parent_id), $orderby ); } else { $items = $this->getItems( $config, true, null, $orderby ); } //voor het geval het eerste item omhoog word gedaan //dat willen we natuurlijk niet if($difference < 0 && $items[0][$config['primary_key']] == $current_item[$config['primary_key']]) { return false; } //voor het geval het laatste item omlaag word gedaan //dat willen we natuurlijk ook niet if($difference > 0 && $items[count($items) - 1][$config['primary_key']] == $current_item[$config['primary_key']]) { return false; } //voor goede ordering moeten we de huidige plek van het item weten //(Voor het geval er gedelete items, gewijzigde cats of iets dergelijks tussen zit) $current_place = 0; for($i = 0; $i < count($items); $i++) { if($items[$i][$config['primary_key']] == $current_item[$config['primary_key']]) { $current_place = $i + 1; break; } } //corrigeer eventueel de _rang en voeg ze op de goede volgorde toe $correction = 0; while(list($cnt, $item) = each($items)) { //kijken of dit het huidige item is if($item[$config['primary_key']] == $current_item[$config['primary_key']]) { $correction--; continue; } //kijken of dit de nieuwe plek word van het huidige item if($cnt + 1 == $current_place + $difference) { //zo ja voeg ze op de goede volgorde toe if($difference > 0) { //eerst normale item $sth = $this->dba->db->prepare("UPDATE " . $config[ 'tabel' ] . " SET _rang = ? WHERE " . $config[ "primary_key" ] . " = ?"); $dbh1 = $this->dba->db->execute( $sth, array( $cnt + 1 + $correction, $item[$config["primary_key"]] ) ); $correction++; //dan het huidige item $sth = $this->dba->db->prepare("UPDATE " . $config[ 'tabel' ] . " SET _rang = ? WHERE " . $config[ "primary_key" ] . " = ?"); $dbh1 = $this->dba->db->execute( $sth, array( $cnt + 1 + $correction, $current_item[$config["primary_key"]] ) ); } else { //eerst het huidige item $sth = $this->dba->db->prepare("UPDATE " . $config[ 'tabel' ] . " SET _rang = ? WHERE " . $config[ "primary_key" ] . " = ?"); $dbh1 = $this->dba->db->execute( $sth, array( $cnt + 1 + $correction, $current_item[$config["primary_key"]] ) ); $correction++; //dan normale item $sth = $this->dba->db->prepare("UPDATE " . $config[ 'tabel' ] . " SET _rang = ? WHERE " . $config[ "primary_key" ] . " = ?"); $dbh1 = $this->dba->db->execute( $sth, array( $cnt + 1 + $correction, $item[$config["primary_key"]] ) ); } continue; } //als er nx speciaals gebeurt update het gewoon normaal (eventueel zelf correctie) $sth = $this->dba->db->prepare("UPDATE " . $config[ 'tabel' ] . " SET _rang = ? WHERE " . $config[ "primary_key" ] . " = ?"); $dbh1 = $this->dba->db->execute( $sth, array( $cnt + 1 + $correction, $item[$config["primary_key"]] ) ); } return true; }