Boardunity & Video Forum

Boardunity & Video Forum (https://boardunity.de/)
-   X-Mentor (Archiv) (https://boardunity.de/x-mentor-archiv-f51.html)
-   -   Dritte Kategorien-Hierarchie (https://boardunity.de/dritte-kategorien-hierarchie-t2078.html)

lotsch 04.07.2004 09:43

Dritte Kategorien-Hierarchie
 
Ich habe mir gestern den X-Mentor 1.2.5 heruntergeladen, neu installiert und bin begeistert. Ich habe zuletzt in der Version 1.1 gearbeitet und im Vergleich dazu ist die neue ein Riesenschritt in Richtung leichterer Adaptierbarkeit und logischem Aufbau. Ein großer Dank an die Programmierer! Schön wäre gewesen, wenn auch das css über das Web-Interface bearbeitbar wäre.

Zur eigentlichen Frage: Philipp schreibt in der Dokumentation, dass es ein leichtes sei, die Kategorien auf drei Ebenen zu erweitern. Das möchte ich jetzt tun. So wie ich das einschätze, bräuchte man dazu lediglich auch die Kategorien der zweiten Ebene in das Zuordnungs-Drop-Down bei der Erstellung einer neuen Kategorie laden und die Cat-ID dann im "Chef"-Feld der Kategorien-Tabelle eintragen.

Sehe ich das richtig oder übersehe ich eine Schwierigkeit? Hat sich dazu schon jemand Gedanken gemacht?

Lg, Lothar-

lotsch 04.07.2004 14:24

Ich habe nun folgendes versucht:
Die dritte ebene bekommt in der categories-Tabelle type "2". Ich habe daher auch function "getnav" um eine if-Schleife erweitert:
Zitat:

if($categories_row['type']=="0") {
$str .= $GLOBALS['Template']->load('hauptkategorie', $categories_row);
}
if($categories_row['type']=="1") {
if($categories_row['chef']==$id || $categories_row['chef']==$chef) {
$str .= $GLOBALS['Template']->load('unterkategorie', $categories_row);
}
}
if($categories_row['type']=="2") {
if($categories_row['chef']==$id || $categories_row['chef']==$chef) {
$str .= $GLOBALS['Template']->load('unterkategorie2', $categories_row);
}
}
Das klappt jetzt insoweit, als die zweite Unterkategorie in der Navigation ausgeklappt wird, wenn ich die erste anklicke. Wenn ich dann aber die zweite Unterkategorie anklicke, um auf die Kategorieübersichtseite zu kommen, verschwindet die erste Unterkategorie in der Navigation, und die zweite steht dann direkt unter der Hauptkategorie.

Hat jemand eine Ahnung, wo der Haken ist?

Ste 05.07.2004 14:22

So nun editiere ich diesen Text zum 5 mal, habe den "Hacken" gefunden, du musst über phpmyadmin die kategorien nach postion ordnen lassen und diese dann anornden incl unterkategorien1&2 wie du es gerne hättest dann geht das ganze

Philipp Gérard 05.07.2004 16:07

Wäre cool, wenn das einer von euch mal als Hack schrieben könnte - für diejenigen, die nicht bis zur 1.2.6 warten können ;)

lotsch 05.07.2004 17:10

@Ste: Vielen Dank, jetzt steht sie zumindest an richtiger Stelle! Dass die 1. Unterkategorien verschwinden, und die 2. Unterkategorie dann als einziger Eintrag unter der Hauptkategorie steht, wenn man sie anklickt, ist aber leider nicht gelöst :o(

Was ich jetzt noch lösen muss, ist, dass die "2" automatisch in das type-Feld geschrieben wird, wenn ich einen neue Kategorie anlege bzw. eine bestehende ändere (und ich das nicht händisch in der phpmyadmin machen muss) und ich muss es irgendwie schaffen, dass die Sortierung mit den Pfeilchen in der admin wieder klappt, denn meine zweite Unterkategorie bringt das System da ein wenig aus dem Konzept.

Sobald ich das habe, ...

@Philipp: ... kann ich das gerne auch weitergeben!

lotsch 05.07.2004 17:22

... dass die 1. Unterkategorieebene verschwindet, ist mir jetzt aber eigentlich eh klar. in die eine richtung funktioniert es natürlich, aber wenn ich nur die id der 2. unterkategorie habe, muss ich natürlich auch noch eine abfrage der chef-kategorie und deren chef-kategorie schreiben ...

Ste 05.07.2004 17:22

@lotsch könntest du mal einen screenshot posten da ich dein Problem nicht ganz verstehe? Also Punkt 1.

Was Punkt 2 angeht "Unterkategorie" erstellen daran werde ich mich auch versuchen, werde es dann hier meine Forschritte posten.

@phillip ein wenig hilfe wäre echt nicht schlecht da ich von php echt im Kindergarten Niveu bin, wobei du hast sicherlich schon genug mit den bugs zu tun

lotsch 05.07.2004 17:31

@Ste: schau einfach mal da: http://gerda.univie.ac.at/thomasbaue...ge=cat&catid=3 und klicke dann auf "Programme Description", dann weißt du, was ich meine.

Ste 05.07.2004 17:35

Ach da wollte ich dir schon schreiben "bei mir ist es nicht so" aber da muss ich doch schnell revidieren gleicher fehler, ich werde das mal untersuchen, dat kann doch nicht so schwer sein :D

Nebenbei kannst du mir veraten wie du "Programm description" eingerückt hast

Edit: Vieleicht ist es einfacher ein eigene Navigation zu bauen ;)

lotsch 05.07.2004 17:42

Wenn es weiter nichts ist, das kann ich beantworten:
Du musst einfach in der layout/display.css einen neuen typ definieren:

Code:

#navigation .unterkategorie2 a {
        display: block;
        padding: 3px;
        padding-left: 40px;
}

und dementsprechend ein neues template für die 2. unterkategorie anlegen:

Code:

                <div class="unterkategorie2"><a href="{link}" title="Kategorie '{name}' öffnen.">{name}</a></div>
@Philipp: Der Bitte nach Unterstützung kann ich mich nur anschließen, sehr groß sind meine php-Kenntnisse nämlich auch nicht

Ste 05.07.2004 17:43

danke

lotsch 05.07.2004 17:45

Zitat:

Zitat von Ste
Edit: Vieleicht ist es einfacher ein eigene Navigation zu bauen ;)

Daran habe ich auch schon gedacht. So eine ganz einfache, deppensicher, ganz ohne functions und so ...

lotsch 05.07.2004 18:24

Das mit dem Verschwinden habe ich jetzt gelöst. Im Nachhinein betrachtet eigentlich eh klar.

Du musst in inc/system.class.php bei der function getnav folgendes einfügen:

Zuerst nach der Variablen $chef:
PHP-Code:

        $chef $this->getcatchef($id);
    
$chef2 $this->getcatchef($chef); 

damit auch die Hauptkategorie der 1. Unterkategorie abgefragt wird.
Dann noch die if-Schleife bei der 1. Unterkategorie ändern:
PHP-Code:

                if($categories_row['type']=="1") {
                                if(
$categories_row['chef']==$id || $categories_row['chef']==$chef || $categories_row['id']==$chef || $categories_row['chef']==$chef2) {
                                    
$str .= $GLOBALS['Template']->load('unterkategorie'$categories_row);
                                } 

damit auch alle die Unterkategorien_1 aufgerufen werden, die den gleichen "Chef" haben, wie die Unterkategorie_1, deren Unterkategorie_2 angeklickt wurde.

Fehlt nur mehr eine Lösung für den Admin-Bereich!

Ste 05.07.2004 19:03

super, war gerade genau an der stelle am werkeln denn da hatte ich den Fehler vermutet, man sieht ich lag richtig, du warst schneller

Was den Admin Beriech angeht, ich habe mir folgendes überlegt.

1. die Kategorie Position wird automatisch "desc" vergeben
das ist schlecht, den nach dem obigen weisst du ja, das die Positionierung wichtig ist, das heisst man muss bei jeder Kategorie noch eine Positionierungs möglichkeit festlegen können und natürlich einen Überblick wo die anderen Kategorien sind
2. Bei dem Erstellen der Kategorien werden nur Hauptkategorien aufgelistet (scroll down Menü),
3. fast wie 1. man braucht eine Überischt um das ganze zu ändern

lotsch 05.07.2004 19:39

Zu 2.: Das ist noch relativ leicht zu ändern: In inc/admin.class.php sieht meine function categorymakeselect jetzt so aus:
PHP-Code:

    function categoriesmakeselect($data$intro 0$indent false)
    {
        
$array = array();
        if (
$intro == 0) {
            
$array['values'][] = "0";
            
$array['options'][] = "no subordination";
        }
        if (
$intro == 2) {
            
$array['values'][] = "0";
            
$array['options'][] = "Search all categories";
        }
        if (
$intro == 3) {
            
$array['values'][] = "0";
            
$array['options'][] = "All categories";
        }
        if (
count($data)) {
            foreach(
$data AS $key => $value) {
                
$array['values'][] = $value['id'];
                if (
$value['type'] == "1") {
                    
$array['options'][] = "&gt; " $value['name'];
                }
                if (
$value['type'] == "2") {
                    
$array['options'][] = "&gt;&gt; " $value['name'];
                } 
          if (
$value['type'] == "0") {
                    
$array['options'][] = $value['name'];
                }
            }
        }
        return 
$array;
    } 

und die function getcategories habe ich folgendermaßen erweitert:
PHP-Code:

    function getcategories($type "all"$not ""$fields='')
    {
        if (
$type == "no") {
            return;
        }
        
$categories $GLOBALS['Sql']->getdata(sprintf("SELECT %s FROM %s %s %s ORDER BY position",
                !empty(
$fields) ? $fields 'id,name,type,chef,position',
                
SQL_PREF SQL_TBL1,
                (
$type == "main") ? "WHERE type='0'" "",
          (
$type == "cat") ? "WHERE type='0' or type='1'" "",
                (!empty(
$not)) ? "AND id!='" $not "'" ""));

        return 
$categories;
    } 

Wenn du dann noch in der function categories_new die Variable $data folgendermaßen änderst:
PHP-Code:

$data $this->categoriesmakeselect($this->getcategories("cat")); 

dann ist dieses Problem gelöst.

Das Problem fängt jetzt aber an: wie teile ich in der function categories_new mit, dass die gewählte Unterkategorie_1 eine Unterkategorie ist und "type" demzufolge auf "2" zu setzen ist?
Dann sind wir bei deinem Punkt 1., denn auch beim Anlegen wird eine Positionierung vergeben, bei der alle anderen betroffenen Kategorien eine andere Ordnungszahl bekommen müssen. Nur wie?

Philipp Gérard 05.07.2004 21:07

Nix, ich misch mich hier erst ein, wenn ihr nicht mehr weiterkommt. So lernt ihr a) PHP und b) den X-Mentor kennen. Klar, das kostet mehr Zeit, aber dafür muss ich nicht mehr den Kindergärtner spielen :-)

Weiter so!

Ste 05.07.2004 21:16

@Phillip Anders gesagt, "Im Tv kommt eine spannende Serie" oder "das Buch hier ist viel zu interessant um es wegzulegen" :D

@lotsch ich schau mir das mal morgen an

lotsch 06.07.2004 06:26

@Philip: Na gut, Herr Lehrer, dann quälen wir uns halt weiter ... ;o)

Die function categories_new habe ich gestern soweit geändert, dass Unterkategorien_2 angelegt werden können. Einziger Schönheitsfehler: Sie werden nicht nach, sondern vor den bereits bestehenden eingeordnet. (->Lösungsvorschläge?)
PHP-Code:

    function categories_new()
    {
        if (!
$GLOBALS['User']->checkaccess(false3)) {
            return 
$this->error(3);
        }
        if (!isset(
$_POST['ignore_new'])) {
            
$array $_POST;
            (!isset(
$array['name'])) ? $array['name'] = "" "";
            (!isset(
$array['link'])) ? $array['link'] = "" "";

            
$data $this->categoriesmakeselect($this->getcategories("cat"));
            
$array['list'] = $this->HtmlSelect("chef"$data['options'], $data['values'], (isset($_POST['chef'])) ? $_POST['chef'] : "");
            
$array['page_title'] = "Create a new category";
            
$array['action'] = "categories_new";
            
$array['visible'] = "checked";
            return 
$GLOBALS['Template']->load('categories_edit'$arrayTPL_ROOT_A);
        }

        
$array $_POST;
        
$fields = array('name' => ".+",
            );
        if (
Formvalidate::validate_form_data($fields$_POST) == true) {
            return 
$this->error("1");
        } else {
         if (!empty(
$_POST['chef'])) {
         
$cheftype $GLOBALS['Sql']->getData(sprintf("SELECT type FROM %s %s",
              
SQL_PREF SQL_TBL1,
              
"WHERE id='" $_POST['chef'] . "'"));
                 if (
$cheftype[0]['type'] == "1") {
                
$array['type'] = 2;
              }
              else {
                
$array['type'] = 1;
                 }
         }
         else {
              
$array['type'] = 0;
         }
/*
          $array['type'] = (!empty($_POST['chef'])) ? 1 : 0;
*/
            

            
$position $GLOBALS['Sql']->getData(sprintf("SELECT position FROM %s %s LIMIT 1",
                    
SQL_PREF SQL_TBL1,
                    (
$array['type'] == 0) ? "ORDER by position desc" "WHERE chef='" $_POST['chef'] . "' ORDER by position desc"
                    
));
            if (!
$GLOBALS['Sql']->rows && $array['type'] == || $array['type'] == 2) {
                
$position $GLOBALS['Sql']->getData(sprintf("SELECT position FROM %s %s LIMIT 1",
                        
SQL_PREF SQL_TBL1,
                        
"WHERE id='" $_POST['chef'] . "' ORDER by position desc"
                        
));
            }

            if (isset(
$position[0]['position'])) {
                
$array['position'] = $position[0]['position'] + 1;
            } else {
                
$array['position'] = 1;
            }
            
$GLOBALS['Sql']->query(sprintf("UPDATE %s SET position=position+1 WHERE position>%d"SQL_PREF SQL_TBL1$position[0]['position']));
            
$GLOBALS['Sql']->INSERT($arraySQL_PREF SQL_TBL1);
            return 
Admin::message(5);
        }
    } 

Heute abend schaue ich mir dann die functions "_edit", "_up" und "_down" an!

Ste 06.07.2004 11:03

Liste der Anhänge anzeigen (Anzahl: 1)
Wahnsinn das klappt jetzt alles, man muss halt nur nachdem man eine Unter-Unterkategorie erstellt hat, im Menüpunkt "Kategorien" mit den Pfeiltasten die postion bestimen, ich habe mal die admin templates angepasst, damit das Menü Übersichtig ist.

Edit: ich sehe gerade was du mit dem Up und down meinst

lotsch 06.07.2004 22:58

FERTIG ... bei mir funktioniert es jetzt tadellos! Bitte downloaden und testen und - falls was doch nicht klappen sollte - melden!

EDIT: Sorry, bin gerade noch auf einen Fehler draufgekommen ... Ich muss mir das Ganze heute noch mal ansehen. Vielleicht kann mir ja jemand helfen, denn momentan blicke ich nicht durch. Es geht um folgenden Teil in den - von mir bereits erweiterten - functions category_up und _down
PHP-Code:

     if ($data['type'] == "0") {
            
// An welche Position soll das ganze eigentlich verschoben werden?
            
$data2 $GLOBALS['Sql']->getdata(sprintf("SELECT id,position,chef FROM %s WHERE type='0' AND position<'%d' ORDER by position DESC LIMIT 1",
                    
SQL_PREF SQL_TBL1,
                    
$data['position']));
            
$data2 $data2[0];
            
// print_r($data2);
            // Wie viele Subcategories hat die zu verschiebene Kategorie?
            
$GLOBALS['Sql']->getdata(sprintf("SELECT id FROM %s WHERE chef='%d'",
                    
SQL_PREF SQL_TBL1,
                    
$data['id']));
            
$step_down $GLOBALS['Sql']->rows() + 1;
            
// print "step down: ".$step_down;
            // Jetzt wird die oberhalb liegende Main Kategorie (und ihre Subs) um $step_down nach unten verschoben
            
$GLOBALS['Sql']->query(sprintf("UPDATE %s SET position=position+%d WHERE chef='%d' OR id='%d'",
                    
SQL_PREF SQL_TBL1,
                    
$step_down,
                    
$data2['id'],
                    
$data2['id']));
            
// Wie viele Subcategories hat die gerade verschobene Kategorie?
            
$GLOBALS['Sql']->getdata(sprintf("SELECT id FROM %s WHERE chef='%d'",
                    
SQL_PREF SQL_TBL1,
                    
$data2['id']));
            
$step_up $GLOBALS['Sql']->rows() + 1;
            
// print "<br>step up: ".$step_up;
            // Jetzt wird die Main Kategorie (und ihre Subs) um $step_up nach oben verschoben
            
$GLOBALS['Sql']->query(sprintf("UPDATE %s SET position=position-%d WHERE chef='%d' OR id='%d'",
                    
SQL_PREF SQL_TBL1,
                    
$step_up,
                    
$data['id'],
                    
$data['id']));
        } 

Für type=="2" und "1" funktioniert es ja bestens mit dem Vorhandenen. Das Problem bei type=="0" ist, dass ich bei jeder Subkategorie(1) die ich mitverschiebe auch abfragen muss, wie viele Subkategorien(2) sie hat. Nur, wie bringe ich das Ergebnis, das ja aus beliebig vielen Kategorien und damit auch beliebig vielen "chef"- und "id"-Werten bestehen kann in eine DB-Abfrage wie diese?:
PHP-Code:

            $GLOBALS['Sql']->query(sprintf("UPDATE %s SET position=position+%d WHERE chef='%d' OR id='%d'",
                    
SQL_PREF SQL_TBL1,
                    
$step_down,
                    
$data2['id'],
                    
$data2['id'])); 


lotsch 07.07.2004 17:51

Liste der Anhänge anzeigen (Anzahl: 1)
So, jetzt aber! Nun sollte alles funktionieren! Viel Spaß beim Testen!

Ste 08.07.2004 13:44

habe es runtergeladen und werde es testen. danke

Gast 27.07.2004 18:54

Klasse, funktioniert! Vielen Dank.

Gast 02.08.2004 19:21

Zitat:

Template konnte nicht geladen werden: '/www/htdocs/v120486/xmentor/admin/tpl/pages_row_2.tpl' Fehlendes Template wurde in der Datei '/www/htdocs/v120486/xmentor/inc/template.class.php' in Zeile '60' verlinkt. Template konnte nicht geladen werden: '/www/htdocs/v120486/xmentor/admin/tpl/pages_row_2.tpl' Fehlendes Template wurde in der Datei '/www/htdocs/v120486/xmentor/inc/template.class.php' in Zeile '60' verlinkt. Template konnte nicht geladen werden: '/www/htdocs/v120486/xmentor/admin/tpl/pages_row_2.tpl' Fehlendes Template wurde in der Datei '/www/htdocs/v120486/xmentor/inc/template.class.php' in Zeile '60' verlinkt.

Diese Fehlermeldung kommt beim Aufrufen der Artikelübersicht!

lotsch 14.08.2004 22:53

Das muss ich wohl vergessen haben, sorry! Dieses Template musst du natürlich auch noch anlegen mit in etwa folgendem Inhalt:
Code:

                <tr>
                  <td bgcolor="#FFFFFF">&nbsp;</td>
                  <td bgcolor="#FFFFFF">&nbsp;</td>
                  <td bgcolor="#FFFFFF">&middot; {title}</td>
                  <td bgcolor="#F1F1F1" width="40%" align="center">
                        <a href="index.php?page=pag&sid={sid}&amp;action=pages_up&amp;id={id}"><img src="img/up.gif" alt="Move upwards" title="Move upwards" border="0" /></a> &middot;
                        <a href="index.php?page=pag&sid={sid}&amp;action=pages_down&amp;id={id}"><img src="img/down.gif" alt="Move downwards" title="Move downwards" border="0" /></a> &middot;
                        <a href="index.php?page=pag&amp;action=pages_info&amp;sid={sid}&amp;id={id}"><img src="img/info.gif" alt="Article information" title="Article information" border="0" /></a> &middot;
                        <a href="index.php?page=pag&amp;action=pages_publish&amp;sid={sid}&amp;id={id}"><img src="img/status_{status}.gif" alt="{publish_title}" title="{publish_title}" border="0" /></a> &middot;
                        <a href="index.php?page=pag&amp;action=pages_setindex&amp;sid={sid}&amp;id={id}"><img src="img/index_{index}.gif" alt="Set as start article of this category" title="Set as start article of this category" border="0" /></a> &middot;
                            <a href="index.php?page=pag&amp;action=comments_list&amp;sid={sid}&amp;id={id}"><img src="img/comments.gif" alt="Edit comments" title="Edit comments" border="0" /></a> &middot;
                              <a href="index.php?page=pag&amp;action=pages_edit&amp;sid={sid}&amp;id={id}"><img src="img/edit.gif" alt="Edit" title="Edit" border="0" /></a> &middot;
                        <a href="index.php?page=pag&amp;action=pages_delete&amp;sid={sid}&amp;id={id}"><img src="img/delete.gif" alt="Delete" title="Delete" border="0" /></a></td>
                </tr>



Alle Zeitangaben in WEZ +1. Es ist jetzt 07:03 Uhr.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25