Page 1 sur 1

fonctions

Posté : 24 mai 2012, 11:53
par Thakandar
Salut à vous =). Je suis en BTS SIO (programmateur d'applications) et je suis actuellement en stage. Mon 1er travail est de traduire un "algo" que je ne comprends pas, quelqu'un pourrait-il m'aider?
Voici le code. Je recherche l'effet qu'aura cet algo sur une page de site (menu principal).
<?php
defined('_JEXEC') or die('Restricted access'); // no direct access

ob_start();
require_once realpath(dirname(__FILE__) . str_replace('/', DIRECTORY_SEPARATOR, '/../../../../modules/mod_mainmenu/tmpl/default.php'));
ob_clean();

if (!defined('modMainMenuArtxExtensions'))
{

	function modMainMenuArtXMLCallback(&$node, $args)
	{
		$options = $GLOBALS['modMainMenuArtXMLCallbackOptions'];
		if ($node->name() == 'li') {
			if (!$options['show_submenus'] && $node->level() == 1) {
				if ($ul = $node->getElementByPath('ul'))
					$node->removeChild($ul);
			}
			$liChildren = & $node->_children;
			if (count($liChildren) > 0) {
				// element                 ( $img?,                                          $span ( $text     )  )      )
				// <a href="...">          <img src="..." (align="left|right")? alt="..." />?<span><![CDATA[...]]></span></a>
				// <span class="separator"><img src="..." (align="left|right")? alt="..." />?<span><![CDATA[...]]></span></span>
				$element = & $liChildren[0];
				if ($element->_children[0]->name() == 'img') {
					$img = & $element->_children[0];
					$span = & $element->_children[1];
					$element->removeChild($img);
				} else {
					$img = null;
					$span = & $element->_children[0];
				}
				$element->removeChild($span);
				// convert separator to anchor
				if ($element->name() == 'span' && $element->attributes('class') == 'separator') {
					$element->_name = 'a';
					$element->addAttribute('href', '#');
					$element->addAttribute('onclick', ++++'return false;');
				}
				// add extra spans for top level items, required for design
				if ($element->level() == ($options['start'] + 1) * 2) {
					$lspan = & $element->addChild('span', array('class' => 'l'));
					$lspan->setData(' ');
					$rspan = & $element->addChild('span', array('class' => 'r'));
					$rspan->setData(' ');
					$tspan = & $element->addChild('span', array('class' => 't'));
					$container = & $tspan;
				} else {
					$container = & $element;
				}
				// to prevent span from collapsing
				$text = strlen($span->data()) == 0 ? ' ' : $span->data();
				// container is always <a ...>...</a> here
				if ($img != null) {
					$align = $img->attributes('align');
					if ($align == 'left' || $align == '') {
						$container->addChild('img', array('class' => 'art-metadata-icon',
							'src' => $img->attributes('src'),
							'style' => 'margin-right: 5px; vertical-align: middle;',
							'alt' => $img->attributes('alt')));
						$extraArtxSpan = & $container->addChild('artx-extra-span');
						$extraArtxSpan->setData($text);
					} else if ($align == 'right') {
						$extraArtxSpan = & $container->addChild('artx-extra-span');
						$extraArtxSpan->setData($text);
						$container->addChild('img', array('class' => 'art-metadata-icon',
							'src' => $img->attributes('src'),
							'style' => 'margin-left: 5px; vertical-align: middle;',
							'alt' => $img->attributes('alt')));
					}
				} else {
					$container->setData($text);
				}
			}

			modMainMenuXMLCallback($node, $args);

			// this should be after modMainMenuXMLCallback, because the callback sets class='active' and id='current'
			if ($options['vmenu'] !== null && !$options['vmenu']['simple']) {
				$class = $node->attributes('class');
				$isActive = $class && false !== strpos(' ' . $class, ' active');
				if ($node->attributes('id') != 'current' && !$isActive) {
					if ($ul = $node->getElementByPath('ul'))
						$node->removeChild($ul);
				}
			}

			$class = $node->attributes('class');
			if ($class && false !== strpos(' ' . $class, ' active')) {
				$element->addAttribute('class', 'active');
			}
		} else {
			modMainMenuXMLCallback($node, $args);
		}

	}

	function artxMenuDecorator($content)
	{
		$result = '';
		ob_start();
?>
<div class="art-nav">
	<div class="l"></div>
	<div class="r"></div>
<?php
		$result .= ob_get_clean() . $content;
		ob_start();
?>
</div>
<?php
		$result .= ob_get_clean();
		return $result;
	}


	define('modMainMenuArtxExtensions', true);
}

if (isset($attribs['name']) && $attribs['name'] == 'user3') {
	$GLOBALS['modMainMenuArtXMLCallbackOptions'] = array(
		'show_submenus' => $GLOBALS['artx_settings']['menu']['show_submenus'] && 1 == $params->get('showAllChildren'),
		'vmenu' => null,
		'start' => $params->get('startLevel')
	);
	$xml = modMainMenuHelper::getXML($params->get('menutype'), $params, 'modMainMenuArtXMLCallback');
	if ($xml) {
		$xml->addAttribute('class', 'art-menu');
		if ($tagId = $params->get('tag_id')) {
			$xml->addAttribute('id', $tagId);
		}
		$result = JFilterOutput::ampReplace($xml->toString((bool)$params->get('show_whitespace')));
		$result = str_replace(array('<ul/>', '<ul />', '<artx-extra-span>', '</artx-extra-span>'), '', $result);
		echo artxMenuDecorator($result);
	}
	unset($GLOBALS['tmp_menu_show_submenus']);
} else if ($params->get('moduleclass_sfx') == 'art-vmenu') {
	$GLOBALS['modMainMenuArtXMLCallbackOptions'] = array(
		'show_submenus' => $GLOBALS['artx_settings']['vmenu']['show_submenus'] && 1 == $params->get('showAllChildren'),
		'vmenu' => array('simple' => $GLOBALS['artx_settings']['vmenu']['simple']),
		'start' => $params->get('startLevel')
	);
	$xml = modMainMenuHelper::getXML($params->get('menutype'), $params, 'modMainMenuArtXMLCallback');
	if ($xml) {
		$xml->addAttribute('class', 'art-vmenu');
		if ($tagId = $params->get('tag_id')) {
			$xml->addAttribute('id', $tagId);
		}
		$result = JFilterOutput::ampReplace($xml->toString((bool)$params->get('show_whitespace')));
		$result = str_replace(array('<ul/>', '<ul />', '<artx-extra-span>', '</artx-extra-span>'), '', $result);
		echo $result;
	}
	unset($GLOBALS['tmp_menu_show_submenus']);
} else {
	modMainMenuHelper::render($params, 'modMainMenuXMLCallback');
}
Merci de votre aide. Cordialement, Thakandar

Re: fonctions

Posté : 24 mai 2012, 11:57
par piotrowski-s
qu'est-ce que tu ne comprends pas précisément?

ça c'est un mode de joomla. Pour afficher le menu.

Re: fonctions

Posté : 24 mai 2012, 12:01
par Thakandar
Oui je sais que c'est du joomla! car le site étudié est fait avec le CMS qu est Joomla! mais je ne comprends pas ce qu'est censé faire cet algo. Simplement afficher le menu principal ?

Re: fonctions

Posté : 24 mai 2012, 14:39
par sirakawa
Commence par isoler les fonctions.
et pour chacune ses paramètres en en identifiant le contenu + par exemple pour:
function modMainMenuArtXMLCallback(&$node, $args)
var_dump($node);
var_dump ($args);
le conrtenu de $options:
$options = $GLOBALS['modMainMenuArtXMLCallbackOptions'];
print_r($options);
et tu devrais commencer à y voir moins obscur.
&$node:
http://fr2.php.net/manual/fr/functions.arguments.php
Regarde aussi la doc de GLOBALS (http://fr2.php.net/manual/fr/reserved.v ... lobals.php) : c'est surtout parce que, moi, je ne savais pas trop si cette variable était encore d'actualité.
Il faudrait comprendre ce que c'est qu'un node dont le nom est li

Non compris que tu as une palanquée de fonctions maison (Joomla pas PHP) dont il serait sans doute utile de démêler le but comme:
getElementByPath...

Re: fonctions

Posté : 24 mai 2012, 15:09
par Thakandar
Je te remercie de ta réponse et m'y colle tout de suite =)