Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Из БД в <img> а их розмещаем по слоям (https://javascript.ru/forum/server/6759-iz-bd-v-img-ikh-rozmeshhaem-po-sloyam.html)

Jekel 20.12.2009 03:16

Из БД в <img> а их розмещаем по слоям
 
Товарищи программисты, прошу Вас о помощи!
Есть бд, в ней допустим 10 строк...все данные перегоняются в 10 картинок с им принадлежащими данными которые беру из БД ($all) Все выводит хорошо, но нужно выводить картинки ($all) так чтобы они были по своим слоям..т.е если $y первого id равен 100 а $y второго id равен 110, то id1 выводит в $isbnTextq3 = $dom->createTextNode($all); (смотреть ниже), а id2 выводит в $isbnTextq1...и если id1.y = id2.y то в $isbnTextq2.
Тоесть есть три слоя ($one, $two и $three) и нужно все картинки автоматически роспихивать по своим слоям...и причем чтобы все картинки брали участие в сравнении Y...
Очень прошу помочь...
...
//гребем данные из БД
$mybase = mysql_query("SELECT * FROM customers WHERE id!='$pid'"); 
while($db = mysql_fetch_array($mybase)) {
$id = $db['id'];
$name = $db['name'];
$x = $db['x'];
$y = $db['y'];
$loc = $db['loc'];

//запихиваем данные из строк в <img>
$all = "<img src='$loc' width='50' height='50' id='$name' name='$name' style='position: absolute; left:$x; top:$y'></img>";

//слой первый
$isbnTextq1 = $dom->createTextNode($all);
$one->appendChild($isbnTextq1);


//слой второй
$isbnTextq2 = $dom->createTextNode($all);
$two->appendChild($isbnTextq2);


//и нижний слой
$isbnTextq3 = $dom->createTextNode($all);
$three->appendChild($isbnTextq3);

}
...

Jekel 20.12.2009 16:00

((please help!

PeaceCoder 20.12.2009 17:36

выбери все элементы и отсортируй их по y координате потом просто цилклом примени элементы. я так понял?

Jekel 20.12.2009 18:12

ну да...только если добавляется новый...11-й элемент, то он тоже принемает учатсие в сортировке автоматически)))

Jekel 20.12.2009 18:13

как этот код описать(((???

PeaceCoder 20.12.2009 18:26

$mybase = mysql_query("SELECT * FROM customers WHERE id!='$pid'"); 
$y = array();
while($db = mysql_fetch_assoc($mybase)) $y[$db['y']] = $db;

ksort($y);
 
foreach ($y as $_y=>$db){
  //запихиваем данные из строк в <img>
  $all = "<img src='{$db['loc']}' width='50' height='50' id='{$db['name']}' name='{$db['name']}' style='position: absolute; left:{$db['x']}; top:$_y'></img>";
 
  //слой
  $isbnTextq1 = $dom->createTextNode($all);
  $one->appendChild($isbnTextq1);
  }

Jekel 20.12.2009 18:33

:blink: хм, интрестинг) сейчас попробую

Jekel 20.12.2009 18:49

СПАСИБО ОГРОМНОЕ ТЕБЕ МИРНЫЙ КОДЕР))))
О_о работает, но они все в одном слое...надо чтобы на три слоя (см.ниже) розбивало.. а сейчас оно просто в одном сортирует какой обьект выше а какой иже)

//слой первый
$isbnTextq1 = $dom->createTextNode($all);
$one->appendChild($isbnTextq1);
 
 
//слой второй
$isbnTextq2 = $dom->createTextNode($all);
$two->appendChild($isbnTextq2);
 
 
//и нижний слой
$isbnTextq3 = $dom->createTextNode($all);
$three->appendChild($isbnTextq3);

PeaceCoder 20.12.2009 23:12

непойму каким мокаром распределять элементы по слоям. обьясни доходчивей.

Jekel 20.12.2009 23:40

Вот смотри, есть три слоя (которые читает AJAX код...а этот php создает xml)...верхний слой называется -> "isbnTextq1" (картинки отобрадает над всеми остальными), средний -> "isbnTextq2" (картинки которые по y равны меж собой розмещаются здесь), нижний -> "isbnTextq3" (картинка в этом слое розмещается под всеми слоями (картинками в нем)).

//слой первый
$isbnTextq1 = $dom->createTextNode($all);
$one->appendChild($isbnTextq1);
 
 
//слой второй
$isbnTextq2 = $dom->createTextNode($all);
$two->appendChild($isbnTextq2);
 
 
//и нижний слой
$isbnTextq3 = $dom->createTextNode($all);
$three->appendChild($isbnTextq3);

PeaceCoder 21.12.2009 00:28

т.е. в первом и последнем слое размещаются по одной картинке ? ед что понял что во втором слое находятся картинки с равными у а какие находятся в первом и третем... как их разделять? от тех что равны между собой y координатой?
Короче пример:
есть y=1,1,2,3,4,4,5,5,6,6,7,8,9,10

как распределить эти цифры в слои:
1 слой:
2 слой:
3 слой:

напиши какие цифры додны быть в каком слое. цифры с потолка взял можешь привести свои.

Jekel 21.12.2009 06:00

Описываю полностью:
Есть БД, в ней табличка customers и objects. Из них скрипт достает данные и делает из данных картинки которые розмещаются в слоях (элементах DOM см.ниже $one, two и three), в средний слой и только в средний выводятся картинки из таблички objects и они в слое $two находятся всегда! Но если у картинки из этого слоя y больше чем у другой то она стоит впереди другой))) тоесть выводиться познее и соответственно она будет над другой картинкой с меншим Y..также и в customers картинки меж собой работают....Но те картинки, которые выводит из БД таблички customers должны перемещатся либо в слой $one (отображает в нем картинки выше картинок из среднего и трейтего слоя) либо в трейтий слой ($three)...в зависимости от Y object и Y customers картинок, и все картинки из customers тоже меж собой работают и меряют Y и помещаются в слои.....тоесть еть допустим такой набор данных в БД:

|objects|
|id|img |y |x |
|1|1.gif|100|200|
|2|1.gif|300|300|
|3|1.gif|100|700|

|customers|
|id|loc |y |x |
|4|2.gif|50 |200|
|5|2.gif|50 |400|
|6|2.gif|500|700|
|7|2.gif|500|300|
|8|2.gif|200|600|
|9|2.gif|300|600|

Картинки в слоях код розмещает так (все картинки соответственно id в базе здесь опишу):
<one>
4, 5,
</one>
<two>
1, 3, 2
</two>
<three>
8, 9, 6, 7
</three>

вобщемь...вся картина нынешней ситуации:
...
//создаем dom 
$dom = new DOMDocument();
//в нем главный каталог
$response = $dom->createElement('response');
$dom->appendChild($response);
//в response делаем три слоя (one, two, three)
$one = $dom->createElement('one');
$response->appendChild($one);

$two = $dom->createElement('two');
$response->appendChild($two);

$three = $dom->createElement('three');
$response->appendChild($three);

//загружаем картинки из бд в средний слой 

$myobj = mysql_query("SELECT * FROM objects"); 
while($obj = mysql_fetch_array($myobj)) {
$imgobj = $obj['img'];
$yobj = $obj['y'];
$xobj = $obj['x'];

$allobj = "<img src='$locp' style='position: absolute; left:$xobj; top:$yobj'></img>";
//пыжуем картинки в средний (второй) слой...
$Objects = $dom->createTextNode($allobj);
$two->appendChild($Objects);
}

$mybase = mysql_query("SELECT * FROM customers"); 
while($db = mysql_fetch_array($mybase)) {
$id = $db['id'];
$x = $db['x'];
$y = $db['y'];
$loc = $db['loc'];

$all = "<img src='$loc' id='$id' style='position: absolute; left:$x; top:$y'></img>";
//пыжуем картинки в первый слой...но все картинки будут всегда над средним слоем
$AllUser = $dom->createTextNode($all);
$one->appendChild($AllUser);

...

Jekel 21.12.2009 06:06

если что не понятно - спрашивай, а то я может чет не так написал...ибо у меня уже с этим кодом еще и в такое время...голова квадратная! Ночь не спал...не могу решить этот вопрос((( Пожалуйста помогите!

PeaceCoder 21.12.2009 11:11

т.е. я так понял: во втором слое все картинки из objects. в первом все картинки из customers у которых y < всех Y из 2го слоя, в третьем соответсвенно все из customers, у которых y >= всех y из 2го слоя?
так я понял? или если custemers.y == одному из objects.y то его перекидывать во 2ой слой?

Jekel 21.12.2009 14:17

Вот так:
во втором слое все картинки из objects. в первом все картинки из customers у которых y < всех Y из 2го слоя, в третьем соответсвенно все из customers, у которых y >= всех y из 2го слоя

и во второй не надо ниче кидать)

PeaceCoder 21.12.2009 19:42

$mybase = mysql_query("SELECT * FROM objects WHERE id!='$pid' ORDER BY y ASC"); 
$min2y=$max2y=null;
while($db = mysql_fetch_assoc($mybase)) {
  $y[$db['y']] = $db;
  $allobj = "<img src='{$db['img']}' style='position: absolute; left:{$db['x']}; top:{$db['y'}'></img>";
//пыжуем картинки в средний (второй) слой...
  $Objects = $dom->createTextNode($allobj);
  $two->appendChild($Objects);
  $max2y = $max2y!==null ? max($max2y,$db['y']) : $db['y'];
  $min2y = $min2y!==null ? min($min2y,$db['y']) : $db['y'];
  }

$mybase = mysql_query("SELECT * FROM customers WHERE id!='$pid' ORDER BY y ASC"); 
while($db = mysql_fetch_assoc($mybase)) {
  //запихиваем данные из строк в <img>
  $all = "<img src='{$db['loc']}' width='50' height='50' id='{$db['name']}' name='{$db['name']}' style='position: absolute; left:{$db['x']}; top:{$db['y']}'></img>";
  $isbnTextq = $dom->createTextNode($all);
  $lay = $db['y']<$min2y ?  $one:$three;
  $lay->appendChild($isbnTextq);
  }


А что если customers.y > min2y и customers.y <max2y ?

я сделал что если не меньше всех во втором слое, то кидаем в слой 3 в не зависимости от того находится ли customers.y в промежутке слоя 2.

Jekel 21.12.2009 21:59

В one не добавляется ничего совсем...хотя должно если в БД посмотреть... Но в two и three все работает чудесно!!! И за это тебе огромнийшое СПАСИБО)!:yes:

Jekel 21.12.2009 22:31

вот так сейчас все отображается:( :

PeaceCoder 21.12.2009 22:34

исправил прошлый пост. попробуй ща должно все ок.
дык тебе еще каждый слой надо по y сортировать??

Jekel 21.12.2009 22:41

та да, customers и object обьекты меж собой y меряют...надо не по max и min обьектов..а каждого отдельно взятого...как customers'ы меж собой работают..так и все обьекты с обеих таблиц должны меж собой работать((

Изменил код, ну на max и min работет... обьекты и в one и d three заносятся...

PeaceCoder 21.12.2009 23:21

ну? и что еще надо? в первом слое все что меньше всех objects.y во втором все objects в третьем все остальные customers. все три слоя сортируются по y.
может еще надо приоритет вставить ? например, customers должны быть выше objects если у них Y равны в не зависимости от слоя?

Jekel 21.12.2009 23:33

если у customers Y обьекта меньше чем у objects Y обьекта, то customers обьект (картинка) находиться под objects обьектом) а если какой-то другой обьект в customers выше по игрику чем objects.y обьект то над обьектом из objects

Jekel 21.12.2009 23:44

http://doobiz.co.cc/lamer.php погляди сюда...отак оно сейчас выглядит)

Jekel 22.12.2009 00:07

Ну допустим рисунок с числом 1 и все кружки это customers и рисунок с числом 1 быть накрыт рисунков с objects...даже двумя рисунками, те что возле него но по y они его выше. Рисунок с цифрой 2 должен быть ниже рисунка из objects....а там все наоборот..:help:

PeaceCoder 22.12.2009 18:29

Задача изначально неправильно пошла решением. Тебе тут надо всего один слой. и в нем должны быть расположены обьекты отсортированных по y причем object'ы имеют меньший приоритет если у objects.y==customers.y следовательно у тя в любом случае будут обьекты надо customers если customers.y < objects.y и всегда objects ниже customers, если customers.y>=objects.y при чем при равных "y" должны сначала следовать все обьеты потом все customers
так привожу пример по y: буква - тип, цифра - значение y
objects: o1 o2 o2 o3 o3 o4 o5 o6 o10 o15 o15 o16 o17
customers: с2 с3 с4 с4 с5 с6 с6 с7 с10 с10 с15 с16 с17 с17

результат:
o1 o2 o2 c2 o3 o3 o4 c4 c4 o5 c5 o6 c6 c6 c7 o10 c10 c10 o15 c15 o16 c16 o17 c17 c17
т.е. o.y<=c.y обьект раньше создается равенствующему customers

п.с. я так понял это чето типо игры? и ты хочешь показать псевдо 3d ?

Jekel 22.12.2009 20:15

Три раза прочел и не могу собрать это в голове...только с пар приехал...башка квадратная....да нет, не игра...хотя в каком-то смысле и игрой назвать можно....вид там isometric)))) будут персональные рисунки...вообще анимации должны будут быть пожжей , как личные окошки...ну суть уже не в этом я уже основную задачу отложил((( (основную цель обьясню пожжей) хочу полностью это понять и решить этот вопрос...и ты мне с этим оч оч оч помогаешь, спасибо..

Jekel 22.12.2009 20:28

Дык а че здесь менять надо? Допустим все впихнем в one слой...

как-то так чтоли?:blink:

$mybase = mysql_query("SELECT * FROM objects ORDER BY y ASC"); 

while($db = mysql_fetch_assoc($mybase)) {

  $y[$db['y']] = $db;
  $allobj = "<img src='{$db['img']}' style='position: absolute; left:{$db['x']}; top:{$db['y']}'></img>";

  $Objects = $dom->createTextNode($allobj);
  $one->appendChild($Objects);
  
}
 
$mybases = mysql_query("SELECT * FROM customers ORDER BY y ASC"); 

while($dbs = mysql_fetch_assoc($mybases)) {

  $all = "<img src='{$dbs['loc']}' width='50' height='50' id='{$dbs['id']}' name='{$dbs['name']}' style='position: absolute; left:{$dbs['x']}; top:{$dbs['y']}'></img>";

  $Cust = $dom->createTextNode($all);
  $one->appendChild($Cust);
}

Jekel 22.12.2009 20:54

:(

PeaceCoder 22.12.2009 22:04

ты мне лучше скажи. objects могут быть ниже ТОЛЬКО если customers.y>=objects.y ?

или

customers всегда выше objects вне зависимости от их "y" ?

другими словами: в каких случаях objects могут накрывать собой customers ? и наоборот? ходим с тобой вокруг да около...

Jekel 22.12.2009 23:30

if (customers.y>=objects.y) { customers обьект накрывает собой object картинку}
if (customers.y<=objects.y) { object обьект накрывает собой customers картинку}
надо не max и min Y всех object'ов сравневать с customers а все картинки object'ов

Тоесть есть один кустомер накрывает какой-то обжект то в то же время какойто кустомер может быть под обжектом....
так норм обьяснил? иль может подробней росписать?

я наверное скоро ноги протяну за этим скриптом(((( от недосыпания)

PeaceCoder 23.12.2009 11:21

$mybase = mysql_query("(SELECT img, x, y,name,0 AS t  FROM objects WHERE id!='$pid') UNION (SELECT loc as img,x,y,name,1 AS t FROM customers WHERE id!='$pid') ORDER BY y ASC,t ASC"); 
while($db = mysql_fetch_assoc($mybase)) {
  //запихиваем данные из строк в <img>
  $all = "<img src='{$db['img']}' width='50' height='50' id='{$db['name']}' name='{$db['name']}' style='position: absolute; left:{$db['x']}; top:{$db['y']}'></img>";
  $isbnTextq = $dom->createTextNode($all);
  $one->appendChild($isbnTextq);
  }


Вопрос: есть ли в objects столец name? если да то все ок. если нет то надо будет переделать запрос...

Jekel 23.12.2009 12:58

нету( лучше наверное по id....и в objects будет еще куча столбцов которые нужно будет выводить))
Вроде и работает но еще очень плужит...http://doobiz.co.cc/lamer.php - посмотри, сделал управление customer'сами кнопками WASD...введи в поле число от 1 до 5 - id кустомерсов....попередвигай их и ты все увидишь.....
вот так розмещаются картинки:

О_о и этот код не работает в IE! )))

PeaceCoder 23.12.2009 20:24

переделал немного прошлый пост. попробуй ща.

Jekel 23.12.2009 20:52

$mybase = mysql_query("(SELECT img,x,y,id,t=0 FROM objects) UNION (SELECT loc as img,x,y,id,t=1 FROM customers) ORDER BY y ASC,t ASC"); 
while($db = mysql_fetch_assoc($mybase)) {
  //*************************
  $all = "<img src='{$db['img']}' width='50' height='50' id='{$db['id']}' name='{$db['name']}' style='position: absolute; left:{$db['x']}; top:{$db['y']}'></img>";
  $Display = $dom->createTextNode($all);
  $one->appendChild($Display);
}


:( не работает...ошибка не может найти в базе t я так понял

Warning:  mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource on line 29
29: while($db = mysql_fetch_assoc($mybase)) {


Что это за t вообще?

Jekel 23.12.2009 21:21

я вродебы понял....оно меряет y верха картинки....надо задавать y + height этой картинки

тогда на пол-картинки objecta нельзя будет зайти...

PeaceCoder 23.12.2009 21:23

аа блин голова уже не варит. изменил пост. попробуй ща.

Jekel 23.12.2009 21:26

:-? извини за то, что напрягаю...сейчас попробую

Jekel 23.12.2009 21:40

да вродь все работает но оно меряет не по y max именно отдельного рисунка а читает просто его у тоесть верхнюю точку рисунка....от посмотри на doobiz.co.cc/lamer.php там черный прямоугольник....он должен быть перед тем ящиком..но все наоборот а если написать как-то
y+this.img.height ))) то все будет гуд....т.е надо чтобы игрик брало внизу рисунка
но как это так оформить да правильно росписать...я не могу понять...да я и не знаю наверное(

PeaceCoder 23.12.2009 23:01

для этого надо знать высоту рисунка... на сервере или можно например в клиенте корректировать координаты... но это нагрузка на клиент
=

Jekel 24.12.2009 00:14

т.е мне надо чтобы в БД в записях были записаны высота и ширина рисунка???(( хотелось бы автоматизма добится какого-то..
а если в клиенте (js) при приеме данных как-то фасовать картинки...так возможно?

ну написал в БД w и h ....высота и ширина, так пашет:
$mybase = mysql_query("(SELECT img,x,y,w,h,id,0 AS t FROM objects) UNION (SELECT img,x,y,w,h,id,1 AS t FROM customers) ORDER BY y+h ASC,t ASC"); 
while($db = mysql_fetch_assoc($mybase)) {

  $all = "<img src='{$db['img']}' width='{$db['w']}' height='{$db['h']}' id='{$db['id']}' style='position: absolute; left:{$db['x']}; top:{$db['y']}'></img>";
  $Display = $dom->createTextNode($all);
  $one->appendChild($Display);
}


Часовой пояс GMT +3, время: 04:31.