Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Помогите с Меню на php!
Форумы портала PHP.SU » Объявления » FreeLance » Помогите с Меню на php!

Страниц (1): [1]
 

1. haver077 - 25 Мая, 2007 - 11:38:56 - перейти к сообщению
Дома на сервере Apache работает меню, а на другом платном не работает, принцип работы php меню: наводишь на ссылку открывается под меню и все. Скрипт кода ниже:
или скачать приклепленный файл меню!


index.php:
<?php
require_once('menu.php');
require_once('mymenu.php');
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">
</head>
<body>
<TR>
<TD COLSPAN=2 background="images/bg2.gif">
<div style="padding-left:20;padding-top:12;padding-bottom:2"><?php $main->show(); ?></div> </TD>
</TR> и т.д.
</body>
</html>

menu.php
<?php

class menu {

var $image;
var $items;
var $open;
var $closed;
var $indent;
var $name;

function menu($image,
$name,
$open = '',
$closed = '',
$indent = ''
)
{
$this->items = array();
$this->image = $image;
$this->name = $name;
$this->open = $open;
$this->closed = $closed;
$this->indent = $indent;
}

function add($image, $href = "", $target = "") {
$n = count($this->items);

if (is_object($image)) {
$this->items[$n] = $image;
} else {
$this->items[$n]['image'] = $image;
$this->items[$n]['href'] = $href;
$this->items[$n]['target'] = $target;
}
}

function show($nest = 0) {
$urlimage = strtr ($this->name, ' ', '_');
$indent = '';
global $$urlimage;
global $PHP_SELF;
global $QUERY_STRING;

if ($nest) { // > php4
if(function_exists("str_repeat")){
$indent = str_repeat($this->indent, $nest);
} else { // php3
for($i=0; $i<$nest; $i++){
$indent = $indent . $this->indent;
}
}
}

if (isset($$urlimage)) {
printf('%s<a href="%s?%s">%s</a><br>',
$indent . $this->open,
basename ($PHP_SELF),
ereg_replace("{$urlimage}=&", '', $QUERY_STRING),
$this->image);
echo "n";

while (list(,$item) = each($this->items)) {
if (is_object($item)) {
$item->show($nest + 1);
} else {
printf('%s<a href="%s"%s>%s</a><br>',
$indent . $this->indent,
$item['href'],
(!empty($item['target']) ? ' target="' . $item['target'] . '"' : ''), $item['image']);
echo "n";
}
}
} else {
printf('%s<a href="%s?%s=&%s">%s</a><br>',
$indent . $this->closed,
basename ($PHP_SELF),
$urlimage, $QUERY_STRING,
$this->image);
echo "n";
}
}
}
?>

mymenu.php
<?php

$main = new menu('<a href="index.php?menu_1=&">Главная</a>', 'menu 1');
//$main->add('<img src="images/1.gif" width="40" height="1">submenu', "page1.php?$QUERY_STRING", '_self');
//$main->add('<img src="images/1.gif" width="40" height="1">submenu', "page2.php?$QUERY_STRING", '_self');
//$main->add('<img src="images/1.gif" width="40" height="1">submenu', "page3.php?$QUERY_STRING", '_self');


$main2 = new menu('МАМАК', 'menu 2');
$main2->add('<tr><td><img src="images/bg3-1.gif" width="40" height="1">');
$main2->add('<img src="images/bg3-1.gif" width="40" height="11">Об ассоциации', "page1.php?$QUERY_STRING", '_self');
$main2->add('<img src="images/bg3-1.gif" width="40" height="11">Основные цели', "page2.php?$QUERY_STRING", '_self');
$main2->add('<img src="images/bg3-1.gif" width="40" height="11">Основные задачи', "page3.php?$QUERY_STRING", '_self');
и т.д.
?>
2. evgenijj - 25 Мая, 2007 - 15:28:18 - перейти к сообщению
Классика:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $a = 2;
  4. function test()
  5. {
  6.     $a = 5;
  7.     echo "Локальная переменная ".$a."<br/>";
  8.     global $a;
  9.     echo "Глобальная переменная ".$a."<br/>";
  10.     $b = 7;
  11.     // Пытаемся объявить глобальной не существующую переменную
  12.     global $b;
  13.     if ( isset( $b ) )
  14.         echo "Переменная \\$b определена и равна ".$b."<br/>";
  15.     else
  16.         echo "Переменная \\$b не определена!<br/>";
  17. }
  18. test();
  19. ?>
  20.  

Результат работы:
Локальная переменная 5
Глобальная переменная 2
Переменная $b не определена!

А теперь посмотрим, что у нас внутри функции show()
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. function show($nest = 0)
  4. {    
  5.     $urlimage = strtr ($this->name, ' ', '_');
  6.     $indent = '';
  7.     global $urlimage;
  8.     global $PHP_SELF;
  9.     global $QUERY_STRING;
  10.     // ...............................
  11. ?>
  12.  

Ты объявляешь глобальной НЕОПРЕДЕЛЕННУЮ переменную $urlimage, а потом пытаешься проверить, установлена ли она - if (isset($urlimage))
3. haver077 - 26 Мая, 2007 - 13:35:47 - перейти к сообщению
а как нужно все это правильно выстраить, я просто новичек в пхп ? Спасибо!
4. evgenijj - 26 Мая, 2007 - 14:15:04 - перейти к сообщению
haver077 пишет:
а как нужно все это правильно выстраить, я просто новичек в пхп ? Спасибо!

PHP:
скопировать код в буфер обмена
  1.  
  2.  <?PHP
  3.  function show($nest = 0)  
  4.  {    
  5.      $urlimage = strtr ($this->name, ' ', '_');
  6.      $indent = '';
  7.      // global $urlimage;
  8.      global $PHP_SELF;
  9.      global $QUERY_STRING;
  10.      // ...............................
  11.  ?>
  12.  
5. haver077 - 26 Мая, 2007 - 15:01:31 - перейти к сообщению
я вставил этот код, а тот убрал, $$ в этом была проблема ? но меню все равно не работает ?
function show($nest = 0)
{
$urlimage = strtr ($this->name, ' ', '_');
$indent = '';
// global $urlimage;
global $PHP_SELF;
global $QUERY_STRING;
// ...............................

6. kamikadze - 28 Мая, 2007 - 12:13:02 - перейти к сообщению
Евгенй, есть вопрос! Смотри, использовать переменную изо вне можно лиш тогда когда мы предидущую с таким именем обьявим глобальной (ну это всё в случае если 2 переменных с одинаковыми именами) ?
7. evgenijj - 28 Мая, 2007 - 13:00:14 - перейти к сообщению
Что-то я ничего не понял.

Итак, есть некоторая переменная $a=5. Если эта переменная нам нужна внутри функции, мы ее должны туда передать:
$a = 5;
test1( $a );
function test1( $x )
{
echo $x;
}

Переменную можно передавать "по ссылке" и "по значению".

По значению - это означает, что внутрь функции передается КОПИЯ переменной. Если внутри функции мы изменяем значение этой копии, это никак не отражается на переменной вне функции:
$a = 5;
test2( $a );
echo $a;
function test2( $x )
{
$x = $x + 2;
}
Этот скрипт выведет значение переменной $a, т.е. 5

Передача "по ссылке" - все изменения внутри функции над переменной будут отражаться на переменной вне функции (внутрь функции передается не копия переменной, а ее адрес в оперативной памяти):

$a = 5;
test3( &$a );
echo $a;
function test3( $x )
{
$x = $x + 2;
}
Этот скрипт выведет значение переменной $a, т.е. 7

Передать переменную по ссылке можно еще так - это даже предпочтительнее

$a = 5;
test3( $a );
echo $a;
function test3( &$x )
{
$x = $x + 2;
}
Этот скрипт выведет значение переменной $a, т.е. 7

Еще один пример, чтобы стала понятной идея локальной области видимости переменной:
$a = 5;
test4();
echo $a."<br/>";
function test4()
{
$a = 10;
echo $a."<br/>";
}
Эти две переменные $a (внутри функции) и $a (вне функции) - разные. Этот скрипт сначала выведет значение 10, а потом 5.

Теперь по поводу конструкции global. Чтобы сделать внешнюю преременную (объявленную вне функции) доступной внутри функции, можно сделать так:
$a = 5;
test5();
echo $a."<br/>";
function test5()
{
global $a;
$a = $a + 5;
}
Этот скрипт выведет 10. Это очень похоже на передачу переменной по ссылке.

И. наконец, последнее:
$a = 5;
test6();
function test6()
{
$a = 10;
echo $a."<br/>";
global $a;
echo $a."<br/>";
}
Скрипт выведет сначала 10 (значение локальной переменной), а потом 5 (значение глобальной переменной). Глобальная переменная $a "перекрывает" значение локальной переменной $a.

А теперь - тот пример, что я приводил раньше:
PHP:
скопировать код в буфер обмена
  1.  
  2.  <?PHP
  3.  $a = 2;
  4.  function test()
  5.  {
  6.      $a = 5;
  7.      echo "Локальная переменная ".$a."<br/>";
  8.      global $a;
  9.      echo "Глобальная переменная ".$a."<br/>";
  10.      $b = 7;
  11.      // Пытаемся объявить глобальной не существующую переменную
  12.      global $b;
  13.      if ( isset( $b ) )  
  14.          echo "Переменная $b определена и равна ".$b."<br/>";
  15.      else
  16.          echo "Переменная $b не определена!<br/>";
  17.  }
  18.  test();
  19.  ?>
  20.  

Пременная $b неопределена, о чем нам и сообщает скрипт. Но PHP не выдает сообщение об ошибке (попытка использовать неопределенную переменную). Почему? Не знаю.

 

Powered by ExBB FM 1.0 RC1