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

#1 08. November 2012 10:50

stefanauskoeln
probiert CMS/ms aus
Registriert: 16. April 2012
Beiträge: 60

[GELÖST] Menümanager interner Link immer auf die erste untergeordnete Seite

Guten Morgen,

ich bin auf der Suche nach einer Lösung für folgendes "Problem".
Es wäre toll, wenn ihr mir auf die Sprünge helfen könntet.

Am Kopf der Internetseite gibt es eine Navigation mit den
Hauptthemen. Um von dort zu den Inhalten zu kommen,
habe ich die Seiten, die quasi die Hauptthemen sind, als
interne Linkseiten angelegt und die weiteren zum Thema
gehörenden Seiten dann als untergeordnete Seiten dort
jeweils hinterlegt.

Funktioniert auch, nur gebe ich beim internen Link immer
eine konkrete Zielseite an.

Wie löse ich es, damit bei einem Klick in der Hauptnavigation
nicht die konkrete Seite sondern immer die erste Seite in
der Untergruppe gezeigt wird.

Wenn ich die konkrete Seite lösche läuft der interne Link
in eine Fehlermeldung - praktischer wäre, wenn immer
die erste untergeordente Seite angezeigt wird.

Ich habe ein ganz aktuelle CMSms-Installation mit ganz
aktuellen Modulen (nur zur Info)

Ich bin dankbar für Input :-)

VG

Stefan

Offline

#2 08. November 2012 11:18

nockenfell
Moderator
Ort: Gontenschwil, Schweiz
Registriert: 09. November 2010
Beiträge: 2.934
Webseite

Re: [GELÖST] Menümanager interner Link immer auf die erste untergeordnete Seite

Das ist nicht ganz ohne. Folgender Lösungsansatz kann ich dir dazu bieten:

- Nimm als Seitentyp "Section Header"
- Modifiziere das Menütemplate wie folgt:

{elseif $node->type == 'sectionheader'}
{if $node->haschildren}
{udt_get_children_url currentpage=$node->alias}
<li><a href="{$childurl}" title="{$node->menutext}">{$node->menutext}</a>
{else}
<li class="sectionheader {if $node->depth == 1}f{$node->hierarchy}{/if}">{$node->menutext}{/if}

Der UDT muss ich noch bauen. Dazu kannst du z.B. im Modul ToolBox eine Vorlage finden. Ich melde mich, wenn ich den UDT entsprechend ergänzt habe.


[dieser Beitrag wurde mit 100% recycled bits geschrieben]
Mein Blog  /   Diverse Links rund um CMS Made Simple
Module: btAdminer, ToolBox

Offline

#3 09. November 2012 08:56

stefanauskoeln
probiert CMS/ms aus
Registriert: 16. April 2012
Beiträge: 60

Re: [GELÖST] Menümanager interner Link immer auf die erste untergeordnete Seite

Super, danke Dir! Bin sehr gespannt :-)

Beitrag geändert von stefanauskoeln (09. November 2012 08:57)

Offline

#4 09. November 2012 09:24

nockenfell
Moderator
Ort: Gontenschwil, Schweiz
Registriert: 09. November 2010
Beiträge: 2.934
Webseite

Re: [GELÖST] Menümanager interner Link immer auf die erste untergeordnete Seite

So. Hier nun meine 2Cents dazu:

- Installiere dir das Modul "ToolBox"
- Ersetze den Inhalt der Datei ./modules/ToolBox/lib/class.tbTools.php mit folgendem Inhalt:

<?php
/*======================================================================================
Module:		ToolBox
Title:		Extended tools class
Version:	1.1
Descript.:	Smarty-Extension for some useful functions
Last Mod.:	09.11.2012
Author:		Lukas Blatter
Email:		lukas.blatter@blattertech.ch
Notes:
Licence:	This program 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.
			However, as a special exception to the GPL, this software is distributed
			as an addon module to CMS Made Simple.  You may not use this software
			in any Non GPL version of CMS Made simple, or in any version of CMS
			Made Simple that does not indicate clearly and obviously in its admin
			section that the site was built with CMS Made Simple.
			Find more information about CMS Made Simple on its website:
			http://www.cmsmadesimple.org/
			This program 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.
			You should have received a copy of the GNU General Public License
			along with this program; if not, write to the Free Software
			Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
			Or read it online: http://www.gnu.org/licenses/licenses.html#GPL
======================================================================================*/

class tbTools
{
	/**
	 *
	 * Prüft, ob der angegebene Alias eine PageID ist und gibt den Alias zurück
	 * @param $alias
	 * @return string $alias
	 * @author: Lukas Blatter, 20.12.2011
	 */
	private final function getAlias($alias)
	{
		$gCms = cmsms();

		$manager = $gCms->GetHierarchyManager();
		$node = $manager->sureGetNodeByAlias($alias);
    	if (!isset($node)) {
			$node = $manager->sureGetNodeById($alias);
			if (isset($node))
				$alias = $node->get_tag($alias);
			else
				return false;
		}


		return $alias;
	}

	/**
	 * based on $cgsimple->self_url by Robert Campbell
	 * Gibt die aktuelle Seiten-URL zurück
	 * @param string $assign
	 * @return string / smarty assign
	 */
	public final function selfUrl($assign='')
	{
		$s = empty($_SERVER["HTTPS"]) ? '' : ($_SERVER["HTTPS"] == "on") ? "s" : "";
		$p = strpos($_SERVER['SERVER_PROTOCOL'],'/');
		$protocol = strtolower(substr($_SERVER['SERVER_PROTOCOL'],0,$p)).$s;
		$port = ($_SERVER["SERVER_PORT"] == "80") ? "" : (":".$_SERVER["SERVER_PORT"]);
		$s = $protocol."://".$_SERVER['SERVER_NAME'].$port;

		$url = $s.$_SERVER['REQUEST_URI'];
		if(!empty($assign)) {
			$gCms = cmsms();
			$smarty = $gCms->GetSmarty();
			$smarty->assign($assign,$url);
			return;
		}
		return $url;
	}


	/**
	 * based on $cgsimple->get_parent_alias by Robert Campbell
	 * Gibt den Alias der Parent Page oder den Alias der Parent Page einer definierten Seite zurück
	 * @param string $alias
	 * @param string $assign
	 */

	public final function getParentAlias($alias = '',$assign = '')
	{
		$gCms = cmsms();
		$contentops = $gCms->GetContentOperations();
		$smarty = $gCms->GetSmarty();

		if( $alias == '' ) {
			$alias = $smarty->get_template_vars('page_alias');
		}
		else
			$alias = $this->getAlias($alias);

		$content = $contentops->LoadContentFromAlias($alias);
		if( !is_object($content) ) return '';

		$parentid = $content->ParentId();
		if( $parentid <= 0 ) return '';
		$alias = $contentops->GetPageAliasFromId($parentid);

		if(!empty($assign)) {
			$smarty->assign($assign,$alias);
			return;
    	}
  		return $alias;
	}


	/**
	 * based on $cgsimple->get_root_alias() by Robert Campbell
	 * gibt den Page Alias der Rootseite (oberste Ebene) aktuellen oder einer definierten Seite zurück
	 * @param unknown_type $alias
	 * @param unknown_type $assign
	 */
	public final function getRootAlias($alias = '',$assign = '')
	{
		$gCms = cmsms();
		$contentops = $gCms->GetContentOperations();
		$smarty = $gCms->GetSmarty();

		if( $alias == '' ) {
			$alias = $smarty->get_template_vars('page_alias');
		}
		else
			$alias = $this->getAlias($alias);

  		$id = $contentops->GetPageIDFromAlias($alias);
		while( $id > 0 ) {
			$content = $contentops->LoadContentFromId($id);
			if( !is_object( $content ) ) return '';
			$alias = $content->Alias();
			$id = $content->ParentId();
		}

    	if(!empty($assign)) {
			$smarty->assign($assign,$alias);
			return;
		}
		return $alias;
	}


	/**
	 * gibt den Page Alias einer Parentseite auf einem bestimmten Level aus.
	 * @copyright Lukas Blatter
	 * @param string $alias
	 * @param string $assign
	 * @return string - page alias
	 */
	public final function getLevelAlias($level, $alias = '',$assign = '')
	{
		$gCms = cmsms();
		$contentops = $gCms->GetContentOperations();
		$smarty = $gCms->GetSmarty();

		if( $alias == '' ) {
			$alias = $smarty->get_template_vars('page_alias');
		}
		else
			$alias = $this->getAlias($alias);

  		$id = $contentops->GetPageIDFromAlias($alias);
		while( $id > 0 ) {
			$content = $contentops->LoadContentFromId($id);
			if( !is_object( $content ) ) return '';

			$pagelevel = substr_count($content->Hierarchy(),'.') + 1;
			$alias = $content->Alias();
			$id = $content->ParentId();

			if ($pagelevel == $level) {
				break;
			}
			else if ($pagelevel < $level) {
				return '';
			}
		}

    	if(!empty($assign)) {
			$smarty->assign($assign,$alias);
			return;
		}
		return $alias;
	}

	/**
	 * based on $cgsimple->get_page_title() by Robert Campbell
	 * Gibt den Seitentitel einer definierten Seite oder der aktuellen Seite zurück
	 * @param unknown_type $alias
	 * @param unknown_type $assign
	 */

	public final function getPageTitle($alias = '',$assign = '')
	{
		$gCms = cmsms();
		$contentops = $gCms->GetContentOperations();
		$smarty = $gCms->GetSmarty();

		if( $alias == '' ) {
			$alias = $smarty->get_template_vars('page_alias');
	    }
	    else
			$alias = $this->getAlias($alias);

		if(!$alias) return '';

		$content = $contentops->LoadContentFromAlias($alias);
		if( !is_object($content) ) return '';

		if(!empty($assign)) {
			$smarty->assign($assign,$content->Name());
			return;
	    }
		return $content->Name();
	}


	/**
	 * based on $cgsimple->get_page_menutext() by Robert Campbell
	 * Gibt den Menutext einer bestimmten Seite oder der aktuellen Seite zurück
	 * @param string $alias
	 * @param string $assign
	 */

	public final function getPageMenutext($alias = '',$assign = '')
	{
		$gCms = cmsms();
		$contentops = $gCms->GetContentOperations();
		$smarty = $gCms->GetSmarty();

		if( $alias == '' ) {
			$alias = $smarty->get_template_vars('page_alias');
		}
	    else
			$alias = $this->getAlias($alias);

		if(!$alias) return false;

		$content = $contentops->LoadContentFromAlias($alias);
		if( !is_object($content) ) return '';

		if(!empty($assign)) {
			$smarty->assign($assign,$content->MenuText());
			return;
	    }
		return $content->MenuText();
	}


	/**
	 * based on $cgsimple->has_children() by Robert Campbell
	 * Hat eine definierte oder die aktuelle Seite weitere Unterseiten?
	 * @param $alias
	 * @param $assign
	 */

	public final function hasChildren($alias = '',$assign = '')
	{
		$result = false;
		$gCms = cmsms();
		$contentops = $gCms->GetContentOperations();
		$smarty = $gCms->GetSmarty();

		if( $alias == '' ) {
			$alias = $smarty->get_template_vars('page_alias');
	    }
	    else
	    	$alias = $this->getAlias($alias);

	    if(!$alias) return false;

		$content = $contentops->LoadContentFromAlias($alias);
		if(is_object($content) )
			$result = $content->HasChildren();

		if(!empty($assign)) {
			$smarty->assign($assign,$result);
			return;
	    }
		return $result;
	}


	/**
	 * Gibt den Alias der ersten Childseite aus
	 * @param string $parentalias
	 * @param string $assign
	 * @copyright Lukas Blatter

	 */

	public final function getFirstChildAlias($parentalias = '', $assign = '')
	{
		$smarty = cmsms()->GetSmarty();

		$children = $this->getChildren($parentalias);

		if (!$children) return false;

		$alias = $children[0]['alias'];


		if(!empty($assign)) {
			$smarty->assign($assign,$alias);
			return;
	    }
		return $alias;
	}

	/**
	 * Gibt die URL einer definierten Seite aus
	 * @param string $alias
	 * @param string $assign
	 * @copyright Lukas Blatter

	 */

	public final function getPageUrl($alias = '', $assign = '')
	{
		$gCms = cmsms();
		$contentops = $gCms->GetContentOperations();
		$smarty = $gCms->GetSmarty();

		if( $alias == '' ) {
			$alias = $smarty->get_template_vars('page_alias');
		}
	    else
			$alias = $this->getAlias($alias);

		if(!$alias) return false;

		$content = $contentops->LoadContentFromAlias($alias);
		if( !is_object($content) ) return '';

		if(!empty($assign)) {
			$smarty->assign($assign,$content->GetURL());
			return;
	    }
		return $content->GetURL();
	}



	/**
	 * based on $cgsimple->get_children() by Robert Campbell
	 * Gibt einer Array mit den PageIds aller Child Seiten einer bestimmten Seite oder der aktuellen Seite zurück.
	 * @param string $alias
	 * @param boolean $showall
	 * @param string $assign

	 */

	public final function getChildren($alias = '',$showall = false, $assign = '')
	{
		$gCms = cmsms();
		$smarty = $gCms->GetSmarty();

		if( $alias == '' ) {
			$alias = $smarty->get_template_vars('page_alias');
		}
		else
			$alias = $this->getAlias($alias);

		if(!$alias) return false;

		$hm = cmsms()->GetHierarchyManager();
		$parent = $hm->getNodeByAlias($alias);
		if( !$parent ) { return false; }

		$child_nodes = $parent->getChildren(false,$showall);
		if( !is_array($child_nodes) || count($child_nodes) == 0 ) return false;

		$results = array();
		foreach( $child_nodes as $node ) {
			$content = $node->getContent();
			if( !is_object($content) ) continue;

			$row = array('alias'=>$content->Alias(),'id'=>$content->Id(),
		     'title'=>$content->Name(),'menutext'=>$content->MenuText(),
		     'show_in_menu'=>$content->ShowInMenu(),'type'=>$content->Type());
			$results[] = $row;
		}
		if( !count($results) ) return false;

		if(!empty($assign)) {
			$smarty->assign($assign,$results);
			return;
	    }
		return $results;
	}

	/**
	 * based on $cgsimple->get_page_content() by calguy1000
	 * Gibt den Inhalt eines bestimmten Content Blocks einer definierten Seite zurück
	 * @param string $alias - alias or id of a page
	 * @param string $block - name of the contentblock
	 * @param string $assign - name of assign variable
	 */

	public final function getPageContent($alias, $block = '',$assign = '')
	{
		$result = false;
		$gCms = cmsms();

		$alias = $this->getAlias($alias);
		if(!$alias) return false;

		$contentops = $gCms->GetContentOperations();
		$smarty = $gCms->GetSmarty();

		if( $block == '' ) $block = 'content_en';

		if( $alias != '' ) {
			$content = $contentops->LoadContentFromAlias($alias);
			if( is_object($content) ) {
				$result = $content->GetPropertyValue($block);
			}
	    }

		if(!empty($assign)) {
			$smarty->assign(trim($assign),$result);
			return;
		}
		return $result;
	}

	/**
	 * Hat Berechtigung in den definierten FEU UserGroups
	 * @param string $feugroups
	 * @param string $assign
	 * @return boolean true/false
	 * @author: Lukas Blatter, 20.12.2011
	 */

	public final function hasFeuGroupAccess($feugroups = '', $assign = '')
	{
		$gCms = cmsms();
		$smarty = $gCms->GetSmarty();

		if (!$feugroups) {
			if (!empty($assign)) {
				$smarty->assign(trim($assign),false);
				return;
			}
			return false;
		}


		$feusers = cms_utils::get_module('FrontEndUsers');

		if (!$feugroups or !is_Object($feusers)) {
			if (!empty($assign)) {
				$smarty->assign(trim($assign),false);
				return;
			}
			return false;
		}

		$user_id = $feusers->LoggedInId();
		$groups = $feusers->GetMemberGroupsArray($user_id);

		$gns = array();
		if($groups !== false ) {
		    foreach( $groups as $gid ) {
		        $gns[] = $gid['groupid'];
		    }
		}

		$feuArray= explode(',',$feugroups);
		$retval = false;
		foreach ($feuArray as $feu) {
			if (in_array($feu,$gns)) {
				if (!empty($assign)) {
					$smarty->assign(trim($assign),true);
					return;
				}
				return true;
			}
		}
		if (!empty($assign)) {
			$smarty->assign(trim($assign),false);
			return;
		}
		return false;

	}//if

	/**
	 * Ist der Benutzer eingeloggt
	 * @param string $assign
	 * @return int user_id
	 * @author: Lukas Blatter, 20.12.2011
	 */

	public final function isLoggedIn($assign = '')
	{
		$gCms = cmsms();
		$smarty = $gCms->GetSmarty();
		$feusers = cms_utils::get_module('FrontEndUsers');

		if (!is_object($feusers)) {
			if (!empty($assign)) {
				$smarty->assign(trim($assign),false);
				return;
			}
			return false;
		}//if

		$user_id = $feusers->LoggedInId();

		if ($user_id) {
			if (!empty($assign)) {
				$smarty->assign(trim($assign),true);
				return;
			}
			return true;
		}//if

		if (!empty($assign)) {
			$smarty->assign(trim($assign),false);
			return;
		}//if
		return false;

	}//function


	/**
	 * based on $cgsimple->get_silbing() by Robert Campbell
	 * Get prev sibling
	 * @param $dir
	 * @param $assign
	 * @param $alias
	 */

	public final function getSibling($dir,$assign = '',$alias = '')
	{
		$gCms = cmsms();
		$db = $gCms->GetDb();
		$smarty = $gCms->GetSmarty();
		$contentops = $gCms->GetContentOperations();

		if( empty($alias) ) {
			$alias = $smarty->get_template_vars('page_alias');
		}
		else
			$alias = $this->getAlias($alias);

		$content = $contentops->LoadContentFromAlias($alias);
		if( !is_object($content) ) return false;

		// get the last item out of the hierarchy
		// and rebuild
		$query = 'SELECT content_alias FROM '.cms_db_prefix().'content
				    WHERE parent_id = ?
				      AND item_order %s ?
				      AND active = 1
				    ORDER BY item_order %s
				    LIMIT 1';

		switch(strtolower($dir)) {
			case '-1':
				case 'prev':
					$thechar = '<';
					$order = 'DESC';
				break;

				default:
					$thechar = '>';
					$order = 'ASC';
				break;
		}//switch

		$res = $db->GetOne(sprintf($query,$thechar,$order),
		array($content->ParentId(),$content->ItemOrder()));
		if( !empty($assign) ) {
			$smarty->assign(trim($assign),$res);
			return;
		}//if
		return $res;
	}//function


	/**
	 *
	 * Wandelt ein Objekt in ein Array um
	 * @param $obj
	 * @return array
	 * @author Lukas Blatter
	 */

	protected final function object2array($obj)
	{
	    $_arr = is_object($obj) ? get_object_vars($obj) : $obj;
	    foreach ($_arr as $key => $val) {
	        $val = (is_array($val) || is_object($val)) ? $this->object2array($val) : $val;
	        $arr[$key] = $val;
	    }
	    return $arr;
	}

	/**
	 * Creates HTML table from multidimensional array
	 * based on http://www.terrawebdesign.com/multidimensional.php
	 *
	 * @param array $array
	 * @return string
	 */


	public final function getArrayAsTable($array)
	{
		$array = $this->object2array($array);

		$table = "<table>\n";
		$table .= $this->getArrayAsTableMakeRows($array, 1, 0);
		$table .= "</table>\n";
		return $table;

	}//function

	protected final function getArrayAsTableMakeRows($array, $level, $sub)
	{
		$string = "";

		if (is_array($array) == 1){          // check if input is an array
		      foreach($array as $key_val => $value) {
		          $offset = "";

		          if (is_array($value) == 1){   // array is multidimensional
		          	$string .= "<tr>";
		          	$offset = $this->getArrayAsTableDoOffset($level);
		          	$string .= $offset . "<td valign='top'>" . $key_val . "</td>";
		          	$string .= $this->getArrayAsTableMakeRows($value, $level+1, 1);
		          }else{                      //(sub)array is not multidim
		          	if ($sub != 1){          // first entry for subarray
		              $string .= "<tr>";
		              $offset = $this->getArrayAsTableDoOffset($level);
		          	}
		          	$sub = 0;
		          	$string .= $offset . "<td class='th' valign='top'>" . $key_val .
		              "</td><td valign='top'>" . $value . "</td>";
		          	$string .= "</tr>\n";
		          }
		      } //foreach $array
		 }//if

		return $string;

	}//function

	protected final function getArrayAsTableDoOffset($level)
	{
	    $offset = "";             // offset for subarry
	    for ($i=1; $i<$level;$i++){
	    $offset = $offset . "<td></td>";
	    }
	    return $offset;
	}//function



	/**
	 * based on $cgsimple->get_file_listing() by Robert Campbell
	 * Gibt den Inhalt eines bestimmten Ordners in einem Array zurück
	 * @param string $dir
	 * @param string $excludeprefix
	 * @param string $assign
	 */

	public final function getFileListing($dir,$excludeprefix='',$assign = '')
	{
		$gCms = cmsms();
		$smarty = $gCms->GetSmarty();
		$config = $gCms->GetConfig();

		$fileprefix = '';
		if( !empty($excludeprefix) ) {
			$fileprefix = $excludeprefix;
		}
		if( startswith($dir,'/') ) return;
		$dir = cms_join_path($config['uploads_path'],$dir);
		$list = get_matching_files($dir,'',true,true,$fileprefix,1);
		if( !empty($assign) ) {
			$smarty->assign(trim($assign),$list);
			return;
		}
		return $list;
	}//function
};// class

// EOF

Danach ergänze das Menütemplate wie folgt:

{elseif $node->type == 'sectionheader'}
{if $node->haschildren}
<li><a href="{$tbtools->getPageUrl($tbtools->getFirstChildAlias($node->alias))}" title="{$node->menutext}">{$node->menutext}</a>
{else}
<li class="sectionheader {if $node->depth == 1}f{$node->hierarchy}{/if}">{$node->menutext}{/if}

(Diese Ergänzung wird in das nächste Update der ToolBox einfliessen. Du kannst den Inhalt der Datei also bedenkenlos ersetzen)


[dieser Beitrag wurde mit 100% recycled bits geschrieben]
Mein Blog  /   Diverse Links rund um CMS Made Simple
Module: btAdminer, ToolBox

Offline

#5 09. November 2012 09:27

stefanauskoeln
probiert CMS/ms aus
Registriert: 16. April 2012
Beiträge: 60

Re: [GELÖST] Menümanager interner Link immer auf die erste untergeordnete Seite

Wow - ich probiere das gleich mal aus :-)

Bis hierhin schon mal ganz großen Dank!!!!!!!

Offline

#6 12. November 2012 11:50

stefanauskoeln
probiert CMS/ms aus
Registriert: 16. April 2012
Beiträge: 60

Re: [GELÖST] Menümanager interner Link immer auf die erste untergeordnete Seite

@nockenfell:

Du bist spitze! Klasse, das klappt prima!
Ich habe die Zeilen für das Menü-Template
in meinem Fall noch etwas zurecht gerückt.
Klappt nun auch prima mit Ausklapp-Menüs.

Du hast mich gerettet!!!!

1000 Dank!

Offline

#7 12. November 2012 11:53

nockenfell
Moderator
Ort: Gontenschwil, Schweiz
Registriert: 09. November 2010
Beiträge: 2.934
Webseite

Re: [GELÖST] Menümanager interner Link immer auf die erste untergeordnete Seite

Bitte. Es freut wenn die gemachte Arbeit gebraucht werden kann.


[dieser Beitrag wurde mit 100% recycled bits geschrieben]
Mein Blog  /   Diverse Links rund um CMS Made Simple
Module: btAdminer, ToolBox

Offline

#8 12. November 2012 12:10

stefanauskoeln
probiert CMS/ms aus
Registriert: 16. April 2012
Beiträge: 60

Re: [GELÖST] Menümanager interner Link immer auf die erste untergeordnete Seite

Nachtrag: Das funktioniert super, wenn ich nach der Abschnittsüberschrift
als Children eine einfach Seiten habe. Was aber, wenn da direkt noch mal eine
Abschnittsüberschrift kommt ...

Also

- Abschnittsüberschrift A
-- Abschnittsüberschrift AA
--- Child AA1
--- Child AA2
-- Abschnittsüberschrift AB
--- Child AB1
--- Child AB2


Die Struktur der Internet-Präsenz ist leider so verschachtelt ;-)

Kann man das lösen oder bleib ich dann hier besser bei den Seitenlinks?

Danke Dir noch mal sehr :-)

Offline

#9 12. November 2012 12:26

nockenfell
Moderator
Ort: Gontenschwil, Schweiz
Registriert: 09. November 2010
Beiträge: 2.934
Webseite

Re: [GELÖST] Menümanager interner Link immer auf die erste untergeordnete Seite

Tausche mal die Funktion getFirstChildAlias aus:

/**
	 * Gibt den Alias der ersten Childseite aus
	 * @param string $parentalias
	 * @param string $assign
	 * @param string $onlyInMenu
	 * @copyright Lukas Blatter

	 */

	public final function getFirstChildAlias($parentalias = '', $assign = '', $onlyInMenu=true)
	{
		$smarty = cmsms()->GetSmarty();

		$children = $this->getChildren($parentalias);

		if (!$children) return false;
			
		$alias = "";	
		foreach($children as $child) {
			if ($child['type'] == 'sectionheader' or $child['errorpage'] == 'sectionheader' or $child['type'] == 'separator' or $child['type'] == 'link') continue;
			else if ($onlyInMenu and $child['show_in_menu']) {
				$alias = $child['alias'];
				break;
			}
			else if (!$onlyInMenu) {
				$alias = $child['alias'];
				break;
			}
		}	
		if (!$alias) return false;

		if(!empty($assign)) {
			$smarty->assign($assign,$alias);
			return;
	    }
		return $alias;
	}

[dieser Beitrag wurde mit 100% recycled bits geschrieben]
Mein Blog  /   Diverse Links rund um CMS Made Simple
Module: btAdminer, ToolBox

Offline

#10 12. November 2012 12:37

stefanauskoeln
probiert CMS/ms aus
Registriert: 16. April 2012
Beiträge: 60

Re: [GELÖST] Menümanager interner Link immer auf die erste untergeordnete Seite

Fast ... gibt mir dann die URL der ersten Child-Seite in
der ersten Abschnittsüberschrift aus, aber nicht innerhalb
der übergeordneten Abschnittsüberschrift ...

Also ungefähr so (Auszug aus der momentanen Struktur):

- Abschnittsüberschrift A (Teil der Hauptnavigation)
-- Child A1
-- Child A2

- Abschnittsüberschrift B (Teil der Hauptnavigation)
-- Abschnittsüberschrift BA (Teil der Unternavigation)
--- Child BA1
--- Child BA2
-- Abschnittsüberschrift BB (Teil der Unternavigation)
--- Child BB1
--- Child BB2

Wenn ich in der Hauptnavigation nach Einsetzen Deiner Zeilen
auf die Abschnittsüberschrift B klicke, bekomme ich die URL
von Child A1 - und nicht von Child BA1.

Der Rest, also in der Unternavigation bzw. in der Hauptnavigation
ohne weitere untergeordnete Abschnittsüberschriften klappt prima.

Offline

#11 12. November 2012 12:46

nockenfell
Moderator
Ort: Gontenschwil, Schweiz
Registriert: 09. November 2010
Beiträge: 2.934
Webseite

Re: [GELÖST] Menümanager interner Link immer auf die erste untergeordnete Seite

Naja. Das ist nun wahrscheinlich eine Definitionsfrage was korrekt ist. Hier die dazu angepasste Version:

public final function getFirstChildAlias($parentalias = '', $assign = '', $onlyInMenu=true)
	{
		$smarty = cmsms()->GetSmarty();

		$children = $this->getChildren($parentalias);

		if (!$children) return false;

		$alias = false;
		foreach($children as $child) {
			if ($child['type'] == 'errorpage') continue;
			else if ($child['type'] == 'sectionheader' or $child['type'] == 'separator' or $child['type'] == 'link') {
				if ($this->hasChildren($child['alias'])) {
					$alias = $this->getFirstChildAlias($child['alias'],'',$onlyInMenu);
					if ($alias) break;
				}
			}
			else if ($onlyInMenu and $child['show_in_menu']) {
				$alias = $child['alias'];
				break;
			}
			else if (!$onlyInMenu) {
				$alias = $child['alias'];
				break;
			}
		}
		if (!$alias) return false;

		if(!empty($assign)) {
			$smarty->assign($assign,$alias);
			return;
	    }
		return $alias;
	}

[dieser Beitrag wurde mit 100% recycled bits geschrieben]
Mein Blog  /   Diverse Links rund um CMS Made Simple
Module: btAdminer, ToolBox

Offline

#12 12. November 2012 12:53

stefanauskoeln
probiert CMS/ms aus
Registriert: 16. April 2012
Beiträge: 60

Re: [GELÖST] Menümanager interner Link immer auf die erste untergeordnete Seite

Knaller! Passt ...

noch mal 1000 Dank!!!!!!!!!!

LG

Stefan

Offline

#13 13. November 2012 11:26

TheSidewinder
hat von CMS/ms gehört
Registriert: 13. November 2012
Beiträge: 5

Re: [GELÖST] Menümanager interner Link immer auf die erste untergeordnete Seite

Ist es möglich allein mit Unbearbeitetem Modul ToolBox, die Children-URL auszulesen ?

sowas wie getChildrenUrl meine ich.

Beitrag geändert von TheSidewinder (13. November 2012 11:28)

Offline

#14 13. November 2012 11:33

nockenfell
Moderator
Ort: Gontenschwil, Schweiz
Registriert: 09. November 2010
Beiträge: 2.934
Webseite

Re: [GELÖST] Menümanager interner Link immer auf die erste untergeordnete Seite

Nein. Wobei die ToolBox per se unbearbeitet ist, wenn der Entwickler eine Entwicklung aus der SVN Version direkt hier postet. Wie schon geschrieben, wird diese Ergänzung bei der nächsten ToolBox Version drin sein, genau so wie ich es hier im Beitrag veröffentlicht habe.

Zudem wäre die Funktion getChildrenUrl in etwa das gleiche wie getFirstChildrenAlias. Nur ist die Funktion via Alias sinnvoller, da damit mehr gemacht werden kann.

Mit der von dir angeregten Erweiterung gibt es neu
- getFirstChildrenAlias
- getPageUrl


[dieser Beitrag wurde mit 100% recycled bits geschrieben]
Mein Blog  /   Diverse Links rund um CMS Made Simple
Module: btAdminer, ToolBox

Offline

#15 13. November 2012 11:35

TheSidewinder
hat von CMS/ms gehört
Registriert: 13. November 2012
Beiträge: 5

Re: [GELÖST] Menümanager interner Link immer auf die erste untergeordnete Seite

Gibt es denn eine möglichkeit, alle Children auszulesen und als Verlinkung in ein zweites Menü "einzubetten" ?

Beitrag geändert von TheSidewinder (13. November 2012 11:37)

Offline

#16 13. November 2012 11:44

nockenfell
Moderator
Ort: Gontenschwil, Schweiz
Registriert: 09. November 2010
Beiträge: 2.934
Webseite

Re: [GELÖST] Menümanager interner Link immer auf die erste untergeordnete Seite

$tbtools->getChildren()


[dieser Beitrag wurde mit 100% recycled bits geschrieben]
Mein Blog  /   Diverse Links rund um CMS Made Simple
Module: btAdminer, ToolBox

Offline

#17 13. November 2012 11:57

TheSidewinder
hat von CMS/ms gehört
Registriert: 13. November 2012
Beiträge: 5

Re: [GELÖST] Menümanager interner Link immer auf die erste untergeordnete Seite

Ich habe jetzt diesen Code:

{* CSS classes used in this template: .currentpage - The active/current page .bullet_sectionheader - To style section header hr.separator - To style the ruler for the separator *}
{if $count > 0}
{$tbtools->hasChildren("","hasChildren")}
{if $hasChildren} {assign var='children' value=$tbtools->getChildren()} 
<li><a ><span class="sectionheader">{$children}</span></a> 
{/if} 
{/if}

Wenn ich ihn anwende wird nur Ein Stichpunkt mit Array angezeigt...

Beitrag geändert von TheSidewinder (13. November 2012 11:58)

Offline

#18 13. November 2012 12:06

nockenfell
Moderator
Ort: Gontenschwil, Schweiz
Registriert: 09. November 2010
Beiträge: 2.934
Webseite

Re: [GELÖST] Menümanager interner Link immer auf die erste untergeordnete Seite

Ich zitiere die Hilfe von ToolBox (Smarty-Tools):

hasChildren([$alias],[$assign])

Prüft, ob eine festgelegte Seite untergeordnete Seiten hat.

Argumente:

    [$alias] - (optional) der Seiten-Alias oder die ID der zu prüfenden Seite. Wenn kein Wert festgelegt wurde, wird die aktuelle Seite verwendet.
    [$assign] - (optional) der Name der Variable, der das Ergebnis zugewiesen werden soll.


Beispiel:

{$tbtools->hasChildren("","hasChildren")}
    	{if $hasChildren}Die aktuelle Seite hat untergeordnete Seiten{else}Die aktuelle Seite hat keine untergeordneten Seiten{/if}

getChildren([$alias],[$showinactive],[$assign])

Gibt ein Array zurück, welches Informationen über die untergeordneten Seiten enthält (falls vorhanden)

Arguments:

    [$alias] - (optional) der Seiten-Alias oder die ID der zu prüfenden Seite. Wenn kein Wert festgelegt wurde, wird die aktuelle Seite verwendet.
    [$showinactive] - (optional) hier kann eingestellt werden, ob inaktive Seiten im Ergebnis enthalten sein sollen (Standard ist false).
    [$assign] - (optional) der Name der Variable, der das Ergebnis zugewiesen werden soll.


Felder:

  • alias - der Seiten-Alias der untergeordneten Seite

  • id - die Seiten-ID der untergeordneten Seite

  • title - der Seitentitel der untergeordneten Seite

  • menutext - der Menütext der untergeordneten Seite

  • show_in_menu - ist die Unterseite im Menü sichtbar.

  • type - Typ des Content Elements.

Beispiel:

{$tbtools->getChildren("","","children")}
{if count($children)}
   {foreach from=$children item="child"}
      {if $child.show_in_menu}
        Untergeordnete Seite:  id = {$child.id} Alias = {$child.alias}

      {/if}
   {/foreach}
{/if}

Beachte, dass dies nur die Children der nächsten Ebene ausliest. Nicht die Children aller Ebenen.


[dieser Beitrag wurde mit 100% recycled bits geschrieben]
Mein Blog  /   Diverse Links rund um CMS Made Simple
Module: btAdminer, ToolBox

Offline

#19 13. November 2012 12:08

TheSidewinder
hat von CMS/ms gehört
Registriert: 13. November 2012
Beiträge: 5

Re: [GELÖST] Menümanager interner Link immer auf die erste untergeordnete Seite

Ok, ich habs hingekriegt:

{* CSS classes used in this template:
.currentpage - The active/current page
.bullet_sectionheader - To style section header
hr.separator - To style the ruler for the separator *} 
{if $count > 0}
 
{$tbtools->hasChildren("","hasChildren")}
    	{if $hasChildren}
         {$tbtools->getChildren("","","children")}
        {foreach from=$children item="child"}
      {if $child.show_in_menu}
<ul>
         <li><a href="EureURL/index.php?page={$child.alias}"><span class="sectionheader">{$child.title}</span></a></li>
</ul>
      {/if}
       {/foreach}
{/if}

{/if}

Danke für die Hilfe.

Beitrag geändert von TheSidewinder (13. November 2012 12:11)

Offline

#20 13. November 2012 12:21

nockenfell
Moderator
Ort: Gontenschwil, Schweiz
Registriert: 09. November 2010
Beiträge: 2.934
Webseite

Re: [GELÖST] Menümanager interner Link immer auf die erste untergeordnete Seite

Sauberer wäre

{* CSS classes used in this template:
.currentpage - The active/current page
.bullet_sectionheader - To style section header
hr.separator - To style the ruler for the separator *} 
{if $count > 0}
 
{$tbtools->hasChildren("","hasChildren")}
    	{if $hasChildren}
         {$tbtools->getChildren("","","children")}
        {foreach from=$children item="child"}
      {if $child.show_in_menu}
<ul>
         <li><a href="{$tbtools->getPageUrl($child.alias)}"><span class="sectionheader">{$child.title}</span></a></li>
</ul>
      {/if}
       {/foreach}
{/if}

{/if}

-> Die URL über die Funktion $tbtools->getPageUrl aufrufen


[dieser Beitrag wurde mit 100% recycled bits geschrieben]
Mein Blog  /   Diverse Links rund um CMS Made Simple
Module: btAdminer, ToolBox

Offline

#21 14. November 2012 05:45

Andynium
Moderator
Ort: Dohna / SN / Deutschland
Registriert: 13. September 2010
Beiträge: 7.018
Webseite

Re: [GELÖST] Menümanager interner Link immer auf die erste untergeordnete Seite

TheSidewinder schrieb:

Gibt es denn eine möglichkeit, alle Children auszulesen und als Verlinkung in ein zweites Menü "einzubetten" ?

Ähmm, das kann doch der MenüManager auch ohne ein zusätzliches Modul ... musst nur die entsprechenden Parameter mitgeben.

Offline

#22 23. November 2012 11:26

stefanauskoeln
probiert CMS/ms aus
Registriert: 16. April 2012
Beiträge: 60

Re: [GELÖST] Menümanager interner Link immer auf die erste untergeordnete Seite

Hallo Nockenfell,

Deine Hilfe war echt klasse! Danke noch mal dafür ...

Aber ich habe noch eine Frage: Gibt es noch die Möglichkeit
festzustellen, ob eine Child-Seite aktive oder inaktiv ist?
Wenn z.B. die erste inaktiv ist, das dann automatisch die zweite
(also erste aktive) genommen wird?

Ich würde gerne eine Zeitsteuerung über AdvancedContent
einbinden und damit die Seite nach dem Verfallsdatum inaktiv
stellen ... dann ist sie aber noch im System und wird über den
Menümanager noch als Link angegeben - was dann in einen Fehler
läuft ...

Danke Dir für die Hilfe :-)

Offline

#23 24. November 2012 21:35

nockenfell
Moderator
Ort: Gontenschwil, Schweiz
Registriert: 09. November 2010
Beiträge: 2.934
Webseite

Re: [GELÖST] Menümanager interner Link immer auf die erste untergeordnete Seite

Das ist möglich. Ich habe dazu die Funktionen noch ein klein wenig erweitert:

	/**
	 * Gibt den Alias der ersten Childseite aus
	 * @param string $parentalias
	 * @param string $assign
	 * @param string $onlyInMenu
	 * @copyright Lukas Blatter

	 */

	public final function getFirstChildAlias($parentalias = '', $assign = '', $onlyInMenu=true)
	{
		$smarty = cmsms()->GetSmarty();

		$children = $this->getChildren($parentalias);

		if (!$children) return false;

		$alias = false;
		foreach($children as $child) {
			if (!$child['active']) continue; // inative Seiten überspringen
			else if ($child['type'] == 'errorpage') continue; // Error-Pages überspringen
			else if ($child['type'] == 'sectionheader' or $child['type'] == 'separator' or $child['type'] == 'link') { // Bei Typ Sectionheader, Spearator oder Link, schauen ob es Unterseiten gibt.
				if ($this->hasChildren($child['alias'])) {
					$alias = $this->getFirstChildAlias($child['alias'],'',$onlyInMenu);
					if ($alias) break;
				}
			}
			else if ($onlyInMenu and $child['show_in_menu']) {
				$alias = $child['alias'];
				break;
			}
			else if (!$onlyInMenu) {
				$alias = $child['alias'];
				break;
			}
		}
		if (!$alias) return false;

		if(!empty($assign)) {
			$smarty->assign($assign,$alias);
			return;
	    }
		return $alias;
	}

	/**
	 * based on $cgsimple->get_children() by Robert Campbell
	 * Gibt einer Array mit den PageIds aller Child Seiten einer bestimmten Seite oder der aktuellen Seite zurück.
	 * @param string $alias
	 * @param boolean $showall
	 * @param string $assign

	 */

	public final function getChildren($alias = '',$showall = false, $assign = '')
	{
		$gCms = cmsms();
		$smarty = $gCms->GetSmarty();

		if( $alias == '' ) {
			$alias = $smarty->get_template_vars('page_alias');
		}
		else
			$alias = $this->getAlias($alias);

		if(!$alias) return false;

		$hm = cmsms()->GetHierarchyManager();
		$parent = $hm->getNodeByAlias($alias);
		if( !$parent ) { return false; }

		$child_nodes = $parent->getChildren(false,$showall);
		if( !is_array($child_nodes) || count($child_nodes) == 0 ) return false;

		$results = array();
		foreach( $child_nodes as $node ) {
			$content = $node->getContent();
			if( !is_object($content) ) continue;

			$row = array('alias'=>$content->Alias(),'id'=>$content->Id(),
		     'title'=>$content->Name(),'menutext'=>$content->MenuText(),
		     'show_in_menu'=>$content->ShowInMenu(),'active' =>$content->Active(),'type'=>$content->Type());
			$results[] = $row;
		}
		if( !count($results) ) return false;

		if(!empty($assign)) {
			$smarty->assign($assign,$results);
			return;
	    }
		return $results;
	}

Nun werden bei der getFirstChildAlias inative Seiten übersprungen. Beim getChildern gibt es neu den Parameter $child.active


[dieser Beitrag wurde mit 100% recycled bits geschrieben]
Mein Blog  /   Diverse Links rund um CMS Made Simple
Module: btAdminer, ToolBox

Offline

#24 26. November 2012 09:12

stefanauskoeln
probiert CMS/ms aus
Registriert: 16. April 2012
Beiträge: 60

Re: [GELÖST] Menümanager interner Link immer auf die erste untergeordnete Seite

Perfekt!!!!

Noch mal 1000 Dank für Deine Hilfe!!!!!!

VG

Stefan

Offline

#25 26. November 2012 09:27

nockenfell
Moderator
Ort: Gontenschwil, Schweiz
Registriert: 09. November 2010
Beiträge: 2.934
Webseite

Re: [GELÖST] Menümanager interner Link immer auf die erste untergeordnete Seite

Das ganze ist übrigens im aktuellen Release von ToolBox 1.3.0 enthalten
http://dev.cmsmadesimple.org/project/fi … ckage-1070


[dieser Beitrag wurde mit 100% recycled bits geschrieben]
Mein Blog  /   Diverse Links rund um CMS Made Simple
Module: btAdminer, ToolBox

Offline