Ir para conteúdo

POWERED BY:

fideles

Ids em array

Recommended Posts

Senhores, um dúvida e acho que vocês podem me ajudar a exclarecer ou mudar o codigo.

 

Tenho um formulario onde pode acrescentar varias linhas com javascript e com um botão para chamar a função e que funciona bacana, codigo abaixo;

<script type="text/javascript">
$(function () {

  $(".adicionarCampo").click(function () {
	novoCampo = $("tr.linhas:first").clone();
	novoCampo.find("input").val("");
	novoCampo.insertAfter("tr.linhas:last");
	removeCampo();
  });
});
</script>

Tenho uma função em javascript também que faz preencher alguns campos automaticamente com base em um select.

<script type="text/javascript">
	
	function update(cod_atividade){
		$.post("scripts/codigos_atividades.php", {cod_atividade:cod_atividade}, function(retorno){
			
			dados = retorno.split("/");
			$('#descricao').val(dados[0]);
			
			//alert(dados[0]);
			
		});
}
	
</script>

 

O problema é que nos input, nos nomes eu coloquei colchetes no final, uma vez que eu tenho um array para gravar tudo de uma vez no banco.

<input name="descricao[]" type="text" required="required" id="descricao" size="45" maxlength="255" readonly="readonly" />

So  que no script acima, ele direciona os inputs pelo ID, como o ID é unico, como que eu faço para ele reconher cada linha acrecentada conforme o 1º JS?

 

Ex: 

Cliquei na primeira linha, selecionei uma opção no select e preencheu o campo descrição

Ao adicionar uma segunda linha, como o id é unico, ele não preenche, acaba alterando a primeira linha novamente.

 

Alguém sugere algo que eu consiga ele identificar cada linha acrescentada e preenche o campo daquela respectiva linha?

 

Obrigado desde já.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

<div id="colocar_aqui"></div>

<button onclick="adicionarInput()">Novo Input</button>

<script>
    var contagemID = 0,
        maximoInput = 10, // Quantos podem ser adicionados?
        novoInput,
        novoButton,
        dataInput,
        removeInput,
        alvo = document.getElementById('colocar_aqui');

    function adicionarInput() {
        contagemID++;

        if (contagemID <= maximoInput) {
            // Criar novo input
            novoInput = document.createElement('input');
            novoInput.type = 'text';
            novoInput.name = 'descricao[]';
            novoInput.id = 'descricao_' + contagemID;
            alvo.appendChild(novoInput);

            // Remover input adicionado
            novoButton = document.createElement('button');
            novoButton.innerText = 'Remover';
            novoButton.setAttribute('data-input', novoInput.id);
            novoButton.addEventListener('click', removerInput, false);
            alvo.appendChild(novoButton);
        }
    }

    function removerInput(e) {
        dataInput = e.target;
        removeInput = document.getElementById((dataInput).dataset.input);
        removeInput.parentNode.removeChild(removeInput);
        dataInput.parentNode.removeChild(dataInput);
    }
</script>

 

#EDIT:

Veja que cada ID vai ser descricao_Numero_de_adição

Perceba também o uso do atributo data que você também pode usar para obter o elemento que queira atacar.

Pois foi esse o método que usei para saber qual item devo atacar com a função de remover.

 

 

Além do atributo data você pode usar um classificador e atingir diversos itens de uma só vez.

Qual informação será adicionada ao input, e quais os critérios para esse complemento não há como eu saber.

 

Seria de grande ajuda saber se existe algum critério para anexar valor a um elemento, e que valor seria esse.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Omar, obrigado por ajudar.

 

O script de adicionar e remover campo, este funciona perfeitamente.

 

O script abaixo também funciona, só não funciona quando eu acrescento mais linha, ele continua sempre na primeira linha.

<script type="text/javascript">
	
	function update(cod_atividade){
		$.post("scripts/codigos_atividades.php", {cod_atividade:cod_atividade}, function(retorno){
			
			dados = retorno.split("/");
			$('#descricao').val(dados[0]);
			
			//alert(dados[0]);
			
		});
}
	
</script>

 

E é nesta parte que eu me perco. Ao clica no botão para adicionar linha, a linha é adicionada, mais o script acima so identifica o ID da primeira linha e as demais não funciona.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Lógico , que só o primeiro é alvo, justo porque um identificador é único não pode se repetir.

 

Por isso lhe mostrei uma função que irá criar um elemento em loop cada um com um id único.

Da mesma forma que mostrei como encontrar esse elemento no DOM.

 

Mas não só pelo #ID que podemos encontrar um elemento no documento, existem várias outras formas, e uma infinidade de abordagens diferentes, não importa se está no DOM pode ser encontrado.

 

Um método seria ao criar o elemento adicionar ao mesmo um classificador que poderá ser usado para localizar ele com mais facilidade.

Então um função poderá manipular esse(s) elemento(s). Vejamos isso na prática:

Spoiler

<div class="elemento_alvo">Alvo da função 1</div>
<div class="elemento_alvo">Alvo da função 2</div>
<div class="elemento_alvo">Alvo da função 3</div>
<div class="elemento_alvo">Alvo da função 4</div>
<div class="elemento_alvo">Alvo da função 5</div>
<div class="elemento_alvo">Alvo da função 6</div>

<button onclick="update();">Ativar Update</button>

<script>
    function update() {
        var retorno = 'Item 1/Item 2/Item 3/Item 4/Item 5',
            dados = retorno.split('/'),
            alvos = document.getElementsByClassName('elemento_alvo');
        for (var i = 0; i < alvos.length; i++) {
            alvos[i].innerText = dados[i];
        }
    }
</script>

 

 

Como o que vamos adicionar a cada elemento vem de um array dados, podemos saber seus índices com

dados[0], dados[1] etc..

Usando o método para localizar o classificador "elemento_avo" teremos um array da NodeList de todos

alvos[0], alvos[1] etc..

Bastando então executar um loop no array dos elementos podemos obter o índice da volta atual do loop através de uma variável que se alto incrementa a cada volta. 

 

Mas como nem tudo que reluz é ouro, problemas podem ocorrer se se a quantidade de itens no array dados for menor que o numero de elementos.

Para isso basta apenas conferir se exite algo para se manipular antes:

/*
for (var i = 0; i < alvos.length; i++) {
    alvos[i].innerText = dados[i];
}
*/
for (var i = 0; i < alvos.length; i++) {
    if (typeof dados[i] !== 'undefined' && dados[i] !== null) { // Adicionando esse checagem
        alvos[i].innerText = dados[i];
    }
}

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por luiz monteiro
      Olá, tudo bem?
       
      Estou melhorando meu conhecimento em php e mysql e, me deparei com o seguinte. A tabela da base de dados tem um campo do tipo varchar(8) o qual armazena números. Eu não posso alterar o tipo desse campo. O que preciso é fazer um select para retornar o números que contenham zeros a direita ou a esquerda.
      O que tentei até agora
       
      Ex1
      $busca = $conexao->prepare("select campo form tabela where (campo = :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form']);
       
      Se a direita da string $_REQUEST['campo_form'] termina ou inicia com zero ou zeros, a busca retorna vazio.
      Inseri dados numéricos, da seguinte maneira para testar: 01234567;  12345670: 12345678: 12340000... entre outros nessa coluna. Todos os valores que não terminam ou não iniciam com zero ou zeros, o select funciona.
       
       
      Ex2
      $busca = $conexao->prepare("select campo form tabela where (campo = 0340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex3
      $busca = $conexao->prepare("select campo form tabela where (campo = '02340001' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex4
      $busca = $conexao->prepare("select campo form tabela where (campo like 2340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex5
      $busca = $conexao->prepare("select campo form tabela where (campo like '12340000') ");
      Esse número está cadastrado, mas não retorna.
       
      Ex6
      $busca = $conexao->prepare("select campo form tabela where (campo like '"12340000"' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex7
      $busca = $conexao->prepare("select campo form tabela where (campo like :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form'])
      Não retorna dados.
       
      O  $_REQUEST['campo_form'] é envio via AJAX de um formulário. 
      Usei o gettype para verificar o post, e ele retorna string.
      Fiz uma busca com número 12345678 para verificar o que o select retorna, e também retrona como string.
       
      Esse tipo de varchar foi usado porque os números que serão gravados nesse campo,  terão zeros a direita ou na esquerda. Os tipos number do mysql não gravam zeros, então estou usando esse. O problema é a busca.
      Agradeço desde já.
       
       
    • Por daemon
      Boa tarde,
       
      Eu tenho uma rotina que faz uma leitura do arquivo .xml de vários sites.

      Eu consigo pegar o tópico e a descrição, e mostrar a imagem que esta na pagina do link.
      Para isso utilizo esta função:
      function getPreviewImage($url) { // Obter o conteúdo da página $html = file_get_contents($url); // Criar um novo objeto DOMDocument $doc = new DOMDocument(); @$doc->loadHTML($html); // Procurar pela tag meta og:image $tags = $doc->getElementsByTagName('meta'); foreach ($tags as $tag) { if ($tag->getAttribute('property') == 'og:image') { return $tag->getAttribute('content'); } } // Se não encontrar og:image, procurar pela primeira imagem na página $tags = $doc->getElementsByTagName('img'); if ($tags->length > 0) { return $tags->item(0)->getAttribute('src'); } // Se não encontrar nenhuma imagem, retornar null return null; } // Uso: $url = "https://example.com/article"; $imageUrl = getPreviewImage($url); if ($imageUrl) { echo "<img src='$imageUrl' alt='Preview'>"; } else { echo "Nenhuma imagem encontrada"; }  
      Mas estou com um problema, esta funcão funciona quando coloco em uma pagina de teste.php. Preciso mostrar em uma página inicial diversas fotos de todos os links. (No caso acima só funciona 1).
    • Por violin101
      Caros amigos, saudações.
       
      Por favor, me permita tirar uma dúvida com os amigos.

      Tenho um Formulário onde o Usuário digita todos os Dados necessários.

      Minha dúvida:
      --> como faço após o usuário digitar os dados e salvar, o Sistema chamar uma Modal ou mensagem perguntando se deseja imprimir agora ?

      Grato,
       
      Cesar
    • Por Carcleo
      Tenho uma abela de usuarios e uma tabela de administradores e clientes.
      Gostaria de uma ajuda para implementar um cadastro
       
      users -> name, login, passord (pronta) admins -> user_id, registratiom, etc.. client -> user_id, registratiom, etc...
      Queria ajuda para extender de user as classes Admin e Client
      Olhem como estáAdmin
      <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Admin extends User {     use HasFactory;            protected $fillable = [         'name',         'email',         'password',         'registration'     ];      private string $registration;     public function create(         string $name,          string $email,          string $password,         string $registration     )     {         //parent::create(['name'=>$name, 'email'=>$email, 'password'=>$password]);         parent::$name = $name;         parent::$email = $email;         parent::$password = $password;         $this->registration = $registration;     } } User
      <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable {     /** @use HasFactory<\Database\Factories\UserFactory> */     use HasFactory, Notifiable;     static string $name;     static string $email;     static string $password;     /**      * The attributes that are mass assignable.      *      * @var list<string>      */     protected $fillable = [         'name',         'email',         'password',     ];          /**      * The attributes that should be hidden for serialization.      *      * @var list<string>      */     protected $hidden = [         'remember_token',     ];     /**      * Get the attributes that should be cast.      *      * @return array<string, string>      */     protected function casts(): array     {         return [             'email_verified_at' => 'datetime',             'password' => 'hashed',         ];     }          public function roles() : BelongsToMany {         return $this->belongsToMany(Role::class);     }       public function hasHole(Array $roleName): bool     {                 foreach ($this->roles as $role) {             if ($role->name === $roleName) {                 return true;             }         }         return false;     }         public function hasHoles(Array $rolesName): bool     {                 foreach ($this->roles as $role) {             foreach ($rolesName as $rolee) {             if ($role->name === $rolee) {                 return true;             }          }         }         return false;     }         public function hasAbility(string $ability): bool     {         foreach ($this->roles as $role) {             if ($role->abilities->contains('name', $ability)) {                 return true;             }         }         return false;     }     } Como gravar um Admin na tabela admins sendo que ele é um User por extensão?
      Tentei assim mas é claro que está errado...
      public function store(Request $request, Admin $adminModel) {         $dados = $request->validate([             "name" => "required",             "email" => "required|email",             "password" => "required",             "registration" => "required"         ]);         $dados["password"] =  Hash::make($dados["password"]);                  $admin = Admin::where("registration",  $dados["registration"])->first();                  if ($admin)              return                    redirect()->route("admin.new")                             ->withErrors([                                 'fail' => 'Administrador já cadastrados<br>, favor verificar!'                   ]);                            $newAdmin = $adminModel->create(                                    $dados['name'],                                    $dados['email'],                                    $dados['password'],                                    $dados['registration']                                 );         dd($newAdmin);         $adminModel->save();         //$adminModel::create($admin);                  return redirect()->route("admin.new")->with("success",'Cadastrado com sucesso');     }  
    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos, referente a PDV.
       
      Estou escrevendo um Sistema com Ponto de Vendas, a minha dúvida é o seguinte, referente ao procedimento mais correto.

      Conforme o caixa vai efetuando a venda, o Sistema de PDV já realiza:
      a baixa direto dos produtos no estoque
      ou
      somente após concretizar a venda o sistema baixa os produtos do estoque ?
       
      Grato,
       
      Cesar
       
×

Informação importante

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