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]" );
}