Vorschlag Suchmaschinen freundliche URL

Gesperrt
jnantke
Beiträge: 13
Registriert: Di 30. Jan 2007, 14:56
Kontaktdaten:

Vorschlag Suchmaschinen freundliche URL

Beitrag von jnantke » Di 27. Feb 2007, 11:20

Hallo,

ich habe den Code von Contenido ein wenig verändert um Suchmaschinenfreundliche URL zu erzeugen.

Hier meine Änderungen:


Code: Alles auswählen

--- con_test/contenido/includes/functions.con.php	2006-07-24 01:15:00.000000000 +0200
+++ con_tbs/contenido/includes/functions.con.php	2007-02-15 17:57:59.000000000 +0100
@@ -13,6 +13,7 @@
 * Modified  :   23.07.2003
 *
 * © four for business AG
+* Modified    :     02-15-2007, Juergen Nantke
 ******************************************/
 
 /* Compatibility: Include new functions.con2.php */
@@ -1175,7 +1176,7 @@
  *
  * @copyright four for business AG <www.4fb.de>
  */
-function conCreateLocationString($idcat, $seperator, &$cat_str, $makeLink = false, $linkClass = "", $firstTreeElementToUse = 0, $uselang = 0, $final = true, $usecache = false)
+function conCreateLocationString($idcat, $seperator, &$cat_str, $makeLink = false, $linkClass = "", $firstTreeElementToUse = 0, $uselang = 0, $final = true, $usecache = false,$url=array())
 {
     global $cfg, $client, $cfgClient, $lang, $sess, $_locationStringCache;
 	
@@ -1218,7 +1219,9 @@
                 a.name AS name,
                 a.idcat AS idcat,
                 b.parentid AS parentid,
-				c.level as level
+		c.level as level,
+		a.urlname
+				
             FROM
                 ".$cfg["tab"]["cat_lang"]." AS a,
                 ".$cfg["tab"]["cat"]." AS b,
@@ -1242,20 +1245,33 @@
 		//create link
 		if ($makeLink == true)
 		{
-			$linkUrl = $sess->url("front_content.php?idcat=$idcat");
-			$name = '<a href="'.$linkUrl.'" class="'.$linkClass.'">'.$name.'</a>';	
+			if ($db->f("urlname")!=''){
+				$linkUrl = $sess->url($db->f("urlname")."/");
+			}else{
+				$linkUrl = $sess->url("front_content.php?idcat=$idcat");
+			}
+			
 		}
 	
-		$tmp_cat_str = $name . $seperator . $cat_str;
-		$cat_str = $tmp_cat_str;
+		$url[]=array('name'=>$name,'link'=>$linkUrl);
+		
 
 	}
 
     if ( $parentid != 0 ) {
-        conCreateLocationString($parentid, $seperator, $cat_str, $makeLink, $linkClass, $firstTreeElementToUse ,$uselang, false);
+        conCreateLocationString($parentid, $seperator, $cat_str, $makeLink, $linkClass, $firstTreeElementToUse ,$uselang, false,$usecache,$url);
         
     } else {
-        $sep_length = strlen($seperator);
+        
+        for ($n=count($url)-1;$n>=0;$n--){
+	        if ($makeLink){
+		    if ($n!=count($url)-1) $url[$n]['link']=$url[$n+1]['link'].$url[$n]['link'];
+		    $url[$n]['name']= '<a href="'.$url[$n]['link'].'" class="'.$linkClass.'">'.$url[$n]['name'].'</a>';	
+		}
+                $cat_str .=  $url[$n]['name'].htmlentities($seperator);
+	       
+	}
+        $sep_length = strlen(htmlentities($seperator));
         $str_length = strlen($cat_str);
         $tmp_length = $str_length - $sep_length;
         $cat_str = substr($cat_str, 0, $tmp_length);

Code: Alles auswählen

--- con_test/cms/includes/functions.navigation.php	2006-09-30 02:40:00.000000000 +0200
+++ con_tbs/cms/includes/functions.navigation.php	2007-02-15 17:00:29.000000000 +0100
@@ -1,4 +1,5 @@
 <?php
+//Modified    :     02-15-2007, Juergen Nantke (jn@efilio.de)
 // create Navigation array for one level
 function createNavigationArray($start_id, $db) 
 {
@@ -14,7 +15,8 @@
                 A.idcat,
                 C.name,
                 C.public,
-                C.idcatlang
+                C.idcatlang,
+		C.urlname
		
             FROM
                 ".$cfg["tab"]["cat_tree"]." AS A,
                 ".$cfg["tab"]["cat"]." AS B,
@@ -58,7 +60,9 @@
 			$navigation[$cat_id] = array("idcat"  => $cat_id,
                                          "name"   => $db->f("name"),
                                          "target" => '_self', # you can not call getTarget($cat_id, &$db) at this point with the same db instance!			
-                                         "public" => $db->f("public"));
+                                         "public" => $db->f("public"),
+					 "urlname" => $db->f("urlname")
+					 );
 		}    
     } // end while
 

Code: Alles auswählen

--- con_test/contenido/includes/include.upl_artlist.php	2005-11-01 18:55:00.000000000 +0100
+++ con_tbs/contenido/includes/include.upl_artlist.php	2007-02-20 14:06:23.000000000 +0100
@@ -86,6 +86,10 @@
 	$martlink = "";
 	$idart = $obj->get("idart");
 	
+	
+	conCreateLocationString($idcat, "/", &$martlink,false, "", 1, $lang);
+	$martlink="/".$martlink;
+	/*
 	$_cecIterator = $_cecRegistry->getIterator("Contenido.Content.CreateArticleLink");
 	if ($_cecIterator->count() > 0)
 	{
@@ -99,12 +103,14 @@
 		    }				    
 		}
 	}
+	
 	
 	if ($martlink == "")
 	{
 		$martlink = "front_content.php?idart=$idart";
 	}	
 	
+	*/
 	$jslink = 'parent.parent.frames[\'left\'].frames[\'left_top\'].document.getElementById(\'selectedfile\').value= \''.$martlink.'\'; window.returnValue=\''.$martlink.'\'; window.close();';
 	
 	foreach ($fields as $field)

Zusätzlich für Apache die folgende Rewrite - Rule im cms Verzeichnis (.htaccess)

Code: Alles auswählen

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule .* front_content.php?path=%{REQUEST_URI}&%{QUERY_STRING} [L]
Angepasstes Modul BottomNavigation:

Code: Alles auswählen

<?xml version="1.0" encoding="ISO-8859-1"?>
<module><name>BottomNavigation</name>
<description>Zusatznavigation am Ende der Seite

Author:  Andreas Lindner
Version: 1.0</description>
<type>Navigation</type>
<input/>
<output><?php
/***********************************************
* Bottom Navigation Output
*
* Author      :     Willi Man
* Copyright   :     four for business AG
* Version	  : 	1.0
* Created     :     17-03-2005
* Modified    :     05-08-2005, Andreas Lindner
* Modified    :     02-15-2007, Juergen Nantke (jn@efilio.de)
************************************************/

#System properties in use:
#Type: navigation, Name: idcat_bottomnavi
#Contains idcat of tree to be displayed in bottom navigation


#Includes
cInclude("frontend", "includes/functions.navigation.php");
cInclude('classes', 'class.template.php');

#Get settings	
$cApiClient = new cApiClient($client);
$catStart = $cApiClient->getProperty('navigation', 'idcat_bottomnavi');

if (!is_object($oClient)) {
	$oClient = new cApiClient($client);
}

#Get sub categories
$navigation = array ();
$navigation = createNavigationArray($catStart, $db);
#Output sub categories
$output = '';
if (count($navigation) > 0) {
	foreach ($navigation as $key => $data) {
                if ($data['urlname']!=''){
		        $output .= '<a href="'.$sess->url($data['urlname']).'" class="bottomnavi" title="'.$data['name'].'">'.$data['name'].'</a> | ';
                }else{
                        $output .= '<a href="'.$sess->url("front_content.php?idcat=".$data['idcat']).'" class="bottomnavi" title="'.$data['name'].'">'.$data['name'].'</a> | ';
                }
	}
}
if (strlen($output) > 0) {
	$output = substr($output, 0, strlen($output) - 3);
}

echo $output;

?>

</output>
</module>
Angepasstes Modul Hauptnavigation:

Code: Alles auswählen

<?xml version="1.0" encoding="ISO-8859-1"?>
<module><name>Hauptnavigation</name>
<description>Hauptnavigation aufbauen

Author:  Jan lengowski, Andreas Lindner
Version: 1.0</description>
<type>Navigation</type>
<input>?><?php
/***********************************************
* CONTENIDO MODUL - INPUT
*
* Modulname  :      Hauptnavigation
* Author(s)   :     Jan Lengowski, Andreas Lindner, 4fb
* Copyright   :     Contenido - four for business, Andreas Lindner
* Created     :     12.08.2005
************************************************/

#Select tree
?>
<table cellspacing="0" cellpadding="0" cellpadding="4">
    <tr>
        <td class="text"><?php echo mi18n("Baum wählen");?>:</td>
        <td>
            <select name="CMS_VAR[0]">
            <option value="0">-- <?php echo mi18n("kein");?> --</option>
            <?php
                $sql = "SELECT
                            A.idcat,
                            C.name
                        FROM
                            ".$cfg["tab"]["cat_tree"]." AS A,
                            ".$cfg["tab"]["cat"]." AS B,
                            ".$cfg["tab"]["cat_lang"]." AS C
                        WHERE
                            A.idcat     = B.idcat AND
                            B.idcat     = C.idcat AND
                            C.idlang    = '".$lang."' AND
                            B.idclient  = '".$client."' AND
                            C.visible   = 1 AND
                            A.level     = '0'
                        ORDER BY
                            A.idtree";

                $db->query($sql);

                while ( $db->next_record() ) {
                    if ( "CMS_VALUE[0]" == $db->f("idcat") ) {
                        echo '<option selected="selected" value="'.$db->f("idcat").'">'.$db->f("name").'</option>';
                    } else {
                        echo '<option value="'.$db->f("idcat").'">'.$db->f("name").'</option>';
                    }
                }
            ?>
            </select>
        </td>
    </tr>
</table>
<?php

</input>
<output><?php
/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname  :      Hauptnavigation
* Author(s)   :     Jan Lengowski, Andreas Lindner, 4fb
* Copyright   :     Contenido - four for business, Andreas Lindner
* Created     :     12.08.2005
* Modified    :     02-15-2007, Juergen Nantke (jn@efilio.de)
************************************************/

#System properties in use:
#Type: navigation, Name: idcat_homepage
#Contains idcat of tree to be displayed in main navigation

#Includes
cInclude("frontend", "includes/functions.navigation.php");

#If no tree is selected, use client setting
$start_cat = "CMS_VALUE[0]";
if ($start_cat=='') {
    $cApiClient = new cApiClient($client);
	$start_cat = $cApiClient->getProperty('navigation','idcat_homepage');
}

if ( !is_object($db2) ) {
    $db2 = new DB_Contenido;
}

/**
 * Check if a category is child
 * of another category
 *
 * @return boolean true/false
 * @author Jan Lengowski <Jan.Lengowski@4fb.de>
 * @copyright four for business AG 2003
 */
function catIsChildOf($id, $idparent) {

    global $cfg, $client, $lang;

    $db = new DB_Contenido;

    $parent = $id;

    while ( $parent != 0 ) {

        $sql = "SELECT
                    a.parentid
                FROM
                    ".$cfg["tab"]["cat"]." AS a,
                    ".$cfg["tab"]["cat_lang"]." AS b
                WHERE
                    a.idclient  = '".$client."' AND
                    b.idlang    = '".$lang."' AND
                    a.idcat     = b.idcat AND
                    a.idcat   = '".$parent."'";

        $db->query($sql);
        $db->next_record();

        $parent = $db->f("parentid");

        if ($parent == $idparent) {
            return true;
        }

    }

    return false;

}

if ( catIsChildOf($idcat, $start_cat) ) {
    $sel_idcat = $idcat;
} else {
    $sel_idcat = $start_cat;
}

/* Include Template Class */
include_once($cfg["path"]["contenido"] . 'classes/class.template.php');

/**
 * Array storing alle the
 * navigation data
 */
$navitems = array();


/* Template Instance */
$tpl = new Template;

/**
 * Recursive function for creating
 * the navigation array
 * @param Int $idcat Category id
 */
function nav($idcat) {

        global $navitems, $client, $lang, $cfg, $start_cat;

        $db  = new DB_Contenido;
        $db2 = new DB_Contenido;

        $sql = "SELECT parentid FROM ".$cfg["tab"]["cat"]." WHERE idcat = '$idcat'";

        $db->query($sql);
        $db->next_record();

        $parentid = $db->f("parentid");

        if ( $parentid == 0 ) {

           if ( $idcat != $start_cat ){

                $navitems = array();
              
                $sql = "SELECT
                            A.idcat,
                            C.name,
                            C.public,
                            C.idcatlang,
                            C.urlname
                        FROM
                            ".$cfg["tab"]["cat_tree"]." AS A,
                            ".$cfg["tab"]["cat"]." AS B,
                            ".$cfg["tab"]["cat_lang"]." AS C
                        WHERE
                            A.idcat     = B.idcat   AND
                            B.idcat     = C.idcat   AND
                            B.idclient  = '$client' AND
                            C.idlang    = '$lang'   AND
                            C.visible   = '1'       AND
                            B.parentid  = '".$start_cat."'
                        ORDER
                            BY A.idtree";

                      $db->query($sql);

                      while ($db->next_record()) {

                            /* Check for external redirects... */
                            $sql = "SELECT
                                        a.external_redirect AS ext,
                                        a.idartlang AS idartlang
                                    FROM
                                        ".$cfg["tab"]["art_lang"]." AS a,
                                        ".$cfg["tab"]["cat_art"]." AS b,
                                        ".$cfg["tab"]["cat"]." AS c
                                    WHERE
                                        b.idcat     = '".$db->f("idcat")."' AND
                                        c.idclient  = '".$client."' AND
                                        c.idcat     = b.idcat AND
                                        a.idart     = b.idart AND
                                        a.idlang    = '".$lang."'";

                            $db2->query($sql);
                            $flag = false;
							while ($db2->next_record()&&!$flag) {
	                            if (isStartArticle($db2->f("idartlang"), $db->f("idcat"), $lang))
	                            {
									$flag = true;
	                                $target = ( $db2->f("ext") == 0 ) ? '_self' : '_blank';
	
	                                $navitems[$db->f("idcat")] = array("idcat"      => $db->f("idcat"),
	                                                                    "name"      => $db->f("name"),
	                                                                    "target"    => $target,
			                        	                    "public" => $db->f("public"),
       					            	                    "idcatlang" => $db->f("idcatlang"),
                                                                            "urlname" => $db->f("urlname") 
                                                                             );
	                            }
							}
                      }

           }
           
           return true;
        }

        $sql = "SELECT
                    A.idcat,
                    C.name,
		            C.public,
       			    C.idcatlang,
                            C.urlname
                FROM
                    ".$cfg["tab"]["cat_tree"]." AS A,
                    ".$cfg["tab"]["cat"]." AS B,
                    ".$cfg["tab"]["cat_lang"]." AS C
                WHERE
                    A.idcat     = B.idcat   AND
                    B.idcat     = C.idcat   AND
                    B.idclient  = '$client' AND
                    C.idlang    = '$lang'   AND
                    C.visible   = '1'       AND
                    B.parentid  = '$parentid'
                ORDER BY
                    A.idtree";

        $db->query($sql);

        while ($db->next_record()) {

                /* Check for external redirects... */
                $sql = "SELECT
                            a.external_redirect AS ext,
                            a.idartlang AS idartlang
                        FROM
                            ".$cfg["tab"]["art_lang"]." AS a,
                            ".$cfg["tab"]["cat_art"]." AS b,
                            ".$cfg["tab"]["cat"]." AS c
                        WHERE
                            b.idcat     = '".$db->f("idcat")."' AND
                            c.idclient  = '".$client."' AND
                            c.idcat     = b.idcat AND
                            a.idart     = b.idart AND
                            a.idlang    = '".$lang."'";

                $db2->query($sql);
				$flag = false;
                while ($db2->next_record() && !$flag) {
	                if (isStartArticle($db2->f("idartlang"), $db->f("idcat"), $lang))
	                {
						$flag = true;
	                    $target = ( $db2->f("ext") == 0 ) ? '_self' : '_blank';
	                    
	                    $tmp_nav[$db->f("idcat")] = array("idcat"   => $db->f("idcat"),
	                                                      "name"    => $db->f("name"),
	   	                        	              "public" => $db->f("public"),
		            				      "idcatlang" => $db->f("idcatlang"),
                                                              "urlname" => $db->f("urlname"),
	                                                      "target"  => $target);
	                }
				}
        }

        $tmp_nav[$idcat]["sub"] = $navitems;
        $navitems = $tmp_nav;

        /* Function call */
        nav($parentid);

}  // end function

$sql = "SELECT
            A.idcat,
            C.name,
            C.public,
            C.idcatlang,
            C.urlname
        FROM
            ".$cfg["tab"]["cat_tree"]." AS A,
            ".$cfg["tab"]["cat"]." AS B,
            ".$cfg["tab"]["cat_lang"]." AS C
        WHERE
            A.idcat     = B.idcat   AND
            B.idcat     = C.idcat   AND
            B.idclient  = '$client' AND
            C.idlang    = '$lang'   AND
            C.visible   = '1'       AND
            B.parentid  = '$sel_idcat'
        ORDER BY
            A.idtree";

$db->query($sql);

while ( $db->next_record() ) {

        /* Check for external redirects... */
        $sql = "SELECT
                    a.external_redirect AS ext,
                    a.idartlang AS idartlang
                FROM
                    ".$cfg["tab"]["art_lang"]." AS a,
                    ".$cfg["tab"]["cat_art"]." AS b,
                    ".$cfg["tab"]["cat"]." AS c
                WHERE
                    b.idcat     = '".$db->f("idcat")."' AND
                    c.idclient  = '".$client."' AND
                    c.idcat     = b.idcat AND
                    a.idart     = b.idart AND
                    a.idlang    = '".$lang."'";

        $db2->query($sql);
        #$db2->next_record();
		$flag = false;
		while ($db2->next_record()&&!$flag) {
	        if (isStartArticle($db2->f("idartlang"), $db->f("idcat"), $lang))
	        {
				$flag = true;
	            $target = ( $db2->f("ext") == 0 ) ? '_self' : '_blank';
	    
	            $navitems[$db->f("idcat")] = array("idcat"  => $db->f("idcat"),
	                                               "name"   => $db->f("name"),
	  	                        	       "public" => $db->f("public"),
		            			       "idcatlang" => $db->f("idcatlang"),
                                                       "urlname" => $db->f("urlname"),
	                                               "target" => $target);
	        }
		}
}

/* Create Navigation Array */
if(($sel_idcat=='')||($sel_idcat=='0')){
    $cApiClient = new cApiClient($client);
    $sel_idcat = $cApiClient->getProperty('navigation', 'idcat_homepage');
}

nav($sel_idcat);

/* Start Output buffer */
ob_start();

foreach ($navitems as $key => $data) {

    /* 1. Navigation level */
	if (checkCatPermission($data['idcatlang'],$data['public'])) {
	    $tpl->reset();
	    $tpl->set('d', 'NAME',  $data['name']);
	    $tpl->set('d', 'TARGET', $data['target']);
            if ($data['urlname']!=''){
                      $tpl->set('d', 'HREF',  $sess->url($data['urlname']));
                      $lvlone=$data['urlname'];

            }else{
                      $tpl->set('d', 'HREF',  $sess->url('front_content.php?idcat='.$data['idcat']));
            }
	    $tpl->next();
	    if ($idcat == $data['idcat']) {
	        $tpl->generate('templates/navfirst_on.html');
		}elseif(is_array($data['sub'])){
	        $tpl->generate('templates/navfirst_open.html');
	    } else {
	        $tpl->generate('templates/navfirst_off.html');
	    }
	
    	/* 2. Navigation level */
	    if (is_array($data['sub'])) {
	        foreach ($data['sub'] as $key => $data) {
				if (checkCatPermission($data['idcatlang'],$data['public'])) {
		            $tpl->reset();
		            $tpl->set('d', 'NAME',  $data['name']);
		            $tpl->set('d', 'TARGET', $data['target']);
                            if ($data['urlname']!=''){
                                 $tpl->set('d', 'HREF',  $sess->url($lvlone."/".$data['urlname']));
                                 $lvltwo=$data['urlname'];
                            }else{
                                 $tpl->set('d', 'HREF',  $sess->url('front_content.php?idcat='.$data['idcat']));
                            }

		            $tpl->next();
		            if ($idcat == $data['idcat']) {
		                $tpl->generate('templates/navsecond_on.html');
					}elseif(is_array($data['sub'])){
				        $tpl->generate('templates/navsecond_open.html');
		            } else {
		                $tpl->generate('templates/navsecond_off.html');
		            }

				    /* 3. Navigation level */
		            if (is_array($data['sub'])) {
		                foreach ($data['sub'] as $key => $data) {
							if (checkCatPermission($data['idcatlang'],$data['public'])) {
			                    $tpl->reset();
			                    $tpl->set('d', 'NAME',  $data['name']);
			                    $tpl->set('d', 'TARGET', $data['target']);
                                            if ($data['urlname']!=''){
                                                       $tpl->set('d', 'HREF',  $sess->url($lvlone."/".$lvltwo."/".$data['urlname']));
						       $lvlthree=$data['urlname'];
                                            }else{
                                                       $tpl->set('d', 'HREF',  $sess->url('front_content.php?idcat='.$data['idcat']));
                                            }

			                    $tpl->next();
			
			                    if ($idcat == $data['idcat']) {
			                        $tpl->generate('templates/navthird_on.html');
								}elseif(is_array($data['sub'])){
							        $tpl->generate('templates/navthird_open.html');
			                    } else {
			                        $tpl->generate('templates/navthird_off.html');
			                    }

			                    /* 4. Navigation level */
					            if (is_array($data['sub'])) {
					                foreach ($data['sub'] as $key => $data) {
										if (checkCatPermission($data['idcatlang'],$data['public'])) {
						                    $tpl->reset();
						                    $tpl->set('d', 'NAME',  $data['name']);
						                    $tpl->set('d', 'TARGET', $data['target']);
									if ($data['urlname']!=''){
                                                       				$tpl->set('d', 'HREF',  $sess->url($lvlone."/".$lvltwo."/".$lvlthree."/".$data['urlname']));
						       				$lvlfour=$data['urlname'];
                                            				}else{
                                                       				$tpl->set('d', 'HREF',  $sess->url('front_content.php?idcat='.$data['idcat']));
                                            				}
						                    $tpl->next();
						                    if ($idcat == $data['idcat']) {
						                        $tpl->generate('templates/navfourth_on.html');
											}elseif(is_array($data['sub'])){
										        $tpl->generate('templates/navfourth_open.html');
						                    } else {
						                        $tpl->generate('templates/navfourth_off.html');
						                    }

						                    /* 5. Navigation level */
								            if (is_array($data['sub'])) {
								                foreach ($data['sub'] as $key => $data) {
													if (checkCatPermission($data['idcatlang'],$data['public'])) {
									                    $tpl->reset();
									                    $tpl->set('d', 'NAME',  $data['name']);
									                    $tpl->set('d', 'TARGET', $data['target']);
												 if ($data['urlname']!=''){
                                                       							$tpl->set('d', 'HREF',  $sess->url($lvlone."/".$lvltwo."/".$lvlthree."/".$lvlfour."/".$data['urlname']));
						     						}else{
                                                       							$tpl->set('d', 'HREF',  $sess->url('front_content.php?idcat='.$data['idcat']));
                                            							}
									                    $tpl->next();
									                    if ($idcat == $data['idcat']) {
									                        $tpl->generate('templates/navfifth_on.html');
									                    } else {
									                        $tpl->generate('templates/navfifth_off.html');
									                    }
										            } // end if
								                } // end foreach
								            } // end if
							            } // end if
					                } // end foreach
					            } // end if
				            } // end if
		                } // end foreach
		            } // end if
	            } // end if
	        } // end foreach
	    } // end if
    } // end if
} // end foreach

/* Read out buffer */
$html = ob_get_contents();

/* Clean buffer */
ob_end_clean();

/* Output buffer-contents */
echo $html;
?></output>
</module>
Angepasstes Modul Navigationspfad:

Code: Alles auswählen

<?xml version="1.0" encoding="ISO-8859-1"?>
<module><name>Navigationspfad</name>
<description>Brotkrumen über dem Content

Autor:
Version</description>
<type>Navigation</type>
<input/>
<output><?php
/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname  :      Navigationpath
* Author(s)   :     Andreas Lindner
* Copyright   :     Contenido - four for business, Andreas Lindner
* Created     :     05-08-2005
* Modified    :     02-15-2007, Juergen Nantke (jn@efilio.de)
************************************************/

#Settings
$separator = '>';
$max_length = 65;

#Get path to root
$dummy = conCreateLocationString($idcat, ' '.$separator.' ', $retval, true, "navipath", 1);

if ($retval=='') {
	$retval='&nbsp;';	
} else {
	$pattern = "'>.*?<'";
	
	preg_match_all($pattern, $retval, $matches);
	$matches = $matches[0];
	
	#Get effective text length
	$length = 0;
	foreach ($matches as $value) {
		$length += strlen($value) - 2;
	}
	
	#Get shorten factor
	if ($length > $max_length * 4) {
		$shorten = 5;
	}
	elseif ($length > $max_length * 3) {
		$shorten = 4;
	}
	elseif ($length > $max_length * 2) {
		$shorten = 3;
	}
	elseif ($length > $max_length) {
		$shorten = 2;
	} else {
		$shorten = 1;
	}
	
	#Shorten items
	if ($length > $max_length) {
		foreach ($matches as $value) {
			if (strpos($value, $separator) === FALSE) {
				$text = substr($value, 1, strlen($value) - 2);
				$len = strlen($text);
				if (strpos($text, ' ') === FALSE) {
					$text_new = $text;
				} else {
					$text_new = capiStrTrimAfterWord($text, intval($len / $shorten));
				}
	
				if (strlen($text) != strlen($text_new)) {
					$text_new .= '...';
				}
	
				$text_new = '>'.$text_new.'<';
				$retval = str_replace('>'.$text.'<', $text_new, $retval);
			}
		}
	}
	
	$retval = str_replace('"/index.html"', '"Home/index.html"', $retval);
}

//echo "Sie sind hier: ".$retval;
echo mi18n("Sie sind hier: ").$retval;
?>
</output>
</module>
Vieleicht sind diese Änderungen für den ein oder anderen nützlich oder diese finden möglicherweise den Weg in die nächste Version.

Ich freue mich auf euer Feedback.

Apropos, damit auch wirklich freundliche URL herauskommen muss für jede Kategorie ein eindeutiger Alias gesetzt sein.

Ich stelle die geänderten Dateiien gleich auch nochmal unter http://www.efilio.de/conpatch.zip zum Download bereit.
Zuletzt geändert von jnantke am Di 27. Feb 2007, 12:41, insgesamt 1-mal geändert.

MichFress
Beiträge: 750
Registriert: Mo 5. Jan 2004, 22:32
Wohnort: Bochum
Kontaktdaten:

Beitrag von MichFress » Di 27. Feb 2007, 12:07

erklär uns mal kurz, was deine Erweiterung genau macht, und wo die Unterschiede zu Steses mod_rewrite-Version liegen... hab grad nicht die Muße, mir deinen Code durchzulesen.. ;-)
"Es wird keine Handlung geben, keine Geschichte mit ihrer Versprechung auf einen Anfang und ihrer Hoffnung auf ein Ende." (Andrzej Stasiuk)

jnantke
Beiträge: 13
Registriert: Di 30. Jan 2007, 14:56
Kontaktdaten:

Kurze Erklärung ...

Beitrag von jnantke » Di 27. Feb 2007, 12:41

Ich habe mich mit Steses mod_rewrite-Version nicht so genau auseinandergesetzt, kann daher die Unterschiede oder vor und Nachteile hier nicht aufzeigen.
Ich will daher auch nicht behaupten das meine Version in irgendeiner Form besser ist. Sie ist auch noch nicht so weit getestet, dass ich für absolute Fehlerfreiheit garantieren kann, ist aber von der Anzahl der Änderungen auf jedenfall ein geringerer Eingriff in Contenido.
Ich habe auch nur die Module angepasst, welche für mein aktuelles Projekt notwendig waren. Weitere Module müssten also eventuell extra angepasst werden.

Mein Ansatz war es auf die "path=" Funktionalität aufzubauen.
Meine Modifikation macht also nichts anderes als in den Menüs über die in den Kategorien-Alias eingesetzten Werte einen "freundlichen" URL zu erzeugen, welche dann an die "path" Variabele übergeben werden kann.

Die Auswertung, bzw. der Aufruf der Seite erfolgt dann einfach wieder durch den Aufruf der front_content.php mit Übergabe des "path" durch das Rewrite Modul von Apache.

jnantke
Beiträge: 13
Registriert: Di 30. Jan 2007, 14:56
Kontaktdaten:

Beitrag von jnantke » Mi 21. Mär 2007, 10:42

Hat schon jemand meine Version ausprobiert?

Besteht überhaupt Interesse daran?

Gibt es Informationen darüber ob und wann Contenido selber entsprechend Suchmaschinenfreundlich sein wird?

FlorianL
Beiträge: 21
Registriert: Sa 22. Okt 2005, 17:33
Kontaktdaten:

Beitrag von FlorianL » Mi 21. Mär 2007, 10:52

jnantke hat geschrieben:Hat schon jemand meine Version ausprobiert?

Besteht überhaupt Interesse daran?

Gibt es Informationen darüber ob und wann Contenido selber entsprechend Suchmaschinenfreundlich sein wird?
#

Hört sich sehr gut an, kann man sich das irgendwo schonmal anschauen?

jnantke
Beiträge: 13
Registriert: Di 30. Jan 2007, 14:56
Kontaktdaten:

Beitrag von jnantke » Mi 21. Mär 2007, 11:36

FlorianL hat geschrieben: Hört sich sehr gut an, kann man sich das irgendwo schonmal anschauen?
Es gibt zur Zeit nur eine Kundin die noch beim Aufbau Ihrer Seite ist.

Aber ansehen geht da schon.

Die temporäre Adresse ist. http://tbs.flexres.de

stese
Beiträge: 1040
Registriert: Fr 3. Dez 2004, 17:47
Wohnort: München
Kontaktdaten:

Beitrag von stese » Mi 21. Mär 2007, 11:45

hier die derzeit (in)offizielle ModRewrite Version
http://contenido.org/forum/viewtopic.php?t=11162

das ist ein komplettes Bundle von Contenido, da Änderungen am Core vorgenommen worden.
Hauptunterschied: Als Endnutzer müssen keine Änderungen an Modulen vorgenommen werden, da die gesamtausgabe der html seite bevor sie zum browser geschickt wird, geparsed wird und erst dort die urls umgewandelt werden.

darüber hinaus gibts jede menge kleine features wie die urls ausschauen können. siehe changelog im oben genannten thread

geplant ist es, diese version in relativ naher zukunft als eigenständiges plugin direkt in contenido zu integrieren, dass es mit zum standardbundle gehört, allerdings deaktiviert werden kann - aber das zu realisieren kostet zeit, da die änderungen umfangreich sind.

jnantke
Beiträge: 13
Registriert: Di 30. Jan 2007, 14:56
Kontaktdaten:

Beitrag von jnantke » Mi 21. Mär 2007, 15:17

stese hat geschrieben: Hauptunterschied: Als Endnutzer müssen keine Änderungen an Modulen vorgenommen werden, da die gesamtausgabe der html seite bevor sie zum browser geschickt wird, geparsed wird und erst dort die urls umgewandelt werden.
Ich will die Vorgehensweise ja nicht kritisieren und dies ist als Zwischenlösung ja auch nicht schlecht. Aber ich denke es wäre besser wenn gleich die Benutzerfreundlichen URL erzeugt würden. Langfristig sollten die Modulentwickler dazu angehalten werden die "richtigen" URL zu verwenden.

Ich könnte mir vorstellen, das Contenido eine "offizielle" Funktion zur Verfügung stellen könnte, mit der aus der ID der Seite der benutzerfreundliche URL erzeugt wird, bzw diesen gleich zur Verfügung zu stellen, so wie ich das Ansatzweise in meinen Änderungen vorgenommen habe.

Dies entspräche auch der Vorgehensweise bei den Übersetzungen, welche leider auch nicht von allen Modulentwicklern berücksichtigt wurde.

Man könnte ja die Parsing-Funktion übergangsweise über ein Parameter ein und ausschaltbar machen, so dass man alte Module noch nutzen kann.

Dodger77
Beiträge: 3626
Registriert: Di 12. Okt 2004, 20:00
Wohnort: Voerde (Niederrhein)
Kontaktdaten:

Beitrag von Dodger77 » Do 22. Mär 2007, 08:35

jnantke hat geschrieben:Aber ich denke es wäre besser wenn gleich die Benutzerfreundlichen URL erzeugt würden. Langfristig sollten die Modulentwickler dazu angehalten werden die "richtigen" URL zu verwenden.
Dem muss ich widersprechen. Durch Änderungen an den Modulen ist ja keinem gedient, wenn man die Contenido-Installation mal auf Webspace installieren muss, auf dem mod_rewrite nicht zur Verfügung steht.

stese
Beiträge: 1040
Registriert: Fr 3. Dez 2004, 17:47
Wohnort: München
Kontaktdaten:

Beitrag von stese » Do 22. Mär 2007, 09:58

für wen sind die module/erweiterungen gedacht: für die user die hier im forum hilfe suchen. naja und sind wir mal ehrlich: ich schätze von den aktiven foren-usern hier sind nichtmal ein dutzend dabei, die richtig programmieren können und auf deren code ich mich auch verlassen kann. viele postings zu haben bedeutet noch nciht gleich, auch gute qualität oder entsprechendes programmierwissen zu haben. die meisten user, die das hier nutzen werden, haben so gut wie gar keine ahnung mit programmierung. mein bundle wurde nun seit bestehen rund 10.000 mal runter geladen. und das fazit ist echt ernüchternd: das gros der user liest sich noch nicht mal die readme oder installationsanleitung durch. sobald ne kleinere änderung in modulen notwendig wird, streiken sie, weil dort einfach gefährliches halbwissen vorherrscht.

daher ist mein ansatz im laufe der zeit so gewachsen, dass ich möglichst keinen support habe (man sieht: der thread allein der 4.6er version ist 44 seiten lang). natürlich ist es schneller, wenn man die urls direkt ins modul pakt, aber ein codetechnisch unvorteilhaftes modul wie z.b. das navigationsmodul dann auch noch im quelltext anzupassen und jedem zu sagen wie er eine funktion zu verwenden hat, das ist einfach zu viel des guten.

wer mit meiner version direkt die module umschreiben will kann das auch einfach machen, es wird ja eh alles durch die gleiche methode gejagt:

Code: Alles auswählen

ModRewrite::build_new_url('client=' . $client . '&lang=' . $lang . '&idart=' . $idart);
damit entfällt das zeitraubende parsen am schluss des aufrufes. und zu guter letzt ein vorteil des kompletten bundles: zeitvorteil. ich verbringe eben nicht mehr bei umfangreichen projekten stunden damit die entsprechenden module anzupassen. die ganze ausgabe später durch ne cache engine zu jagen macht den gesschwindigkeitsverlust dann auch wieder wett.

jnantke
Beiträge: 13
Registriert: Di 30. Jan 2007, 14:56
Kontaktdaten:

Beitrag von jnantke » Do 22. Mär 2007, 11:20

Umso mehr spricht dafür in einer zukünftigen Version von Contenido das ganze fest zu integrieren (Contenido 5.0 ???) ...

Ich bin von der Idee hinter der Struktur von Contenido eigentlich sehr begeistert, Teilweise ist der Code aber recht verbaut und habe gestern schon mal ernsthaft nachgedacht das ganze nachzubauen ...

Aber ernsthaft. Ich denke wenn man das ganze Contenido mal in einer 5.0 Version komplett überarbeitet und ein paar Richtlinen für die Entwicklung aufstellt, könnte daraus das beste System auf dem Markt werden.
Und ich habe mich wahrlich schon mit anderen Systemen wie Typo3 herumschlagen dürfen ;-)

mvf
Beiträge: 1758
Registriert: Mo 1. Aug 2005, 00:35
Wohnort: in der schönen Hallertau, mitten im Hopfen
Kontaktdaten:

Beitrag von mvf » Do 22. Mär 2007, 11:59

was ich an stese so mag:
stese hat geschrieben:naja und sind wir mal ehrlich: ich schätze von den aktiven foren-usern hier sind nichtmal ein dutzend dabei, die richtig programmieren können und auf deren code ich mich auch verlassen kann.
... er ist grundehrlich ;)
Grüsse, Guido

"A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools."
Mostly Harmless - Douglas Adams

jnantke
Beiträge: 13
Registriert: Di 30. Jan 2007, 14:56
Kontaktdaten:

Beitrag von jnantke » Do 22. Mär 2007, 12:15

Naja, auf den Code verlassen ist so eine Sache ... selbst gute Programmierer machen Fehler.

Ich denke ein vernünftiger modularer Aufbau, eine verständliche Dokumentation und viel Testen durch unterschiedliche Personen machen ein gutes Produkt.

Ich will mich hier jetzt auch garnicht über die Schwächen im Code von Contenido auslassen, aber dort ist auch sicher einiges verbesserungswürdig.

Ich selber stelle jedenfalls auch fest, das ich über Code den ich vor 5 Jahren geschrieben habe heutte nurnoch lachen kann.

Man muss den Leuten auch die Möglichkeit geben an den Aufgaben zu wachsen. Nich jeder ist als guter Programmierer geboren worden. Aber gerade hier kann man mit Richtlinien zu rProgrammierung einiges an Anleitung geben. Zum Beispiel in dem man Regeln für die Benennung von Funktionen und globalen Variabelen aufstellt ...

Gesperrt