Ir para conteúdo

Didyo

Members
  • Total de itens

    9
  • Registro em

  • Última visita

Reputação

1 Comum

1 Seguidor

Sobre Didyo

Últimos Visitantes

O bloco dos últimos visitantes está desativado e não está sendo visualizado por outros usuários.

  1. Olá a todos, Estou usando um o PhotoSwipe para slider de imagens. Ele percorre os elementos das DIVs com classe desejada e apresenta as fotos de cada galeria. <div class="my-gallery" style="" itemscope itemtype="http://schema.org/ImageGallery"> <figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject"> <a href="https://farm2.staticflickr.com/1043/5186867718_06b2e9e551_b.jpg" itemprop="contentUrl" data-size="964x1024"> <img src="https://farm2.staticflickr.com/1043/5186867718_06b2e9e551_m.jpg" itemprop="thumbnail" alt="Image description" /> </a> <figcaption itemprop="caption description">Image caption 2</figcaption> </figure> <figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject"> <a href="https://farm7.staticflickr.com/6175/6176698785_7dee72237e_b.jpg" itemprop="contentUrl" data-size="1024x683"> <img src="https://farm7.staticflickr.com/6175/6176698785_7dee72237e_m.jpg" itemprop="thumbnail" alt="Image description" /> </a> <figcaption itemprop="caption description">Image caption 3</figcaption> </figure> </div> Pode haver várias galerias. O javascript é assim: var initPhotoSwipeFromDOM = function(gallerySelector) { // parse slide data (url, title, size ...) from DOM elements // (children of gallerySelector) var parseThumbnailElements = function(el) { var thumbElements = el.childNodes, numNodes = thumbElements.length, items = [], figureEl, linkEl, size, item; for(var i = 0; i < numNodes; i++) { figureEl = thumbElements[i]; // <figure> element // include only element nodes if(figureEl.nodeType !== 1) { continue; } linkEl = figureEl.children[0]; // <a> element size = linkEl.getAttribute('data-size').split('x'); // create slide object item = { src: linkEl.getAttribute('href'), w: parseInt(size[0], 10), h: parseInt(size[1], 10) }; if(figureEl.children.length > 1) { // <figcaption> content item.title = figureEl.children[1].innerHTML; } if(linkEl.children.length > 0) { // <img> thumbnail element, retrieving thumbnail url item.msrc = linkEl.children[0].getAttribute('src'); } item.el = figureEl; // save link to element for getThumbBoundsFn items.push(item); } return items; }; // find nearest parent element var closest = function closest(el, fn) { return el && ( fn(el) ? el : closest(el.parentNode, fn) ); }; // triggers when user clicks on thumbnail var onThumbnailsClick = function(e) { e = e || window.event; e.preventDefault ? e.preventDefault() : e.returnValue = false; var eTarget = e.target || e.srcElement; // find root element of slide var clickedListItem = closest(eTarget, function(el) { return (el.tagName && el.tagName.toUpperCase() === 'FIGURE'); }); if(!clickedListItem) { return; } // find index of clicked item by looping through all child nodes // alternatively, you may define index via data- attribute var clickedGallery = clickedListItem.parentNode, childNodes = clickedListItem.parentNode.childNodes, numChildNodes = childNodes.length, nodeIndex = 0, index; for (var i = 0; i < numChildNodes; i++) { if(childNodes[i].nodeType !== 1) { continue; } if(childNodes[i] === clickedListItem) { index = nodeIndex; break; } nodeIndex++; } if(index >= 0) { // open PhotoSwipe if valid index found openPhotoSwipe( index, clickedGallery ); } return false; }; // parse picture index and gallery index from URL (#&pid=1&gid=2) var photoswipeParseHash = function() { var hash = window.location.hash.substring(1), params = {}; if(hash.length < 5) { return params; } var vars = hash.split('&'); for (var i = 0; i < vars.length; i++) { if(!vars[i]) { continue; } var pair = vars[i].split('='); if(pair.length < 2) { continue; } params[pair[0]] = pair[1]; } if(params.gid) { params.gid = parseInt(params.gid, 10); } return params; }; var openPhotoSwipe = function(index, galleryElement, disableAnimation, fromURL) { var pswpElement = document.querySelectorAll('.pswp')[0], gallery, options, items; items = parseThumbnailElements(galleryElement); // define options (if needed) options = { // define gallery index (for URL) galleryUID: galleryElement.getAttribute('data-pswp-uid'), getThumbBoundsFn: function(index) { // See Options -> getThumbBoundsFn section of documentation for more info var thumbnail = items[index].el.getElementsByTagName('img')[0], // find thumbnail pageYScroll = window.pageYOffset || document.documentElement.scrollTop, rect = thumbnail.getBoundingClientRect(); return {x:rect.left, y:rect.top + pageYScroll, w:rect.width}; } }; // PhotoSwipe opened from URL if(fromURL) { if(options.galleryPIDs) { // parse real index when custom PIDs are used // http://photoswipe.com/documentation/faq.html#custom-pid-in-url for(var j = 0; j < items.length; j++) { if(items[j].pid == index) { options.index = j; break; } } } else { // in URL indexes start from 1 options.index = parseInt(index, 10) - 1; } } else { options.index = parseInt(index, 10); } // exit if index not found if( isNaN(options.index) ) { return; } if(disableAnimation) { options.showAnimationDuration = 0; } // Pass data to PhotoSwipe and initialize it gallery = new PhotoSwipe( pswpElement, PhotoSwipeUI_Default, items, options); gallery.init(); }; // loop through all gallery elements and bind events var galleryElements = document.querySelectorAll( gallerySelector ); for(var i = 0, l = galleryElements.length; i < l; i++) { galleryElements[i].setAttribute('data-pswp-uid', i+1); galleryElements[i].onclick = onThumbnailsClick; } // Parse URL and open gallery if it contains #&pid=3&gid=1 var hashData = photoswipeParseHash(); if(hashData.pid && hashData.gid) { openPhotoSwipe( hashData.pid , galleryElements[ hashData.gid - 1 ], true, true ); } }; // execute above function initPhotoSwipeFromDOM('.my-gallery'); Funciona perfeitamente. Link do exemplo http://photoswipe.com/documentation/getting-started.html No entanto, estou tentando mesclar com o JSSOR slider. No exemplo, ele percorre em busca dos filhos da tag FIGURE (a , img, figcaption). Lembrando que as tags <figure> são filhas da div.my-gallery Para usar com o JSSOR a tags <figuere> devem ficar dentro de DIVs. <div class='my-gallery'> <div> <figure> <a href=''> <img src=''> </a> <figcaption></figcaption> </figure> </div> <div> <figure> <a href=''> <img src=''> </a> <figcaption></figcaption> </figure> </div> </div> E por isso o código abre apenas uma imagem por vez, enquanto que deveria abrir todas da galeria para ir passando uma a uma. Na parte do código abaixo, troquei FIGURE por DIV e tentei mais algumas alterações sem sucesso. // find root element of slide var clickedListItem = closest(eTarget, function(el) { return (el.tagName && el.tagName.toUpperCase() === 'FIGURE'); //FIGURE }); Acredito que seja simples para quem tem experiência nessa parte. Agradeço a colaboração de todos.
  2. Olá Bergs, fiz uma tabela simples apenas para demonstração. Segue em anexo uma imagem. Quanto ao campo ordem_imgs não é do tipo Primary Key e nem AUTO_INCREMENT. Tanto é que todos imóveis terão as imagens com a mesma numeração em sua ordem (1,2,3,4,...) havendo números repetidos, mas não para um mesmo imóvel. Tem uma explicação junto a imagem. Algo que poderia usar seria um Índice UNIQUE com os campos fk_imoveis_imv_id e img_ordem. Assim o DB não permitirá que determinado id de imóvel tenha números repetidos no campo img_ordem. Abraço e dúvidas ou sugestões não deixe de compartilhar.
  3. Olá Bergs, realmente poderia usar o WHERE no lugar de AND img.ordem_imgs <=5 Ficaria: SELECT i.*, img.* FROM imoveis i LEFT JOIN imagens img ON img.fk_id_imovel=i.id WHERE img.ordem_imgs <=5 O JOIN só permaneceria obviamente para o relacionamento das tabelas. No caso eu dei preferencia para aproveitar o ON ao invés de usar o WHERE Quanto a LIMIT não poder ser usado com JOIN como você disse, eu estou cada vez mais ciente de que possa ser impossível mesmo. Acredito que por não ter uma maneira obvia de conseguir usar o LIMIT com JOIN, deve ser por não haver necessidade para isso, afinal os DBs são bem elaborados e quando usamos chaves estrangeiras, índices,... imagino que o mysql já deva saber que o imóvel id=35 possua 12 imagens na tabela ou que possua 5 imagens com com o campo (ordem_imgs) <=5. Isso por causa do uso do índice, senão ele teria que verificar todos registros um a um para calcular isso. Dessa forma, por já saber, é provável que ele já use o LIMIT automaticamente. Suponho que é como se o mysql dissesse: "no meu índice indica 12 imagens para o id 35, encontrei elas, então encerro a busca por mais imagens com esse id e prossigo procurando as imagens relacionadas aos outros ids." "no meu índice indica 5 imagens para o id 35 com o campo (ordem_imgs) tendo valor <=5, encontrei elas, então encerro a busca por mais imagens com esse id e prossigo procurando as imagens relacionadas aos outros ids." Não teria o porque após encontrar as 5 ou 12 imagens desejadas, prosseguir verificando se encontra mais imagens nas outras centenas ou milhares de linhas restantes na tabela. Outra evidência é que ele tenha esse entendimento de quantas imagens existam relacionadas com determinado id, é que quando usamos ON DELETE RESTRICT ele instantaneamente não permite deletar o registros que tenha outros relacionados. Será que ele varre toda a tabela para saber se tem tais registros (o que seria mais lento) ou usa os índices? Não tenho dúvidas que ele usará os índices. Ou seja, o mysql é poderoso e inteligente e quando usamos chaves estrangeiras e índices, ele organizará e usará os registros da melhor forma possível.
  4. Bem pessoal consegui uma solução simples, que não é exatamente o que procurava, mas dá para quebrar um galho. Vou continuar tentando encontrar a solução para a forma original que queria, usando (LIMIT) dentro do JOIN. Objetivo: Uso de 2 tabelas relacionadas 1:n onde temos vários imóveis na primeira tabela e cada imóvel possui várias imagens em outra tabela. Objetivo: Retornar apenas 5 imagens para cada imóvel em um SELECT com JOIN. Solução provisória: Ter na tabela imagens, além dos campos como (id, fk_id_imovel, nome_img, diretorio), um campo ordem_imgs que deverá ser populado com números sequências iniciando no 1. Assim no SELECT ficaria algo do tipo: SELECT i.*, img.* FROM imoveis i LEFT JOIN imagens img ON img.fk_id_imovel=i.id AND img.ordem_imgs <=5 Só para base de conhecimento: Pode-se usar uma biblioteca JQuery como (sortable) junto com o PHP e MySql para se ordenar as imagens arrastando-as (DRAG and Drop) no lado do cliente de modo a atualizar a sequência de números que determina a ordem das imagens na tabela do banco de dados.
  5. Olá Bergs, nesse caso específico não usei como chave estrangeira. A necessidade e objetivo são outros. Sei que se usa-se n:m seria mais prático e fácil de garantir a integridade. No exemplo que usei, é claro que se limão tiver escrito errado (lemãoo) na tabela cardapio_bebidas e for corrigido (UPDATE), automaticamente a correção afetará todas as linhas que tenham limão em cardapio_itens. pois nessa tabela, embora em um único campo, estão armazenados apenas os IDs das bebidas. Também seria importante cuidar para não permitir que limão seja removido da tabela cardapio_bebidas caso esteja em alguma linha em cardapio_itens. Poderia usar uma TRIGGER com uma validação antes de a linha ser removida (BEFORE DELETE). Use um campo (quantidade) para controlar quantos itens usam a bebida limão e só permita que seja removida caso a quantidade seja 0; Se desejar que quando nenhum cliente possuir mais a bebida limão, a mesma seja removida da lista em cardapio_bebidas, poderia usar um campo quantidade (qnt) na tabela cardapio_bebidas e usar UPDATE quando a bebida é inserida ou removida em cardapio_itens. Depois, se a quantidade for 0, você pode remover a bebida da lista. Para otimizar esses processos poderia usar TRIGGER no UPDATE da tabela cardapio_bebidas, onde, quando qnt=0 , DELETE. Na situação que estou usando, em (cardapio_bebidas) um usuário não poderá excluir uma bebida (exemplo: limão), pois a mesma poderá estar sendo usada por outros restaurantes e bares. Esta tabela apenas armazena todas opções disponíveis de bebidas sendo que o usuário pode apenas incluir novas bebidas, sendo que cada bebida é única UNIQUE. No entanto o usuário pode remover a bebida limão de sua lista de bebidas (cola, limão, laranja) que está armazenada apenas os ids (1,3,4) das mesmas em um campo na tabela cardapio_itens. Mas lembrando, limão não será removido da tabela cardapio_bebidas pois outros usuários poderão ter essa bebida. No meu caso não deverá haver a necessidade de excluir uma bebida se a quantidade for 0, apenas se ela não existir ou se o nome estiver escrito errado. Isso porque serão armazenadas as principais marcas com suas variações (coca-cola, pepsi, coca-cola zero,...) em torno de 40 no máximo 60 registros e no caso das demais marcas serão armazenadas apenas os sabores (limão, guaraná, limão zero, laranja,...) em torno de mais uns 50 registros. Total uns 100 registros apenas. Mesmo se colocar todos refrigerantes com marca e sabor seria no máximo 300 a 400 registros. Vamos supor que dê 5 ou 10 Mil registros incluindo cervejas, vinhos, espumantes,... Não acredito que manter tais registro apenas para consulta irá prejudicar muito o banco de dados pois usam indÍces (PRIMARI KEY).
  6. Olá pessoal, tive pensando em resolver a questão com algo tipo SELECT c.`cat_id` as id, c.`cat_nome_fantasia` as empresa, i.img_nome as imagem FROM `catalogo` c LEFT JOIN (SELECT * FROM imagens WHERE fk_catalogo_id=c.cat_id LIMIT 3) i ON c.cat_id=i.fk_catalogo_id Porém a coluna cat_id na subquery (WHERE fk_catalogo_id=c.cat_id ) não é reconhecida. Sabem se existe alguma forma de mudar isso? Tipo tornar a coluna Global. Então tentei SELECT (@valor_id:=c.`cat_id`) as id, c.`cat_nome_fantasia` as empresa, i.img_nome as imagem FROM `catalogo` c LEFT JOIN (SELECT * FROM imagens WHERE fk_catalogo_id=@valor_id LIMIT 3) i ON c.cat_id=i.fk_catalogo_id Porém o @valor_id parece não ter ficado setado, pois não retornou registros. Por fim tentei setar a variável. SET @valor_id:=1; SELECT (@valor_id:=c.`cat_id`) as id, c.`cat_nome_fantasia` as empresa, i.img_nome as imagem FROM `catalogo` c LEFT JOIN (SELECT * FROM imagens WHERE fk_catalogo_id=@valor_id LIMIT 3) i ON c.cat_id=i.fk_catalogo_id Nesse caso quase funcionou, buscou as imagens com LIMIT. Mas, ficou preso a setar manualmente o @valor_id, ou seja, só busca as imagens do id setado, o que não teria serventia pois seria o mesmo que inserir manualmente o id dentro do SELECT contido no JOIN. Alguém tem alguma ideia de como resolver? Obrigado
  7. Olá pessoal, consegui solucionar o problema de 2 formas. Minha ideia era relacionar 2 tabelas de um cardápio, exemplo (itens e bebidas) sem usar relacionamento n:m, mas armazenando os ids das bebidas em um campo "lista_bebidas". Para quem desejar, ao invés de usar o operador IN no JOIN ON, basta usar o FIND_IN_SET com GROUP_CONCAT e GROUP BY para agrupar os resultados por linha. Tabela cardapio_itens (* apenas demonstrativo) id || item_nome || lista_bebidas 1 || refri 300ml || 1,2,4,5 2 || refri 600ml || 2,3,5 Tabela cardapio_bebidas (* apenas demonstrativo) id || nome_bebida 1 || cola 2 || guaraná 3 || uva 4 || laranja 5 || limão Solução 1 - com uso de JOIN: (minha preferida) SELECT i.*, GROUP_CONCAT(b.nome_bebida) as bebidas FROM cardapio_itens i LEFT JOIN cardapio_bebidas b ON FIND_IN_SET(b.id, i.lista_bebidas) GROUP BY i.id Resultado: 1 || refri 300ml || cola, guaraná, laranja, limão 2 || refri 600ml || guaraná, uva, limão Solução 2 - com uso de Subquery: SELECT i.*, (SELECT GROUP_CONCAT(b.nome_bebida) as bebidas FROM cardapio_bebidas b WHERE FIND_IN_SET(b.id, i.lista_bebidas) ORDER BY b.nome_bebida ASC) FROM cardapio_itens i Essa escolha foi para evitar um grande número de linhas em uma tabela de ligação n:m, devido a serem vários restaurantes e bares com várias bebidas em tamanhos diferentes. Sei que para uma questão de integridade,... a melhor opção seria a terceira tabela n:m. Se o esperado fosse apenas alguns milhares de linhas até usaria n:m com uma tabela de junção itens_has_bebidas. Obrigado a todos
  8. Olá pessoal, não sei se é possível mas minha ideia seria usar o operador IN dentro de um JOIN substituindo o "=". Ex: Teria uma tabela itens_cardapio (car_id, car_nome, car_bebidas) e outra tabela > bebidas (b_id, b_nome) Sei que poderia relaciona n:m tendo uma tabela tipo itens_cardapio_has_bebidas (fk_car_id, fk_b_id) porém queria fazer diferente pois para o que quero isso geraria muitas linhas na tabela de junção. Gostaria que o campo car_bebidas na 1ª tabela armazenasse os ids das bebidas da 2ª tabela. Ex. car_bebidas=1,2,5,6,9,11 e na consulta ficaria algo do tipo: SELECT i.* , GROUP_CONCAT(b.b_nome) FROM itens_cardapio i INNER JOIN bebidas b ON (b.b_id IN i.car_bebidas) Tentei também algo tipo SELECT i.* , (SELECT b.nome FROM bebidas b WHERE b.b_id IN i.car_bebidas) FROM itens_cardapio i Usei algumas variação com GROUP BY e GROUP_CONCAT,... Consegui obter resultados como: - a primeira bebida de cada item do cardápio - repetir várias vezes cada bebida por item, e outros, mas nenhum 100% correto. Se no IN usar os números dos ids das bebidas manualmente, ao invés de puxar de um campo, ele busca as bebidas pedidas, porém não fica dinâmico, pois é sempre os mesmos números de modo a todos itens do cardápio ficaram com (coca-cola,sprite,fanta) por exemplo. Se tiverem alguma ideia agradeço.
  9. Olá pessoal, gostaria de saber se é possível e como limitar a quantidade de linha retornadas usando JOIN. A ideia é limitar a quantidade de linhas retornadas da tabela filho em relação a cada linha da tabela pai. Ex. Tenho 10 registros de imóveis na tabela_imv e cada um destes possui mais de 12 imagens na tabela_imgs (cada imagem em uma linha diferente). Usando o LEFT JOIN gostaria que para cada imóvel fossem trazidas apenas 5 imagens usando LIMIT 5 de modo que a cada 5 imagens encontradas, a busca cessasse na tabela filho, e retomasse procurando as 5 primeiras imagens do próximo imóvel. Desde já agradeço a atenção.
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.