Eu tenho uma tabela no banco de dados chamada #__magazines
, contém dados para revistas (data de publicação, número da edição etc.). Eu criei um Componente, Plugin e Módulo que é para o Joomla 3.x, quero que o módulo exiba variáveis (vamos usar Datas Publicadas como exemplo) que, se elas forem escolhidas e o botão "Pesquisar" for clicado, o módulo irá para o banco de dados e trará de volta todos os resultados correspondentes à data escolhida e exibirá os resultados em uma nova página.
Eu segui os tutoriais do Joomla, mas não consigo exercitar a melhor maneira de consultar o #__magazines
tabela e, em seguida, exiba os resultados.
ATUALIZAÇÃO
Agora, o plug-in de pesquisa está funcionando corretamente; portanto, se eu pesquisar um título de revista (que eu sei que está no banco de dados), ele aparecerá nos resultados da pesquisa.
O que eu quero saber, no entanto, é como eu posso exibir todas as diferentes variáveis da tabela de banco de dados de #__magazines
e mostre-os como menus suspensos em um módulo de pesquisa, mas sem duplicatas. Por exemplo, se houver um title
chamado June 2014
e ele está no banco de dados duas vezes, eu só quero que ele seja exibido no menu suspenso Selecionar opção uma vez, se for escolhido e o botão "Pesquisar" clicar em que o usuário será direcionado para a página de resultados, onde a versão múltipla do Os detalhes de "junho de 2014" são mostrados.
Corrigi isso usando o seguinte no arquivo default.php dentro do módulo:
// Get a db connection.
$db = JFactory::getDbo();
// Published dates
$query = $db->getQuery(true);
$query->select($db->quoteName(array('publishedDate')));
$query->from($db->quoteName('#__magazines'));
$query->order('publishedDateASC');
$query->group('publishedDate');
$db->setQuery($query);
// Load dates
$dates = $db->loadObjectList();
// Input
$input = JFactory::getApplication()->input;
<label for="publisheddate">Departure Date:</label>
<select id="publisheddate" name="publisheddate">
<option selected="selected" value="A">Choose Date</option>
<?php $dateInput = $input->get('publisheddate', null, 'string'); ?>
<?php foreach ($dates as $result): ?>
<option value="<?php echo $result->publishedDate; ?>"<?php echo $dateInput == $result->publishedDate ? ' selected="selected"' : ''; ?>>
<?php echo $result->publishedDate; ?>
</option>
<?php endforeach; ?>
</select>
Isso foi para a tabela #__magazines, recuperou um de cada publishDate e preencheu a tabela com ele!
Atualização: para modificar meu snippet para uso dinâmico para uma variedade de possíveis valores de variáveis de entrada, suponho que você possa simplesmente declarar uma "lista de permissões" de nomes de colunas e verificar se o $column
A ser consultado é válido.
Por exemplo, $column = "publishedDate"
Você só precisa refazer publishedDate
com $column
No meu script e chamar $db->qn()
a cada vez para garantir sua segurança.
... e use strtolower()
para preparar a variável para declarações de atributo dom.
Código testado:
$db = JFactory::getDBO();
try {
$query = $db->getQuery(true)
->select("DISTINCT publishedDate")
->from("#__magazines")
->order("publishedDate");
// echo $query->dump(); // uncomment if you want to see what is generated
$db->setQuery($query);
if ($dates = $db->loadColumn()) {
$user_date = JFactory::getApplication()->input->get('publisheddate', null, 'string');
}
} catch (Exception $e) {
$dates = array();
// echo "Syntax Error" , $e->getMessage();
}
echo "<label for=\"publisheddate\">Departure Date:</label>";
echo "<select id=\"publisheddate\" name=\"publisheddate\">";
echo "<option value=\"A\">Choose Date</option>";
foreach ($dates as $date) {
echo "<option" , ($user_date == $date ? " selected" : "") , ">{$date}</option>";
}
echo "</select>";
Explicações:
try {} catch {}
É uma maneira limpa de verificar se há erros e controlar o desempenho do seu código após um possível erro de sintaxe da consulta.getQuery()
para que $query
Seja gravado apenas uma vez ao criar a consulta.SELECT DISTINCT
Em vez de GROUP BY
. Aqui está m post de suporte .select()
não precisa receber uma matriz - uma string funcionará perfeitamente. Como publishedDate
não [~ # ~] precisa que [~ # ~] seja embalado em backtick, poupe a função qn()
chamada de método e deixe-a como uma sequência não citada, sem implicações de segurança.ORDER BY
Usará ASC
como a direção padrão, portanto, não há necessidade de declarar isso explicitamente. E você precisava de um espaço antes do seu ASC
, mas isso pode ter sido apenas um erro de digitação.loadColumn()
é a chamada mais apropriada quando você deseja gerar uma matriz unidimensional a partir de um único conjunto de resultados da coluna.$user_date
Se a matriz $dates
Não estiver vazia. O condicional está fazendo duas coisas: 1. declarando $dates
E 2. verificando um valor que não seja falsey (uma matriz vazia é falsey). Se não houver elementos em $dates
, Se o usuário enviou ou não $_GET['publisheddate']
É discutível.$dates
Como uma matriz vazia para que o loop foreach()
não possa iterar.$e->getMessage()
ao público.A
. Assumirei que isso significa "Todos" e você exibirá todos os registros nos resultados da pesquisa, o que parece ser um recurso razoável.selected="selected"
No primeiro <option>
. Se nenhuma outra opção for selecionada, ela será exibida como a opção selecionada.$date
Dentro do loop foreach()
e nenhuma sintaxe de objeto (->
) É necessária.<option>
Valores idênticos ao texto visível, não há necessidade de declarar o atributo value
. Poupe o inchaço do código; o texto será enviado como o valor.$date
São meu estilo de codificação preferido - não é necessário neste caso.