The Joomla! Forum ™






Post new topic Reply to topic  [ 10 posts ] 
Author Message
PostPosted: Tue Nov 20, 2007 5:41 pm 
Joomla! Apprentice
Joomla! Apprentice
Offline

Joined: Tue May 01, 2007 9:59 am
Posts: 44
Olá.

Já utilizo o Joomla há um ano e meio e considero-o uma excelente ferramenta. Mas um dos pontos fracos do Joomla é não permitir que se atribua um artigo a mais do que duas categorias sem ter de duplicar o artigo. Fartei-me de procurar em fóruns a ver se alguém tinha feito um hack para isto, mas não encontrei nada, mas pude perceber que esta é uma funcionalidade muito requisitada. Após tanta procura, decidi tentar eu mesmo fazer esse Hack. Mesmo não sendo um grande programador em PHP, lancei mãos à obra e para quem não é programador até que me desenrrasquei bem.

Segue a lista do que já consegui fazer:

1 - Criei uma tabela chamada maiscategorias para poder relacionar um artigo a mais do que uma categoria;
2 - Backend:
    2.1 - No formulário de Inserção/Edição de artigos criei um campo lista que é multiselect em que o utilizador escolhe as outras categorias às quais o artigo vai estar associado;
    2.2 - Gravo e os dados são guardados na tabela nova (maiscategorias), ficando assim o artigo associado a mais do que uma categoria.

3 - Frontend:
    3.1 - Alterei a função que lista os artigos por categoria de modo a listar os artigos por associação (não sei se deu para perceber).

O Problema:

      - Já consegui tudo isso, mas agora tenho um problema grande que é a edição. Quando vou editar no backend, se eu gravar sem alterar o campo com as outras categorias nada é gravado, ou seja, não consigo ir buscar quais as categorias a que o artigo está associado e gravar de novo na nova tabela. O que faço é o seguinte: ao gravar vejo se o artigo que estou a criar/editar já está na tabela mais categorias. Se estiver, quer dizer que estou a editá-lo e o que faço é apagá-lo e escrevo por cima com os novos valores. Ora, como ele não recupera os valores armazenados, ele apaga o registo e não escreve nada. Já agora, estou a utilizar a função SelectList para seleccionar as categorias.

A questão é: como é que vou buscar os valores armazenados na nova tabela ao editar um artigo?

Quem estiver disponível a debater e tentar resolver esta questão comigo pode postar aqui e posso disponibilizar o código alterado para poderem perceber melhor o que foi feito e como.

Jerson Figueiredo.


Top
 Profile  
 
PostPosted: Tue Nov 20, 2007 5:45 pm 
User avatar
Joomla! Virtuoso
Joomla! Virtuoso
Offline

Joined: Thu Aug 18, 2005 12:39 pm
Posts: 4016
Location: São Paulo - Brazil
Putz amigo, eu já tinha visto algo parecido com isso. E tinha visto uma solução no extensions.joomla.org porém não lembro mais o nome do componente.

_________________
http://www.ronildo.com.br/blog/ pt-br | twitter: twitter.com/ronildo
http://forum.joomla.org/viewtopic.php?f=23&t=144443 - FAQ Joomla [pt]
Pessoal por favor não tiro dúvidas por e-mail nem mensagem privada, por favor não insistam.


Top
 Profile  
 
PostPosted: Tue Nov 20, 2007 7:04 pm 
User avatar
Joomla! Ace
Joomla! Ace
Offline

Joined: Thu Aug 18, 2005 5:34 pm
Posts: 1871
Location: BH/MG - Brasil
ronildo wrote:
Putz amigo, eu já tinha visto algo parecido com isso. E tinha visto uma solução no extensions.joomla.org porém não lembro mais o nome do componente.


Não seria isso: -> http://extensions.joomla.org/component/ ... Itemid,35/

_________________
http://www.danielcorrea.me
http://www.joomleiros.com


Top
 Profile  
 
PostPosted: Wed Nov 21, 2007 3:16 pm 
Joomla! Apprentice
Joomla! Apprentice
Offline

Joined: Tue May 01, 2007 9:59 am
Posts: 44
pchardnet wrote:
ronildo wrote:
Putz amigo, eu já tinha visto algo parecido com isso. E tinha visto uma solução no extensions.joomla.org porém não lembro mais o nome do componente.


Não seria isso: -> http://extensions.joomla.org/component/ ... Itemid,35/


Acho que isso não serve para o que eu quero. O que tento fazer é somente ao inserir um artigo (notícia), ter a possibilidade de colocar essa notícia em várias categorias sem ter de a duplicar. Como expliquei em cima, já consegui fazer isso alterando o código da com_content mas tenho problemas no Editar. Ao editar uma notícia, se eu não escolher de novo as categorias, ou seja, se deixar a notícia tal como está, sem alterações e tornar a gravar os valores do array das categorias escolhidas não são guardados, o seu valor é perdido.

Jerson Figueiredo.


Top
 Profile  
 
PostPosted: Thu Nov 22, 2007 2:26 am 
User avatar
Joomla! Guru
Joomla! Guru
Offline

Joined: Fri Aug 19, 2005 1:59 am
Posts: 611
Location: Brasil
jersonf wrote:
O que faço é o seguinte: ao gravar vejo se o artigo que estou a criar/editar já está na tabela mais categorias. Se estiver, quer dizer que estou a editá-lo e o que faço é apagá-lo e escrevo por cima com os novos valores. Ora, como ele não recupera os valores armazenados, ele apaga o registo e não escreve nada. Já agora, estou a utilizar a função SelectList para seleccionar as categorias.

A questão é: como é que vou buscar os valores armazenados na nova tabela ao editar um artigo?


Se vc já consulta a tabela maiscategorias para ver se o artigo já se encontra lá e depois o remove de lá. Por que vc não pega as categorias às quais o artigo pertence, antes de removê-lo, e usa estes dados para preencher a lista de categorias ao o artigo pertence durante a edição do mesmo ?

Não para fazer isso usando a função SelectList, pois apesar de construir a lista de seleção automaticamente, ela não permite definir os valores que já devem aparecer selecionados. Para isso vc vai ter que construir uma select list manualmente e nas categorias que desejar que estejam selecionadas vc deve setar o atributo selected.
Mais sobre formulários:
http://www.tizag.com/htmlT/forms.php

FaBMak

_________________
Fabricio Elias Costa - Moderador do Joomla.org e Coordenador da Tradução Brasileira do Joomla!
Katipsoi Zunontee - http://ka-tips-oi-zu-non-tee.com/


Top
 Profile  
 
PostPosted: Thu Nov 22, 2007 9:57 am 
Joomla! Apprentice
Joomla! Apprentice
Offline

Joined: Tue May 01, 2007 9:59 am
Posts: 44
Olá FabMak, obrigado pela resposta. A minha dificuldade é exatamente essa, como setar o atributo selected.

Para perceberem melhor o que fiz, vou colocar aqui o código. Mas antes quero explicar a minha ideia, porque agora tentei outra abordagem. Para simplificar, desisti da idéia de alterar o com_content e criei um componente somente para atribuir a notícia a várias categorias depois dessa notícia ser gravada.

Funciona do seguinte modo:

1 - Crio a notícia normalmente com o com_content e gravo numa categoria qualquer.
2 - Na lista de notícias acrescentei um link para o meu componente. Assim, por exemplo:

      nº  Título  Publicado  Primeira Página  Acesso  ID  Categoria  + Categorias 
      1  Teste  Publicado    Não                    Público      40      Teste2      +Cats 

Como podem ver acrescentei o campo a bold. Todas as notícias têm um link para o meu componente e esse link leva o id da notícia. O que o meu componente faz é apresentar uma combobox multiselect com todas as categorias (independentemente da seção) e escolho então as outras categorias que a notícia vai fazer parte.

Ao atribuir pela primeira vez funciona perfeito. O problema está exatamente no atributo selected ao editar. Ao editar os campos aparecem selecionados ou seja estão com o atributo selected mas os campos selected não têm valor. Assim ao guradar de novo, como os campos selected não têm valor, ele insere na tabela maiscategorias o valor 0. Tenho certeza que o problema está na chamada da função makeOption.

Mas para vocês perceberem melhor aqui vai o código do meu Inserir/Editar e Guardar categorias do meu componente.

Code:
//Adicionar/Editar Categorias
function addCategorias($id, $option) {
   global $database, $mainframe, $mosConfig_absolute_path, $my;

   //Dados da notícia
   $query = "SELECT id_categoria"
   . "\n FROM #__maiscategorias"
   . "\n WHERE id_noticia=".$id
   ;
   $database->setQuery( $query );
   $mais_cat = $database->loadObjectList();
   
   $categorias = array();
   if ($mais_cat) {
      foreach($mais_cat as $maiscategorias) {
         $categorias[] = $maiscategorias->id_categoria;
      }
   }
   $conta=count($categorias);
   

   //Dados da notícia
   $query="SELECT * FROM  #__content WHERE id=".$id;         
         
   $database->setQuery($query);
   $database->query();
   $curItem=null;
   
   $database->loadObject($curItem);

   //Categorias
   $database->setQuery( "SELECT id, name FROM  #__categories ORDER BY name" );
   $categs = $database->loadObjectList();
   
   $cats_arr = array();

   foreach($categs as $cat) {
      $checked="id";
         if(count($categorias))
         {
            echo "Entrou no if count novo";
            echo "<br />";
            $checked=in_array($cat->id,$categorias)? "selected":"id";
         }
            //echo "checked::$checked";
         $cats_arr[]  = mosHTML::makeOption( $cat->id, $cat->name, $checked,"name"); //[b]Acho que o problema está aqui[/b]
   }

   $lista_categorias['categorias'] = mosHTML::selectList($cats_arr,"categorias[]",'class="inputbox" multiple="multiple"',"id","name", $categorias );
   

   HTML_categorias::addCategorias($option, $mais_cat, $curItem, $my->id, $lista_categorias);
   
}

/**************************************************************************************************/

//Guardar Categorias
function save($id, $option)
{
   global $database, $mosConfig_absolute_path;

   $mais    = josGetArrayInts( 'categorias' );
   $noticia = mosGetParam($_REQUEST,"id_noticia",null);
   $seccao2 = mosGetParam($_REQUEST,"seccao",null);

   /******************************************************************************************/
   // Apaga as categorias da notícia
   $query = "DELETE FROM #__maiscategorias"
   . "\n WHERE id_noticia = " . (int) $noticia
   ;
   $database->setQuery( $query );
   $database->query();

   $cont = count($mais);
   
   foreach ($mais as $mais_categorias){
      // this check for the blank spaces in the select box that have been added for cosmetic reasons
         // assign new module to menu item associations
         $query = "INSERT INTO #__maiscategorias SET id_noticia = " . (int) $noticia . ", id_categoria = " . (int) $mais_categorias . ", data = now()";
         //$query = "INSERT INTO #__maiscategorias (id_noticia, id_categoria, data) VALUES (". (int) $noticia.",". (int) $mais_categorias.", now())";
         $database->setQuery( $query );
         $database->query();
   }   

   mosRedirect( "index2.php?option=com_content§ionid=$seccao2&cont=$cont&valor1=$mais[0]" );
}



Top
 Profile  
 
PostPosted: Thu Nov 22, 2007 9:50 pm 
User avatar
Joomla! Guru
Joomla! Guru
Offline

Joined: Fri Aug 19, 2005 1:59 am
Posts: 611
Location: Brasil
Creio que:
Code:
$lista_categorias['categorias'] = mosHTML::selectList($cats_arr,"categorias[]",'class="inputbox" multiple="multiple"',"id","name", $categorias );


Deva ser:
Code:
$lista_categorias['categorias'] = mosHTML::selectList($cats_arr,'categorias[]','class="inputbox" multiple="multiple"','value','text', $categorias );


Fonte:
http://forum.joomla.org/index.php?topic ... .msg870058
http://dev.joomla.org/component/option, ... electlist/

FaBMak

PS: Pode ter passado mais alguma pois não entendi algumas coisas em seu código-fonte. I'm a noob, i know!

_________________
Fabricio Elias Costa - Moderador do Joomla.org e Coordenador da Tradução Brasileira do Joomla!
Katipsoi Zunontee - http://ka-tips-oi-zu-non-tee.com/


Top
 Profile  
 
PostPosted: Fri Nov 23, 2007 9:57 am 
Joomla! Apprentice
Joomla! Apprentice
Offline

Joined: Tue May 01, 2007 9:59 am
Posts: 44
Oi.

Muito obrigado. Esses links que você me indicou foram excepcionais. Funcionou direitinho. Estava quase desistindo mas ainda bem que postei o problema aqui. Nem tinha me lembrado de procurar no site Joomla.org.

Valeu mesmo. Muito obrigado.

Se alguém aqui estiver interessado no meu código, pode entrar em contato comigo por email, neste aqui: jerson.figueiredo@gmail.com.

Jerson Figueiredo.


Top
 Profile  
 
PostPosted: Sat Jan 12, 2008 10:02 pm 
Joomla! Fledgling
Joomla! Fledgling
Offline

Joined: Thu Jan 10, 2008 10:48 pm
Posts: 4
jersonf,
Mandei um e-mail pra vc hoje estou com mesmo problema e conto com sua ajuda no code :)


Top
 Profile  
 
PostPosted: Wed Jan 04, 2012 2:48 pm 
User avatar
Joomla! Intern
Joomla! Intern
Offline

Joined: Sat Jul 08, 2006 8:10 pm
Posts: 90
ola all, estou retomando a este post. Andei pesquisando em diversos posts no forum e no extentions do joomla e nunca vi nada que me agradasse. O ZOO enche de coisa e fica estranho depois trabalhar com ele.

Estava aguardando as novas versões (1.6, 1.7 e agora 2.5) e continua sem essa funcionalidade.

Alguem consegue algo (agora para joomla 1.7)? que consiga um artigo em mais de uma categoria?

Jersonf, Vc conseguiu finzalizar o que vc fez? funcionou? Poderia disponibilizar para a comunidade?

Obrigado.

_________________
JC Lins
http://www.ideianaweb.com.br


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 10 posts ] 



Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Jump to:  
Powered by phpBB® Forum Software © phpBB Group