2016-06-16 5 views
2

В шаблоне симфони мы можем использовать форматтеры какSymfony даты до даты Хиджры преобразования в веточку файле

{{ news.created|date('Y-m-d') }} 

мне нужно что-то подобное для преобразования даты Хиджры. Значение я обеспечиваю дату в григорианском и преобразовать его в Хиджру в файле шаблон веточки может быть что-то вроде

{{ news.created|hijridate }} 

Я искал много на форумах и т.д., но не нашел что-то соответствующее конкретно в шаблоне веточки.

ответ

3

После того, как вы не нашли решения, я делаю собственное расширение ветки. Я вставив его, надеюсь, это поможет любому один вход является объектом даты, как {{ newsitem.created|hdate }} и является выводе الأربعاء 10 رمضان 1437 ه

Написать расширение прут в src/AppBundle/Twig/HdateExtension.php со следующим кодом.

<?php 
namespace AppBundle\Twig; 

class HdateExtension extends \Twig_Extension 
{ 

public function getFilters() 
{ 
    return array(
     new \Twig_SimpleFilter('hdate', array($this, 'hdateConvert')) 
    ); 
} 


public function hdateConvert($date) 
{ 

    if($date instanceof \DateTime){ 
     $dateDay = $date->format('N'); 
     $date->modify('+1 day'); 
     $year = $date->format('Y'); 
     $month = $date->format('m'); 
     $day = $date->format('d'); 
    } 
    $dayH = array("الأثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت","الأحد"); 
    // actual calculation 
    $newDate = $dayH[$dateDay-1]." ".HdateExtension::Greg2Hijri($day, $month, $year, true); 
    return $newDate; 
} 
public function getName() 
{ 
    return 'hdate_extension'; 
} 

public function Greg2Hijri($day, $month, $year, $string = false) 
{ 
    $day = (int) $day; 
    $month = (int) $month; 
    $year = (int) $year; 

    if (($year > 1582) or (($year == 1582) and ($month > 10)) or (($year == 1582) and ($month == 10) and ($day > 14))) 
    { 
     $jd = HdateExtension::intPart((1461*($year+4800+HdateExtension::intPart(($month-14)/12)))/4)+HdateExtension::intPart((367*($month-2-12*(HdateExtension::intPart(($month-14)/12))))/12)- 
      HdateExtension::intPart((3* (HdateExtension::intPart( ($year+4900+ HdateExtension::intPart(($month-14)/12) )/100) ) ) /4)+$day-32075; 
    } 
    else 
    { 
     $jd = 367*$year-HdateExtension::intPart((7*($year+5001+HdateExtension::intPart(($month-9)/7)))/4)+HdateExtension::intPart((275*$month)/9)+$day+1729777; 
    } 

    $l = $jd-1948440+10632; 
    $n = HdateExtension::intPart(($l-1)/10631); 
    $l = $l-10631*$n+354; 
    $j = (HdateExtension::intPart((10985-$l)/5316))*(HdateExtension::intPart((50*$l)/17719))+(HdateExtension::intPart($l/5670))*(HdateExtension::intPart((43*$l)/15238)); 
    $l = $l-(HdateExtension::intPart((30-$j)/15))*(HdateExtension::intPart((17719*$j)/50))-(HdateExtension::intPart($j/16))*(HdateExtension::intPart((15238*$j)/43))+29; 

    $month = HdateExtension::intPart((24*$l)/709); 
    $day = $l-HdateExtension::intPart((709*$month)/24); 
    $year = 30*$n+$j-30; 
    $mname = array("محرّم","صفر","ربيع الأوّل"," ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوّال","ذو القعدة","ذو الحجّة"); 
    $date = array(); 
    $date['year'] = $year; 
    $date['month'] = $mname[$month-1]; 
    $month = $mname[$month-1]; 
    $date['day'] = $day; 

    if (!$string) 
     return $date; 
    else 
     return  "{$day} {$month} {$year} هـ "; 
} 
public function intPart($float) 
{ 
    if ($float < -0.0000001) 
     return ceil($float - 0.0000001); 
    else 
     return floor($float + 0.0000001); 
} 

}

Затем добавьте следующий код в файле services.yml

app.twig_extension: 
    class: AppBundle\Twig\HdateExtension 
    public: false 
    tags: 
     - { name: twig.extension }