2016-06-10 48 views
3

我目前正在尝试使用instantsearch.js“rangeslider”小部件来创建从我的索引数据中出生日期的年龄范围滑块。 检查了文档,似乎没有转换数据功能,我可以用它将出生日期转换为数字年龄数字,例如“点击”小部件可以执行的操作。阿尔戈利亚即时搜索年龄范围根据出生日期

我想到的一种方法是在索引中创建一个年龄栏,并且每天运行一个cron作业以更新出生日期的每个记录库的年龄列,但这看起来不是一个优雅的解决方案。

我想知道是否有任何解决方法或现有解决方案的这种情况?

Laravel as backend(贷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(); 
} 

在前端:

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; } 

回答

4

您的解决方案包括每天跑步一个cron确实会工作,但我认为你可以以更简单的方式做到这一点。

您可以简单地为日期索引数字时间戳并将它们添加到attributesForFaceting。你可能想索引timestamp('01-01-2100') - timestamp(birthdate),否则你的滑块会比左边更老,右边更年轻。

一旦你这样做了,你可以使用这个属性作为rangeSlider widget的主要参数。
然后,您可以使用options.tooltips将此时间戳转换为实际可显示的时间,用CSS隐藏图例值(.ais-range-slider--value),您应该很好。

+0

从未想过使用时间戳,谢谢你的解决方案的工作精彩! 用解决方案更新了我的问题。 – user3364008

+0

@ user3364008我很高兴这为你工作。 :) – Jerska