Интервал даты Symfony с несколькими форматами

У меня есть интервал дат объекта под названием работник с периодом времени, чтобы увидеть следующие функции:

// Get date of retirement
public function getRetireYear()
{
    $this->retireYear = $this->getBirthDay()->add(new \DateInterval('P60Y'));
    return $this->retireYear;
}

// Get time left for retirement
public function getTimeToRetirement()
{
    // Date of today
    $today = new \DateTime('today');

    // Calculate date diff between today and retirement day.
    $this->timeToRetirement = $today->diff($this->retireYear);

    // Return the time to retirement time formated
    return $this->formatTimeInterval(
        $this->timeToRetirement,
        '%r%Y years, %m months, %d days'
    );
}

//Format the dateInterval numbers as string
public function formatTimeInterval($aDateDif, $format)
{
    return $aDateDif->format($format);
}

Единственное значение, которое хранится в базе данных здесь, это $this->getBirthDay(), затем getRetireYear генерирует год выхода на пенсию работника (день рождения + 60 лет).
getTimeToRetirement дает время, чтобы уйти в отставку кого-то и formatTimeInterval($,$) используется для форматирования интервала даты.

Теперь мне нужно иметь возможность использовать этот dateInterval в разных форматах, например, иногда мне просто нужно, чтобы год сравнивался как целое число с другими значениями в представлениях, поэтому мне нужно, чтобы этот год был единственным значением, которое будет доступно в представлениях.

Я попробовал несколько вещей, но я не знаю, как правильно это сделать, поэтому я не получил более хорошее заключение по этому вопросу.

Также иногда мне нужны месяц и день для других задач, а не только года, эти значения должны быть доступны в представлениях, потому что в контроллере я просто ищу ArrayColletion объектов и передаю его в представление, в противном случае мне нужно идти вверх и вниз коллекции массивов.

Для получения дополнительной информации о проблеме вы можете прочитать эту ветку

2 ответа

Я думаю, тебе лучше иметь getTimeToRetirement метод вернуть DateInterval и переместить formatTimeInterval метод из сущности в целом, так как это более актуально для DateInterval форматирование чем твоему работнику. Вы могли бы тогда иметь DateInterval отформатирован, как вы хотите, когда вам это нужно. Что-то в этом роде.

В вашем рабочем классе сущности:

// Get date of retirement
public function getRetireYear()
{
    $this->retireYear = $this->getBirthDay()->add(new \DateInterval('P60Y'));
    return $this->retireYear;
}

// Get time left for retirement
public function getTimeToRetirement()
{
    // Date of today
    $today = new \DateTime('today');

    // Calculate date diff between today and retirement day.
    $this->timeToRetirement = $today->diff($this->retireYear);

    // Return the time to retirement time as a DateInterval
    return $this->timeToRetirement;
}

Затем вы можете использовать date Фильтр Twig для форматирования DateInterval в представлении. См. http://twig.sensiolabs.org/doc/filters/date.html Если вам нужно что-то более конкретное или инкапсулированное, вы также можете создать расширение Twig для этого. См. http://symfony.com/doc/master/cookbook/templating/twig_extension.html

Это то, что я сделал, но, возможно, это не самый практичный способ:

    public function getYearsLeft(){
    $aux = $this->birthDay->add(new \DateInterval('P60Y'));       
    //date today
    $today = new \DateTime('today');
    // Calculate date diff between today and retirement day.
    $this->yearsLeft = $today->diff($aux);                
    $aux2 = $this->formatTimeInterval($this->yearsLeft, '%r%Y');
    $this->birthDay->sub(new \DateInterval('P60Y'));
    return $aux2;
}
public function getMonthsLetf(){
    $aux = $this->birthDay->add(new \DateInterval('P60Y'));       
    //date today
    $today = new \DateTime('today');
    // Calculate date diff between today and retirement day.
    $this->monthsLetf = $today->diff($aux);        
    //$this->yearsLeft = $aDateDif; //('%r%Y');
    $aux2 = $this->formatTimeInterval($this->monthsLetf, '%m');
    $this->birthDay->sub(new \DateInterval('P60Y'));
    return $aux2;
}

Я преобразую эти две функции в 3 функции, более простые и более пригодные для повторного использования, и, возможно, создам помощника, если он мне понадобится, за пределами этой среды. В контроллере я получаю доступ к файлу конфигурации:

         $redTime = $this->container->getParameter('time_red');
         $orangeTime = $this->container->getParameter('time_orange');

Конечно, нет, я должен передать список рабочих для просмотра, а также конфигурационные переменные. И теперь в представлении я могу просто получить доступ к переменным следующим образом:

                {% for aWorker in aWorkerList %}
            {% if aWorker.retireYear is defined %}
              {% if colorOrange > aWorker.yearsLeft %}
                  <tr bgcolor="orange">
                  {% if colorRed > aWorker.monthsLetf %}
                        <tr bgcolor="red">                                
                        {% elseif 0 > aWorker.yearsLeft %}
                                <tr bgcolor="red">                                    
                  {% endif %}                  

              {% endif %}
                        <td><a href="{{path('osd_retire_editworkerpage', { 'id': aWorker.idWorker })}}">Edit</a> 
                            <a href="{{path('osd_retire_deleteworkerpage', { 'id': aWorker.idWorker })}}">Delete</a></td> 
                        <td>{{aWorker.omang}}</td>                        
                        <td>{{aWorker.workerTitle}}</td>
                        <td>{{aWorker.workerName}}</td>
                        <td>{{aWorker.workerSurname}}</td>
                        <td>{{aWorker.birthDay|date('Y-m-d')}}</td>
                        <td>{{aWorker.dateOfEmployment|date('Y-m-d')}}</td>
                        <td>{{aWorker.retireYear|date('Y-m-d')}}</td>
                        <td>{{aWorker.timeToRetirement}}</td>
                        <td>{{aWorker.fileNumber}}</td>
                    </tr>
            {% endif %}
            {% endfor %}

Работает нормально... с независимостью от нарушений философии!?

Другие вопросы по тегам