Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Nerdmonkey

Autocomplete não exibe os métodos relacionados da classe

Recommended Posts

Bom dia, olha eu aqui de novo com mais um problema. Isso que dá aprender coisas novas né. Com códigos mais bem estruturados vem novos erros :v

 

É o seguinte,

tenho meu controller Index.php para renderizar minhas páginas

 

 

 
<?php
namespace App\Controllers;

use SON\Controller\Action;
use SON\DI\Container;

class Index extends Action
{
public function home()
{
$this->render('home');
}

public function business()
{
$this->render('business');
}
}
 

 

Tenho o meu conteúdo que faz a gestão de dependência da conexão com o banco de dados

 

<?php
namespace SON\DI;

class Container
{
public static function getClass($name)
{
$str_class = "\\App\\Models\\" . ucfirst($name);
$class = new $str_class(\App\Init::getDb());
return $class;
}
}

 

E por fim a classe Table que faz as consultas e gerencia toda essa comunicação com o banco de dados

 

<?php
namespace SON\DB;

abstract class Table
{
protected $db;
protected $table;

public function __construct(\PDO $db)
{
$this->db = $db;
}

public function fetchAll()
{
$query = "SELECT * FROM {$this->table}";
return $this->db->query($query);
}

public function find($param, $valueParam)
{
$stmt = $this->db->prepare("SELECT * FROM {$this->table} WHERE {$param} :{$param}");
$stmt->bindParam(":{$param}", $valueParam);
$stmt->execute();
$res = $stmt->fetch();
return $res;
}
}

 

Eu preciso ir no gastro e esse problema ta me deixando de cabelo em pé.

Ao tentar retornar um dos métodos da minha classe Table no meu controller, ele simplesmente não encontra sugestões para os meus métodos o que me leva a acreditar que deu ruim =/

 

public function home()
{
    $test = Container::getClass("MyClass");
   $test->no_sugestions; // Não funciona a chamada de nenhum dos dois métodos da classe Table
    $this->render('home');
}

 

Como disse esse mundo é um pouco novo pra mim, mas não menos fascinante. Posso estar deixando passar alguma coisa aqui ou ali que meus olhos de aprendiz não me deixam ver então conto com a sapiência de vocês pra me ajuda :)

 

É um mini sistema e se precisarem do restante do código é só falar mas, basicamente, tudo funciona até aqui, com exceção desse problema apresentado.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O autocomplete, ou intellisense, é proveniente da IDE, e não da linguagem de programação.

 

A melhor IDE que tive o prazer de traabalhar, nessa questão, foi PHPDesigner, mas hoje ela é "abandonware", pois o desenvolvedor, de certa forma, abandonou o projeto e não liberou o fonte (já que é uma IDE paga).

 

Se não me engano, IDEs como NetBeans, Eclipse e Zend oferecem um bom suporte ao autocomplete. Outras IDEs, como PHPStorm, Aptana e Sublime, eu não possuo essa informação.

 

No linux eu uso Kate, que o recurso é bem precário mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Heming, eu trabalho como phpStorm. Ela é ótima e sim, tem o autocompletar de todas as linguagens web. Porém nesse caso em específico, ela não encontra sugestões.

 

O fato da classe ser abstrata não me impede de chamar um método dela através de um objeto, ou impede?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não impede.

 

Também pode ser pois dois motivos, a sua estruturação da classe MyClass, pois não está no seu código acima (pode ser a falta do Extends). Ou a IDE não reconheça que o método Container::getClass() retornará a classe passada como parâmetro. Isso também influência.

 

Tenda da seguinte forma:

$myClass = new MyClass();

Verifique se irá funcionar o autocompletar.

 

Caso positivo, é o problema de fraca tipagem do PHP que faz com que a IDE não entenda o que está sendo retornado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não funcionou dessa forma.

 

O código da model Home

<?php
namespace App\Models;

use SON\DB\Table;

class Home extends Table
{
protected $table = "artigos";
}

Apenas seta a tabela para pega os dados. E aqui no controller Index deveria fazer a atribuição para ser passado para o View, que é a home.phtml lá em baixo.

public function home()
{
$link = Container::getClass("Home");
$link->view->test = $link->find('id', 1);
$this->render('home');
}

Mas não vai. O phpStorm sempre me retorna o autocomplete de todos os códigos. É nesse trecho em específico que não está retornando.

home.phtml
 
<?php echo $this->view->test; ?>
 
Erro
Warning: Creating default object from empty value in D:\Server\public_html\App\Controllers\Index.php on line 12

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por clovis.sardinha
      Tenho uma consulta de autocomplete no bd que funciona no servidor local e não roda no servidor da web. 
      Ao enviar a consulta no servidor local  aparece no console :Fetch terminou o carregamento: GET ".../Cidade?cidade=sao%20paulo". A pesquisa é feita normalmente.
      Quando mando a mesma pesquisa para o servidor web(locaweb) aparece no console: Fetch terminou o carregamento: GET "..../Cidade?cidade=sao%2520paul".
      O número 25 aparece só no servidor web. Pelo que pesquisei 25 significa %, ou seja, está duplicando o caractere %. 
      Não consegui utilizar nenhuma função para evitar que isto ocorra. Alguém sabe se há alguma configuração no servidor web que possa ser alterada para evitar essa duplicação?
       
    • Por clovis.sardinha
      Estou em um impasse pois sei pouco de javascript. Estou fazendo um autocomplete com CI4 e Javascript.
      Consigo gerar, através do controllers/model do CI4 um arquivo em json, mas não consigo retorná-lo para o javascript para poder mostrar as opções para consulta. 
      O console.log mostra que estou obtendo o  json() { [native code] }.
      Segue os dois arquivos para ver se alguém me ajuda.
      //arquivo cidade.js async function carregar_cidade(valor) { if (valor.length >= 3) { //console.log("Pesquisar:" + valor); const dados = fetch('Testes/?cidade='+valor, { method: "get", headers: { "Content-Type": "application/json", "X-Requested-With": "XMLHttpRequest" } }); const resposta = (await dados).json; console.log(resposta); var html = "<ul class='list-group position-fixed'>"; html += "<li class='list-group-item'>" + resposta['cid_nome'] + "</li>"; html += "</ul>"; } } <?php //arquivo Testes.php namespace App\Controllers; use App\Models\CidadeModel; /** NÃO MANDAR PARA O SERVIDOR - APENAS TESTES DE FUNÇÕES E OUTROS ELEMENTOS DO CI4 */ class Testes extends BaseController{ protected $tbCidades; public function __construct(){ $this->tbCidades = new CidadeModel(); } public function index(){ $request = \Config\Services::request(); $client = \Config\Services::curlrequest(); $cidades=[]; if($get=$request->getGet()){ $cities=$get['cidade']; $cidadeFiltrada=$this->tbCidades->getCidByName($cities); $cidades= json_encode($cidadeFiltrada); //dd($cidades); } echo view('Testes/testes'); } public function salvar(){ $request = \Config\Services::request(); if($post=$request->getPost()){ dd($post); } } } <!doctype html> <html lang="pt-br"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- Bootstrap CSS --> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous"> <title>Autocomplete</title> </head> <body> <div class="container"> <h1 class="mt-4 mb-4">Formulário</h1> <form class="row g-3"> <div class="col-12"> <label for="cidade" class="form-label">Cidade</label> <input type="text" name="cidade" class="form-control" id="cidade" placeholder="Pesquisar cidade" onkeyup="carregar_cidade(this.value)"> </div> <span ></span> </form> </div> <!-- Optional JavaScript; choose one of the two! --> <!-- Option 1: Bootstrap Bundle with Popper --> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script> <script src="assets/js/cidade.js"></script> </body> </html>
    • Por klonder
      Olá a todos(as)!
      Estava há 3 dias pesquisando sobre como resolver um problema que estava enfrentando em meu sistema, que consistia no seguinte:
      Implantar um Combobox com dados vindos do banco. Esse combobox deveria ser editável e apresentar os valores em seu popup suspenso. À medida em que o usuário fosse digitando, o autocomplete faria a busca em todos os valores já cadastrados e mostraria os compatíveis (procedimento até então comum em qualquer autocomplete). Todavia, o combobox só poderia perder o foco caso o texto inserido fosse exatamente igual a um dos valores existentes no popup, ou seja, não poderia ser  inserido nada que já não estivesse cadastrado anteriormente e presente na lista de valores.
      Após muito pesquisar, cheguei a um resultado muito satisfatório que compartilho com vocês, visto que varri a internet inteira à procura desse código e não encontrei em lugar nenhum. PyQt5 é extremamente pobre em tutoriais, principalmente em português.
       
      Segue o código que poderá ajudar quem precise:
      from PyQt5 import QtGui, QtCore, QtWidgets from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QComboBox, QLineEdit, QCompleter from PyQt5.QtCore import QSize, Qt, QSortFilterProxyModel, QStringListModel class Ui_Autocomplete(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 200, 800, 600) self.setWindowTitle('Autocomplete com combobox') self.cboxEstado = QComboBox(self) self.cboxEstado.move(50, 50) self.cboxEstado.addItem("Acre") self.cboxEstado.addItem("Amazonas") self.cboxEstado.addItem("Amapá") self.cboxEstado.addItem("Pará") self.cboxEstado.addItem("Rondônia") self.cboxEstado.addItem("Roraima") self.cboxEstado.addItem("Tocantins") self.cboxEstado.addItem("Distrito Federal") self.cboxEstado.addItem("Goiás") self.cboxEstado.addItem("Mato Grosso") self.cboxEstado.addItem("Mato Grosso do Sul") self.cboxEstado.addItem("Alagoas") self.cboxEstado.addItem("Bahia") self.cboxEstado.addItem("Ceará") self.cboxEstado.addItem("Maranhão") self.cboxEstado.addItem("Piauí") self.cboxEstado.addItem("Pernambuco") self.cboxEstado.addItem("Paraíba") self.cboxEstado.addItem("Rio Grande do Norte") self.cboxEstado.addItem("Sergipe") self.cboxEstado.addItem("Paraná") self.cboxEstado.addItem("Rio Grande do Sul") self.cboxEstado.addItem("Santa Catarina") self.cboxEstado.addItem("Espírito Santo") self.cboxEstado.addItem("Minas Gerais") self.cboxEstado.addItem("São Paulo") self.cboxEstado.addItem("Rio de Janeiro") self.cboxEstado.setEditable(True) self.cboxEstado.completer().setCompletionMode(QCompleter.PopupCompletion) self.cboxEstado.completer().setFilterMode(Qt.MatchContains) self.cboxEstado.completer().setCaseSensitivity(QtCore.Qt.CaseInsensitive) self.cboxEstado.focusOutEvent = self.pedeuFoco self.leRegiao = QLineEdit(self) self.leRegiao.move(250,50) self.leRegiao.resize(200, 22) def pedeuFoco(self,event): occur = 0 for i in range(len(self.cboxEstado)): if self.cboxEstado.currentText() == self.cboxEstado.itemText(i): occur = occur+1 if occur == 0: self.cboxEstado.lineEdit().setFocus() self.cboxEstado.lineEdit().selectAll() else: #Retira o cursor do widget QComboBox.focusOutEvent(self.cboxEstado,event) if __name__ == '__main__': import sys app = QApplication(sys.argv) mainWin = Ui_Autocomplete() mainWin.show() sys.exit(app.exec_())  
       
    • Por sthefany silva
      Olá, minha dúvida é ao fazer um selecte em algum as opções do autocomplete mostrar contudo na pág. e ao limpar os dados inseridos no input fazer com que volte ao estado anterior. 
       
      ou seja, ao seleconar ele abrirar o que foi seleconado, ao limpar campus do input mostrar topicos anterior.
       
       
      segue abaixo meus códigos: 
       
      HTML:
       <form class="submit-line" id="form">                           <input  id="buscaPerguntas" autocomplete="off" class="form-control input-faq"                          placeholder="Digite palavras-chaves para pesquisar" style="padding: 28px;">                       </form>                 </div>               </div>         </div>         <div class="row">             <div id="buscaPerguntas-description">             </div>         </div>

                <div class="divFaq" id="listaFaq">             <div class="row">                 {% for valor in faq%}                   <div class="col-sm-12">                       <div class="boxFaq">                         <a class="btn btn-faq accordion" type="button" data-toggle="collapse" data-target="#{{valor.id}}" aria-expanded="true">                              {{valor.pergunta}}                         </a>                     </div>                 </div>                   <div class="col-sm-12">                     <div id="{{valor.id}}" class="collapse">                         <div class="boxFaq">                             <div class="card-body">                                 <div>{{valor.resposta|raw}}</div>                             </div>                         </div>                     </div>                 </div>                   {% endfor %}               </div>
         
       
       
      JAVASCRIPT:
       
      $(function () {       $("#buscaPerguntas").autocomplete({           autoFocus: true,         minLength: 1,         appendTo: '#form',         source: function (request, response) {                        $.ajax({                 url: '/pesquisafaq',                 type: 'post',                 data: {                     dadosPesquisa: request.term                   }                               }).done(function (data) {                   let parse = JSON.parse(data)                   if (parse.length > 0) {                       let dados = Object.values(parse).map((e) => {                           return {                             label: e.pergunta,                             desc: "<div class='divFaqCollapse'><div class='col-sm-12'><div class='boxFaq'><a class='btn btn-faq accordion' type='button' data-toggle='collapse' data-target='#collapse' aria-expanded='true'>" + e.pergunta + "</a></div></div> <div class='col-sm-12'> <div id='collapse' class='collapse'> <div class='boxFaq'> <div class='card-body'> <div>" + e.resposta + "</div> </div> </div> </div> </div> </div>",                           }                       })                     response(dados.slice(0))                 }                                });           },         select: function (event, ui) {               $("#buscaPerguntas").val(ui.item.label);             $("#buscaPerguntas-description").html(ui.item.desc);                        $('#listaFaq').hide();             $('#buscaPerguntas-description').show();                      }       })   });  
    • Por bessa238
      Bom dia galera, estou com um problema do qual não consigo resolver. É o seguinte, eu tenho 2 selects, um com as siglas dos estados brasileiros e outro com as cidades, o select de cidades é populado de acordo com o estado selecionado, até aí tudo bem. O problema é que estou usando um webservice do viacep para trazer dados de acordo com o cep preenchido, ao preencher o cep ele seta todos os dados corretamente, mas quando chega o valor da cidade, ele tenta setar o select antes do preenchimento das cidades. Sendo assim gostaria de saber se existe uma maneira de saber quando o select esta completamente carregado ? Segue o trecho do código…
      //Consulta o webservice viacep.com.br/ $.getJSON("https://viacep.com.br/ws/"+ cep +"/json/?callback=?", function(dados) { if (!("erro" in dados)) { //Atualiza os campos com os valores da consulta. $("#endereco").val(dados.logradouro); $("#bairro").val(dados.bairro); $("#estadoatual").val($('option:contains('+(dados.uf)+')').val()); $("#estadoatual").change(); $("#cidadeatual").val($('option:contains('+(dados.localidade).toUpperCase()+')').val()); $("#complemento").val(dados.complemento); } //end if. else { //CEP pesquisado não foi encontrado. limpa_formulário_cep(); alert("CEP não encontrado."); } });
×

Informação importante

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