2015-05-06 19 views
9

Bu nedenle, bir kez dinamik olarak php tarafından oluşturulan bu veri tabanına sahibim. Ama bir kez yüklendiğinde, tüm tabloyu yeniden yüklemek istemiyorum çünkü yaptığım bir açıklamada sadece küçük bir javascript var. Düğmeye bastığınızda, tr sayfamdaki bir veri özelliğini karşılaştırırım. Eğer uymuyorsa, onları saklamak istiyorum, onlara göstermek isterim. İşte bu yüzden şimdiye kadar denedim.Datatable bir düğme tıklatma olayına göre satırları gizle ve göster

<div style="margin: 30px 0;"> 
     <button class="btn btn-primary" id="myClientButton">Voir mes clients seulements</button> 
    </div> 
    <table id="advancedSearchTable"> 
     <thead> 
      <tr> 
       <th>Name</th> 
       <th>Phone</th> 
       <th>Email</th> 
       <th>Subject</th> 
       <th>Date</th> 
       <th>Profile</th> 
      </tr> 
     </thead> 
     <tbody> 
      {% for entity in entities %} 
       <tr data-user="{{ entity.user.id }}" class="values"> 
        <td>{{ entity }}</td> 
        <td>{{ entity.mainphone }}</td> 
        <td>{{ entity.email }}</td> 
        <td>{{ entity.tagline }}</td> 
        <td>{{ entity.createdDate|date('d-m-Y') }}</td> 
        <td><a href="{{ path('clients_show', {id: entity.id}) }}" class="btn btn-success"><span class="glyphicon glyphicon-eye-open"></span></a></td> 
       </tr> 
      {% endfor %} 
     </tbody> 
    </table> 

Döngü Symfony'de 2 yapılır HTML (bunu anlamak yoksa, Twig Şablon Kullanarak gerçekten önemi yok) anlaman gereken tek şey olduğunu "verilere nitelik -user "PHP tarafından oluşturuldu ve veritabanımın her girişi bu döngüde gidiyor.

Sonra jQuery bu var:

<script> 
$('#advancedSearchTable').DataTable(
    { 
     "language": { 
       "url": "//cdn.datatables.net/plug- ins/9dcbecd42ad/i18n/French.json" 
        }, 
       responsive: true 
      }); 
    $('#myClientButton').on('click', function(){ 
    if ($(this).hasClass('active')){ 
     $(this).removeClass('active'); 
     $('tr.values').show(); 
    } 
    else{ 
     $(this).addClass('active'); 
     $('tr.values').each(function(){ 
      if ($(this).attr('data-user') != 5){ 
       $(this).hide(); 
      } 
     }); 
    } 
}); 
</script> 

Çok iyi çalışıyor. Tek sorun, DataTable'ın "kendisini değiştirmesi" değil. Örneğin, 25 sayfa varsa, 25 sayfa tutar ve "sonraki tablo sayfası" düğmesine bastığınızda, "tablo sayfası" nı yeniler ve artık şeyler gizlenmez. Çok arandım ama bir yol bulamadım. Bunun için ajax kullanmak istemiyorum, çünkü sadece bir kez değer ile doldurulmalı ve daha sonra aktif olana veya düğmenin etkin olmamasına bağlı olarak gizlenmeli veya gösterilmeli ... Bu jQuery kullanılarak bile mümkün mü? Eklenti ?

Şimdiden teşekkürler.

+0

Sana istemci tarafı elemanlarını sakladığını çünkü bu olduğunu düşünüyorum ve ne zaman sayfa size neyi hiçbir bilgiye sahip yeni bir veri kümesi alan Datatable daha önce gizlenmiş. Etkin olarak, istemci tarafı filtreleme ile sunucu tarafı verilerini kullanmaya çalışıyorsunuz. – markpsmith

+0

Hayır İstemci tarafı gizlemek için kullanıyorum. Açıkça çalışmıyor çünkü gizlediğim veriler veri tablosunda hesaplanmıyor. Örneğin, satırın yarısını gizlerim ancak yine de "150 öğenin 20'sini gösterir" diyor (örneğin) ... Coud Veri tablosunu yeniliyor muyum? –

+2

Veritabanını yeniliyorsanız, temel veriler değişmediğinden satırlarınız tekrar gösterilecektir. – markpsmith

cevap

20

Evet, bu gerçekten mümkün, ancak farklı bir yaklaşıma ihtiyacınız olacak. DataTable'lar DOM'da orijinal <table> öğesinde yapılan değişikliklerin farkında olmadığından, jQuery ile satırların gizlenmesi ve dataTable'ların kendisiyle gizlenmesi genellikle kötü bir fikirdir. "Bir yerde kod-başka-bir-komut-bir-gizli-bir-satır" -event dataTable içine kanca olabilir. Bu yüzden dataTables değişiklikleri "unutmak" gibi görünüyor, sadece bu değişikliklerin farkında değil ve dataTables iç organları el değmeden kalıyor. Bu nedenle, custom filter kullanın. Aşağıdaki küçük parça kodu istediğinizi yapar - 5'dan farklı tüm satırları data-user özniteliğine saklar. Sıralama ve sayfalandırma üzerinde çalışır. Son kod parçası, sıfırlama düğmesine bir örnektir.

$("#hide").click(function() { 
    $.fn.dataTable.ext.search.push(
     function(settings, data, dataIndex) { 
      return $(table.row(dataIndex).node()).attr('data-user') == 5; 
     } 
    ); 
    table.draw(); 
});  
$("#reset").click(function() { 
    $.fn.dataTable.ext.search.pop(); 
    table.draw(); 
}); 

demo ->http://jsfiddle.net/d5hre2ux/

+0

Mükemmel çalışıyor, ancak veri tabanı belgelerini bulamadım. Çalışmak için kendi işlevinizi mi yaratıyorsunuz veya Datatables'de zaten var olan bir işlev var mı? –

+1

Bu sayfada, iki tablo olduğunda işe yaramayacağım. Sadece belirli bir tabloyu filtrelemek istiyorum, ancak her ikisi de bu kod kullanılarak filtreleniyor. Bana yardım edebilir misin lütfen? – Delgan

+1

Nihayet, "settings" i kullanarak bir kontrol eklemem gerektiğine, "if (settings.sTableId! =" First_table ") gibi bir şeylerin gerçekte geri döndüğüne; Bunu çözmek için başka bir yol olduğunu düşünmüyorum. – Delgan

İlgili konular