Projekt

Obecné

Profil

Požadavek #965

otevřený

Neomezený konec přerušení

Přidáno uživatelem Ondřej Fibich před asi 9 roky(ů). Aktualizováno před více než 8 roky(ů).

Stav:
Odeslaný
Priorita:
Normální
Přiřazeno:
Kategorie:
Členi a uživatelé
Cílová verze:
Začátek:
2015-02-25
Uzavřít do:
% Hotovo:

0%

Odhadovaná doba:
3:00hod

Popis

Pokud není v nastavení nastaveno horní omezení trvání přesměrování, mělo by být možné nastavit přesměrování do "nekonečna".
Lze to udělat přidáním zaškrtávacího tlačítka s popiskem: neomezeno.
V DB by se ukládala hodnota 9999-12-31, takže by zásah zbytek systému neovlivnil, jelikož SQL dotazy s touto hodnotou umí pracovat.

Zaškrtávací tlačítko by mělo být hned za polem pro zadání horního intervalu a pomocí JS by se mělo zajistit, aby při jeho zaškrtnutí nebylo možné hodnotu pole měnit. Tuto funkcionalitu by chtělo udělat nějak obecněji, jelikož se bude hodit i u jiných požadavků (#954).

Aktualizováno uživatelem Ondřej Fibich před asi 9 roky(ů)

Aktualizováno uživatelem Ondřej Fibich před téměř 9 roky(ů)

  • Popis aktualizován (rozdíl)
  • Přiřazeno nastaven na David Raška
  • Odhadovaná doba změněn z 5:00hod na 3:00hod

Aktualizováno uživatelem David Raška před téměř 9 roky(ů)

  • Stav změněn z Nový na Odeslaný

Aktualizováno uživatelem Ondřej Fibich před téměř 9 roky(ů)

Když ve Form_Date přetížíš metodu __get, tak se ti může podařit následující kód do Form_Date:

if (isset($form_data["to_infinity"]) && $form_data["to_infinity"] != "1")
{
    $to = date('Y-m-d', $form_data['to']);
}
else
{
    $to = '9999-12-31';
}

Pokud zaškrtnu volbu "nekonečno", pak by se měl datum v tlačítku změnit na 9999-12-31, nebo prostě by neměl asi vidět ten starý co jsem tam zadal.

Zároveň bych zkusil implementaci provést bez závislosti na rodičovský formulář. Něco jako $form->date('to', TRUE). S tím že si checkbox přidáš pomocí html_element metody. Nejsem si úplně jistý jestli to půjde, ale pak by to bylo super :-).

Aktualizováno uživatelem David Raška před téměř 9 roky(ů)

Toto řešení bohužel néni možné, zkusil sem neco podobného. Problém je v tom, že by bylo nutné přepsat veškeré validátory, helpery a další, jelikož v nich používáme PHP funkce, které neumíja dělat s datem větším jak 2038 (přeteče unix timestamp).

Aktualizováno uživatelem Ondřej Fibich před téměř 9 roky(ů)

David Raška napsal:

Toto řešení bohužel néni možné, zkusil sem neco podobného. Problém je v tom, že by bylo nutné přepsat veškeré validátory, helpery a další, jelikož v nich používáme PHP funkce, které neumíja dělat s datem větším jak 2038 (přeteče unix timestamp).

Tak to můžeš vrazit do samostatné get_value_with_infinite() metody Form_Date a tu budeme volat.

Aktualizováno uživatelem David Raška před téměř 9 roky(ů)

Ondřej Fibich napsal:

Zároveň bych zkusil implementaci provést bez závislosti na rodičovský formulář. Něco jako $form->date('to', TRUE). S tím že si checkbox přidáš pomocí html_element metody. Nejsem si úplně jistý jestli to půjde, ale pak by to bylo super :-).

A toto řešení sem taky zkusil a taky nefunguje, jelikož pak onen checkbox není v interních strukturách Forge a nedojde k validaci a načtení hodnot odeslaného formuláře. Pak by bylo nutné data tahat z $_POST$ místo @form->as_array().

Ziskani hodnoty je teda ted pres funkci get_string_value_with_infinite(). Schvalne sem zduraznil string, protoze normalne Form_Date vraci timestamp.

Aktualizováno uživatelem Ondřej Fibich před více než 8 roky(ů)

A co upravit Form_Date tak aby nepoužíval strtotime?

Řádek 280:

$timeObj = new DateTime($time);
$this->data['value'] = $timeObj->format('U');

Řádek 150: to si domyslíš...

Nemám po ruce žádný 32bit, na kterém bych to vyzkoušel..

David Raška napsal:

Toto řešení bohužel néni možné, zkusil sem neco podobného. Problém je v tom, že by bylo nutné přepsat veškeré validátory, helpery a další, jelikož v nich používáme PHP funkce, které neumíja dělat s datem větším jak 2038 (přeteče unix timestamp).

Aktualizováno uživatelem David Raška před více než 8 roky(ů)

Ondřej Fibich napsal:

A co upravit Form_Date tak aby nepoužíval strtotime?

Řádek 280: [...]

Řádek 150: to si domyslíš...

Zkusil sem, format('U') sice vrátí správný timestamp aj pro 9999-12-31, ale přepsání validátorů a helperů to neeřeší. Vracá to totiž string a drtivá většina funkcí pracuje s integerem který je ale pořád 32bitový ať použiješ funkci jaků chceš.

A co sem teď testoval na 64bitu, tak není potřeba DateTime ani používat, protože funkce date a mktime umí s velkým datumem pracovat bez problému. Jediný problém je teda enom v datovém typu int, který jde vyřešit asi jedině použitím 64 bitového systému.

Také k dispozici: Atom PDF