Page 1 of 2
eigene Replacement Tags
Posted: Sat 23. Sep 2006, 16:05
by iriechaos
Hi all,
Kann mir jmd sagen wo ich eigene Replacement Tags anlegen kann?
Ich möchte das bestimmte Wörter im Artikeltext automatisch mit Links Hinterlegt werden. zb. Ich schreibe Google und phpwcms gibt den link zu google aus.
Hatt jmd schon ne gute lösung?
greetz
Posted: Sat 23. Sep 2006, 16:12
by ff123
If you want to make your own replacement tag, you have to program a .php script and put it in:
phpwcms_template/inc_script/frontend_render
Reptags are always called with {...}, for example {autolink}.
An example for a reptag is breadcrump:
Code: Select all
<?php
/**
BREADCRUMB_LEVELS
Version: 1.0
Replacementtag for BREADCRUMB_LEVELS
This Replacementtag allows you to show an breadcrumb with setting the start-level
and the end-level of the category-structure. So it is possible to show only on
level or the sub's beginning with the choosen level. Level is the real level of
the structure not the category-ID.
Home will not be shown!
The Start-level has to be lower than or equal to the End-Level otherwise the
Startlevel will be the first level (main below home)
If there is no such level in the end-level so, the next possible level will be
shown. If there is no level found, so you can decide if the whole breadcrumb
will be shown otherwise it can be hided.
- for use of this you must set in ../config/phpwcms/conf.inc.php:
$phpwcms["allow_ext_init"] = 1;
$phpwcms["allow_ext_render"] = 1;
- copy the provided .php-file into
phpwcms_template/inc_script/frontend_render/
{BREADCRUMB_LEVELS:0:0:0:} = {BREADCRUMB_LEVELS} without home
All levels till the active will be shown
{BREADCRUMB_LEVELS:1:1:0:|}
Only the first level (main below home) will be shown
· :1 start level for display
· :1 end level for display
· :0 hide breadcrumb if there is no level to show
· :| the delimiter between breadcrumb-levels
{BREADCRUMB_LEVELS:2:4:0:|}
All levels between level 2 and level 4 will be shown
ad1) All levels beginning with this level to the 4th level will be shown
ad2) This is the end level for show, if you use 0 then all levels beginning
with the start level will be shown
ad3) if you choose 0, then all levels will be shown, if you use 1 then the
breadcrumb will not be on display
ad4) the delimiter between the breadcrumb-levels can be set if there is nothing
the delimiter will be '>'
*************************************************************************************
Copyright notice
Parts FROM
(c) 2002-2005 Oliver Georgi (oliver@phpwcms.de) // All rights reserved.
(c) 2005 Jochen Regenfelder // All rights reserved.
This script is for PHPWCMS.
The PHPWCMS web content management system is free software; you can redistribute
it and/or modify it under the terms of the GNU General Public License as published
by the Free Software Foundation; either version 2 of the License, or (at your option)
any later version.
The GNU General Public License can be found at http://www.gnu.org/copyleft/gpl.html
A copy is found in the textfile GPL.txt and important notices to the license
from the author is found in LICENSE.txt distributed with these scripts.
This script is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU General Public License for more details.
This copyright notice MUST APPEAR in all copies of the script!
*************************************************************************************
**/
// -------------------------------------------------------------
// #####--- modified by jochen---
function breadcrumb_levels ($end_id, $struct_array, $start_id, $hide_menu, $spacer="", $link_to="index.php") {
//builds the breadcrumb menu based on given values
//$link_to = the page on which the breadcrum part links
//$root_name = name of the breadcrumb part if empty/false/0 $start_id
//$spacer = how should breadcrumb parts be divided
if ($spacer==false) $spacer=">";
$spacer=" ".$spacer." ";
$nohide=true;
$act_id = $GLOBALS ['content']["cat_id"]; //store actual ID for later comparing
//if Home-level is disabled, then set the level to level 1
//This is necassery if the given level is not included at the act leveltree
//Proof if end_level is greater then start_level, because this are levels
if (($end_id>$start_id) && ($start_id >0)) {
$end_id=1;
}
// setting the start_level (this is the level of the last menu, but gives the
// ACAT_ID of the first menu)
if ($start_id==0) {
$start_id = intval($act_id);
} else {
$array_order = array_flip($GLOBALS['LEVEL_ID']);
$level_key = array_search($start_id ,$array_order);
if ($level_key==false){
//if start_id can not be found, so take the last found level for dispay
// if it is greater then act_id, else use act_id
$jr_max = count($array_order)-1;
if ($jr_max >= $end_id){
$start_id=$GLOBALS['LEVEL_ID'][$jr_max];
} else {
// IF no level is found and hide is selected
if ($hide_menu==1){
$nohide=false;
}
$start_id = $act_id;
}
} else {
$start_id = intval($level_key);
}
}
// setting the end_level (this is the level of the first menu, but gives the
// ACAT_ID of the last menu)
if ($end_id==0) {
$array_order = array_flip($GLOBALS['LEVEL_ID']);
$end_id = array_search("1" ,$array_order);
} else {
$array_order = array_flip($GLOBALS['LEVEL_ID']);
$level_key = array_search($end_id ,$array_order);
if ($level_key==false){
//if no level is found hide breadcrumb
if ($hide_menu==1){
$nohide=false;
}
$end_id = array_search("1" ,$array_order);
} else {
$end_id = intval($level_key);
}
}
// #####--- END --- modified by jochen---
if ($nohide){
while ($start_id) { //get the breadcrumb path starting with given start_id
$data[$start_id] = $struct_array[$start_id]["acat_name"];
// #####--- modified by jochen---
// this is moved so that home is not displayed
if($end_id && $start_id == $end_id) break;
// #####--- END --- modified by jochen---
$start_id = $struct_array[$start_id]["acat_struct"];
}
$data[$start_id] = $struct_array[$start_id]["acat_name"];
$crumbs_part = array_reverse($data, 1);
if(is_array($crumbs_part) && count($crumbs_part)) {
$breadcrumb = "";
foreach($crumbs_part as $key => $value) {
$alias = '';
if ($act_id != $key) {
if($breadcrumb) $breadcrumb .= $spacer;
if(!$struct_array[$key]["acat_redirect"]) {
$breadcrumb .= '<a href="index.php?';
$alias = $struct_array[$key]["acat_alias"];
$breadcrumb .= ($alias) ? html_specialchars($alias) : 'id='.$key.',0,0,1,0,0';
$breadcrumb .= '">';
} else {
$redirect = get_redirect_link($struct_array[$key]["acat_redirect"], ' ', '');
$breadcrumb .= '<a href="'.$redirect['link'].'"'.$redirect['target'].'>';
}
$breadcrumb .= html_specialchars($crumbs_part[$key]).'</a>';
} else {
if($breadcrumb) $breadcrumb .= $spacer;
$breadcrumb .= html_specialchars($crumbs_part[$key]);
}
}
} else {
$breadcrumb = "";
}
return $breadcrumb;
}
}
// -------------------------------------------------------------
// -------------------------------------------------------------
//breadcrumb replacementtag
if( ! ( strpos($content["all"],'{BREADCRUMB_LEVELS')===false ) ) {
$content["all"] = str_replace('{BREADCRUMB_LEVELS}', '{BREADCRUMB_LEVELS:0:0:0:>}', $content["all"]);
$replace = 'breadcrumb_levels("$1", $content["struct"], "$2", "$3", "$4", "index.php");';
$content["all"] = preg_replace('/\{BREADCRUMB_LEVELS:(.*?):(.*?):(.*?):(.*?)\}/e', $replace, $content["all"]);
}
// -------------------------------------------------------------
?>
As you see in the end, the reptag {BREADCRUMP} is replaced with php code. Thats how it works!
Good luck!
Vuurvos
Posted: Sat 23. Sep 2006, 18:17
by iriechaos
I want to call the reptag without {}. for example when I write phpwcms I want to get an autolink to
http://www.phpwcms.de/.
Posted: Sat 23. Sep 2006, 20:07
by ff123
Sounds very strange to me... So for every word there should be a link and how should phpwcms where to link?
Maybe the autolink plugin from wordpress is like what you mean:
http://wp-plugins.net/plugin/wp-autolink/
Maybe a reptag would be looking like this:
{AUTOLINK:phpwcms|
www.phpwcms.de}
Yes! It already exists:
[EXT
http://www.phpwcms.de]phpWCMS[/EXT]
Source:
http://www.phpwcms-docu.de/link_tags.phtml
Posted: Sat 23. Sep 2006, 22:54
by iriechaos
I tell one time that the link for phpwcms is
http://www.phpwcms.de/ for example.
So I can type phpwcms in every artikel and the cms knows that the link is
http://www.phpwcms.de/ without telling every time the link.
sorry 4 my english!!!
Posted: Sat 23. Sep 2006, 23:18
by marcus@localhorst
just a hint
setup an array with a wordlist and with related links
with a regExpr. function from php you replace all words from the array in $content['all'].
if you are familiar with php, it's no problem
no codesnippets at the moment, sorry.
Posted: Sun 24. Sep 2006, 18:21
by iriechaos
meine php kenntnisse sind genau so schlecht wie mein english *g
Posted: Fri 29. Sep 2006, 16:04
by iriechaos
put the following in a file in the frontend_render folder:
<?
$datei = "config/links.txt";
$wordlist = file($datei);
for ($i = 0; $i < count($wordlist); $i++) {
$wordlist[$i] = explode(";" , $wordlist[$i]);
$wordlist[$i]['keyword']=$wordlist[$i][0];
$wordlist[$i]['link']=$wordlist[$i][1];
}
function mytag($keyword,$link) {
$output="<a href=\"http://" . $link . "\" target=\"_blank\">" . $keyword . "</a>";
return $output;
}
$i=0;
while ($i <= count($wordlist)) {
$content['all'] = str_replace($wordlist[$i]['keyword'],mytag($wordlist[$i]['keyword'],$wordlist[$i]['link']),$content['all']);
$i++;
}
?>
Create a file links.txt with the keywords and the links in the config folder:
Thats all. Now the srcipt will replace all keywords with the urls.
thx to marcus!!!
Posted: Sat 30. Sep 2006, 08:06
by Oliver Georgi
Sorry, es gefährlich einen solchen Tipp zu geben!!!!
Ein Dokument besteht eben nicht nur aus Text, sodass man einfach dahergehen kann und mal eben wahllos aus phpwcms einen <a href...> machen kann. Es ist gut möglich, dass es bereits woher auch immer einen solchen Link gibt - na überlegt was passiert, trifft der Replacer auf <a href="http://phpwcms.de">Na gucke</a> - genau: daraus wird <a href="http://<a href="...">phpwcms</a>.de">Na gucke</a>. Also ist das Schrott.
Es ist also IMMER empfohlen, bewußt etwas zu setzen und auch genau hierfür einen Tag einzuführen. Eine Wortliste an sich ist OK, aber es ist immer ratsam bewußt zu taggen! Oder man muss Code nutzen, der genau auch die Ausnahmen berücksichtigt. Für den Laien eher kompliziert!
Es ist also ratsam, sich umschließende Tags zu definieren. Dann arbeitet man die Tags von oben nach unten ab und am Ende werden alle Tags entfernt, die eventuell übrig geblieben sind, weil z.B. das Keyword nicht definiert ist.
Oliver
Posted: Thu 5. Oct 2006, 18:50
by iriechaos
Hi Oliver,
das hatte ich nicht bedacht der Marcus hat mich auch schon darauf hingewiesen vielen dank für deine hilfe.
:O
Posted: Tue 2. Jan 2007, 11:21
by phalancs
Danke für eure Hinweise, das Skript würde mich dennoch sehr interessieren aber es funktioniert nicht. :O
Im frontend erscheint immer.
wobei keyword das entsorechende Wort ist.
Woran kann es liegen?
Posted: Tue 2. Jan 2007, 11:36
by marcus@localhorst
hi,
ich hab jetzt nicht das endgültige skript vorliegen, weil ja bloß mit half bei der umsetzung.
aber der beitrag zuvor von oliver könnte der entsprechende hinweis sein.
wenn "keyword" in einem html tag vorkommt, dann wird das natürlich auch ersetzt und ergibt murks.
prüfe das nochmal.
normalerweise dürfte die ersetzung nur durchgeführt werden, wenn keyword nicht innerhalb von < > vorkommt.
prüf das mal. ansonsten geb mal bitte die zeile aus der ersetzungsliste und etwas mehr von dem fehlerhaften output mit.
grüße
marcus
Posted: Tue 2. Jan 2007, 12:07
by phalancs
hmm, also ich hab ja jetzt nur keyword in die fehlerzeile eingefügt damit ihr wisst was da stehen würde.
In meinem Test ahtte ich da einen einzigartigen string verwendet um sowas auszuschließen.
Also die zu ersetzenden worte werden ja egtl. erkannt aber der umschließend link wird nciht korretk gesetzt.
vor das keyword wird immer nur
eingefügt.
Eine Idee?
Danke für die schnelle antwort schonmal.
Posted: Tue 2. Jan 2007, 12:35
by marcus@localhorst
also, es kann nur sein, das sich das skript hier irgendwo aufhängt:
$output="<a href=\"http://" . $link . "\" target=\"_blank\">" . $keyword . "</a>";
also den fettgedruckten teil unterschlägt das skript einfach... :-/, warum auch immer. sorry, weiss ich jetzt keinen rat. das script hast du 1:1 übernommen?
eigenartig...
Posted: Tue 2. Jan 2007, 13:26
by phalancs
ja hab das so übernommen. hmm, also immerhin erkennt er die stellen.
ich dneke auch dass es was mit der von dir angegebenen stelle zu tun hat.
schade. villeicht hat ja jemand noch ne idee dazu :O
prinzipiell kann die idee mit dem global replacing sehr hilfreich sein, wenn man das beachtet auf das oli hingewiesen hat.