Modul "floating information"

Alles rund um Module und Plugins in CONTENIDO 4.9.
Antworten
McHubi
Beiträge: 1209
Registriert: Do 18. Nov 2004, 23:06
Wohnort: Mettmann
Kontaktdaten:

Modul "floating information"

Beitrag von McHubi » Di 2. Aug 2016, 15:41

Hallo zusammen,

dieses Modul zäumt das Thema "Accordion" mal von einer anderen Seite auf. Die Inhalte passen sich responsiv dem zur Verfügung stehenden Platz an und sind über das Backend flexibel sortierbar. Vom Grundprinzip her ist es mit einer zweistufigen FAQ vergleichbar. Es gibt eine übergeordnete Kopfnavigation mit den jeweiligen Themen, die beim Anklicken den darunter liegenden Fragen-/Themenbereich öffnen. Dort sind neben einem möglichen Einleitungstext Infoboxen hinterlegt, die sich entsprechend öffnen und schließen lassen. Die Anzahl der Themen und Fragen ist unbegrenzt, die Sortierung kann nach dem Sortierschlüssel oder Backend-Title der Webartikel erfolgen, in denen die Daten hinterlegt sind.

Im Frontend schaut das Ganze dann zum Beispiel bei vier Hauptthemen und ein paar Infoboxen so aus:
floating_information_fe-001.jpg
(171.75 KiB) Noch nie heruntergeladen
INSTALLATION

1) Modul und Dateien
Als erstes das Modul anlegen und zwei Grafiken nach Wahl (oder die im nächsten Post verwenden) zum Öffnen/Schließen der Infoboxen (Dateiname fi_item_question_open.gif und fi_item_question_close.gif) nach upload/bullets hochladen. Wenn ein anderes Verzeichnis oder andere Dateien gewünscht sind, entsprechend die JS-Funktion fi_box_answer_show_hide sowie die CSS-Klasse div.fi_box_show_answer im Modulreiter CSS in punkto backgroundImage anpassen. Gleiches gilt für den Button button-arrow-up.png unterhalb des Infoboxenbereichs, der ein Hochspringen zur Hauptnavigation des Moduls ermöglicht. Wer hier etwas anpassen möchte, kann dies in der CSS-Klasse div.button_back_to_themes machen.

2) Informationsquelle schaffen
Die in den Infoboxen, Einleitungstexten und der "Kopfnavigation des Moduls" hinterlegten Texte und Bilder werden über Kategorien und Artikel gesteuert. Als erstes hierzu die Kategorien anlegen, passend zum Screenshot also:

Startseite
---Nähere Informationen
------Thema 1
------Thema 2
------Thema 3
------...

Der Name der Kategorie entspricht später dem Text, der unter den Bildern in der Kopfnavigation erscheint. Da "Thema 1 bis ..." nur ihres Namens wegen gebraucht werden und sonst lediglich Container für Informationsartikel sind, sollten sie offline geschaltet sein.

3) Vorlage für Artikel mit Informationen anlegen
Das Modul holt sich die für die Darstellung benötigten Infos aus den Standardmodulen content_image, content_header_first und content_text bzw. den dort hintelegten CMS-types CMS_IMGEDITOR[1], CMS_HTMLHEAD[1] und CMS_HTML[1] per cApiArticleLanguage. Insofern eine Vorlage mit diesen drei Modulen anlegen und darauf achten, dass die Nummerierung in den CMS-types stimmt. Anderenfalls muss die Modulausgabe angepasst werden.

4) Artikel anlegen
Alle Artikel in den Kategorien "Thema 1 bis ..." basieren auf der gerade angelegten Vorlage. Der Startartikel in der jeweiligen Kategorie muss jetzt zumindest mit dem Bild versorgt werden, dass in der Kopfnavigation des Moduls angezeigt werden soll. Die Überschrift und der Text des Artikels, der in der Ausgabereihenfolge zuerst dargestellt wird, bilden - wenn gewünscht - den Einleitungstext des Bereichs, der die Infoboxen beinhaltet. Alle weiteren Artikel benötigen lediglich die Headline und den Text. Innerhalb des Textes sind keine Grenzen gesetzt, hier können also auch Bilder und alle sonst üblichen Inhalte vorkommen. Beim Anlegen der Artikel - für die spätere Sortierung - auf den Backendtitle und/oder den Sortierschlüssel im Artikelreiter "Eigenschaften" achten.

5) Weitere Vorlage erstellen
...die das Modul "floating information" beinhaltet oder bestehende Vorlage ergänzen.

6) Artikel für die Anzeige der Moduls erstellen
Webartikel anlegen der auf der Vorlage basiert, die das Modul beinhaltet. Über den Artikelreiter "Konfiguration" gib es drei Stellschrauben um das Modul einzurichten:
Gewünschte Reihenfolge der idcats:
Hier einfach die idcats der Kategorien eintragen, die die Webartikel mit den Daten für die Infoboxen beinhalten. Hier also die idcats von "Thema 1 bis ...". Dabei die idcats mit einem # voneinander trennen. Die Reihenfolge der Eintragung bestimmt die Reihenfolge im Frontend.
Sortierung der Infoblöcke nach:
Entweder Backend-Title oder Sortierschlüssel
Sortierung auf-/absteigend:
Erklärt sich selbst :wink:

Fertig.

Wie kann die Anzahl der Elemente pro Zeile in der Kopfnavigation und bei den Infoboxen angepasst werden?
Im Augenblick ist die Anzahl der Hauptnavigationspunkte und Infoboxen in der "Desktopansicht" auf 4 pro Zeile festgelegt, was sich - je nach Breite des zur Verfügung stehenden Platzes - verringert. Die Anordnung der einzelnen Elemente erfolgt per Flexbox und die Breakpoints werden anhand von em-Weiten festgelegt. Um diese Breakpoints anzupassen sowie die Anzahl der Bilder/Punkte der Kopfnavigation die CSS-Klasse div.fi_boxes_theme_item in punkto width verändern. Die Infoboxen selbst können per width über die CSS-Klasse fi_box für die jeweiligen Breakpoints definiert werden. Zu finden ist das alles im Modulreiter "CSS".

Wie kann die Optik angepasst werden?
Auch hier geht der Weg über den Modulreiter "CSS". Um die korrekte Stellschraube herauszufinden, lohnt sich ein Blick in die Modulausgabe und die dort verwendeten CSS-Klassen.

Tipp:
Eine onsite-Search wird natürlich auch innerhalb der Artikel, die rein für die Ablage der Daten für die Infoboxen gebraucht werden, Suchtreffer generieren und hierauf verlinken. Schön aussehen wird das dann beim Öffnen wegen der abgespeckten Vorlage in den meisten Fällen nicht und wenn eine "normale Vorlage" in der üblichen Seitenoptik verwendet wird, dann ist die Information auch schnell "aus dem Zusammenhang gerissen". Um das zu vermeiden, kann im Artikelreiter "Eigenschaften" das Häkchen bei "Suchbar" entfernt werden. Dann wird natürlich nichts mehr gefunden, was letztlich auch nicht Sinn und Zweck sein kann. Die Lösung liegt jetzt darin, das Häkchen bei "Suchbar" aktiviert zu lassen, aber unter "Weiterleitung" die URL per front_content.php?idart=... auf den Webartikel, der das Modul "floating_information" beinhaltet, einzutragen. So führt ein Suchtreffer letztlich doch zum Ziel, auch wenn die passende Infobox dann noch nicht aufgeklappt ist.

Dieses Modul "floating_information" kann mit einem auf die Infoboxen beschränkten Suchmodul - was im folgenden Posting zu finden ist - ergänzt werden.

SOURCEN

Moduleingabe

Code: Alles auswählen

/***********************************************
* floating_information_sd input
*
* Author      :     seamless-design Markus Hübner
* Copyright   :     seamless-design Markus Hübner
* Created     :     2016-08-02
************************************************/
echo '<table>';
echo '<tr><td>'.mi18n("input - Gewünschte Reihenfolge der idcats").'<td><td><input type="text" name="CMS_VAR[100]" value="CMS_VALUE[100]"/></td></tr>';
echo '<tr><td>'.mi18n("input - Sortierung der Infoblöcke nach").'</td>';
      $infoboxes_order="CMS_VALUE[3000]";
      echo '<td>
      <select name="CMS_VAR[3000]">';
	    echo '<option value=""';
           if($infoboxes_order=="") echo ' selected="selected"';
		  echo '>--- ? ---</option>';
	    echo '<option value="sortsequence"';
           if($infoboxes_order=="sortsequence") echo ' selected="selected"';
		  echo '>'.mi18n("input - sortsequence").'</option>';
	    echo '<option value="title"';
           if($infoboxes_order=="title") echo ' selected="selected"';
		  echo '>'.mi18n("input - title").'</option>';
      echo '</select>
      </td></tr>';
echo '<tr><td>'.mi18n("input - Sortierung auf-/absteigend").'</td>';
      $infoboxes_order_direction="CMS_VALUE[3100]";
      echo '<td>
      <select name="CMS_VAR[3100]">';
	    echo '<option value=""';
           if($infoboxes_order_direction=="") echo ' selected="selected"';
		  echo '>--- ? ---</option>';
	    echo '<option value="ASC"';
           if($infoboxes_order_direction=="ASC") echo ' selected="selected"';
		  echo '>'.mi18n("input - aufsteigend").'</option>';
	    echo '<option value="DESC"';
           if($infoboxes_order_direction=="DESC") echo ' selected="selected"';
		  echo '>'.mi18n("input - absteigend").'</option>';
      echo '</select>
      </td></tr>';
echo '</table>';
echo '<input type="image" src="images/submit.gif">';
Modulausgabe

Code: Alles auswählen

<?php

/***********************************************
* floating_information_sd output
*
* Author      :     seamless-design Markus Hübner
* Copyright   :     seamless-design Markus Hübner
* Created     :     2016-08-02
************************************************/

$current_url=""; // without submitting current url to js-function, there will be a page-reload within firefox and chrome to www.domain.de/cms/#my_anchor. only after this reload jumping to anchors works

$isHttps = (!empty($_SERVER['HTTPS']));
if($isHttps) $current_url="https://";
  else $current_url="http://";

$current_url.=$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$string_idcats="CMS_VALUE[100]";
$array_idcats=explode("#",$string_idcats);
$array_idcats_length=count($array_idcats);
$infoboxes_order="CMS_VALUE[3000]";
if($infoboxes_order=="") $infoboxes_order="title";
$infoboxes_order_direction="CMS_VALUE[3100]";
if($infoboxes_order_direction=="") $infoboxes_order_direction="asc";

echo '<div id="fi_boxes_theme_container" class="fi_boxes_theme_container">';
foreach($array_idcats AS $element)
  {
  /* get picture of start article begin */
  $dirname="";
  $filename="";
  $list_of_articles = new cArticleCollector(array('idcat' => $element, "startonly" => 1)); 
  $array_articles_to_show=array();
  $array_articles_to_show=array();
  foreach ($list_of_articles as $thisarticle)
    {
    $array_articles_to_show[]=$thisarticle->get('idart');
    }
  if(count($array_articles_to_show)>0)
    {
	foreach($array_articles_to_show AS $source_idart)
	 {
     $article = new cApiArticleLanguage();
     $article->loadByArticleAndLanguageId($source_idart, $lang);
     $image = new cApiUpload();
     $idupl = $article->getContent('CMS_IMGEDITOR', 1);
     $image->loadByMany( array("idupl"=>$idupl) );
     $dirname =$image->getField("dirname");
     $filename = $image->getField("filename");
	 }
	}
  /* get picture of start article end */
  /* show theme begin */
  $cApiCatLang = new cApiCategoryLanguage();
  $cApiCatLang->loadByCategoryIdAndLanguageId($element, $lang);
  $theme=$cApiCatLang->get('name');
  echo '<div class="fi_boxes_theme_item" id="fi_boxes_theme_item_'.$element.'" onclick="javascript:fi_boxes_theme_show_hide(\''.$element.'\',\''.$string_idcats.'\',\''.$current_url.'\');">';
    echo '<div class="fi_boxes_theme_item_content">';
    echo '<img style="width: 100%; height: auto;" src="upload/'.$dirname.$filename.'" alt="'.$theme.'" title="'.$theme.'"/><br/>';
    echo $theme;
	echo '</div>';
  echo '</div>';
  /* show theme end */
  }
echo '</div>';
  
  
echo '<div style="clear: both;"></div>';

$string_search_ids=""; // preparation for module "floating_information_search"

foreach($array_idcats AS $element)
  {
  /* building array of articles within category begin */
  //https://docs.contenido.org/display/CONDEVE/cArticleCollector
  //http://api.contenido.org/latest/source-class-cArticleCollector.html
  $list_of_articles = new cArticleCollector(array('idcat' => $element, "start" => 1, "order" => $infoboxes_order, "direction" => $infoboxes_order_direction));
  $array_articles_to_show=array();
  foreach ($list_of_articles as $thisarticle)
    {
    $array_articles_to_show[]=$thisarticle->get('idart');
    }
  /* building array of articles within category end */
  /* show content of articles begin */
  if(count($array_articles_to_show)>0)
    {
	  $i=0;
	  echo '<div id="fi_boxes_theme_idcat_'.$element.'" style="display: none;">';	
    echo '<div class="fi_boxes container">';	
    foreach($array_articles_to_show AS $source_idart)
	    {
      $article = new cApiArticleLanguage();
      $article->loadByArticleAndLanguageId($source_idart, $lang);
		  if($i==0)
		  {
      echo '<div id="fi_boxes_theme_idcat_'.$element.'_box_'.$i.'" class="fi_box_theme_intro">';
		    echo '<div class="fi_box_theme_intro" id="fi_boxes_theme_idcat_'.$element.'_box_'.$i.'_content">'; // definition of id as ..._content is necessary for searching ids
		      echo '<div class="fi_box_theme_intro_headline" id="fi_boxes_theme_idcat_'.$element.'_box_'.$i.'_question">'; // definition of id as ..._question is necessary for searching ids
                echo $article->getContent('CMS_HTMLHEAD', 1);
			    echo '</div>';
			    echo '<div class="fi_box_theme_intro_content" id="fi_boxes_theme_idcat_'.$element.'_box_'.$i.'_answer">'; // definition of id as ..._answer is necessary for searching ids
		            echo $article->getContent('CMS_HTML', 1);
			    echo '</div>';
		    echo '</div>';
      echo '</div>';
		  }
		  else
		    {
        echo '<div class="fi_box item" id="fi_boxes_theme_idcat_'.$element.'_box_'.$i.'">';
 	        echo '<div class="fi_box_content" id="fi_boxes_theme_idcat_'.$element.'_box_'.$i.'_content">';
		        echo '<div title="'.mi18n("Informationen anzeigen/verbergen").'" class="fi_box_question" id="fi_boxes_theme_idcat_'.$element.'_box_'.$i.'_question" onclick="javascript:fi_box_answer_show_hide(\'fi_boxes_theme_idcat_'.$element.'_box_'.$i.'\',\'\')">'; // second data is necessary. have a look at floating_information.js and called function!
                  echo $article->getContent('CMS_HTMLHEAD', 1);
		        echo '</div>';
		        echo '<div class="fi_box_answer" id="fi_boxes_theme_idcat_'.$element.'_box_'.$i.'_answer" style="display: none;">';
                  echo $article->getContent('CMS_HTML', 1);
		        echo '</div>';
          echo '</div>';
			    echo '<div title="'.mi18n("Informationen anzeigen/verbergen").'" class="fi_box_show_answer" id="fi_boxes_theme_idcat_'.$element.'_box_'.$i.'_show_answer" onclick="javascript:fi_box_answer_show_hide(\'fi_boxes_theme_idcat_'.$element.'_box_'.$i.'\',\'\')">'; // second data is necessary. have a look at floating_information.js and called function!
			           echo '&nbsp;';
		      echo '</div>';
			  echo '</div>';
		    }
		  $string_search_ids.='#fi_boxes_theme_idcat_'.$element.'_box_'.$i.'_content';  // preparation for module "floating_information_search"
	    $i++;
	    }
	  echo '</div>';
	  echo '<div class="button_back_to_themes" onclick="javascript:window.location=\''.$current_url.'#fi_boxes_theme_container\';"></div>';
	echo '</div>';
    }
  /* show content of articles end */
  }
?>
CSS

Code: Alles auswählen

div.fi_boxes {
background-color: #f2f2f2;
padding-top: 0em;
padding-bottom: 2em;
padding-left: 0.5em;
padding-right: 0.5em;
margin-bottom: 2em;
width: 100%;
    box-shadow: 
        inset 0px 11px 8px -10px #e1e1e1,
        inset 0px -11px 8px -10px #e1e1e1; 
}

div.fi_boxes_theme_container {
margin-top: 2em;
margin-bottom: 1em;
display: flex;
flex-wrap: wrap;
justify-content: center;
}
div.fi_boxes_theme_item {
background-color: #ffffff;
width: 22%;
cursor: pointer;
display: flex;
flex-wrap: wrap;
align-content: space-between;
justify-content: center;
}
div.fi_boxes_theme_item_content {
padding: 1%;
text-align: center;
}

.container {
display: flex;
flex-wrap: wrap;
justify-content: center;
}

div.fi_box {
width: 24%;
text-align: center;
}
div.fi_box_theme_intro {
margin-top: 1em;
width: 100%;
text-align: center;
}
div.fi_box_theme_intro_headline {
font-weight: 900;
}
div.fi_box_theme_intro_content {
}
.item {
align-self: stretch;
margin-top: 1em;
}
div.fi_box_content {
background-color: #ffffff;
height: 95%;
margin: 1em;
font-size: 0.9em;
}
div.fi_box_question {
cursor: pointer;
padding: 1em;
color: #555555;
}
div.fi_box_answer {
padding: 0.5em;
padding-bottom: 2.5em;
}
div.fi_box_show_answer {
width: 1em;
height: 1em;
background-image: url('../upload/bullets/fi_item_question_open.gif');
background-repeat: no-repeat;
background-size: 1em 1em;
background-position: center right;
margin-top: -2.5em;
margin-right: 1.5em;
float: right;
cursor: pointer;
}

div.button_back_to_themes {
width: 2em;
height: 2em;
margin-left: auto;
margin-right: auto;
background-image: url('../upload/bullets/button-arrow-up.png');
background-repeat: no-repeat;
background-size: 1em 1em;
cursor:pointer;
}


@media only screen and (max-width: 59em) {
div.fi_boxes {
}
div.fi_box {
width: 33%;
}
div.fi_boxes_theme_item {
width: 33%;
}
}


@media only screen and (max-width: 49em) {
div.fi_boxes {
}
div.fi_box {
width: 49%;
}
}
@media only screen and (max-width: 39em) {
div.fi_box {
width: 98%;
}
div.fi_boxes_theme_item {
width: 48%;
}
}
Javascript

Code: Alles auswählen

function fi_box_answer_show_hide(var_id,var_origin) {
/*
this function shows or hides the answer to a question an manipulates the appearance of the question in color or whatever you want
examples for var_id:
fi_boxes_theme_idcat_2_box_0 (only possible, if this function is called from searchresult. if id is ending at _0, it contains the opening text of faq-area which has not a button to show/hide it like those boxes representing questions and answers
fi_boxes_theme_idcat_2_box_1 ("normal" id which is transferred by clicking on "show answer" within question-boxes of faq-area
var_origin: necessary -> have a look at module "search" and search.js -> function open_location. if this function is called via searchresult, it contains "search". otherwise it's clear.
*/
var var_box=var_id.split("_box_"); //some operations must not be processed for introtext, e.g. displaying a button to open or close the answer - if first element of this array is 0, it's the introtext
var var_box_number=var_box[1]; 
var var_pause=0; // in milli-seconds, needed if you want to add some effects an not just let the answer appear.
var var_animation_time=0; // in seconds, needed if you want to add some effects an not just let the answer appear.
var var_status=document.getElementById(var_id+'_answer').style.display; //checking if answer is already displayed or not
if(var_status=="none" || var_status=="" || var_origin=="search")
/*
var_status none: 
is set, if that answer was displayed once before but hidden again via user 
var_status empty:
nothing done with it, style-information was not manipulated 
var_origin search: 
this function firstly checks for status. if it is shown, the answer will be hidden. if it is hidden, it will be shown. if this function is called via searchresult, the answer might already be shown via user - in that case it must not be set to hidden. So in that case display will always be set to "block"
*/
  {
  document.getElementById(var_id+'_question').style.color="#00499a";
  document.getElementById(var_id+'_question').style.fontWeight="900";
  if(var_box_number!="0") // exclude intro of faq-area
    {
    document.getElementById(var_id).style.width="98%"; 
    document.getElementById(var_id).style.transition=var_animation_time+"s";
    document.getElementById(var_id).style.height="auto";
    document.getElementById(var_id).style.marginBottom="-1em";
    document.getElementById(var_id+'_show_answer').style.backgroundImage="url('../cms/upload/bullets/fi_item_question_close.gif')";
    }
  setTimeout(function()
    {
	document.getElementById(var_id+'_answer').style.display="block";
    }
  	,var_pause);
  }
  else // when var_status is "block" or var_origin is empty
    {
	document.getElementById(var_id+'_answer').style.display="none";
	document.getElementById(var_id).style.width="";
	document.getElementById(var_id).style.transition=var_animation_time+"s";
	document.getElementById(var_id+'_question').style.color="#555555";
	document.getElementById(var_id+'_question').style.fontWeight="normal";
	document.getElementById(var_id).style.height="";
	document.getElementById(var_id).style.marginLeft="";
	document.getElementById(var_id).style.marginBottom="";
	document.getElementById(var_id+'_show_answer').style.backgroundImage="url('../cms/upload/bullets/fi_item_question_open.gif')";
	}
}

function fi_boxes_theme_show_hide(var_id_theme,string_idcats,var_current_url) {
/*
this function is called via the parts of the heading menu of areas and shows or hides the different areas/themes of module. it also alters the appearance of heading menu-parts
var_id_theme: contains the idcat of category in which the information of area/theme is located
string_idcats: all idcats which are considered within module
*/
var array_idcats=new Array();
array_idcats = string_idcats.split("#"); //array contains the idcats of categories, in which the articles are located. these articles are filled with  information to be shown
var var_status=document.getElementById('fi_boxes_theme_idcat_'+var_id_theme).style.display; // checking if area/theme is shown or not. depending on result it will be toggled.
if(var_status=="none") // all area divs are delivered with display: none at first rendering of site - yes, not that good regarding barriers. but letting them first appear all and afterwards setting them to display none would cause a gnarly flashpopuglysomething - especially on mobile devices... ;O)
  {//if faq-area is hidden, it will be shown
  document.getElementById('fi_boxes_theme_idcat_'+var_id_theme).style.display="block";
  document.getElementById('fi_boxes_theme_item_'+var_id_theme).style.color="#0049a5";
  document.getElementById('fi_boxes_theme_item_'+var_id_theme).style.fontWeight="900";
  for (var i = 0, len = array_idcats.length; i < len; i++) // all ids of faq-areas are rolled through, to hide them - disregarding the user chosen one
    {
    if(var_id_theme!=array_idcats[i])
	  {
	  document.getElementById('fi_boxes_theme_idcat_'+array_idcats[i]).style.display="none";
	  document.getElementById('fi_boxes_theme_item_'+array_idcats[i]).style.color="#000000";
	  document.getElementById('fi_boxes_theme_item_'+array_idcats[i]).style.fontWeight="normal";
	  }
    }
  window.location=var_current_url+'#fi_boxes_theme_idcat_'+var_id_theme; // after hiding not necessary areas, jump to shown one
  }
  else // if faq-area is shown, it now will be hidden and heading menu part is set to passive state
    {
	document.getElementById('fi_boxes_theme_idcat_'+var_id_theme).style.display="none";
	document.getElementById('fi_boxes_theme_item_'+var_id_theme).style.color="#000000";
	document.getElementById('fi_boxes_theme_item_'+var_id_theme).style.fontWeight="normal";
	}
}
Übersetzung (lang_de_DE.txt)

Code: Alles auswählen

Informationen anzeigen/verbergen=Informationen anzeigen/verbergen
input - Gewünschte Reihenfolge der idcats=Gewünschte Reihenfolge der idcats
input - Sortierung auf-/absteigend=Sortierung auf-/absteigend
input - Sortierung der Infoblöcke nach=Sortierung der Infoblöcke nach
input - absteigend=absteigend
input - aufsteigend=aufsteigend
input - sortsequence=Sortierschlüssel
input - title=Backend-Title
Zuletzt geändert von McHubi am Mi 30. Nov 2016, 12:36, insgesamt 1-mal geändert.
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.

Das Handbuch zur Version 4.10: CONTENIDO für Einsteiger (4.10)

Das Handbuch zur Version 4.9: CONTENIDO für Einsteiger (4.9)

McHubi
Beiträge: 1209
Registriert: Do 18. Nov 2004, 23:06
Wohnort: Mettmann
Kontaktdaten:

Re: Modul "floating information"

Beitrag von McHubi » Mi 30. Nov 2016, 12:30

Ergänzendes Modul zum Durchsuchen der Infoboxen

Hallo zusammen,

da ist sie, die Suche für die Infoboxen. Das Modul "floating_information_sd" ist unverändert, es ist auch ohne die hier aufgeführte Suchfunktion uneingeschränkt lauffähig. Umgekehrt braucht die Suche natürlich das Modul "floating_information_sd" damit überhaupt was zum Durchsuchen da ist... :wink:

In der Vorlage ist zuerst das Modul "floating_information_sd" aus dem Eröffnungsposting einzubinden und danach (!) dieses Suchmodul "floating_information_sd_search". Hängt damit zusammen, dass Variablen gemeinsam verwendet werden.

FEATURES
# Durchsucht die per "floating_information_sd" dargestellten Infoboxen
# generierte Suchtreffer öffnen automatisch die passende Infobox und springen deren Anker an
# Anzeige von Suchvorschlägen kann zugeschaltet werden

Die Anzeige von Suchvorschlägen ist eine "beta". Sie bietet die Möglichkeit z. B. nur Worte zu indexieren, die mindestens x Buchstaben haben und auch Sperrworte können definiert werden. Die Vorschlagsliste ist per HTML5-Datalist umgesetzt, was bei den gängigen Webbrowsern (noch) zu unterschiedlicher Darstellung führt da der neue Standard anscheinend unterschiedlich interpretiert wird. Beispiel: Wenn im Suchfeld ein "p" eingegeben würde:
*IE und Chrome: Angezeigt werden alle Vorschlagsworte, die mit "p" beginnen.
-> "Programm": ja
-> "Fernsehprogramm": nein
*Firefox: Angezeigt werden alle Vorschlagsworte, die ein "p" beinhalten.
-> "Programm": ja
-> "Fernsehprogramm": ja

Die Worte für die Vorschlagsliste werden im Reiter Konfiguration festgelegt und können aus den aktuell hinterlegten Informationen der Infoboxen generiert werden. Wenn diese Inhalte verändert werden, sollte natürlich auch die Vorschlagsliste aktualisiert werden. Das muss jedoch manuell geschehen, damit nicht bei jedem Seitenaufruf im Frontend alles neue gecrawlt und zusammengestellt wird. Um zu verhindern, dass Vorschlagworte angezeigt werden, die in den Infoboxen z. B. nach Änderungen nicht mehr vorkommen angezeigt werden, kann ein "Check" durchgeführt werden. Was noch fehlt: Auflistung von neuen möglichen Suchworten, die bei Ergänzungen oder Änderungen hinzugekommen sind.

"Starterset" für auszuschließende Worte (pro Zeile eines, müssen mit dem Trennmarker # beendet werden):

Code: Alles auswählen

aber#
ähnliche#
alle#
allen#
aller#
alles#
andere#
anderem#
anderen#
anderer#
anderes#
anzeigen#
auch#
ausgeprägt#
ausgeprägte#
ausgeprägten#
ausgeprägter#
ausgeprägtes#
auszeichnen#
beide#
beidem#
beiden#
beider#
beides#
belange#
beteiligt#
bisher#
bleib#
bleibe#
bleiben#
bleibt#
dabei#
daher#
damit#
daneben#
dann#
darauf#
daraufhin#
darum#
dass#
denn#
deren#
derer#
deshalb#
deswegen#
deutschen#
dicht#
dichte#
diese#
diesem#
diesen#
dieser#
dieses#
durch#
eben#
ebenfalls#
egal#
eine#
einem#
einen#
einer#
eines#
erhalte#
erhalten#
erst#
finanzielle#
fort#
geben#
gelangen#
genießen#
gern#
gerne#
gibt#
groß#
große#
großen#
großer#
großzügige#
hänge#
hängen#
hängt#
heißt#
heißen#
heute#
hohe#
hohen#
hohes#
ihnen#
ihr#
ihre#
ihrem#
ihren#
ihrer#
ihres#
introtext#
kann#
können#
konnte#
konnten#
lässt#
lassen#
legen#
legt#
mach#
machen#
mein#
meine#
meinem#
meinen#
meiner#
meines#
mich#
müssen#
nach#
natürlich#
neben#
nein#
nicht#
nichts#
noch#
nutzt#
oder#
passieren#
passiert#
passt#
rahmen#
rechne#
rechnen#
rund#
sehe#
sehen#
sehr#
sein#
selber#
selbst#
selbstverständlich#
setzen#
sich#
sieht#
sind#
sobald#
sogar#
sowie#
sowohl#
stark#
starke#
starker#
stehe#
steher#
stehen#
stellt#
stetig#
stets#
tage#
tagen#
trage#
tragen#
trete#
treten#
tritt#
tritte#
über#
unser#
unsere#
unseren#
unserer#
unter#
viel#
viele#
vieler#
vieles#
voll#
volle#
warum#
weitere#
weiterer#
weiterhin#
wenden#
wenn#
weshalb#
welche#
werde#
werden#
wird#
würde#
würden#
wurde#
wurden#
zahlreich#
zahlreiche#
zusammen#

INSTALLATION
1) Modul anlegen
2) In Vorlage nach (!) dem Modul "floating_information_sd" einbinden
3) konfigurieren


SOURCEN für "floating_information_sd_search"

Beschreibung

Code: Alles auswählen

important: modules "floating_information_sd_search" and "floating_information_sd" are combined and depend on each other. Example: $string_idcats here is used from module "floating_information_sd". so "floating_information_sd_search" has to be executed after "floating_information_sd"!
"floating_information_sd_search" does not work without "floating_information_sd", but "floating_information_sd_search" is not needed for running "floating_information_sd"
Moduleingabe

Code: Alles auswählen

?>
<h2>FAQ-Suche</h2>
<script type="text/javascript">
function fi_box_answer_show_hide(var_id,var_origin) { // var_origin: necessary -> have a look at module "search" and search.js -> function open_location
var var_status=document.getElementById(var_id+'_answer').style.display;
if(var_status=="none" || var_status=="" || var_origin=="search") document.getElementById(var_id+'_answer').style.display="block";
  else document.getElementById(var_id+'_answer').style.display="none";
}
</script>
<?php
$use_suggestions="CMS_VALUE[1000]";

echo mi18n("Suchvorschläge im Frontend aktivieren").' <input type="checkbox" name="CMS_VAR[1000]" value="true"';
if($use_suggestions=="true") echo ' checked';
echo '><br/><br/>';

$array_idcats=array(2,3,4,5,6,7);
//$keyword_minimum_length=3;
$array_search_keywords=array();
$punctuations_search= array(".",",","!","?","'",":","(",")","/",'"'); 
$punctuations_replace=array(" ","" ," "," ","" ,"" ,"" ,"" ,"" ,'');

echo '<strong>'.mi18n("Mindestlänge Suchvorschlag").'</strong><br/>';
echo '<input type="number" name="CMS_VAR[30000]" value="CMS_VALUE[30000]"/> '.mi18n("Buchstaben").'<br/>';
$keyword_minimum_length=CMS_VALUE[30000];
if($keyword_minimum_length=="") $keyword_minimum_length=3;
echo '<br/><strong>'.mi18n("Auszuschließende Worte").'</strong><br/>';
echo '<textarea name="CMS_VAR[20000]" style="width: 20em; height: 20em; font-family: arial;font-size: 1em;"/>CMS_VALUE[20000]</textarea><br/>';
echo mi18n("Zur Zeit ist ein doppeltes Abspeichern erforderlich, damit Änderungen wirksam werden.").'<br/>';
$string_words_not_to_consider_a="CMS_VALUE[20000]";
echo '<input style="display: none;" type="text" name="CMS_VAR[21000]" value="'.$string_words_not_to_consider_a.'">'; //this  input-field is necessary. For unknown reason string build directly from textarea does not work, only the first item of array from string can be found later within foreach($array_search_potential AS $potential)
$string_words_not_to_consider="CMS_VALUE[21000]";
$array_words_not_to_consider=array();
$array_words_not_to_consider=explode('#',$string_words_not_to_consider);
//print_r($array_words_not_to_consider);

echo '<br/><strong>'.mi18n("Berücksichtigte Webartikel").'</strong><br/>';
echo '<div style="height: 30em; overflow: auto;">';
/*
// http://forum.contenido.org/viewtopic.php?f=92&t=35025&hilit=kategorie+name
// mit idcat und lang
$cApiCatLang = new cApiCategoryLanguage();
$cApiCatLang->loadByCategoryIdAndLanguageId($idcat, $lang);
echo $cApiCatLang->get('name');
// oder mit idcatlang
$cApiCatLang = new cApiCategoryLanguage($idcatlang);
echo $cApiCatLang->get('name');
*/

foreach($array_idcats AS $element)
  {
  $cApiCatLang = new cApiCategoryLanguage();
  $cApiCatLang->loadByCategoryIdAndLanguageId($element, $lang);
  echo '<strong>'.$cApiCatLang->get('name').'</strong> (idcat: '.$element.')<br/>';
  /* building array of articles within category begin */
  //https://docs.contenido.org/display/CONDEVE/cArticleCollector
  //http://api.contenido.org/latest/source-class-cArticleCollector.html
  $list_of_articles = new cArticleCollector(array('idcat' => $element, "start" => 1, "order" => "sortsequence", "direction" => "asc")); 
  //$count = $liste->count();
  $array_articles_to_show=array();
  foreach ($list_of_articles as $thisarticle)
    {
    $array_articles_to_show[]=$thisarticle->get('idart');
    }
  /* building array of articles within category end */
   
  /* content of articles begin */
  if(count($array_articles_to_show)>0)
    {
	$search=array(' ','&auml;','&ouml;','&uuml;','&szlig;','&Auml;','&Ouml;','&Uuml;');//needed for checking correct length (&auml; is otherwise counted as 6 letters instead of 1)
	//$replace=array('','ä','ö','ü','ß','Ä','Ö','Ü'); // this does not work, because umlaut is automatically transformed back into entity. so placeholder hast to be e.g. used "-"
	$replace_count=array('','-','-','-','-','-','-','-');
	$replace_match=array('','ä','ö','ü','ß','Ä','Ö','Ü');
      foreach($array_articles_to_show AS $source_idart)
	    {
        $article = new cApiArticleLanguage();
        $article->loadByArticleAndLanguageId($source_idart, $lang);
		echo '<div style="background-color: #f9f9f9;margin-bottom: 1em;"  id="fi_boxes_theme_idcat_'.$element.'_box_'.$i.'_content">';
		echo '<div style="cursor: pointer; margin-top: 0.3em; color: #0049a5;" onclick="javascript:fi_box_answer_show_hide(\'fi_boxes_theme_idcat_'.$element.'_box_'.$i.'\',\'\')">'; // second data is necessary. have a look at floating_information.js and called function!
        echo $article->getContent('CMS_HTMLHEAD', 1);
		$search_potential=strip_tags($article->getContent('CMS_HTMLHEAD', 1));
		echo '</div>';
		//echo '<div class="fi_box_answer" id="fi_boxes_theme_idcat_'.$element.'_box_'.$i.'_answer" style="display: none;">';
		echo '<div style="margin-bottom: 1em;display: none;" id="fi_boxes_theme_idcat_'.$element.'_box_'.$i.'_answer">';
        echo $article->getContent('CMS_HTML', 1);
		$search_potential .=' '.strip_tags($article->getContent('CMS_HTML', 1));
		echo '</div>';
		echo '</div>';
		$search_potential=str_replace($punctuations_search,$punctuations_replace,$search_potential);
		//echo $search_potential.'<br/>';
		$search_potential=str_replace(array("\n","\r"),array(" "," "),$search_potential);
		//$search_potential=str_replace("\r"," ",$search_potential);
		$array_search_potential=explode(" ", $search_potential);
		//print_r($array_search_potential);
		foreach($array_search_potential AS $potential) 
		  {
		  //if(strlen(str_replace($search,$replace,$potential))>$keyword_minimum_length AND !in_array(strtolower($potential),$array_words_not_to_consider) AND !in_array($potential, $array_search_keywords)) $array_search_keywords[]=str_replace('&nbsp;','',$potential);// for unknown reasons, some keywords have an added blankspace at the end, so search will have a look at "keyword " instead of "keyword" what causes an empty result
		  if(
		  strlen(str_replace($search,$replace_count,$potential))>$keyword_minimum_length AND 
		  !in_array(str_replace($search,$replace_match,strtolower($potential)),$array_words_not_to_consider) AND 
		  !in_array($potential,$array_search_keywords)
		  ) //$array_search_keywords[]=str_replace(array('&nbsp;',' ','  '),array('NBSP','EINS','ZWEI'),$potential);// for unknown reasons, some keywords have an added blankspace at the end, so search will have a look at "keyword " instead of "keyword" what causes an empty result
		    {
		    $array_search_keywords[]=$potential;// for unknown reasons, some keywords have an added blankspace at the end, so search will have a look at "keyword " instead of "keyword" what causes an empty result
			}
		  }
		//print_r($array_search_keywords);
		$string_search_ids.='#fi_boxes_theme_idcat_'.$element.'_box_'.$i.'_content';
	    $i++;
	    }
    }
/* content of articles end */
  }
echo '</div>';

echo '<table>';
echo '<tr><td>';
echo '<br/><strong>'.mi18n("Ausgewählte Keywords und/oder Sätze").'</strong><br/>';
echo '<textarea name="CMS_VAR[10000]" style="width: 40em; height: 30em; font-family: arial;font-size: 1em;"/>CMS_VALUE[10000]</textarea>';
$string_value_10000="CMS_VALUE[10000]";
$array_value_10000=explode('#',$string_value_10000);
echo '<br/>'.count($array_value_10000);
echo '<input style="display: none;" type="text" name="CMS_VAR[11000]" value="'.$string_value_10000.'">'; //this  input-field is necessary. For unknown reason string build directly from textarea does not work in output, in ie there won't be a popup of suggested words while typing
echo '<br/><br/><span style="font-size: 0.9em;">
Die Vorschlagsliste ist per HTML5-Datalist umgesetzt. Die Darstellung der<br/>
Vorschlagsworte variiert allerdings durch unterschiedliche Interpretation<br/>
von Browser zu Browser. Beispieleingabe "p":<br/>
<ul>
<li>IE und Chrome: Angezeigt werden alle Vorschlagsworte, die mit "p" beginnen.<br/>
-> Programm: ja<br/>
-> Fernsehprogramm: nein</li>
<li>Firefox: Angezeigt werden alle Vorschlagsworte, die ein "p" beinhalten.<br/>
-> Programm: ja<br/>
-> Fernsehprogramm: ja</li>
</ul>
</span>';
echo '</td><td>';
echo '<br/><strong>'.mi18n("Aus Webartikeln extrahierte, mögliche Keywords für Suchvorschläge").'</strong><br/>';
sort($array_search_keywords);
echo '<div style="height: 30em; overflow: auto;">';
  foreach($array_search_keywords AS $keyword) echo $keyword.'#<br/>';
echo '</div>';
echo count($array_search_keywords);
echo '</td></tr></table>';

echo '<strong>'.mi18n("Suchvorschläge prüfen").'</strong> ';
$check_suggestions="CMS_VALUE[40000]";
echo '<input type="checkbox" name="CMS_VAR[40000]" value="true"';
if($check_suggestions=="true") echo ' checked';
echo '>';

if($check_suggestions=="true")	 
  {
  echo '<br/>';
  $string_suggestions_to_check="CMS_VALUE[11000]";
  ?>
  <script type="text/javascript">
  function search_backend(var_string_search_ids,var_string_suggestions_to_check)
  {
  var array_searchString_not_found=new Array();
  var array_suggestions_to_check=var_string_suggestions_to_check.split('#');
  var array_search_ids=new Array();
  array_search_ids=var_string_search_ids.split("#");
  array_search_ids.shift(); // removes the first, empty element of array which would lead to an error because of non existing id	
  document.write('<div style="height: 20em; border: 1px solid #999999; overflow: auto;"><table>');
  for (var i = 0, len = array_suggestions_to_check.length; i < len; i++)
  {
  var searchString=array_suggestions_to_check[i];
  var var_search_results_string="";
  var var_to_crawl="";
  var array_search_results=new Array();
  var_found="false";

  array_search_ids.forEach(
    function(entry)
      {
	  var var_search_result_linktext="";
      var rex = /(<([^>]+)>)/ig;
	  // innerhtml in kleinbuchstaben umwandeln, und tags entfernen searchstring in kleinbuchstaben umwandeln
	  var_to_crawl=document.getElementById(entry).innerHTML.toLowerCase();
	  var_to_crawl=var_to_crawl.replace(rex , "");
	  //document.write(var_to_crawl);
      // in pageContent nach dem Suchwort suchen , todo: anzahl ermitteln
	  var result = var_to_crawl.match(searchString.toLowerCase());
      if (result) var_found="true";
      }
	);
	if(var_found=="true") document.write('<tr><td>'+searchString+'</td><td>gefunden</td></tr>');
	  else
	    {
		document.write('<tr><td>'+searchString+'</td><td><strong>nicht gefunden</strong></tr>');
		array_searchString_not_found.push(searchString);
		}
  }
  document.write('</table></div>');
    document.write('<?php echo '<strong>'.mi18n("Bei der Überprüfung wurden nicht gefunden:").'</strong><br/>'; ?>');
  for (var i = 0, len = array_searchString_not_found.length; i < len; i++) document.write(array_searchString_not_found[i]+'<br/>');
  } 
  
  var var_string_suggestions_to_check='<?php echo $string_suggestions_to_check; ?>';
  search_backend('<?php echo $string_search_ids; ?>',var_string_suggestions_to_check);
  </script>
  <?php
  }
	 
echo '<br/><br/><input type="image" src="images/submit.gif">';
Modulausgabe

Code: Alles auswählen

<?php
$show_suggestions="CMS_VALUE[1000]";
if($show_suggestions=="") $show_suggestions="false";
$string_keywords="CMS_VALUE[11000]";
$suggestions=$arr = array_filter(explode('#',$string_keywords));

echo '<div class="box_search_container">';
echo '<div class="box_search">';
echo '<div class="box_search_left">';

echo '<input class="s_input_text" type="text" name="search" id="searchString"';
if($show_suggestions=="true") echo ' list="suggestions"';
echo ' onkeypress="return searchKeyPress(event);"';
echo '>';

echo '</div>';
echo '<div class="box_search_right" id="btnSearch" onclick="javascript: search(\''.$string_search_ids.'\',\''.$string_idcats.'\',\''.$current_url.'\');"></div>'; //important: $current_url is defined within module floating_information!
echo '</div>';
echo '<div id="box_search_result_header" class="box_search_result_header" style="display:none;"><br/>'.mi18n("Suchergebnisse").'</div>';
echo '<div id="box_search_result" style="display:none;"></div>';

if($show_suggestions=="true")
  {
  echo '<datalist id="suggestions">';
  foreach($suggestions AS $suggestion) echo '<option value="'.$suggestion.'" />';
  echo '</datalist>';
  }
echo '</div>';
?>
CSS

Code: Alles auswählen

div.box_search_container {
margin-bottom: 4em;
}
div.box_search {
margin-top: 1em;
width: 50%;
margin-left: auto;
margin-right: auto;
background-color: #e5e5e5;
overflow: hidden;
}
div.box_search_left {
background-color: #e5e5e5;
width: 85%;
float: left;
}
input.s_input_text {
background-color: #e5e5e5;
border: 1px solid #e5e5e5;
height: 2em;
width: 90%;
}
div.box_search_right {
float: left;
background-image: url('../upload/bullets/button-search.png');
background-repeat: no-repeat;
background-position: center center;
background-size: 1.5em 1.5em;
width: 15%;
height: 2em;
background-color: #e5e5e5;
cursor: pointer;
}
div.box_search_right:hover {
background-image: url('../upload/bullets/button-search-active.png');
}
div.box_search_result_header {
font-weight: 900;
margin-bottom: 1em;
}
span.search_result_link {
cursor: pointer;
font-size: 0.9em;
color: #000000;
margin-top: 0.3em;
display: block;
background-color: #e5e5e5;
}
span.search_result_link:hover {
color: #0049a5;
}
Javascript

Code: Alles auswählen

function open_location(var_id_location,var_string_idcats,var_current_url) // show clicked search result  and the faq-area in which it is located and also hide other faq-areas | example for var_id_location: fi_boxes_theme_idcat_2_box_0_content
  {
  var_id_location=var_id_location.replace('_content','');  //for searching the single themes within faq-areas the ids named ..._content where needed. to get the id of surrounding div of faq-area,  _content just has to be cut off in first step. -> fi_boxes_theme_idcat_2_box_0
  var result = var_id_location.split("_box_"); //first part of that split is now "fi_boxes_theme_idcat_2" which is the id of surrounding area.
  document.getElementById(result[0]).style.display="block"; //"fi_boxes_theme_idcat_2" now is being shown
  var result = var_id_location.split("_idcat_"); //fi_boxes_theme_idcat_2_box_0 is splitted into "fi_boxes_theme" and "2_box_0"
  var result2 = result[1].split("_"); // "2_box_0" is splitted into "2", "box", "0" -> first part is important, it represents the idcat of faq-area in which the clicked searchresult is located
  document.getElementById('fi_boxes_theme_item_'+result2[0]).style.color="#0049a5"; //in heading menu for faq-areas the icon, font or whatever... of area in which searchresult is located is highlighted/ set to active
  document.getElementById('fi_boxes_theme_item_'+result2[0]).style.fontWeight="900";
  array_idcats = var_string_idcats.split("#");  // all idcats of faq-areas are transferred to an array
  for (var i = 0, len = array_idcats.length; i < len; i++) //every idcat is rolled through and checked if highlighting in heading menu has to be set to passive
    {
    if(result2[0]!=array_idcats[i]) // if idcat is not the same as the idcat/faq-area in which searchresult is located, it can be set to passive
      {
	  document.getElementById('fi_boxes_theme_idcat_'+array_idcats[i]).style.display="none";
	  document.getElementById('fi_boxes_theme_item_'+array_idcats[i]).style.color="#000000";
	  document.getElementById('fi_boxes_theme_item_'+array_idcats[i]).style.fontWeight="normal";
	  }
    }
  fi_box_answer_show_hide(var_id_location,'search'); //using function of module "floating_information": sending origin,"search", so that there will not be a status-testing for display: none / block and status will always be set to "block"
  window.location=var_current_url+'#'+var_id_location;
}

function search(var_string_search_ids,var_string_idcats,var_current_url)  //looking for searchterm within ids named ..._content which are located within faq area
  {
  var array_search_ids=new Array();
  array_search_ids=var_string_search_ids.split("#");
  array_search_ids.shift(); // removes the first, empty element of array which would lead to an error because of non existing id
  var searchString = document.getElementById('searchString').value.toLowerCase(); // extract searchterm and transform to lowercase
  var var_search_results_string="";
  var var_to_crawl="";
  array_search_ids.forEach(
    function(entry) // entry represents the ids within array_search_ids. these _content-ids contain further divs with ids named _question and _answer
      {
	  var var_search_result_linktext="";
      var rex = /(<([^>]+)>)/ig;
	  var_to_crawl=document.getElementById(entry).innerHTML.toLowerCase(); // extracting content which has to be searched for searchterm (containing _question and _answer), transform this innerhtml to lowercase and remove tags
	  var_to_crawl=var_to_crawl.replace(rex , "");
	  var result = var_to_crawl.match(searchString); //search within whole _content-div
      if (result)
	    {
		var var_entry_for_linktext=entry;
		var_entry_for_linktext=var_entry_for_linktext.replace('_content','_question'); // linktext has to contain the question within _question-div. to extract content, the id to look for that has to end with _question. to get this, id contained in entry ist transformed from ..._content to ...-question.
		var_search_result_linktext=document.getElementById(var_entry_for_linktext).innerHTML;
		var_search_results_string+='<span class="search_result_link" onclick="javascript:open_location(\''+entry+'\',\''+var_string_idcats+'\',\''+var_current_url+'\');">'+var_search_result_linktext+'</span><br/>'; // entry for searchresults
		}
      }
	);
	document.getElementById('box_search_result').style.display="block";
	document.getElementById('box_search_result_header').style.display="block";
	if(var_search_results_string!="")
	  {
	  document.getElementById('box_search_result').innerHTML=var_search_results_string;
	  }
	  else
	    {
	    document.getElementById('box_search_result').innerHTML='Kein Suchtreffer.';
		}
	window.location=var_current_url+'#box_search_result_header';
  } 

function searchKeyPress(e)
  {
  // look for window.event in case event isn't passed in
  e = e || window.event;
  if (e.keyCode == 13)
    {
    document.getElementById('btnSearch').click();
    return false;
    }
  return true;
  }
Übersetzung

Code: Alles auswählen

Aus Webartikeln extrahierte, mögliche Keywords für Suchvorschläge=Aus Webartikeln extrahierte, mögliche Keywords für Suchvorschläge
Ausgewählte Keywords und/oder Sätze=Ausgewählte Keywords und/oder Sätze
Auszuschließende Worte=Auszuschließende Worte
Bei der Überprüfung wurden nicht gefunden:=Bei der Überprüfung wurden nicht gefunden:
Berücksichtigte Webartikel=Berücksichtigte Webartikel
Buchstaben=Buchstaben
Mindestlänge Suchvorschlag=Mindestlänge Suchvorschlag
Suchergebnisse=Suchergebnisse:
Suchvorschläge im Frontend aktivieren=Suchvorschläge im Frontend aktivieren
Suchvorschläge prüfen=Suchvorschläge prüfen
Zur Zeit ist ein doppeltes Abspeichern erforderlich, damit Änderungen wirksam werden.=Zur Zeit ist ein doppeltes Abspeichern erforderlich, damit Änderungen bei den Ausschlussworten in der Anzeige der möglichen Worte wirksam werden.
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.

Das Handbuch zur Version 4.10: CONTENIDO für Einsteiger (4.10)

Das Handbuch zur Version 4.9: CONTENIDO für Einsteiger (4.9)

Antworten