CMS_TYPE Select?

Alles rund um Module und Plugins in CONTENIDO 4.9.
Antworten
Bernbacher
Beiträge: 63
Registriert: Fr 21. Jan 2011, 13:29
Kontaktdaten:

CMS_TYPE Select?

Beitrag von Bernbacher » Di 11. Dez 2012, 13:51

Hallo, gibt es so was wie ein CMS_SELECT? Also ein das man beim Editieren eines Artikels statt ein Textfeld ein Dropdown hat?

xmurrix
Beiträge: 3147
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: CMS_TYPE Select?

Beitrag von xmurrix » Di 11. Dez 2012, 14:28

Hallo Bernbacher,

ein CMS-Typ für Selects gibt es nicht, du kannst es aber auch mit einem Modul lösen. hier ein einfaches Beispiel:

Moduleingabe:

Code: Alles auswählen

?><?php
// Module input

$selectList = array(
    'a' => 'Apple',
    'b' => 'Banana',
    'c' => 'Cherry'
);

$cmsValueSelect = "CMS_VALUE[1]";
$cmsVarSelect = "CMS_VAR[1]";

?>

<select name="<?php echo $modContext->cmsVarSelect ?>">
<?php
foreach ($selectList as $k => $v) {
    $sel = ($cmsValueSelect == $k) ? ' selected="selected"' : '';
    echo '<option value="' . $k . '"' . $sel . '>' . $v . '</option>' . "\n";
}
?>
</select>
Modulausgabe:

Code: Alles auswählen

<?php
// Module output

$selectList = array(
    'a' => 'Apple',
    'b' => 'Banana',
    'c' => 'Cherry'
);

$cmsValueSelect = "CMS_VALUE[1]";

if (isset($selectList[$cmsValueSelect])) {
    echo $selectList[$cmsValueSelect];
}

?>
Man kann es auch ohne die redundante Liste lösen, in dem man in der Eingabe gleich die Werte speichert. Ich bevorzuge eher das Speichen von Schlüsseln, da sich Werte ändern können, Schlüssel in der Regel nicht...

Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

Bernbacher
Beiträge: 63
Registriert: Fr 21. Jan 2011, 13:29
Kontaktdaten:

Re: CMS_TYPE Select?

Beitrag von Bernbacher » Do 13. Dez 2012, 13:45

Hallo xmurrix,

vielen Dank für die Antwort. Ich glaube ich habe mich ein bisschen missverständlich ausgedrückt: ich würde gerne nicht im Input ein Select haben, sondern im Output.
Aber dazu müsste ich ja den Wert speichern, aber ein CMS_VAR gibts ja nicht im Output...
Wollte so was in der Art im Output:

Code: Alles auswählen

<select name="CMS_VAR[1]">
    <option value="1">Wert 1</option>
    <option value="2">Wert 2</option>
</select>
Ich will damit die Möglichkeit haben im Artikel versch. Einstellungen zu machen, ohne jedem Artikel ein eigenes Template zu weisen zu müssen und ohne extra immer in die Konfiguration gehen zu müssen.

Gruß Bernbacher

xmurrix
Beiträge: 3147
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: CMS_TYPE Select?

Beitrag von xmurrix » Do 13. Dez 2012, 17:31

Verstehe,

du kannst in der Ausgabe mit ein paar Tricks eine Selectbox, oder jede andere Art von Formularfeldern, ausgeben, um dann ausgewählte oder eingegebene Werte zu speichern.

Über CMS_VAR/CMS_VALUE sollte es auch möglich sein, aber da fält mir jetzt keine einfache Lösung ein. Du kannst aber die properties-Tabelle verwenden, um Daten zu speichern.

Das folgende Beispielcode generiert im Backend im Editiermodus eine Select-Box inkl. der Option zum Speichern der Auswahl. Im Frontend wird die Select-Box nicht angezeigt, aber du hast den gespeicherten Wert zur Verfügung, mit der du was machen kannst:

Code: Alles auswählen

<?php
// Module output


// Our select list
$selectList = array(
    ''  => '-- Select fruit --',
    'a' => 'Apple',
    'b' => 'Banana',
    'c' => 'Cherry'
);

// Are we in backend edit mode?
$isBackendEditMode = (!empty($contenido) && !empty($edit) && "true" == $edit);

$defaultCmsValueSelect = "a";
$cmsValueSelect = "";

$oPropertyColl = new PropertyCollection();

if ($isBackendEditMode) {
    // We are in backend edit mode, do form processing...
    if (!empty($_POST['frontend_cms_select_value'])) {
        // Form was send, save data
        $cmsValueSelect = $_POST['frontend_cms_select_value'];
        if (!isset($selectList[$cmsValueSelect])) {
            $cmsValueSelect = $defaultCmsValueSelect;
        }
        $oPropertyColl->setValue('article', (int) $idart, 'frontend_cms_select_name_type', 'frontend_cms_select_name', $cmsValueSelect);
    }
}

// Get selected value
$oPropertyColl->select("idclient = " . (int) $client . " AND itemtype = 'article' AND itemid = " . (int) $idart . " AND name='frontend_cms_select_name' AND type='frontend_cms_select_name_type'");
if ($oProperty = $oPropertyColl->next()) {
    $cmsValueSelect = $oProperty->get("value");
}

// Validate selected value
if (!isset($selectList[$cmsValueSelect])) {
    $cmsValueSelect = $defaultCmsValueSelect;
}

?>
<?php if ($isBackendEditMode) : ?>
    <?php /* Output the selectbox only in backend edit mode! */ ?>
    <select name="frontend_cms_select">
    <?php
    foreach ($selectList as $k => $v) {
        $sel = ($cmsValueSelect == $k) ? ' selected="selected"' : '';
        echo '<option value="' . $k . '"' . $sel . '>' . $v . '</option>' . "\n";
    }
    ?>
    </select>
    <a href="javascript:saveFrontendCmsSelect();"><img src="<?php echo $cfg['path']['contenido_fullhtml']?>images/but_ok.gif" border="0"></a>
    <script type="text/javascript">
    function saveFrontendCmsSelect() {
        var $form = $("form[name=editcontent]"),
            $select = $('select[name=frontend_cms_select]');
            $input = $form.find('input[name=frontend_cms_select_value]')[0];
        if (!$input) {
            $input = $('<input type="hidden" name="frontend_cms_select_value" value="" />');
            $form.append($input);
        }
        $input.val($select.val());
        $form.submit();
    }
    </script>
<?php endif; ?>

<!-- display the selected value -->
<pre>Selected value: <?php var_dump($cmsValueSelect); ?></pre>
Das Beispiel ist sehr einfach gehalten, es ist z. B. nicht möglich, die Modulausgabe mehrfach im gleichen Artikel zu verwenden, aber das sollte bei Bedarf einfach zu anzupassen sein...
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

Spider IT
Beiträge: 1416
Registriert: Fr 3. Dez 2004, 10:15

Re: CMS_TYPE Select?

Beitrag von Spider IT » Do 13. Dez 2012, 20:10

Hallo Bernbacher,

alternativ kannst du das hier nehmen (ist etwas kürzer):

Code: Alles auswählen

<?php
# Show a html select in edit mode, the selected value in frontend
$oArt = new Article($idart, $client, $lang, $idartlang);
$selected = $oArt->getContent('CMS_TEXT', 1001);
if ($edit) {
    if (isset($_POST['mySelectOption'])) {
        # Wert speichern
        conSaveContentEntry($idartlang, 'CMS_TEXT', 1001, $_POST['mySelectOption']);
        $selected = $_POST['mySelectOption'];
    }
    $options = explode(',', getEffectiveSetting('editor', 'options'));
?>
    <select id="mySelect" name="mySelect" onchange="saveSelect()">
        <option value="">- Bitte w&auml;hlen -</option>
<?php
    for ($i = 0, $n = count($options); $i < $n; $i ++) {
        echo '
        <option value="' . trim($options[$i]) . '"' . ((trim($options[$i]) == $selected) ? ' selected="selected"' : '') . '>' . trim($options[$i]) . '</option>';
    }
?>
    </select>
    <script type="text/javascript">
    //<![CDATA[
        function saveSelect() {
            var f = document.forms['editcontent'];
            var s = document.getElementById('mySelect').value;
            var c = document.createElement('input');
            c.type = 'hidden';
            c.name = 'mySelectOption';
            c.value = s;
            f.appendChild(c);
            f.submit();
        }
    //]]>
    </script>
<?php
} else {
    echo $selected;
}
?>
Die Werte für das Select werden aus den Mandanteneinstellungen gelesen:

Code: Alles auswählen

Typ = editor
Name = options
Wert = Apfel,Banane,Limone,Zitrone
Wert ist eine Komma-getrennte Liste der Begriffe.
Du kannst natürlich auch die Werteliste über die Konfiguration einstellen, dafür dann da ein einzelnes input type="text" reinbringen und im Output die Funktion getEffectiveSetting() komplett gegen den Wert aus dem Input austauschen.
Was du letztendlich mit dem Wert machst ist dir überlassen, zurzeit wird er (in der vorletzten Zeile) im Frontend und in der Vorschau einfach per echo ausgegeben.

Gruß
René

xmurrix
Beiträge: 3147
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: CMS_TYPE Select?

Beitrag von xmurrix » Do 13. Dez 2012, 20:24

@René:

Danke für das Posten der alternaiven Lösung!

Gruß
Murat
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

Bernbacher
Beiträge: 63
Registriert: Fr 21. Jan 2011, 13:29
Kontaktdaten:

Re: CMS_TYPE Select?

Beitrag von Bernbacher » Fr 14. Dez 2012, 11:43

Hallo,

vielen Dank Ihr beiden, das ist genau das, was ich gesucht habe, prima! Tolle, schnelle, fundierte Hilfe, so macht das Spaß.
Ich hätte nur nicht die Funktion "conSaveContentEntry" gefunden, gibts irgendwo eine Übersicht über die bestehenden Funktionen in welchen Dateien man die findet? Ansonsten läuft man ja schnell Gefahr das Rad neu zu erfinden bei versch. anderen Anforderungen, die eigtl. schon gelöst sind...

Gruß Bernbacher

xmurrix
Beiträge: 3147
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: CMS_TYPE Select?

Beitrag von xmurrix » Fr 14. Dez 2012, 12:20

Halo Bernbacher,

eine genaue Beschreibung aller Funktionen gibt es eigentlich nicht. Auf http://www.contenido-wiki.org gibt es einige Infos, z. B. aber nicht über conSaveContentEntry().

Am Besten ist es, wenn man sich etwas mit den Sourcen auseinander setzt. Eine detailierte Dokumentation über die Funktionen gibt es leider nicht, es wird aber daran gearbeitet...

Es gibt einige hier im Forum, die eine Dokumentation der Sourcecodes generiert haben (z. B. mit phpDocumentor). Das kann auch hilfreich sein.

Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

Spider IT
Beiträge: 1416
Registriert: Fr 3. Dez 2004, 10:15

Re: CMS_TYPE Select?

Beitrag von Spider IT » Fr 14. Dez 2012, 12:28

Hallo Bernbacher,

die Funktionen zum Bearbeiten von Artikel stehe in der Datei /contenido/includes/functions.con.php.

Gruß
René

Bernbacher
Beiträge: 63
Registriert: Fr 21. Jan 2011, 13:29
Kontaktdaten:

Re: CMS_TYPE Select?

Beitrag von Bernbacher » Fr 14. Dez 2012, 13:00

Vielen Dank!

hoprah
Beiträge: 28
Registriert: Di 15. Apr 2008, 13:57
Kontaktdaten:

Re: CMS_TYPE Select?

Beitrag von hoprah » Fr 14. Dez 2012, 13:45

Hallo,

nur mal als Hinweis - vielleicht hilft das ja:

http://www.conrepo.org/apidoc/contenido ... a8b2076e3f
Gruß
hoprah

xmurrix
Beiträge: 3147
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: CMS_TYPE Select?

Beitrag von xmurrix » Di 18. Dez 2012, 00:49

Vielleicht wäre hier die API Dokumentation zur der aktuellen 4.9 angebracht.

Die Sourcen, vor allem die Dokumentation der Sourcen in der Version 4.9 haben fast nichts gemein mit den Sourcen und der Dokumentation der 4.8.11. In der Version 4.9 wurde viel im Bereich der Dokumentation gearbeitet und auch an den Sourcen.

Nachtrag:
Die API Dokumentation für Version CONTENIDO 4.9 gibt es unter:
http://forum.contenido.org/viewtopic.php?t=32562

Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

marcus.gnass_4fb
Beiträge: 87
Registriert: Do 26. Apr 2012, 23:02
Kontaktdaten:

Re: CMS_TYPE Select?

Beitrag von marcus.gnass_4fb » Sa 9. Feb 2013, 14:01

Cool! Ich hab versucht Murats Lösung mal in eine Klasse zu packen. Hab den Code aber nicht getestet!!

EDIT: Ich habe noch einen kleinen Fehler behoben der mir aufgefallen war. Zudem habe ich versucht die Klasse so umzushreiben, daß nicht nur eine Selectbox zur Auswahl von vorher definierten Werten angezeigt werden kann, sondern auch ein einzeiliges Eingabefeld. Hier kann das JavaScript des Editors allerdings noch nicht funktionieren.

Zudem hatte Murat mich darauf aufmerksam gemacht, daß diese Lösung nicht funktioniert, wenn man mehrere Instanzen in einem Artikel unterbringen möchte.

Ich werde versuchen demnächst auch hierfür eine funktionierende Lösung anzubieten.

EDIT: Die neue Version ist getestet und funktioniert. Zumindest für SelectBoxen. Es sollte sogar möglich sein mehrere Properties auf einer Seite damit zu editieren.

Code: Alles auswählen

<?php

/**
 *
 * @package Classes
 * @subpackage Article Property Editor
 * @author marcus.gnass
 */
class ArticlePropertyEditor {

    /**
     * Type to be used for property table.
     *
     * @var string
     */
    protected $_type = '';

    /**
     * Name to be used for property table.
     * This name is also used for the editors hidden input field.
     *
     * @var string
     */
    protected $_name = '';

    /**
     * Default value to be assumed when no valid value is given.
     *
     * @var string
     */
    protected $_default = '';

    /**
     * If this member is set to an array a selectbox is displayed in backend
     * edit mode allowing the selection of one of its values.
     * The array has
     * then to be associative with the option values as keys and human
     * readable
     * labels as values.
     *
     * @var array || NULL
     */
    protected $_options = NULL;

    /**
     * Random index between 1 and 1,000,000
     *
     * @var int
     */
    protected $_index = 0;

    /**
     * Collection object to retrieve & store property values.
     *
     * @var PropertyCollection
     */
    protected $_collection = NULL;

    /**
     * Stores given params as members & creates a property collection.
     *
     * @param string $type
     * @param string $name
     * @param string $default
     * @param array $options
     */
    public function __construct($type, $name, $default = '', array $options = NULL) {

        // store params as members
        $this->_type = $type;
        $this->_name = $name;
        $this->_default = $default;
        $this->_options = $options;

        // get random index
        $this->_index = rand(1, 1000000);

        // create property collection
        $this->_collection = new PropertyCollection();

    }

    /**
     * Sets the default value to use when no valid value is given.
     */
    public function setDefault($default) {
        $this->_default = $default;
    }

    /**
     * Sets the options to display for selecction of a value.
     */
    public function setOptions(array $options) {
        $this->_options = $options;
    }

    /**
     * Saves the posted value in backend edit mode and returns the posted
     * value.
     * When not called in backend edit mode or no value is posted the value
     * is read from database and then returned.
     */
    public function storeValue() {

        if (false === cRegistry::isBackendEditMode()) {
            return $this->readValue();
        }

        $fieldName = $this->_getFieldName();

        if (empty($_POST[$fieldName])) {
            return $this->readValue();
        }

        $value = $_POST[$fieldName];
        $value = $this->_validate($value);

        $itemid = cRegistry::getArticleId();
        $this->_collection->setValue('article', $itemid, $this->_type, $this->_name, $value);

        return $value;

    }

    /**
     * Reads and returns the value from database.
     * If no value was stored or is
     * an invalid value, the default value will be returned.
     */
    public function readValue() {

        $property = $this->_getProperty();

        $value = $this->_default;
        if (false !== $property) {
            $value = $property->get('value');
            $value = $this->_validate($value);
        }

        return $value;

    }

    /**
     * get article property
     */
    protected function _getProperty() {

        $idclient = cRegistry::getClientId();
        $itemid = cRegistry::getArticleId();

        // TODO validation to prevent SQLI
        $this->_collection->select(implode(' AND ', array(
            "idclient = $idclient",
            "itemtype = 'article'",
            "itemid = $itemid",
            "type = '$this->_type'",
            "name = '$this->_name'"
        )));

        $item = $this->_collection->next();

        return $item;

    }

    /**
     * validate value
     */
    protected function _validate($value) {

        if (false === is_array($this->_options)) {
            return $value;
        }

        if (true === isset($this->_options[$value])) {
            return $value;
        }

        return $this->_default;

    }

    /**
     * Returns the editor to edit the property value.
     */
    public function getEditor($selectedValue) {

        $cfg = cRegistry::getConfig();

        $contenido_fullhtml = $cfg['path']['contenido_fullhtml'];
        $fieldName = $this->_getFieldName();
        $function = "saveArticleProperty$this->_index";

        $editor = '<label class="con-label-edit">' . i18n('property') . ': ' . $this->_type . '/' . $this->_name . '</label>' . "\n";
        if (true === is_array($this->_options)) {
            // select element
            $editor .= "<select name=\"$fieldName\">\n";
            foreach ($this->_options as $value => $option) {
                $attrib = ($selectedValue == $value)? ' selected="selected"' : '';
                $editor .= "<option value=\"$value\"$attrib>$option</option>\n";
            }
            $editor .= "</select>\n";
        } else {
            $editor .= "<input type=\"text\" name=\"$fieldName\" value=\"$selectedValue\">";
        }

        // save icon
        $editor .= "<a href=\"javascript:$function()\">";
        $editor .= "<img src=\"${contenido_fullhtml}images/but_ok.gif\" border=\"0\">";
        $editor .= "</a>";

        // script
        // TODO does not yet work with input
        $editor .= "
<script type=\"text/javascript\">
function $function() {
    var form = $('form[name=editcontent]'),
        select = $('select[name=$fieldName]');
        input = form.find('input[name=$fieldName]');
    if (0 === input.length) {
        input = $('<input type=\"hidden\" name=\"$fieldName\" value=\"\" />');
        form.append(input);
    }
    input.val(select.val());
    form.submit();
}
</script>\n";

        return $editor;

    }

    /**
     *
     * @return string
     */
    protected function _getFieldName() {
        return 'cms_property_' . $this->_type . '_' . $this->_name;
    }

}

?>
Im Module kann man dann wie folgt auf den Wert bzw. den Editor zugreifen:

Code: Alles auswählen

<?php
// create instance of ArticlePropertyEditor
$propertyEditor = new ArticlePropertyEditor('map', 'display');
$propertyEditor->setDefault('true');
$propertyEditor->setOptions(array(
    '' => '-- whatever --',
    'true' => 'true',
    'false' => 'false'
));

// get value & editor
if (cRegistry::isBackendEditMode()) {
    $value = $propertyEditor->storeValue();
    echo $propertyEditor->getEditor($value);
} else {
    $value = $propertyEditor->readValue();
}
?>

apicalart
Beiträge: 161
Registriert: Fr 18. Mär 2005, 13:09
Wohnort: Linnich ( NRW )
Kontaktdaten:

Re: CMS_TYPE Select?

Beitrag von apicalart » Mo 11. Aug 2014, 13:23

Mahlzeit,

ich glaube ich brauche genau die umgekehrte Version. Was habe ich vor.
Wir geben auf unserer Seite die Auswertung eines Print-Fragebogens aus. Jetzt möchte ich aber nicht jedesmal die Antworten via copy und paste einfügen, sondern beim Anlegen des Artikels die Antworten in einer Auswahlbox stehen haben statt Sie jedesmal in ein CMS_HTML Feld tippen oder kopieren zu müssen.

Den Ansatz von xmurrix hatte ich eingebaut als Modul, gibt aber sofort einen Fehler im Input aus. Ich benutze die Version 4.9.4
Dat gijjt et doch nit wirklich, odder !

Grüsse aus dem Rheinland
http://www.eukoba.de

Antworten