Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.

#1 14. Januar 2014 19:49

faglork
arbeitet mit CMS/ms
Ort: Fränkische Schweiz
Registriert: 15. Dezember 2010
Beiträge: 1.152
Webseite

canonical url

Moin!

Wie und wo wird in CMSMS $canonical gesetzt?

Ich habe folgendes Problem:

In den Globalen Metadaten steht

[== smarty ==]
<link rel=”canonical” href=”{if isset($canonical)}{$canonical}{else}{$content_obj->GetURL()}{/if}” />

Ich verwende FEU/CGUserDirectory. Ich habe eine Seite auf der alle user via {CGUserDirectory} gelistet werden:
/vereine.html

--> canonical url ist www.domain.de/vereine.html

Rufe ich in der Liste eine Detailansicht auf, so lautet die URL zb.
/users/35/73/vereinsname.html

Als canonical url ist aber weiterhin www.domain.de/vereine.html angegeben ...

Wie wird das denn in CMSMS korrekt gehandhabt? Ich hab schon ewig rumgesucht, aber nix gefunden: da wird immer nur einfach die oben angegebene Codezeile erwähnt.

Servus,
Alex

Offline

#2 14. Januar 2014 19:53

czarnowski
kennt CMS/ms
Registriert: 18. Oktober 2012
Beiträge: 457

Offline

#3 14. Januar 2014 19:55

faglork
arbeitet mit CMS/ms
Ort: Fränkische Schweiz
Registriert: 15. Dezember 2010
Beiträge: 1.152
Webseite

Re: canonical url

... und das hat mit meinem Problem genau was zu tun?

Ich weiss was eine canonical url ist, die Frage war wie das in CMSMS korrekt gehandhabt werden kann - siehe obiges Beispiel.

Servus,
Alex

Offline

#4 15. Januar 2014 10:44

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.435

Re: canonical url

Die canonical Variable muss vom Modul selbst gesetzt werden.
Wenn das Modul das nicht tut ... schlecht.
Es gäbe aber die Möglichkeit, die Variable in einem Template des Moduls zu setzen.
Bei News-Artikeln z.B. wäre das einfach {$entry->canonical} (siehe original Details Template des News-Moduls).

CGUserDirectory scheint derartiges aber noch nicht implementiert zu haben. Was Du im Prinzip brauchst, ist Zugriff auf die Funktion zum Generieren des Detail-Links. Das könntest Du über die Modul-Instanz machen (Im DetailTemplate müsste eine Variable namens {$CGUserDirectory} oder {$mod} sein).
Hab das noch nicht getestet, aber im Prinzip müsste diese Zeile im Detailtemplate ausreichen:

{$canonical=$CGUserDirectory->CreateURL($actionid,'detail',$returnid,$actionparams)}

Problem: als canonical URL werden so keine pretty-URLs des Moduls ausgegeben.

Oder Du baust Dir einfach ein Plugin (der Code basiert auf den Teil der action.default.php aus dem CGUserDirectory Modul, der für die Detail-Links zuständig ist):

<?php
function smarty_function_set_canonical_cgud_details($params, &$template)
{
	if(!$CGud =& cms_utils::get_module('CGUserDirectory'))
		return;
	
	$detailpage = cms_utils::get_current_pageid();
	$prettyurl = 'users/' . $params['uid'] . '/' . cms_utils::get_current_pageid();
	if( isset($params['params']['detailtemplate']) )
		$prettyurl .= '/' . munge_string_to_url(trim($params['params']['detailtemplate']));
	
	$prettyurl .= '/' . munge_string_to_url($params['username']);
	cmsms()->GetSmarty()->assign('canonical', $CGud->CreateURL($id, 'detail', $detailpage, $params, false, $prettyurl));
}
?>

Und im Details-Template dann einfach nur so aufrufen:

{set_canonical_cgud_details username="$oneuser.username" params="$actionparams"}

Wie gesagt, ungetestet.


Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline

#5 15. Januar 2014 14:33

faglork
arbeitet mit CMS/ms
Ort: Fränkische Schweiz
Registriert: 15. Dezember 2010
Beiträge: 1.152
Webseite

Re: canonical url

NaN schrieb:

Die canonical Variable muss vom Modul selbst gesetzt werden.

Danke, danke, danke! Eine einfach, klar verständliche Aussage! Wieso wird das eigentlich nirgendwo erwähnt mad

Was genau macht denn $content_obj->GetURL() ?

Da ja CGUserDirectory die $canonical von sich aus nicht setzt, kommt ja (im oben angegebenem Code) dieser Mechanismus zum Zuge. Der aber ergibt als Ergebnis die Seite, auf der die Liste ausgegeben wird
/vereinsliste.html
und nicht die Seite
/users/xx/yy/einverein.html

WTF?

NaN schrieb:

Es gäbe aber die Möglichkeit, die Variable in einem Template des Moduls zu setzen.
Bei News-Artikeln z.B. wäre das einfach {$entry->canonical} (siehe original Details Template des News-Moduls).

CGUserDirectory scheint derartiges aber noch nicht implementiert zu haben. Was Du im Prinzip brauchst, ist Zugriff auf die Funktion zum Generieren des Detail-Links.

Blöd nur das das im detail teplate ist ... denn jetzt haben wir ein echtes Problem:

Je nach Situation (Übersichtsliste, Suchergebnis etc) erzeugen viele Module ja unterschiedliche URL.

/user/zz/yyy/vvv.html
/user/kk/yyy/vvv.html
etc.

Das IST ja grad das Problem. Wenn ich im detail template die $canonical generiere dann erhalte ich mehrere canonicals für ein und dieselbe Seite.

Cheers,
Alex

Offline

#6 15. Januar 2014 15:06

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.435

Re: canonical url

Was genau macht denn $content_obj->GetURL() ?

Naja, wie der Name sagt, es gibt die URL des Inhaltsobjektes aus.
Mit "Inhaltsobjekt" ist aber nicht der Modulinhalt gemeint sondern eine Seite vom Typ Inhalt auf der das Ergebnis der Modulaktion angezeigt wird.
Module haben keine eigenen Seiten in dem Sinne, sondern werden immer nur im Kontext mit einer Inhaltsseite ausgegeben.
Dabei wird der Inhalt des {content} Tags mit dem der Modulaktion ersetzt.
(Deshalb ist der {content} Tag ja auch Pflicht im Seiten-Template)
Das geht auch nicht so einfach anders zu machen, weil das CMS sonst nicht weiß, wo es die Modulaktion auf der Seite ausgeben soll.
Also muss es wissen, welche Inhaltsseite -> daraus folgt welches Seitentemplate -> und daraus folgt dann die Position an der die Modulaktion ausgegeben wird.

$content_obj->GetURL() gibt Dir also die URL zu einer Inhaltsseite aus. Unabhängig von der Modul-Aktion.

Das Problem A) ist, man kann jede x-beliebige Modulaktion auf ein und der selben Seite ausgeben lassen, indem man nur Teile des Parameters "mact" ändert, aber dabei die returnid beibehält. Wenn also keine canonical URL vom Modul bereitgestellt wird, gibt es immer die URL zu einer Seite auf der das Modul ursprünglich angezeigt wurde. Und das bedeutet tatsächlich, dass man für unterschiedliche Modulaktionen ein und dieselbe canonical URL erhält, die wiederum identisch mit einer Inhaltsseite ist.

Das Problem B) bei meinem obigen Beispiel ist genau umgekehrt, dass man sich ein und dasselbe Ergebnis ein und desselben Moduls auch auf jeder x-beliebigen Seite ausgeben lassen kann, indem man nur die "returnid" ändert. Da ich aber auf die returnid zugreife bzw. auf die aktuelle Seiten-ID, ändert sich die canonical URL ständig mit. Es gibt also für ein und dieselbe Aktion so viele canonical URLs, wie es Inhaltsseiten gibt.

Anstelle der returnid, die man im Link übergeben bekommt, kann man aber auch im PHP- oder bzw. Smarty-Code immer eine ganz bestimmte ("statische") ID angeben. Hier noch mal ein Beispiel:

<?php
function smarty_function_set_canonical_cgud_details($params, &$template)
{
	if(!$CGud =& cms_utils::get_module('CGUserDirectory'))
		return;
	
	$returnid = isset($params['returnid']) ? $params['returnid'] : cms_utils::get_current_pageid(); // <- SEITEN ID
	$prettyurl = 'users/' . $params['uid'] . '/' . $returnid;
	if( isset($params['params']['detailtemplate']) )
		$prettyurl .= '/' . munge_string_to_url(trim($params['params']['detailtemplate']));
	
	$prettyurl .= '/' . munge_string_to_url($params['username']);
	
	cmsms()->GetSmarty()->assign('canonical', $CGud->CreateURL($id, 'detail', $returnid, array('uid' => $params['uid']), false, $prettyurl));
}
?>

Aufruf im Detailtemplate:

{set_canonical_cgud_details username=$oneuser.username uid=$actionparams.uid returnid="HIER DIE ID EINER BESTIMMTEN SEITE EINTRAGEN"}

Dann sollte es egal sein, auf welcher Seite man sich laut URL die Details anschaut. Die canonical URL sollte sich dann nicht mehr mit ändern. Somit hätte man zumindest für das Modul CGUserDirectory das Problem A) für die Detailaktion und das Problem B) gelöst.

Neuer Nachteil: man bräuchte für jedes Modul, welches keine canonical URLs bietet, ein eigenes Plugin je Modulaktion, um die canonical URL für diese Aktion zu generieren.

Edit: Hatte jetzt Zeit zum Ausprobieren. Hab den Code nochmal geändert. So funktionierts.

Beitrag geändert von NaN (15. Januar 2014 20:51)


Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline