Neue Checkbox in den Basis-Rubrikeinstellungen

Fragen zur Implementierung und/oder Anpassung von ConPresso 4 werden in diesem Forum diskutiert.
Antworten
Marko

Neue Checkbox in den Basis-Rubrikeinstellungen

Beitrag von Marko »

Hallo zusammen,

in der _rubrics.php habe ich eine weitere Checkbox hinzugefügt:

Code: Alles auswählen

<td class="leftrow"><?php echo ___('Nicht im Menu anzeigen?'); ?></td>
            <td class="rightrow">
                <?php 
                echo '<input name="cpoRubricSettings[disableNav]" class="checkbox" type="checkbox" value="1" id="disableNav" ';
                echo ($_POST['cpoRubricSettings']['disableNav'] ? 'checked' : '').'> ';
                echo '<br />';
                ?>
            </td>
Auf Datenbank-Ebene funktioniert zwar alles so wie ich mir das vorstelle - allerdings ist die Checkbox in den Basis-Rubrikeinstellungen nicht "checked", wenn im Feld Settings (der Tabelle rubric) disableNav auftaucht. Wahrscheinlich ein doofer Fehler - bin noch php-Anfänger.

Bin für jede Hilfe dankbar!

Marko
Benutzeravatar
semf
Modul-Entwickler
Beiträge: 1853
Registriert: 01.01.1970 01:00
Wohnort: Gütersloh-Friedrichsdorf
Hat sich bedankt: 14 Mal
Danksagung erhalten: 40 Mal
Kontaktdaten:

Beitrag von semf »

vielleicht ist $_POST für einen array-eintrag einfach der falsche weg ;-)

wenn du den wert speichern konntest und nun beim aufrufen die checkbox mit der entsprechenden einstellung anzeigen lassen möchtest, dann könnte das so gehen:
(cpoRubricSettings['disableNav'] ? 'checked' : '')

dabei gehe ich davon aus, das du den gespeicherten wert über das array
cpoRubricSettings und den schlüssel ['disableNav'] abrufen kannst, d.h.
es liegt ein wert vor!
Viel Erfolg!

Module ConPresso 4.x
Latest News
Tell-a-friend

Module ConPresso 3.4.x
Index_X
Kontakt
RSS-Feed
Umfrage
Gästebuch
Tell-a-Friend

Modul-Download
Marko

Beitrag von Marko »

Bei der CheckBox "disableRubric" steht das gleiche:

Code: Alles auswählen

                echo '<input name="cpoRubricSettings[disableRubric]" class="checkbox" type="checkbox" value="1" id="disableRubric" ';
                echo ($_POST['cpoRubricSettings']['disableRubric'] ? 'checked' : '').'> ';   [...]
Aber langsam check ich es: Das obige Snippet holt sich den Wert für die Checkbox aus dem POST_array, was ja auch Sinn macht... Irgendwo in der rubrics.php muss sich dann aber noch eine Datenbankabfrage für die disableRubric Option verstecken...
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7362
Registriert: 01.01.1970 01:00
Hat sich bedankt: 111 Mal
Danksagung erhalten: 934 Mal
Kontaktdaten:

Beitrag von MarkusR »

Dieses Verfahren alles über $_POST-Variablen zu füttern, ziehst sich durch das ganze ConPresso4 durch und sorgt dafür, daß ein "Speichern" neben "Speichern und zurück zur Rubrikauswahl" existieren kann.

Die $_Post-Variablen werden hier mit den Datenbankwerten gefüttert:

Code: Alles auswählen

<?php


        $query = "SELECT directory, name, seclevel, source_rubric_id, settings "
                ."FROM ".CPO_RUBRIC." "
                ."WHERE id='".addslashes($_REQUEST['id'])."'";
        $db->query($query);

        // basic settings
        $_POST['directory']        = '';
        $_POST['name']             = '';
        $_POST['seclevel']         = 0;
        $_POST['source_rubric_id'] = 0;
        while($db->next_record()) { // will only loop once
            $_POST['directory']        = $db->v('directory');
            $_POST['name']             = $db->v('name');
            $_POST['seclevel']         = $db->v('seclevel');
            $_POST['source_rubric_id'] = $db->v('source_rubric_id');
            $_settings = $db->v('settings');
        }

        // individual extended settings
        if (is_string($_settings)) $t_cpoRubricSettings = unserialize($_settings);
        if (!is_array($t_cpoRubricSettings)) $t_cpoRubricSettings = array();
        foreach ($cpoRubricSettingsDefaults as $k=>$v) {
            if (isset($t_cpoRubricSettings[$k])) { 
                $_POST['cpoRubricSettings'][$k] = $t_cpoRubricSettings[$k];
                continue;
            }
            // use default setting as it was not stored in the DB yet
            $_POST['cpoRubricSettings'][$k] = $v;
        }


        // advanced settings
        if ($_POST['source_rubric_id']!=0) {
            // use different source for advanced settings?
            $query = "SELECT settings "
                    ."FROM ".CPO_RUBRIC." "
                    ."WHERE id='".addslashes($db->v('source_rubric_id'))."'";
            DEBUG(1, 'Fetching settings from other rubric... <br /><br />'. $query, __FILE__, __LINE__);
            $db->query($query);
            $db->next_record();
            $_settings = $db->v('settings');
        }

        if (is_string($_settings)) $t_cpoRubricSettings = unserialize($_settings);
        if (!is_array($t_cpoRubricSettings)) $t_cpoRubricSettings = array();
        foreach ($cpoRubricSettingsDefaults as $k=>$v) {
            if ($k=='title') continue;
            if (isset($t_cpoRubricSettings[$k])) { 
                $_POST['cpoRubricSettings'][$k] = $t_cpoRubricSettings[$k];
                continue;
            }
            // use default setting as it was not stored in the DB yet
            $_POST['cpoRubricSettings'][$k] = $v;
        }


?>
Falls bei Dir also wirklich
cpoRubricSettings['disableNav']
existiert, dann füttere die $_POST-Variable mittels
$_POST['cpoRubricSettings']['disableNav'] = cpoRubricSettings['disableNav'];

Steht disableNav denn bei Deinen Rubrik-Settings in der DB :?:
Dann musst Du nur die Default-Settings in common.inc.php mit Deiner Variable ergänzen:

Code: Alles auswählen

<?php


$cpoRubricSettingsDefaults = array( // FIXME switch all to $cpoRubric?
    'title' => '',
    'sorting' => $articleSortMethodsDefault,
    'edit_index'    => false,
    'showArchive' => false,
    'showArchiveText' => __('Archive'),
    'disableRubric' => false,
    'disableRubricText' => '',
    'disableNav' => false,    // <== hier habe ich sie mal hineingeschrieben...
    'edit_author'   => false,
    'edit_email'    => false,
    'edit_initial'  => false,
    'standard_template' => 0,
    'date_format' => '',
    'articleSeparator' => '', 
    'noArticlesFound' => __('No articles found.'),
    'noOfArticles' => 10, 
    'language' => 'english', 
    'pager_showresults' => false,
    'pager_found' => '',
    'pager_results' => '',
    'pager_previous' => '',
    'pager_next' => ''
);


?>
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Marko

Beitrag von Marko »

So funzt es jetzt:

Code: Alles auswählen

        // individual extended settings
        if (is_string($_settings)) $t_cpoRubricSettings = unserialize($_settings);
        if (!is_array($t_cpoRubricSettings)) $t_cpoRubricSettings = array();
        foreach ($cpoRubricSettingsDefaults as $k=>$v) {
            if (isset($t_cpoRubricSettings[$k])) { 
                $_POST['cpoRubricSettings'][$k] = $t_cpoRubricSettings[$k];
                continue;
            }
            $_POST['cpoRubricSettings']['disableNav'] = $t_cpoRubricSettings['disableNav']; //AENDERUNG 
            // use default setting as it was not stored in the DB yet
            $_POST['cpoRubricSettings'][$k] = $v;
        }
Vielen Dank!
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7362
Registriert: 01.01.1970 01:00
Hat sich bedankt: 111 Mal
Danksagung erhalten: 934 Mal
Kontaktdaten:

Beitrag von MarkusR »

Auch möglich...

allerdings mußt Du jetzt überall, wo Du es verwenden möchtest die Variable erneut ziehen... z.B auch wenn diese Rubrik die Einstellungen für andere Rubriken stellt...

Wäre sie in der common.inc.php als Default-Wert drin, dann stände sie IMMER zur Verfügung (Frontend und Backend) ohne dafür nochmal einen Finger rühren zu müssen... :wink:
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Marko

Beitrag von Marko »

Meine common.inc.php sieht jetzt also wie folgt aus:

Code: Alles auswählen

$cpoRubricSettingsDefaults = array( // FIXME switch all to $cpoRubric?
    'title' => '',
    'sorting' => $articleSortMethodsDefault,
    'edit_index'    => false,
    'showArchive' => false,
    'showArchiveText' => __('Archive'),
    'disableRubric' => false,
    'disableRubricText' => '',
    'disableNav' => false, [...]
Die Zeile in der rubrics.php habe ich entfernt. Ich verstehe zwar mal wieder nicht so genau, was ich eigentlich gemacht habe, aber es funktioniert! Dieses Forum ist besser als jeder Support!

Eine Frage hätte ich noch: Die Variable wird bei mir in der printnavigation.php ausgewertet:

Code: Alles auswählen

            if (proper_strrpos($db->v('settings'),'disableNav')>0)
              {$GLOBALS["disNav"]=TRUE;}
              else
              {$GLOBALS["disNav"]=FALSE;}
Die Funktion proper_strrpos sucht einen kurzen String (mehrere Zeichen!) in einem längeren String. Ich schau also nur, ob der Schlüssel disableNav überhaupt existiert. Geht das auch eleganter? Wie kann man direkt auf den Wert von disableNav im Feld settings der Tabelle rubric innerhalb der Funktion printnavigation zugreifen?
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7362
Registriert: 01.01.1970 01:00
Hat sich bedankt: 111 Mal
Danksagung erhalten: 934 Mal
Kontaktdaten:

Beitrag von MarkusR »

Marko hat geschrieben:Eine Frage hätte ich noch: Die Variable wird bei mir in der printnavigation.php ausgewertet:

Code: Alles auswählen

            if (proper_strrpos($db->v('settings'),'disableNav')>0)
              {$GLOBALS["disNav"]=TRUE;}
              else
              {$GLOBALS["disNav"]=FALSE;}
Die Funktion proper_strrpos sucht einen kurzen String (mehrere Zeichen!) in einem längeren String. Ich schau also nur, ob der Schlüssel disableNav überhaupt existiert. Geht das auch eleganter? Wie kann man direkt auf den Wert von disableNav im Feld settings der Tabelle rubric innerhalb der Funktion printnavigation zugreifen?
Deine neue Funktion gibt es eigentlich schon als "strpos"

Code: Alles auswählen

            if (strpos($db->v('settings'),'disableNav') !== FALSE)
              {$GLOBALS["disNav"]=TRUE;}
              else
              {$GLOBALS["disNav"]=FALSE;}
Vermutlich führst Du ja noch eine Abfrage aus, um $db->v('settings') zu erhalten?
Dagegen spricht erst mal nichts, außer daß Du jede Menfge Abfragen zusätzlich erzeugst, da printnavigation() rekursiv arbeitet, sich also mehfach selbst aufruft, wenn Du das nicht irgendwie unterbindest.

:!: Ungetestet:
Du könntest schon in getnavigation() die Rubrik-Einstellungen mitnehmen

Code: Alles auswählen

    $query = 'SELECT id, directory, name, seclevel '
            .'FROM '.CPO_RUBRIC.' ';
    DEBUG(1, $query, __FILE__, __LINE__);
    $db = new DB;
    $db->query($query);
    $rubrics = array(0=>'');
    while ($db->next_record()) {
        $rubrics[$db->v('id')] = array(
            'id'=>$db->v('id'), 
            'directory'=>$db->v('directory'), 
            'name'=>$db->v('name'), 
            'settings'=>unserialize($db->v('settings')), // <== DAS HIER KOMMT DAZU!
            'seclevel'=>$db->v('seclevel')
        );
    }
dann würde Dir Deine Variable als $v['rubric']['settings']['disableNav'] zur Verfügung stehen und Dein Code eben so aussehen:

Code: Alles auswählen

            if ($v['rubric']['settings']['disableNav'])
              {$GLOBALS["disNav"]=TRUE;}
              else
              {$GLOBALS["disNav"]=FALSE;}
was sich noch komprimieren ließe durch

Code: Alles auswählen

$GLOBALS['disNav'] = ($v['rubric']['settings']['disableNav']) ? TRUE : FALSE ;
oder sogar

Code: Alles auswählen

$GLOBALS['disNav'] = $v['rubric']['settings']['disableNav'];
wenn Dir 1 und 0 genauso helfen wie TRUE und FALSE (da Du ja selbst 1 und 0 als gespeicherte Werte genommen hast statt das boolesche TRUE und FALSE)

Wie gesagt: alles nur Theorie und nicht getestet, da ich den Rest Deines Codes nicht kenne...
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Benutzeravatar
balu
ConPresso-Entwickler
Beiträge: 1748
Registriert: 01.01.1970 01:00
Hat sich bedankt: 81 Mal
Danksagung erhalten: 133 Mal

Beitrag von balu »

Hallo zusammen,

kurzen Vorschlag nebenbei: Wenn es sich um eine Aenderung handelt, die nur fuer ein Projekt gedacht ist, lohnt sich der Aufwand der ConPresso-Anpassung meistens nicht (also das Aendern der Rubrikeinstellungen, der common.inc.php, usw.), da dadurch auch Updates erschwert werden.

Eine einfachere und trotzdem funktionierende Loesung besteht darin, z.B. nur eine eigene, angepasste printnavigation.inc.php zu erzeugen.. Faengt ein Rubrik-/Navigationsname dann z.B. mit "---" an, wird die Ausgabe dieses Elements einfach uebersprungen...

Deine Variante ist natuerlich schoener, aber auch aufwaendiger :).

Balu
PS: Wieso haengst Du ueberhaupt eine Rubrik in die Navigation, wenn sie dort nicht auftauchen soll? :)
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7362
Registriert: 01.01.1970 01:00
Hat sich bedankt: 111 Mal
Danksagung erhalten: 934 Mal
Kontaktdaten:

Beitrag von MarkusR »

balu hat geschrieben:PS: Wieso haengst Du ueberhaupt eine Rubrik in die Navigation, wenn sie dort nicht auftauchen soll? :)
Ich glaube ja (aber Glauben heißt "nicht wissen"), daß es nicht um die (Nicht-)Aufnahme einer Rubrik in die Navigation geht, sondern das Ausblenden der Navigation (die z.B. über global_header eingebaut wird) in bestimmten Rubriken, ohne per FTP lokale header hochladen zu müssen...

Eben das, wofür ich mod_pages entwickelt habe, aber eben völlig HTML- und PHP-Code-frei...
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Marko

Beitrag von Marko »

Hallo Balu,

die Idee ist natürlich auch nicht schlecht... Vor allem reicht dafür eine einzige Zeile in der printnavigation.php. Vorteil ist auch, dass Navigationselemente auch dann ausgeblendet werden, wenn ihnen keine Rubrik zugeordnet ist. ("externer Link")

Code: Alles auswählen

foreach ($navi as $k=>$v) {
        if ($v['level']<$level) $level = 0;            // prints all children of active parent => clear $level
        if ($v['id']==$parent) $level = $v['level']+1; // found active parent => save $level
        if ($v['level']!=$level) continue;             // not the active level => continue
        if (substr($v['caption'],0,2)=='---') continue;
Hintergrund: Ich will die Unterrubriken einer Rubrik nicht in der Hauptnavigation anzeigen lassen, sondern (per local_header.php) waagerecht direkt über den Artikeln.
Noch eine Frage: Wie kann ich einem Navigationselement weitere Variablen zuordnen? (z.B. eine Farbe)
Benutzeravatar
balu
ConPresso-Entwickler
Beiträge: 1748
Registriert: 01.01.1970 01:00
Hat sich bedankt: 81 Mal
Danksagung erhalten: 133 Mal

Beitrag von balu »

Marko hat geschrieben: Hintergrund: Ich will die Unterrubriken einer Rubrik nicht in der Hauptnavigation anzeigen lassen, sondern (per local_header.php) waagerecht direkt über den Artikeln.
Noch eine Frage: Wie kann ich einem Navigationselement weitere Variablen zuordnen? (z.B. eine Farbe)
Du kannst beim Ausgeben der Navigation Parameter angeben, z.B. wie viele Ebenen (bei der Hauptnavi dann eben nur eine) oder ab welchem "Elternelement" die Navigation ausgegeben werden soll (Aktives Element der ersten Ebene ist dann das Elternelement fuer die Unternavigation).

Das mit den Farben ist natuerlich dann wieder nicht ganz so einfach. Es ginge vielleicht aehnlich wie mit den "---". Wenn dann in dem Eintrag z.B. "#" vorkommt, werden "#" und die naechsten 6 Ziffern als Farbe genommen. Allerdings wird es dann langsam unuebersichtlich fuer die Redakteure :).

Balu
Antworten