Suchergbnis-Links customizen
Die folgenden Optimierungen (Modifikationen) dienen nur dazu innerhalb einer Seite positionieren zu können.
Werden keine Anpassungen vorgenommen, können einzelne Positionen dennoch direkt angesprochen werden. Andere Objekte werden aber nicht direkt gefunden, sondern nur auf die entsprechende Seite positioniert. D.h. ohne Anpassungen bleibt man beim bisherigen Stil: Man kommt auf die Seite, aber nicht exakt an die Fundstelle
Navigation.ccml
In Sidebars positionieren
In den Sidebars müssen die auszugebenden Absätze in navigation.ccml numeriert werden und ein Tag
<a name="titlesb#0"></a> geschrieben werden, wobei "#" für die Nummer der Absatzes gilt.
Das kann w2d mit folgendem Befehl erledigen (in Sidebar-Absatzschleife in navigation.ccml):
<a name="titlesb<cc:print value="&mysidebar.number">0"></a> neuer Code einfügen vor
<cc:if cond="&mysidebar.caption"> vorhandenen Code
Seitentitel eindeutig machen
Google will pro Site einen eindeutigen Titel. Der gleiche Titel für mehrere Content-Seiten wird als „Fehler“ in webmastertools reklamiert.
Damit alle Suchseiten einen eineindeutigen Namen bekommen, benötigen wir wiederum einen PHP-Code in der navitation .ccml.
<title><cc:print value="&page.content.filename"></title> alter Code zu ersetzen
Der oben angeführte Code (relativ am Anfang von Navigation.ccml) ist durch folgenden rote Code-Passage zu ersetzen. Der schwarze Text (hier e-Consultance) ist ein statischer Text der immer dazu gelinkt wird. Einmal der Text für die Startseite (anstelle des Titels) und einmal ein Einleitungstext vor dem Seitentitel, der mit page.content.caption ausgegeben wird.
<?php
if (!function_exists("ob_get_clean")) {
function ob_get_clean() {
$ob_contents = ob_get_contents();
ob_end_clean();
return $ob_contents;
}
}
$suchwort="";
$scriptname = preg_replace("/^.*\//","",$_SERVER['REQUEST_URI']);
$xs= strpos($scriptname,"kalender");
$kalender="";
if ($xs>0){
$kalender=" Month=".substr($scriptname,$xs+9,5);
}
$xs= strpos($scriptname,"feiertage=");
if ($xs>0){
if (substr($scriptname,$xs+10,1)==1)
{$kalender=$kalender." mit Feiertagen"; }
else
{$kalender=$kalender." ohne Feiertage"; }
}
$xs= strpos($scriptname,"mode=");
if ($xs>0){
$kalender=$kalender." Modus: beide Suchworte";
}
if(substr($scriptname,0,7)=="fts.php") {
$xs=strpos(" ".$scriptname,"criteria=")+strlen("criteria=");
$x=strpos(" ".substr($scriptname,$xs-1,99),"&");
if ($x>0){
$suchwort="'".substr($scriptname,$xs-1,$x-1)."'";}
if (strpos(" ".$scriptname,"nurabsatz=")>0)
{
$xs=strpos(" ".$scriptname,"nurabsatz=")+strlen("nurabsatz=");
$x=strpos(" ".substr($scriptname,$xs-1,99),"&");
if ($x>1){
$suchwort=$suchwort." im Absatz Nr. '".substr($scriptname,$xs-1,$x-1)."'";}
}
else
{ if (strpos(" ".$scriptname,"nurseite=")>0)
{
$xs=strpos(" ".$scriptname,"nurseite=")+strlen("nurseite=");
$x=strpos(" ".substr($scriptname,$xs-1,99),"&");
if ($x>1){
$suchwort=$suchwort." auf Seite '".substr($scriptname,$xs-1,$x-1)."'";}
}}
if (strpos(" ".$scriptname,"Bereich=")>0)
{
$xs=strpos(" ".$scriptname,"Bereich=")+strlen("Bereich=");
$x=strpos(" ".substr($scriptname,$xs-1,99),"&");
if ($x>1){
$suchwort=$suchwort." in Bereich '".substr($scriptname,$xs-1,$x-1)."'";}
}
if (strpos(" ".$scriptname,"prodid=")>0)
{
$xs=strpos(" ".$scriptname,"prodid=")+strlen("prodid=");
$x=strpos(" ".substr($scriptname,$xs-1,99),"&");
if ($x==0){$x=strlen($scriptname);}
$suchwort=$suchwort." mit Prod.Nummer '".substr($scriptname,$xs-1,$x-1)."'";
}
$suchwort =ereg_replace("%C4","Ä",$suchwort);
$suchwort =ereg_replace("%D6","Ö",$suchwort);
$suchwort =ereg_replace("%DC","Ü",$suchwort);
$suchwort =ereg_replace("%DF","ß",$suchwort);
$suchwort =ereg_replace("%E4","ä",$suchwort);
$suchwort =ereg_replace("%F6","ö",$suchwort);
$suchwort =ereg_replace("%FC","ü",$suchwort);
if (strpos($suchwort,"x=")>0)
{ $x=strpos($suchwort,"x=");
$suchwort=substr($suchwort,0,$x-1);
}
$suchwort = str_replace('%7C','+',$suchwort);
$suchwort = "Suche nach ".str_replace('&',' ',$suchwort)."";
$xs= strpos($scriptname,"offset=");
if ($xs>0){
$suchwort=$suchwort." Ergebnisposition: ".substr($scriptname,$xs+7,strpos(substr($scriptname,$xs+7,6)."&","&"));
}
echo "\n<title>".$suchwort.$kalender."</title>\n";}
else {$suchwort="";
ob_start();?>
<cc:if cond="&page.ishome">
e-Consultance, IT- und Unternehmensberatung für Banken und Finanzdiensleister
<cc:else>
e-Consultance: <cc:print value="&page.content.caption"></cc:if>
<?php
$title=ob_get_clean();
$title=$title." ".$kalender;
$scriptname = preg_replace("/^.*\//","",$_SERVER['REQUEST_URI']);
if ($title=="#unsichtbar"){$title="Seite umgezogen: ".$scriptname;}
if ($title==""){$title="fts.php";}
echo "\n<title>".$title."</title>\n";}
?>
Damit wird jeder Seite ein eindeutiger Name zugeordnet und Titel-Duplikate werden vermieden. Ein offenes Thema bleibt noch, wenn über die Auswahl ein Offset gewählt wird… aber das folgt dann in einer der nächsten Versionen.
Page.ccml
In der page.ccml sollte der <a name-Tag aus der Bedingung befreit werden, dass ein Seitentitel existiert.
ALT:
<cc:if cond="¶.caption"> vorhandener Code
<a name="title<cc:print value="¶.uid">"></a>
<h2><cc:print value="¶.caption"></h2>
</cc:if>
Neu:
<a name="title<cc:print value="¶.uid">"></a> verschobener Code
<cc:if cond="¶.caption"> alter Code
<h2><cc:print value="¶.caption"></h2>
</cc:if>
Damit gibt jetzt jeder Absatz seine UID aus.
Tipp
Sollten Sie Fehlermeldungen bekommen, dann bezieht sich das Tool auch auf diese UID-Nummern, die die Organisation der Daten beschreibt. Mit dem CCML-Befehl <a name="title<cc:print value="¶.uid">"></a> kann man Ankerpunkte setzen, die man sich z.B. mit web-developer anzeigen lassen kann. Damit kann man auf einer im Browser angezeigten Seite und eingeschalteter web-developer-Funktion für Ankerpunkte die einzelnen Objekte mit Ihren UID (unique identifier) sehen und schnell finden. Ohne diesen Befehl geht die Information über die UID-Nummer im HTML Code verloren und man kann weder auf der angezeigten Seite, noch im webtodate oder shoptodate selber diese Nummer sehen. Nur wenn ein Absatz definiert wird, dann wird als Pfad diese Nummer verwendet, solange bis der Pfad mittels des Buttons Auto überschrieben wird.
Teaser.ccml
Diese haben keine eigene UID. Daher nimmt man die UID des Absatzes und nummeriert die Teaser selber durch:
D.h. wir schaffen uns einen eigenen Zähler "pageteasercount" in "page.ccml":
#C<cc:loop type="paragraph" obj="para"> vorhandener Code
<cc:set obj="pageteasercount" value="1"> neuer, eingefügter Code
Damit wird vor Ausgabe eines Absatzes (ggf. eines Teasers) die Variable pageteasercount auf 1 gesetzt
Dann muss in den Teasern natürlich noch die Ausgabe eines Namen erfolgen: D.h. in allen Teasern im Content, d.h. in teaser_caption.ccml, in teaser_captionabstract.ccml und teaser_captionabstractpicture.ccml folgender neuer (roter Code):
<cc:loop type="teaserelement" obj="myteaserelement"> vorhandener Code
<a name="title<cc:print value="¶.uid">t<cc:print value="&pageteasercount">"></a> neuer Code
<cc:set obj="pageteasercount" value="&pageteasercount+1">
Damit wird die UID das Absatzes um die Zählung des Teasers ergänzt, und dass wird vom Searchindextool synchron referenziert und als Adresse genutzt. Nach der Ausgabe muss man um ein hochzählen.
FAQ-Plugin
Seiten mit einem FAQ-Plugin haben das Problem, dass die FAQ mit Ihrem Text nicht geöffnet ist, wenn aus der Suchseite referenziert wird. Daher muss nach dem FAQ-Plugin ein folgender HTML-Absatz mit diesem Code nachgeschoben werden. Damit wird nach Ausgabe der FAQ noch der relevante FAQ-Punkt geöffnet:
<?php
function getfaqnr($myKey) {global $HTTP_GET_VARS;
if (isset($HTTP_GET_VARS[$myKey])) { return ($HTTP_GET_VARS[$myKey]); } else {return ("");}}
$faqnr=getfaqnr("faqnr");
if ($faqnr!="") {echo "<script type='text/javascript'>document.getElementById(\"faq".$faqnr."\").style.display = 'block';";
echo "window.scrollBy(0,document.getElementById(\"faqplugin\").offsetTop+".(23*($faqnr-2)).");</script>";}
?>
Damit nun auch noch richtig positioniert wird, benötigt diese Routine einen Referenzposition. Diese schaffen wir uns selber indem wir nun auch noch vor dem Plugin einen HTML-Ansatz einfügen:
<span id="faqplugin"></span>
Durch diese Referenzposition ist es nicht möglich mehrere FAQ-Plugins in einer Seite zu haben und dann noch das richtige FAQ zu öffnen. Ich weiß gar nicht, ob man mehrere FAQ auf einer Seite haben kann, da ich noch mit web2date V4.0 arbeite.
P.S: Das ist auch der Grund, warum ich nicht das Plugin einfach modifiziere, da ich es nicht habe. Also muss ich um das FAQ mit zwei HTML-Absätzen arbeiten.
Termine-Plugin
Seiten mit einem Termin werden durchsucht. Zur Positionierung müssen noch Anker vergeben werden, damit die Positionierung sofort funktioniert.
Datei „web2date\plugins\W2DPluginWhatsUpScript.inc“ mit einem Editor öffnen und Zeile 23 (rot) ergänzen.
for ($i=1;$i<=<cc:param name="count">;$i++) { // alter Code
if (time()>$t[$i]["date"]-$pre && time()<$t[$i]["date"]+$post) {
if ($sidebarmode) {
echo ("<p>");
} else {
echo ("<tr>\n");
echo ("<td class=s2d valign=top >\n");
}
#R echo ("<a name='titleterminnr".$i."'></a>"); // eingefügter Code: Ergänzung zur Positionierung
Such-Maske vereinfachen
Ist die Ausgabe aller Eingabefelder einer Suchmaske (immer als Standard-Anzeige) zu komplex kann man die Anzeige „Vereinfachen“.
Nach Installation des Tools kann die modifizierte Suchmaske in der Navigation.ccml weiter verbessert werden:
#C<div id="topic">
<form class="search" action="<cc:print value="&site.ftsfile">" ></ method="get">
<input class="searchx" type="text" name="criteria" value="Text suchen" maxlength="80"
onfocus="if(this.form.prodid.value=='Artikel-Nr. finden')this.form.prodid.value='';
if(this.form.criteria.value=='Text suchen')this.form.criteria.value='';
if(this.form.preis.value=='Preis ?')this.form.preis.value='';"
onblur="if(this.form.prodid.value==''&&this.form.criteria.value==''&&this.form.preis.value=='')
{this.form.criteria.value='Text suchen';
this.form.preis.value='Preis ?';
this.form.prodid.value='Artikel-Nr. finden';
}" /><br />
#R<?php
function NgetVarsPlain($myKey) {
// Gibt die HTTP-Post-Variablen zurück
global $HTTP_GET_VARS;
if (isset($HTTP_GET_VARS[$myKey])) {
return ($HTTP_GET_VARS[$myKey]);
}
else {
return ("");
}
}
$showtipp=NgetVarsPlain("showtipp");
$scriptname = $_SERVER['REQUEST_URI'];
// echo "Showtipp".$showtipp.".<br>";
if ($showtipp==""){$showtipp="none";$showtipp2="inline";}else {$showtipp="inline";$showtipp2="none";}
// echo "Showtipp".$showtipp.".<br>";
echo "<div id=\"tipp\" style=\"display:".$showtipp."\">";
?>
….
Grau ist der durch das Tool eingefügte Code (ggf. durch Fehlerbehebungen leicht korrigiert) und rot ist der einzufügender Text. Dieser Text gibt nun einen <div>-Containter aus, mit der Eigenschaft display:none oder display:inline. Die weiteren Sucheingabefelder werden damit (je nachdem ) ein oder ausgeblendet.
Nach den weiteren Sucheingabefeldern ist mit dem Befehl </div> dieser Container zu schließen und mit weiteren PHP-Befehlen wird eine Linkzeile ausgegeben, die die aktuelle Seite erneut aufruft und dabei zwischen „einfacher“ und „ausführlicher“ Eingabemaske umschaltet.
</div>
<input type="image" src="<cc:printpictureurl obj="pic.search">" title="Suche starten" />
<?php
if (strpos($scriptname,"?")>0)
{ $scriptxname=substr($scriptname,0,
strpos($scriptname,"?"))."?showtipp=yes&".substr($scriptname,strpos($scriptname,"?")+1,999);
}else
{$scriptxname=$scriptname."?showtipp=yes";}
echo "<a href=\"".$scriptxname."\" class=\"erweitert\"
style=\"display:".$showtipp2.";\">Click für erweiterte Suche</a>";
$scriptname=substr($scriptname,0,strpos($scriptname,"?"));
echo "<a href=\"".$scriptname."\" class=\"erweitert\"
style=\"display:".$showtipp.";\">Click für einfache Suche</a>";
?>
Zu sehen ist diese Funktion bei http://www.salzlampe.de/index.php