[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Подскажите какая в этом коде ошибка?
Gotar
Всем привет!

Написал CMS, однако во время верстки, чтобы корректно отображалась полоса состояния пришлось в php файле вставить ява-код.

Вот отрывок этого кода:

echo "<script language='JavaScript'>";
echo "if (screen.width == 1680) {document.write('$width = 710;');}";
echo "else if (screen.width == 1440) {document.write('$width = 612;');}";
echo "else if (screen.width == 1280) {document.write('$width = 540;');}";
echo "else if (screen.width == 1024) {document.write('$width = 433;');}";
echo "</script>";
$bar_size = ceil($width * ($team['now_number']/$team['min_number']));
$bar_offset = ceil(5*($team['now_number']/$team['min_number']));


Поясню что тут за что отвечает:

$team['now_number'] - текущее кол-во купленных предметов.
$team['min_number'] - минимальное кол-во купленных предметов чтобы "акция" состоялась.

и переменная $width - собственно здесь указывается сама ширина картинки.

Потом все эти переменные передаются в html-файл, где:

<div class="progress-left" style="width:{$bar_size-$bar_offset}px;">


как вы видите от значения этих переменных и зависит сама ширина картинки.

Ошибка в том, что когда запускаю данную страницу, то ширина картинки вовсе не меняется. А вверху страницы выводится просто результат, который при ширине экрана: 1440 равняется просто: = 612; (<=вот именно эта строчка "= 612; " и выводится у меня на сайте).

Без использования ява-скрипта все работает нормально. С ним...вот такая вот ерудна.

Подскажите, в чем может быть причина?



Спустя 1 час, 5 минут, 8 секунд (13.09.2011 - 15:54) Gotar написал(а):
Вывел на экран содержимое переменной $bar_size с помощью printf. Мне вывелась данная переменная с пустым значением...

Неужели никто не знает или просто не хочет помочь?

Если второе, то для чего тогда создавался этот форум, если люди просто просматривают эту тему и не делятся советами? smile.gif

Спустя 12 минут, 49 секунд (13.09.2011 - 16:07) inpost написал(а):
Gotar
Переписал: ты думаешь, что за час вокруг твоей темы должны собраться толпы людей, спящие проснуться, работающие бросить свои места? Ты ведь центр земли, все должны бросать свои дела и помогать тебе, правильно?

Спустя 1 минута, 36 секунд (13.09.2011 - 16:09) Gotar написал(а):
inpost спят в это время?)) я конечно извиняюсь, возможно, у нас часовые пояса разные. Например у меня сейчас 17:08.

PS: а кем ты тогда себя считаешь, если позволяешь себе грубить другим?)) или администраторам можно все?

я вроде нормально спросил, а ты так ответил wink.gif

PSS: вот ты вроде админ этого форума => знаешь php (теоретически) оч. хорошо. Тогда вместо грубости можно было бы просто написать ошибку в одну строчку. Это заняло бы гораааздо меньше времени на написание ответа, чем то, что ты написал). И у меня бы вопросов больше не было, и другим не пришлось бы ничего писать.

Или скажешь я не прав?

Спустя 4 минуты, 45 секунд (13.09.2011 - 16:13) inpost написал(а):
у меня 15:57, я встал пол часа назад, первым делом пошел кушать, потом умываться, вот открыл форум посмотреть, что тут нового. А другие в это время завалены работой, или ты хочешь, чтобы тебе помогали беззаботные безработные и никому ненужные люди, которые не отрываясь от форума ждут, кому бы ответить? К тому же этот форум посещают и американцы, и немцы, есть из дальней России, есть украинцы, есть евреи (израильтяне), есть грузины, а ты замкнулся на своем часовом поясе, не находишь?

Ладно офф.топить, по теме: переменная пустая, вот и ничего не выводит, выводит пустое место. $width тоже пустая, как и $bar_size , я не увидел в предоставленном скрипте, где ты определяешь их значения.

Спустя 56 секунд (13.09.2011 - 16:14) caballero написал(а):
ты тупо смешал клиентский и серверный скрипт.
естественно если переменная $witch пустая так она и не покажется

Цитата
{document.write('width = 612;');}";
- так правильно
иначе в браузере будет (можешь сам уюедится просмотрев исходник страницы в браузере)
Цитата
{document.write('width = 612;');}";


и внизу будет пусто - ты ж умножаешь на пустое значение

document.write вместо этого для сообщений лучше alert юзать

Спустя 2 минуты, 18 секунд (13.09.2011 - 16:17) sadon написал(а):
Ява скрипт выполняется (в большинстве случаев) после загрузки страницы на пользовательской стороне.
А вы патаетесь присвоить переменной $width значение из JS

и к тому же
$width - это для JS неправильно

Спустя 35 секунд (13.09.2011 - 16:17) Gotar написал(а):
inpost, поясню. Данные для массивов:
$team['now_number']
и $team['min_number'] берутся из таблицы в БД. Следовательно, пустыми они быть не могут впринципе.

Если без использования ява-скрипта все работает нормально, то С ним - перестает работать.

И как переменная $width может быть пустой если я присваиваю ей значение в зависимости от ширины экрана?

Спустя 31 секунда (13.09.2011 - 16:18) inpost написал(а):
Я промолчу насчет твоего заявления.
ПХП обрабатывается на сервере, участия в этом не принимает JS, потом готовый код отправляется клиенту, где запускается HTML + CSS + JS.
Каким образом ты пытаешься подставить ширину сюда:
<div class="progress-left" style="width:{$bar_size-$bar_offset}px;"> ? И что это за фигурные скобки, в какой конструкции ты пытаешься это вывести? Откуда берётся эта переменная, что должна подставиться в этот участок? JS ещё не отработал, данные с JS ты получить не можешь, а значит разрешение экрана ты никак не узнаешь у посетителя, то данные откуда подставляются? Обычно пишется так: <?php echo $bar_size; ?> , а у тебя просто фигурные скобки.

Спустя 1 минута, 20 секунд (13.09.2011 - 16:19) inpost написал(а):
"И как переменная $width может быть пустой если я присваиваю ей значение в зависимости от ширины экрана?"
Ты не показал строчки в PHP, где ты пытаешься её присвоить.Поэтому я не знаю, откуда у тебя она берётся.

Спустя 33 секунды (13.09.2011 - 16:20) Gotar написал(а):
sadon, поясни почему неправильно?

Если говорить по-русски, то мы имеем несколько условий:

1) если ширина экрана = 1680, то просто печатаем строчку $width = 710;
2) в противном случае если ширина экрана = 1440, то.....

и так далее...

если неправильно, тогда как правильно?

Спустя 8 минут (13.09.2011 - 16:28) inpost написал(а):
не строчку $width = 710, а значение $width (которое у тебя пустое), а потом "= 710", вот и получаешь так.

echo 'if (screen.width == 1680) {document.write(\'$width = 710;\');}';
- вот так выведется на экран именно $width, а не её значение.

Спустя 4 минуты, 51 секунда (13.09.2011 - 16:33) Gotar написал(а):
Вот отрывок HTML - кода, где фигурируют переменные из PHP - файла:
<!--{if $team['state']=='none'}-->
<div class="deal-box deal-status" id="deal-status">
<p
class="deal-buy-tip-top">Куплено: <strong>{$team['now_number']}</strong></p>

<div
class="progress-bar"><div class="progress-left" style="width:{$bar_size-$bar_offset}px;"></div></div>

<p
style="position:relative; z-index:2;" class="deal-buy-tip-btm">Осталось купить: <strong>{$team['min_number']-$team['now_number']}</strong></p>
</div>

<!--{else}-->
<div class="deal-box deal-status deal-status-open" id="deal-status">
<p
class="deal-buy-tip-top">Куплено: <strong>{$team['now_number']}</strong></p>
<!--{if $team['max_number']&&$team['max_number']>$team['now_number']}-->
<p class="deal-buy-tip-btm">Осталось купить:<strong>{$team['max_number']-$team['now_number']}</strong></p>
<!--{/if}-->


Данные для этого HTML-файла берутся из PHP-файла.

этот HTML - файл подключается к PHP при помощи инструкции include

в итоге получается своеобразная MVC - модель.

Вот полный код PHP - файла до изменения:

<?php
require_once(dirname(__FILE__) . '/app.php');

$id = abs(intval($_GET['id']));
if (!$id || !$team = Table::FetchForce('team', $id) ) {
redirect( WEB_ROOT . '/team/index.php');
}

/* refer */
if ($_rid = abs(intval($_GET['r']))) {
if($_rid) cookieset('_rid', abs(intval($_GET['r'])));
redirect( WEB_ROOT . "/team.php?id={$id}");
}
$teamcity = Table::Fetch('category', $team['city_id']);
$city = $teamcity ? $teamcity : $city;
$city = $city ? $city : array('id'=>0, 'name'=>'Все города');

$pagetitle = $team['title'];

$discount_price = $team['market_price'] - $team['team_price'];
$discount_rate = team_discount($team);

$left = array();
$now = time();

if($team['end_time']<$team['begin_time']){$team['end_time']=$team['begin_time'];}

$diff_time = $left_time = $team['end_time']-$now;
if ( $team['team_type'] == 'seconds' && $team['begin_time'] >= $now ) {
$diff_time = $left_time = $team['begin_time']-$now;
}

$left_day = floor($diff_time/86400);
$left_time = $left_time % 86400;
$left_hour = floor($left_time/3600);
$left_time = $left_time % 3600;
$left_minute = floor($left_time/60);
$left_time = $left_time % 60;

/* progress bar size */

[color=blue]$width = 710;

$bar_size = ceil($width * ($team['now_number']/$team['min_number']));
$bar_offset = ceil(5*($team['now_number']/$team['min_number']));
$partner = Table::Fetch('partner', $team['partner_id']);
$team['state'] = team_state($team);[/color]

/* your order */
if ($login_user_id && 0==$team['close_time']) {
$order = DB::LimitQuery('order', array(
'condition' => array(
'team_id' => $id,
'user_id' => $login_user_id,
'state' => 'unpay',
),

'one' => true,
));

}
/* end order */

/* team_type */

if ($team['team_type'] == 'seconds') {
die(include template('team_view_seconds'));
}
if ($team['team_type'] == 'goods') {
die(include template('team_view_goods'));
}
/*/team_type */

$condition = array('team_id = '.$team['id']);

$comments_count = Table::Count('comment', $condition);
list($pagesize, $offset, $pagestring) = pagestring($comments_count, 10);

$comments = DB::LimitQuery('comment', array(
'condition' => $condition,
'order' => 'ORDER BY create_time DESC',
'size' => $pagesize,
'offset' => $offset,
));


$user_ids = Utility::GetColumn($comments, 'user_id');
$users = Table::Fetch('user', $user_ids);

/*seo*/
$seo_title = $team['seo_title'];
$seo_keyword = $team['seo_keyword'];
$seo_description = $team['seo_description'];
/*end*/
include template('team_view');





Спустя 7 минут, 54 секунды (13.09.2011 - 16:40) inpost написал(а):
Gotar
Что за движек? Ты уверен, что именно так надо выводить: {$bar_size-$bar_offset} ?
Ты пишешь вопрос из песочницы, а код показываешь сложный, забавный ты smile.gif У тебя точно инициализируется переменная до вывода? Попробуй её вывести до инклюда, если работает, то значит та конструкция по выводу переменных - неправильная, посмотри как надо выводить.
Если банально инклюдишь файл, то там достаточно было бы: <?php echo $bar_size; ?>, но у тебя запускается функция template, и фиг его знает, что она делает.

Спустя 2 минуты, 1 секунда (13.09.2011 - 16:42) Gotar написал(а):
В общем, если так оно все плохо... Тогда посоветуйте как мне подставлять в переменную $width значения в зависимости от ширины экрана. PHP кодом (насколько я знаю) нельзя это сделать. Остается тогда применение ява-скрипта. Но и оно, как мы видим, ничего не дает.

Тогда как?

Спустя 5 минут, 24 секунды (13.09.2011 - 16:48) Gotar написал(а):
inpost, вот что делает функция template:


function template($tFile) {
global $INI;
if ( 0===strpos($tFile, 'manage') ) {
return __template($tFile);
}
if ($INI['skin']['template']) {
$templatedir = DIR_TEMPLATE. '/' . $INI['skin']['template'];
$checkfile = $templatedir . '/html_header.html';
if ( file_exists($checkfile) ) {
return __template($INI['skin']['template'].'/'.$tFile);
}
}

return __template($tFile);
}


Она просто указывает на путь к папке template с html-файлами. Еще проверяет наличие файла: html_header.html и если файл найден, тогда...думаю мне тут разжевывать ничкому, ничего не надо.

Дураков тут нет :)

Спустя 7 минут, 6 секунд (13.09.2011 - 16:55) Gotar написал(а):
Вопрос остается открытым:

В общем, если так оно все плохо... Тогда посоветуйте как мне подставлять в переменную $width значения в зависимости от ширины экрана. PHP кодом (насколько я знаю) нельзя это сделать. Остается тогда применение ява-скрипта. Но и оно, как мы видим, ничего не дает.

Тогда как?

Спустя 11 минут, 33 секунды (13.09.2011 - 17:06) Игорь_Vasinsky написал(а):
inpost
первым делом пошел кушать, потом умываться

потом проснулся biggrin.gif

Спустя 2 минуты, 19 секунд (13.09.2011 - 17:09) inpost написал(а):
Игорь_Vasinsky
зубы чистить надо после еды. Если сначала завтракаешь, потом вычищаешь зубы от еды, тогда они менее портятся, а если сначала чистишь зубы, а потом завтракаешь, то еда забивается в зубы сразу после завтрака, а потом почти 12 часов ходишь с едой между зубами. smile.gif Это правила гигиены smile.gif

Gotar
Я тебе ответил, выводить переменные надо так: <?php echo $var; ?> ,а не {$var}

Спустя 39 секунд (13.09.2011 - 17:09) Gotar написал(а):
Удалось решить проблему таким вот способом:

echo '<script language="javascript">';
echo "if (screen.width == 1680) {document.write('710');}";
echo "else if (screen.width == 1440) {document.write('612');}";
echo "else if (screen.width == 1280) {document.write('540');}";
echo "else if (screen.width == 1024) {document.write('433');}";
echo "</script>";
if ('710') { $width = 710;}
else if ('612') { $width = 612;}
else if ('540') { $width = 540;}
else if ('433') { $width = 433;}


$bar_size = ceil($width * ($team['now_number']/$team['min_number']));


Однако теперь загрузка страницы немного увеличилась...Может есть способ еще проще? :)

Спустя 4 минуты, 23 секунды (13.09.2011 - 17:14) Gotar написал(а):
я подумал про оператор switch...case мне кажется он не сыграет роли на время загрузки страницы...

или на быстродействие он повлияет?

Спустя 3 минуты, 56 секунд (13.09.2011 - 17:18) inpost написал(а):
Gotar
switch медленнее. Вот я тебя всё равно не понял абсолютно smile.gif

Спустя 1 час, 53 минуты, 20 секунд (13.09.2011 - 19:11) Игорь_Vasinsky написал(а):
такой сильно нагружаемый проект чтоли... switch или if else...

Спустя 2 минуты, 25 секунд (13.09.2011 - 19:14) crash написал(а):
Цитата (Gotar @ 13.09.2011 - 14:09)
Удалось решить проблему таким вот способом:

могу поспорить, что $width всегда равно 710 wink.gif

ширину полосы состояния правильнее в этом случае высчитывать с помощью JS.

Спустя 1 час, 2 минуты, 23 секунды (13.09.2011 - 20:16) Gotar написал(а):
Цитата
могу поспорить, что $width всегда равно 710 wink.gif

ширину полосы состояния правильнее в этом случае высчитывать с помощью JS.


Хм...согласен. Я уже и экранировал апострофы, и чего только не делал... Тогда как можно это исправить?

inpost, здесь используются доп. библиотеки, поэтому данный вид вставки переменных в хтмл возможен.

Спустя 57 минут, 13 секунд (13.09.2011 - 21:13) Gotar написал(а):
единственное что мне пришло в голову - это вместе с $bar_size создать еще 3 переменные: $bar_size1 $bar_size2 и $bar_size3. И уже в хтмл в зависимости от условия выводить ту или иную переменную в стиле.

Но может есть у кого вариант лучше?)

Спустя 29 минут, 29 секунд (13.09.2011 - 21:43) crash написал(а):
Цитата (Gotar @ 13.09.2011 - 17:16)
Хм...согласен.  Я уже и экранировал апострофы, и чего только не делал... Тогда как можно это исправить?

Здесь не в апострофах дело. Строка - она всегда строка, поэтому всегда будет срабатывать первый if. Это первоосновы языка. Тут уже что не вставляй, результат будет тот же.

Тебе стоит ознакомиться с понятием клиент-сервер и тогда все станет на свои места.

Спустя 42 минуты, 54 секунды (13.09.2011 - 22:26) Gotar написал(а):
crash, а ты знаешь решение?

Спустя 26 минут, 57 секунд (13.09.2011 - 22:52) Gotar написал(а):
Короче...таким вот примитивным способом я все-таки решил проблему

PHP:

$bar_size1900 = ceil(710 * ($team['now_number']/$team['min_number']));
$bar_size1680 = ceil(710 * ($team['now_number']/$team['min_number']));
$bar_size1440 = ceil(612 * ($team['now_number']/$team['min_number']));
$bar_size1280 = ceil(540 * ($team['now_number']/$team['min_number']));
$bar_size1024 = ceil(433 * ($team['now_number']/$team['min_number']));
$bar_size800 = ceil(433 * ($team['now_number']/$team['min_number']));
$bar_offset = ceil(5*($team['now_number']/$team['min_number']));


HTML:
<script language="javascript">
if (screen.width == 1900) {document.write ('<div class="progress-bar"><div class="progress-left" style="width:{$bar_size1900-$bar_offset}px;"></div>');}
else if (screen.width == 1680) {document.write ('<div class="progress-bar"><div class="progress-left" style="width:{$bar_size1680-$bar_offset}px;"></div>');}
else if (screen.width == 1440) {document.write ('<div class="progress-bar"><div class="progress-left" style="width:{$bar_size1440-$bar_offset}px;"></div>');}
else if (screen.width == 1280) {document.write ('<div class="progress-bar"><div class="progress-left" style="width:{$bar_size1280-$bar_offset}px;"></div>');}
else if (screen.width == 1024) {document.write ('<div class="progress-bar"><div class="progress-left" style="width:{$bar_size1024-$bar_offset}px;"></div>');}
else if (screen.width == 800) {document.write ('<div class="progress-bar"><div class="progress-left" style="width:{$bar_size800-$bar_offset}px;"></div>');}
</script>


Если кто знает более рациональное решение проблемы - большая просьба просвятите! Ведь, каждый может что-то не знать или не до конца разобраться в чем-то... А если кто поделится своим опытом - я уверен это пойдет на пользу не только мне, а всем кто прочитает эту тему. И может не знал как решить подобную проблему :)

Спустя 20 минут, 15 секунд (13.09.2011 - 23:13) neadekvat написал(а):
Навскидку, как-то так:
$arr = array(1900 => 710, 1680 => 710, 1440 => 612, ...);
$bar_offset = ceil(5*($team['now_number']/$team['min_number']));

$out_arr = array();
foreach($arr as $screen_width => $k)
$out_arr[] = "arr[$screen_width] = ". ceil($k * ($team['now_number']/$team['min_number'])) - $bar_offset .';';

$out_str = implode("\n", $out_arr);


<script language="javascript">
<?
php echo $out_str; ?>
document.write ('<div class="progress-bar"><div class="progress-left" style="width:'+ arr[screen.width] +'px;"></div>');

</
script>


Конечно, при этом в комментарии надо все будет объяснить, т.к. сходу тут не разобраться.

Спустя 11 минут, 54 секунды (13.09.2011 - 23:25) Gotar написал(а):
спс, большое!

и как же я сам не догадался что все можно решить через массив...зациклился на JS и все тут smile.gif

Спустя 10 часов, 2 минуты, 48 секунд (14.09.2011 - 09:27) crash написал(а):
Цитата (Gotar @ 13.09.2011 - 19:26)
crash, а ты знаешь решение?

Знаю. И я его уже озвучил. Высчитывать ширину нужно в JS. А не в php. Поскольку первый расположен у клиента и может получить доступ к ширине экрана, а второй на сервере и не может получить доступ к ширине непосредственно.

Самое примитивное решение, которое можно придумать выглядит приблизительно так

<div id="progress_left_id" class="progress-left"></div>
<?php
echo '<script language="javascript">';
echo 'var now_number='.$team['now_number'].';';
echo 'var min_number='.$team['min_number'].';';
echo '
var progress_left = document.getElementById("progress_left_id");

if (screen.width == 1900) {progress_left.style.width=Math.ceil(710 * (now_number/min_number))+"px";}
else if (screen.width == 1680) {progress_left.style.width=Math.ceil(710 * (now_number/min_number))+"px";}
else if (screen.width == 1440) {progress_left.style.width=Math.ceil(612 * (now_number/min_number))+"px";}
else if (screen.width == 1280) {progress_left.style.width=Math.ceil(540 * (now_number/min_number))+"px";}
else if (screen.width == 1024) {progress_left.style.width=Math.ceil(433 * (now_number/min_number))+"px";}
else if (screen.width == 800) {progress_left.style.width=Math.ceil(433 * (now_number/min_number))+"px";}
</script>'
;
?>


Причем скрипт должен быть расположен после <div id="progress_left_id" class="progress-left"></div>. Иначе не будет работать корректно.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.