Textlänge mit drupalicious_summarise begrenzen
am 14.11.2007 - 09:51 Uhr in
Hallo,
ich benutze das Modul Contemplate (5.x-1.3) um den Teaser eines bestimmten Inhaltstypen zu themen.
Der Teaser soll nur aus den ersten 15 Worten des Feldes Beschreibun bestehen. Dieser Teaser wird dann in einem gmapview in der jeweiligen "Blase" angezeigt.
Ich habe mir dazu das Tutorial "Trim a text field to a certain word length" unter http://drupal.org/node/46391 angesehen. Dort wird die Funktion "drupalicious_summarise" beschrieben, mit der man die Textausgabe von bestimmten Feldern auf eine bestimmte wWortzahl begrenzen kann.
Die Datei template.php habe ich nach Lektüre der Tutorials
trotz der Anmerkung "This has been tested and works with Drupal 4.6.x and Drupal 4.7." um folgendes Codesnippet
erweitert:
function drupalicious_summarise($paragraph, $limit) {
// STEP 1: trim the text down to the nearest sentence determined by $limit
// NOTE: This step will only end text if the End Punctuation is met by a blank space, NOT a new or close paragraph tag ("<p>" or "</p>").
$textfield = strtok($paragraph, " ");
while($textfield) {
$text .= " " . $textfield;
$words++;
// Check if the limit has been met. ALSO check if the last character in the token word is an End Punctuation. If not, move on to the next word
if (($words >= $limit) && ((substr($textfield, -1) == "!")||(substr($textfield, -1) == ".")||(substr($textfield, -1) == ":")||(substr($textfield, -1) == "?"))) {
break;
} else {
$textfield = strtok(" ");
};
};
// STEP 2: Once text has been trimmed to the word limit (to the nearest sentence), check for any HTML closing tags (">")
$textfield = strtok($text, ">");
while($textfield) {
// Only re-add the closing tag if there is a tag to close (text might of been trimmed in first step where closing tag would of been excluded)
if ((substr($textfield, -1,1) == "!") || (substr($textfield, -1,1) == ".") || (substr($textfield, -1,1) == ":") || (substr($textfield, -1,1) == "?")) {
$revText .= $textfield;
} else {
$revText .= $textfield . ">";
};
$tags++;
// Count the number of words when each closing tag is met to ensure the word count isn't under the limit ($limit)
// Note: Using a different word count method in order not to break the current String position in the "strtok()" method
$wordCount = explode(" ", $revText);
$words = count($wordCount);
// If word count is over, check to see if the tag being closed in a paragraph. If so, return the trim text
if ($words >=$limit) {
if (($tags >= 2) && ((substr($textfield, -2,2) == "<p") || (substr($textfield, -3,3) == "</p") )) {
$wordCount = ""; // Dump the array to save memory
break;
} else {
$textfield = strtok(">");
};
} else {
$textfield = strtok(">");
};
};
return ltrim($revText);
}
Im Contemplatemodul benutze ich wie im Tutorial angegeben für den Teaser folgendes:
<?php print drupalicious_summarise($field_beschreibung[0]['value'],15);?>
Daraufhin funktioniert zwar die Begrenzung der Wortzahl auf 15 innerhalb des Teasers und damit auch innerhalb der gmapblase, aber leider erhalte sobald ich versuche irgendetwas zu speichern, löschen etc. nun ständig einen "whitescreen" und nach den Aktualisieren per Brwoser die folgende Fehlermeldung
Cannot modify header information - headers already sent by (output started at /mounted-storage/home61a/sub006/sc38600-KENG/www/themes/hvv/template.php:1) in /mounted-storage/home61a/sub006/sc38600-KENG/www/includes/common.inc in Zeile 311.
Natürlich habe ich die obenaufgeführten codesnippets wieder entfernt und siehe da alles läuft wieder ohne Probleme, doch ich benötige immer noch eine Lösung um die angezeigten Worte auf eine bestimmte Zahl zu begrenzen.
Gruß Jonas
P.S.
admin/content/node-settings und dort Länge der "gekürzten Beiträge" (Teaser) auf 200 Zeichen einstellen reicht leider nicht...
- Anmelden oder Registrieren um Kommentare zu schreiben
Klappt dann wohl doch nicht
am 14.11.2007 - 10:17 Uhr
Klappt dann wohl doch nicht mit 4.7 und 5.x
Wo genau verwendest Du
<?php
print drupalicious_summarise($field_beschreibung[0]['value'],15);
?>
Hast Du ein separates Template ala node_nodetype.tpl.php erstellt? Wenn nicht, warum?
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
Teste das mal:
am 14.11.2007 - 10:26 Uhr
Teste das mal: http://drupal.org/node/124621
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
im contemplatemodule
am 14.11.2007 - 10:46 Uhr
Das Snippet:
<?php
print drupalicious_summarise($field_beschreibung[0]['value'],15);
?>
benutze ich im contemplatemodule unter admin/content/templates
Dort kann man zu den jeweiligen inhaltstypen jeweils ein template für teaser, body und rss gestalten.
für die normale anzeige des inhaltstyps verwende ich ein Template ala node_nodetype.tpl.php
Aber der Teaser soll aus oben genannten gründen (anzeige in eine gmapblase) eben anders gethemet werden...
Gibt es eine andere Möglichkeit den Teaser zu themen?
ich test...
am 14.11.2007 - 10:50 Uhr
ich teste das mal, danke!
Testergebnis: Request for increased functionality: drupalicious_
am 14.11.2007 - 10:54 Uhr
Sobald ich
function drupalicious_summarise($paragraph, $limit)
{
$extra = " [..continued..]";
$textfield = strtok($paragraph, " ");
while($textfield)
{
$text .= " $textfield";
$words++;
if(($words >= $limit) && ((substr($textfield, -1) == "!")||(substr($textfield, -1) == ".")))
break;
$textfield = strtok(" ");
}
if (str_word_count($text) >= $limit) $text = $text . $extra;
return ltrim($text);
}
in meiner template.php ergänzt habe, kommt wieder der allseits beliebte whitescreen und die Fehlermeldung:
warning: Cannot modify header information - headers already sent by (output started at /mounted-storage/home61a/sub006/sc38600-KENG/www/themes/hvv/template.php:1) in /mounted-storage/home61a/sub006/sc38600-KENG/www/includes/common.inc on line 311.
Doppeltes Templating?
am 14.11.2007 - 11:05 Uhr
benutze ich im contemplatemodule unter admin/content/templates
Dort kann man zu den jeweiligen inhaltstypen jeweils ein template für teaser, body und rss gestalten.
für die normale anzeige des inhaltstyps verwende ich ein Template ala node_nodetype.tpl.php
Wenn ich das jetzt richtig verstehe "templatest" Du 2 Mal an unterschiedlicher Stelle fuer ein und die selbe Ausgabe?
Einmal mit Contemplate und Andermal mit einer zum Nodetype gehoerenden Template-Datei?
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
template für teaser
am 14.11.2007 - 11:15 Uhr
ich benutze contempale nur und den teaser zu themen, die normale ausgabe überlasse ich der node_nodetype.tpl.php.
Kann man denn inder node_nodetype.tpl.php den Teaser auch themen?
teaser themen mit if ($page == 0):
am 14.11.2007 - 11:20 Uhr
habe gerade unter http://drupal.org/node/93311 gelesen, dass mit in der datei node_nodetype.tpl.php auch den teaser themen kann...
if ($page == 0): //this article node is being displayed as a teaser
...
if ($page == 1): //this article node is being displayed as full node
...
Vermutlich entsteht der
am 14.11.2007 - 11:31 Uhr
Vermutlich entsteht der Fehler weil Du parallel mit Contemplate und einer Template-Datei themest.
Ja, man kann in der "node_nodetype.tpl.php" den Teaser separat themen.
Da Du einen mit CCK generierten Nodetype ausgibst hier noch ein ergaenzender Tip: http://www.drupalcenter.de/node/6447
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
ich verusuch es jetzt mal ohne contemplate
am 14.11.2007 - 11:37 Uhr
aber gibt es außer drupalicious_summarise noch eine andere möglichkeit, die länge der textausgabe zu definieren?
Ich denke, die Funktion
am 14.11.2007 - 12:08 Uhr
Ich denke, die Funktion drupalicious_summarise() ist NICHT das Problem.
Bitte teste mal so in dem Du nur EINE Variante zu themen verwendest. Entweder mit Contemplate oder mit "node_nodetype.tpl.php". Aber NICHT beide Varianten gleichzeitig. Benenne Deine "node_nodetype.tpl.php" mal eben in "node_nodetype_xx.tpl.php" um.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
ich habe beide varianten ausprobiert...
am 14.11.2007 - 12:36 Uhr
1. nur mit Contemplate
2. nur mit node_nodetype.tpl.php
also beides funktioniert. Ich kann mit beiden Methoden Teaser und Body themen.
NUR: sobald ich die funktion drupalicious_summarise()in meine template.php einbinde taucht der schon oben erwähnte whitescreen auf...
Mhm, ich werde die Funktion
am 14.11.2007 - 16:42 Uhr
Mhm, ich werde die Funktion nachher mal selber testen. Arbeite auch gerade mit einem Template. Da passt das. Melde mich.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
danke,
am 21.11.2007 - 08:29 Uhr
würde mich freuen...