[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблема подключения PHP-блока посредством AJAX
ArtOfLife
Доброго времени суток!
Собственно на данный момент занимаюсь созданием своей странички. Решил воспользоваться технологией AJAX для передачи контента из БД в шаблон.
Следующим образом передаю данные из шаблона в скрипт, реализующий технологию AJAX (вытягиваю название страницы из строки запроса):
HTML
<body background="img/main/bg.gif" onLoad="javascript:Load('<?php echo (isset($_GET['page']) ? $_GET['page'] : 'index'); ?>');">

Сама функция Load реализована следующим образом:
Код

function Load(page)
{
request = getRequest();
request.open("GET", "pages_content.php?page=" + page, true);
request.onreadystatechange = updatePage;
request.send();
}

Далее попадаем в PHP-блок следующего содержания:
PHP
header("Content-type: text/html; charset=windows-1251");   
header("Cache-Control: no-store, no-cache, must-revalidate");   
header("Cache-Control: post-check=0, pre-check=0"false);

include(
"blocks/db.php");
include(
"blocks/functions.php");
    
$sql "SELECT text FROM settings WHERE page = ".smart_quote($_GET["page"]);   
$result mysql_query($sql);
$data mysql_fetch_array($result);

echo 
$data["text"];

Таким образом вывожу контент из БД в специально отведенный <div>-блок шаблона. Все страницы корректно работают, кроме одной... страницы с галереей и слайд-шоу. Собственно все это - готовые решения с применением библиотек jquery и mootools. Так вот собственно проблемы 2:
1) Код галереи некорректно выводится из БД на страницу.
2) Если подключать отдельным блоком (включить контент галереи в отдельный файл), то совершенно не срабатывают подключаемые в шаблоне библиотеки и стили. huh.gif
Попробуем по порядку. Вот код контента галереи:
Код

<script type="text/javascript">
window.addEvent('domready', function() {
 document.myGallerySet = new gallerySet($('myGallerySet'), {
  timed: false,
  useReMooz: true,
  embedLinks: false
 });
});
</script>

HTML
<h2 style="font-size:36px; color:#000000" align="center">Галерея фотографий</h2>
<div class="content" align="center">
<div id="myGallerySet">

PHP
$album_cnt 5;
$album_year 2005;
$photo_id 1;
                        
for (
$i_cnt 0$i_cnt $album_cnt$i_cnt++) {
    
$query mysql_query("SELECT * FROM photos WHERE album = '".$album_year."'"$db);
    
    
$cnt mysql_num_rows ($query);
    
mysql_free_result($query);
                                
    echo 
"<div id='gallery".$i_cnt."' class='galleryElement'>";
                                
    
$i 1;
                            
    while (
$i <= $cnt) {
        
$query mysql_query("SELECT album, fImgRef, bImgRef, sImgRef, title, lDescription FROM photos WHERE id = $photo_id"$db);
        
$gallery_data mysql_fetch_array($query);
    
        
mysql_free_result($query);
                                
        
printf ("<div class='imageElement'>
               <h2>%s</h2>
               <h3>%s</h3>
               <p>%s</p>
               <a href='%s' title='Увеличить изображение' class='open'></a>
               <img src='%s' class='full' />
               <img src='%s' class='thumbnail' />
               </div>"
,
               
$gallery_data['album'], $gallery_data['title'], $gallery_data['lDescription'], $gallery_data['fImgRef'],
               
$gallery_data['bImgRef'], $gallery_data['sImgRef']);
                                         
        
$i++;
        
$photo_id++;
    }
                            
    echo 
"</div>";
    
$album_year++;
}

Тут же слайд-шоу:
HTML
<div id="monoSlideshow">
<p><strong>Please install Flash&reg; and turn on Javascript.</strong></p>
</div>

Код

<script type="text/javascript">
var so = new SWFObject("swf/monoslideshow.swf", "SOmonoSlideshow", "640", "480", "7", "#ffffff");

so.addVariable("showLogo", "false");
so.addVariable("showVersionInfo", "false");
so.write("monoSlideshow");
</script>

Код немного сыроват, но не в этом суть. При выводе этого кода из БД в области контента появляется следующая красота unsure.gif :
user posted image
Пробовал дописывать условие для подключения этого кода, как отдельного PHP-блока:
PHP
header("Content-type: text/html; charset=windows-1251");   
header("Cache-Control: no-store, no-cache, must-revalidate");   
header("Cache-Control: post-check=0, pre-check=0"false);

include(
"blocks/db.php");
include(
"blocks/functions.php");
    
$sql "SELECT text FROM settings WHERE page = ".smart_quote($_GET["page"]);   
$result mysql_query($sql);
$data mysql_fetch_array($result);

if (
$page != "gallery")
    echo 
$data["text"];
else
    require(
"gallery_content.php"); // include, require_once - аналогично

В итоге получал галерею в виде кучи подряд идущих фотографий, т.е. не срабатывали библиотеки и стили, подключаемые в шаблоне. Самое интересное, что подключение этого блока
PHP
require("gallery_content.php");
в самом шаблоне, все корректно отображает!
Может кто заметил какую-то неточность в коде?! Или может я чего-то не знаю об особенностях работы технологии AJAX... Собственно сформулирую еще раз вопросы: 1) Почему этот код некорректно отображается из БД?.. 2) Почему подключаемый блок (если не делать выборку из БД) работает непосредственно в самом шаблоне, но не хочет отображаться посредством технологии AJAX?.. Ведь по идее все подключенные скрипты и стили в шаблоне должны срабатывать и на дополнительно подключаемые блоки! К тому же обновляется только контент (один информационный блок), а не полностью вся страница.



Спустя 6 часов, 20 минут, 22 секунды (4.09.2009 - 06:50) hara_ написал(а):
Без 100 грамм не разобраться,
- почему бы не посмотреть документацию к этим готовым решениям, - 100% там есть демо и примеры js и php кода.

Что находиться в $data["text"] я так и не понял. - объясните.
Потому что исходя из этого:
Цитата
Таким образом вывожу контент из БД в специально отведенный <div>-блок шаблона.

Цитата
Попробуем по порядку. Вот код контента галереи:

там находится три куска кода которые ниже (то есть js, html и php) и не понятно как они там уживаются.
Вы что храните php код в базе?

Цитата
При выводе этого кода из БД в области контента появляется следующая красота:

Да и красоту сюда желательно постить ту которая находится в исходном коде страницы, так будет понятно какие html теги там есть.

Вобщем ещё раз и по человечьи.


Спустя 5 часов, 41 минута (4.09.2009 - 12:31) ArtOfLife написал(а):
Цитата
- почему бы не посмотреть документацию к этим готовым решениям, - 100% там есть демо и примеры js и php кода.

Собственно делал все по примерам, включенным в документацию. Понимаете, если выше описанный код галереи располагать статически на странице, то все прекрасно работает. Как только я пытаюсь выводить его из БД, то вырисовывается тот самый ужас, который приведен на скрине.
Цитата
Что находиться в $data["text"] я так и не понял. - объясните.

Таким образом я вывожу содержимое информационного блока из БД. Чтобы было понятней, вот структура таблицы settings:
user posted image
text - обычное информационное поле, которое содержит главную начинку каждой страницы. Например, если page=about, то содержимое информационного блока представляет собой автобиографию.
Цитата
там находится три куска кода которые ниже (то есть js, html и php) и не понятно как они там уживаются.

Собственно исходные примеры готовых решений галереи и слайд-шоу включают в себя сочетание HTML и JS. PHP я подключаю самостоятельно, чтобы произвести выборку информации о фотографиях из БД. Не хранить же статически одинаковые блоки кода, где меняется лишь линк на фото и информация о нем?!
Цитата
Вы что храните php код в базе?

Вообще-то нет, но мне необходимо каким-то образом подгрузить информационную часть галереи (блок кода приведен в предыдущем посте). Пытался включить его в БД, выводило то, что приведено на рисунке, пытался инклудить через отдельный файл, не видело подключаемых библиотек и стилей. Потому я и в замешательстве.
Цитата
Да и красоту сюда желательно постить ту которая находится в исходном коде страницы, так будет понятно какие html теги там есть.

Приведу код самого шаблона, куда подгружается вся информация из БД в соответствующую область.
PHP
include("blocks/db.php");
include(
"blocks/functions.php");
$query mysql_query("SELECT title, meta_d, meta_k, text FROM settings WHERE page = '". (isset($_GET['page']) ? $_GET['page'] : 'index') ."'"$db);
$data mysql_fetch_array($query);

HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>

<meta http-equiv="Content-Type" content="text/html" charset="windows-1251">
<meta http-equiv="Pragma" content="no-cache">
<meta name="description" content="<?php echo $data['meta_d']; ?>">
<meta name="keywords" content="<?php echo $idata['meta_k']; ?>">
<title><?php echo $data['title']; ?></title>

<link rel="stylesheet" href="styles/style.css" type="text/css" charset="windows-1251" />
<link rel="stylesheet" href="jquery_gallery/jquery.ad-gallery.css" type="text/css" charset="windows-1251" />
<link rel="stylesheet" href="css/layout.css" type="text/css" media="screen" charset="windows-1251" />
<link rel="stylesheet" href="css/jd.gallery.css" type="text/css" media="screen" charset="windows-1251" />
<link rel="stylesheet" href="css/ReMooz.css" type="text/css" media="screen" charset="windows-1251" />

<script type="text/javascript" src="scripts/aj.js"></script>
<script type="text/javascript" src="jquery_gallery/jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="jquery_gallery/jquery.ad-gallery.js?rand=995"></script>
<script type="text/javascript" src="functions.js"></script>
<script type="text/javascript" src="player/swfobject.js"></script>

<script type="text/javascript" src="scripts/mootools-1.2.1-core-yc.js"></script>
<script type="text/javascript" src="scripts/mootools-1.2-more.js"></script>
<script type="text/javascript" src="scripts/jd.gallery.js"></script>
<script type="text/javascript" src="scripts/jd.gallery.set.js"></script>
<script type="text/javascript" src="scripts/ReMooz.js"></script>
<script type="text/javascript" src="scripts/swfobject.js"></script>

</head>

<body background="img/main/bg.gif" onLoad="javascript:Load('<?php echo (isset($_GET['page']) ? $_GET['page'] : 'index'); ?>');">
<form name="form1" method="get">
<table width="878" border="0" align="center" cellpadding="0" cellspacing="0">
<?php include("blocks/header.php"); ?>
<tr>
<td bgcolor="#FFFFFF">
<table width="878" border="0" cellpadding="0" cellspacing="0" class="main_border">
<tr>
<?php include("blocks/navigation.php"); ?>
<td valign="top">
<?php //require("gallery_content.php"); ?>
<div id="detail"></div>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<?php include("blocks/footer.php"); ?>
</tr>
</table>
</form>
</body>
</html>

В блок <div id="detail"></div> посредством технологии AJAX выводится контент из БД (код уже писался выше, но я продублирую):
PHP
header("Content-type: text/html; charset=windows-1251");   
header("Cache-Control: no-store, no-cache, must-revalidate");   
header("Cache-Control: post-check=0, pre-check=0"false);

include(
"blocks/db.php");
include(
"blocks/functions.php");
    
$sql "SELECT text FROM settings WHERE page = ".smart_quote($_GET["page"]);   
$result mysql_query($sql);
$data mysql_fetch_array($result);

echo 
$data["text"];

Как вы видите, выше <div>-блока есть закомментированная строка <?php //require("gallery_content.php"); ?>. Собственно это я пробовал подключать описанный в предыдущем сообщении код галереи. Таким способом и, если просто включить тот код в шаблон, все работает. Но если я его кидаю в поле text таблицы settings, выводит ерунду (см. рисунок). Если подключаю этот блок на странице формирования ответа шаблону, то слетает все форматирование галереи (как-будто библиотеки и стили вообще не подключались), т.е. от галереи остается только "бесконечное" число фотографий, выстроенных в столбик. В общем, необходим совет - как мне корректно подгрузить галерею в шаблон посредством AJAX-технологии?

Спустя 13 минут, 48 секунд (4.09.2009 - 12:44) twin написал(а):
Что находится в gallery_content.php?

Спустя 4 минуты, 40 секунд (4.09.2009 - 12:49) ArtOfLife написал(а):
Цитата
Что находится в gallery_content.php?

В первом посте весь код, начинающийся после слов...
Цитата
Попробуем по порядку. Вот код контента галереи:

... и заканчивающийся перед скрином с "красотой"...

Спустя 4 минуты, 37 секунд (4.09.2009 - 12:54) twin написал(а):
То есть, если я правильно понял, ты php код записываешь в базу, в поле text, а потом хочешь чтобы он оттуда у тебя выполнился? Если так, то как минимум нужно eval(), а вообще это довольно непредусмотрительно и дырявенько...

Спустя 7 минут, 50 секунд (4.09.2009 - 13:01) ArtOfLife написал(а):
Цитата
То есть, если я правильно понял, ты php код записываешь в базу, в поле text, а потом хочешь чтобы он оттуда у тебя выполнился? Если так, то как минимум нужно eval(), а вообще это довольно непредусмотрительно и дырявенько...

Именно так и делал. Честно говоря - впервые включал php-код в БД, потому всех нюансов не знаю. Про eval() уже прочитал, спасибо, учту. А почему такой способ небезопасный? И можно ли как-то иначе подключить этот блок в моем случае?

Спустя 3 минуты, 52 секунды (4.09.2009 - 13:05) twin написал(а):
В принципе ничего страшного, если не давать возможность заприси юзеру. Иначе он может написать веселых вещей. А вообще я не понял, для чего этот код в базу... Почему просто нельзя подключить файлом?

Спустя 7 минут, 7 секунд (4.09.2009 - 13:12) ArtOfLife написал(а):
Так я уже пытался на странице, где формируется сообщение для вывода в <div>-блок информационной части, подключать php-блок галереи. В итоге шаблон полностью игнорирует подключаемые скрипты и стили для галереи. Вот так я писал:
PHP
header("Content-type: text/html; charset=windows-1251");   
header("Cache-Control: no-store, no-cache, must-revalidate");   
header("Cache-Control: post-check=0, pre-check=0"false);

include(
"blocks/db.php");
include(
"blocks/functions.php");
    
$sql "SELECT text FROM settings WHERE page = ".smart_quote($_GET["page"]);   
$result mysql_query($sql);
$data mysql_fetch_array($result);

if (
$page != "gallery")
    echo 
$data["text"];
else
    require(
"gallery_content.php"); // include, require_once - аналогично

А получал лишь хаос из фотографий на странице...

Спустя 22 минуты, 55 секунд (4.09.2009 - 13:35) twin написал(а):
Выводить нужно не весь блок, а только изменяющиеся данные. В нужное место. Я чесно говоря в этом коде идеи уловить никак не могу...

Спустя 20 минут, 1 секунда (4.09.2009 - 13:55) ArtOfLife написал(а):
Так это ведь реализация технологии AJAX. У меня один шаблон для всех страниц. Через body-лоадер я активирую динамическое обновление информационной части шаблона, передавая JS-функции лишь название страницы в строке запроса. В итоге я из БД подгружаю куски HTML-кода - своего рода информационный контент - в <div>-блок шаблона, а сама страница (дизайн, навигация) остаются без изменений. Код приведенной галереи собственно и является информационным контентом страницы gallery. Потому там нет ничего лишнего, весь этот блок мне нужно при необходимости подгружать, но он актуален лишь для страницы gallery. А разделение его на куски приведет к неработоспособности галереи, т.к. все скрипты и html-теги являются ее неотъемлемой частью, взятой, между прочим, из мануалов производителей. А описанный в предыдущем сообщении блок кода в соответствии с технологией AJAX передаст сформированное сообщение в шаблон, в место, для него зарезервированное (блок <div> c id="detail"). Именно на странице, формирующей ответ, мне необходимо каким-то образом подключить php-блок галереи. Но, к сожалению, почему-то полностью игнорируются скрипты и стили галереи, подключаемые в шаблоне. Не могу понять, почему...

Спустя 1 час, 6 минут, 14 секунд (4.09.2009 - 15:02) twin написал(а):
Ерунда это всё. Подгружать аяксом стили и скрипты, которые все равно используются на всех страницах галереи, это не просто чё попало, это увеличение трафика и скорости загрузки. А аякс служит именно для сокращения последних. Дело в том, что стили и скрипты кэшируются браузером, а аякс нет. По этому все это нужно подключать к шаблону до, а в нужное место подгружать только те данные, которые меняются. То есть вот это место:
PHP
printf ("<div class='imageElement'>
               <h2>%s</h2>
               <h3>%s</h3>
               <p>%s</p>
               <a href='%s' title='Увеличить изображение' class='open'></a>
               <img src='%s' class='full' />
               <img src='%s' class='thumbnail' />
               </div>"
,
               
$gallery_data['album'], $gallery_data['title'], $gallery_data['lDescription'], $gallery_data['fImgRef'],
               
$gallery_data['bImgRef'], $gallery_data['sImgRef']);
А это html и никаких там скриптов.

Спустя 22 минуты, 4 секунды (4.09.2009 - 15:24) glock18 написал(а):
стили загружать через ajax бесполезно, насколько я знаю

скрипты можно выполнять при помощи eval.

на самом деле это имеет смысл, если подгружается не какой-то мега здоровый js файл, а именно js для выполнения каких-то действий уже с загруженными библиотеками.
Быстрый ответ:

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