Zweiter Kategorie-Text

Umfangreiche SEO-Texte muss ich im Footer des Produktlisting/Kategorien anzeigen.
Dafür habe ich ein entsprechendes Datenbankfeld angelegt und über ein Template für page_list_listbody funktioniert die Frontendausgabe wunderbar.

Für das Backend wollte ich ein eigenes Tab, welches ich über die menu.xml in meinem Modul definiert habe.

<?xml version="1.0" encoding="ISO-8859-15"?>
<OX>
	<OXMENU id="NAVIGATION_ESHOPADMIN">
		<MAINMENU id="mxmanageprod">
            <SUBMENU id="mxcategories" cl="category" list="category_list">
                <TAB id="tbclcategory_text2" cl="category_text2" />
            </SUBMENU>
		</MAINMENU>
	</OXMENU>
</OX>

Zusätzlich habe ich noch einen Controller sowie ein Backend Template erstellt.

Controller:

<?php

class category_text2 extends oxAdminDetails {

    protected $_sThisTemplate = "category_text2.tpl";

    public function render() 
	{
		parent::render();
		
        $this->_aViewData['edit'] = $oCategory = oxNew('oxcategory');

        $soxId = $this->_aViewData["oxid"] = $this->getEditObjectId();
        if ($soxId != "-1" && isset($soxId)) {
            // load object
            $iCatLang = oxRegistry::getConfig()->getRequestParameter("catlang");

            if (!isset($iCatLang)) {
                $iCatLang = $this->_iEditLang;
            }

            $this->_aViewData["catlang"] = $iCatLang;

            $oCategory->loadInLang($iCatLang, $soxId);


            foreach (oxRegistry::getLang()->getLanguageNames() as $id => $language) {
                $oLang = new stdClass();
                $oLang->sLangDesc = $language;
                $oLang->selected = ($id == $this->_iEditLang);
                $this->_aViewData["otherlang"][$id] = clone $oLang;
            }
        }		
		
        $this->_aViewData["editor"] = $this->_generateTextEditor("100%", 300, $oCategory, "oxcategories__oxlongdesc2", "list.tpl.css");		
		
		return $this->_sThisTemplate;
	}
	

    /**
     * Saves category description text to DB.
     *
     * @return mixed
     */
    public function save()
    {
        parent::save();

        $myConfig = $this->getConfig();

        $soxId = $this->getEditObjectId();
        $aParams = oxRegistry::getConfig()->getRequestParameter("editval");

        $oCategory = oxNew("oxcategory");
        $iCatLang = oxRegistry::getConfig()->getRequestParameter("catlang");
        $iCatLang = $iCatLang ? $iCatLang : 0;

        if ($soxId != "-1") {
            $oCategory->loadInLang($iCatLang, $soxId);
        } else {
            $aParams['oxcategories__oxid'] = null;
        }


        $oCategory->setLanguage(0);
        $oCategory->assign($aParams);
        $oCategory->setLanguage($iCatLang);
        $oCategory->save();

        // set oxid if inserted
        $this->setEditObjectId($oCategory->getId());
    }		
	
}

Template:

[{include file="headitem.tpl" title="GENERAL_ADMIN_TITLE"|oxmultilangassign}]

<script type="text/javascript">
<!--
function loadLang(obj)
{
    var langvar = document.getElementById("catlang");
    if (langvar != null )
        langvar.value = obj.value;
    document.myedit.submit();
}
//-->
</script>

[{ if $readonly }]
    [{assign var="readonly" value="readonly disabled"}]
[{else}]
    [{assign var="readonly" value=""}]
[{/if}]

<form name="transfer" id="transfer" action="[{ $oViewConf->getSelfLink() }]" method="post">
    [{ $oViewConf->getHiddenSid() }]
    <input type="hidden" name="oxid" value="[{ $oxid }]">
    <input type="hidden" name="cl" value="category_text2">
    <input type="hidden" name="editlanguage" value="[{ $editlanguage }]">
</form>

        [{ $editor }]

        <form name="myedit" id="myedit" action="[{$oViewConf->getSelfLink()}]" method="post" onSubmit="copyLongDesc('oxcategories__oxlongdesc2');" style="padding: 0px;margin: 0px;height:0px;">
        [{ $oViewConf->getHiddenSid() }]
        <input type="hidden" name="cl" value="category_text">
        <input type="hidden" name="fnc" value="">
        <input type="hidden" name="oxid" value="[{ $oxid }]">
        <input type="hidden" name="voxid" value="[{ $oxid }]">
        <input type="hidden" name="editval[oxcategories__oxid]" value="[{ $oxid }]">
        <input type="hidden" name="catlang" value="[{$catlang}]">
        <input type="hidden" name="editval[oxcategories__oxlongdesc2]" value="">
        <table>
        <tr>
          <td valign="top" class="edittext">
          [{if $languages}]<b>[{ oxmultilang ident="GENERAL_LANGUAGE" }]</b>
          <select name="catlang" class="editinput" onchange="Javascript:loadLang(this)" [{ $readonly }]>
          [{foreach key=key item=item from=$languages}]
            <option value="[{$key}]"[{if $catlang == $key}] SELECTED[{/if}]>[{$item->name}]</option>
          [{/foreach}]
          </select>
          [{/if}]
          </td>
        </tr>
        <tr>
          <td>
                <input type="submit" class="edittext" name="save" value="[{ oxmultilang ident="CATEGORY_TEXT_SAVE" }]" onClick="Javascript:document.myedit.value='save'">
          </td>
        </tr>
        </form>
      </table>

[{include file="bottomnaviitem.tpl"}]

[{include file="bottomitem.tpl"}]

Wenn ich nun eine Kategorie bearbeite wird der Text des Datenbankfeldes [B]oxlongdesc2[/B] geladen. Aber nach dem Speichern oder einer Änderung der Sprache wird immer der Standard Langtext geladen. Was habe ich übersehen, bzw. was muss ich noch anpassen?

Hallo,
die frage wird dir höchstwahrscheinlich nicht gefallen aber warum denn das alles?

Jeder Kategorie hat Kurz-und Langbeschreibung. Wenn du zuwenig Zeichenlänge hast kannst du das in der Datenbank erhöhen. Aber warum benötigst du eine dritte Beschreibung für die Kategorien?

Oder möchtest du die Beschreibung trennen, hälfte oben und der Rest unter den Produkten anzeigen?

Grüße
Rafig

Ändere

<input type="hidden" name="cl" value="category_text">

in

<input type="hidden" name="cl" value="category_text2">

Hallo,

danke für das schnelle Feedback - manchmal sieht man vor lauter Bäumen den Wald nicht…

Wie von dir vermutet möchte ich den Text trennen. Da die Texte etwas umfangreicher werden, sollen diese nach dem Produktlisting platziert werden.

Beispiel: http://vosseler.tmedia-software.de/Fliegenrollen/DC-Serie/

Hi,
dann schaue doch mal [B]hier[/B] rein. Es ist ein fertiges Modul für Flow-und Azure-Theme.

[B]SEO-Kategoriebeschreibung[/B]

Dabei bin ich ein bisschen anders vorgegangen wie du.

Grüße
Rafig

Dein Modul sieht gut aus :slight_smile: Nur bei der onDeactivate-Funktion habe ich etwas Kopfschmerzen. Das ist zwar sauber programmiert, des öfteren haben mir leider Kunden im Backend rumgespielt und Erweiterungen deaktiviert. D.h. alles Texte wären beim Deaktivieren des Moduls weg, deshalb würde ich die onDeactive weglassen.

Sobald in meinem Modul ein zweiter Text eingegeben wurde, setzte ich an den Standard-Text einen “Mehr lesen” Link. Ich habe das mit jQuery gelöst.

[{$smarty.block.parent}]

<span id="label_more" style="display:none">[{oxmultilang ident='ID_READ_MORE'}]</span>

[{oxscript add="$(document).ready(function() {
    var_desc = $('#catLongDescLocator');
    var_more = $('#label_more').html();	
    var_desc2 = $('#catLongDescLocator2').size();				
	if(var_desc2 > 0) { var_desc.append( \"<a id='scroll_desc2' href='#catLongDescLocator2'>\"+var_more+\"</a>\" ); }
	
	$('a[href^=\"#\"]').on('click',function (e) {
	    e.preventDefault();
	    var target = this.hash;
	    var \$target = \$(target);		
	    $('html, body').stop().animate({
	        'scrollTop': \$target.offset().top
	    });
	});		
}); "}]

Viele Grüße
Dscho

Hallo Dscho,

[B]1.[/B] Das stimmt nicht ganz, siehe [B]hier[/B]. Die stelle ist im Modul auskommentiert.

[B]2.[/B] Entschuldigung aber das macht einfach keinen Sinn. Auch dafür habe ich das Modul [B]hier[/B] seit Jahren im Angebot. Bei dem Kunden meckerten aber beiden SEO-Agenturen das es keinen Sinn macht texte zu verbergen. Deshalb auch das neuester gratis Modul damit man den text aufteilt anstatt zu verstecken.

[B]Edit:[/B] Ok. Jetzt habe ich es verstanden. Du setzt einfach einen Link bei dem ersten text ein die den Besucher bei klick nach unten zur zweiten text runter scrollt und du versteckst überhaupt nicht.

Das ist eine gute Idee und wenn ich heute dazukomme werde ich das Modul dementsprechend erweitern.

Grüße
Rafig

Genau, damit man nichts verstecken muss habe ich den ganzen Aufwand betrieben :slight_smile:
Nach unten raus spielt es von der Usability keine Rolle längeren SEO-Content einzufügen - soweit die Texte natürlich optimiert sind.

Viele Grüße
Dscho