2016-06-10 2 views
3

Ich versuche gerade, das instantsearch.js "rangslider" Widget zu verwenden, um einen Altersbereich Slider aus dem Geburtsdatum innerhalb meiner Indexdaten zu erstellen. Überprüft die Dokumentation und scheint, dass es keine Transformationsdatenfunktion gibt, die ich verwenden kann, um das Geburtsdatum in numerische Alterszahlen umzuwandeln, wie das "Hits" Widget tun kann.Algolia instantsearch age rangslider Basis am Geburtsdatum

Eine Möglichkeit, wie ich eine Altersspalte im Index erstellen und einen Cron-Job täglich ausführen, um die Altersspalte für jede Datensatzbasis am Geburtsdatum zu aktualisieren, aber das scheint nicht eine elegante Lösung.

Ich frage mich, gibt es irgendwelche Workarounds oder bestehende Lösungen für dieses Szenario?

Lösung mit Laravel as backend (Credits Jerska):

public function getAlgoliaRecord() 
{ 
    /** 
    * Load the categories relation so that it's available 
    * in the laravel toArray method 
    */ 

    $this->dob_timestamp = strtotime('01-01-2100') - strtotime($this->dob); 

    return $this->toArray(); 
} 

Im Frontend:

function _calculateAge(birthday) { // birthday is a date 
     var ageDifMs = Date.now() - birthday.getTime(); 
     var ageDate = new Date(ageDifMs); // miliseconds from epoch 
     return Math.abs(ageDate.getUTCFullYear() - 1970); 
    } 

search.addWidget(
      instantsearch.widgets.rangeSlider({ 
       container: '#age', 
       attributeName: 'dob_timestamp', 

       tooltips: { 
        format: function(formattedValue) { 

         var dob = new Date((4102444800-formattedValue)*1000); 
         var age =_calculateAge(dob); 
         return age; 
        } 
       } 

      }) 
    ); 

CSS:

.ais-range-slider--value{ display:none; } 

Antwort

4

Ihre Lösung jeden Tag einen Cron mit Laufen in der Tat würde Arbeit, aber ich denke, Sie können dies auf eine Weise einfacher Mode tun.

Sie könnten einfach numerische Zeitstempel für Ihre Daten indizieren und sie zur attributesForFaceting hinzufügen. Sie werden wahrscheinlich etwas wie timestamp('01-01-2100') - timestamp(birthdate) indizieren wollen, ansonsten wäre Ihr Schieberegler links größer, jünger rechts. Wenn Sie das getan haben, können Sie dieses Attribut als Hauptparameter des rangeSlider widget verwenden.
Sie könnten dann options.tooltips verwenden, um diesen Zeitstempel in ein tatsächlich anzeigbares Alter zu transformieren, verstecken Sie mit CSS die Legendenwerte (.ais-range-slider--value) und Sie sollten gut gehen.

+0

Niemals daran gedacht, Zeitstempel zu verwenden, danke, dass Ihre Lösung wunderbar funktioniert! Meine Frage mit Lösung aktualisiert. – user3364008

+0

@ user3364008 Ich bin froh, dass dies für Sie funktioniert hat. :) – Jerska