fonctions

Thakandar
Invité n'ayant pas de compte PHPfrance

24 mai 2012, 11:53

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

Mammouth du PHP | 702 Messages

24 mai 2012, 11:57

qu'est-ce que tu ne comprends pas précisément?

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

Thakandar
Invité n'ayant pas de compte PHPfrance

24 mai 2012, 12:01

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 ?

Mammouth du PHP | 2278 Messages

24 mai 2012, 14:39

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...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Thakandar
Invité n'ayant pas de compte PHPfrance

24 mai 2012, 15:09

Je te remercie de ta réponse et m'y colle tout de suite =)