tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

formátování datumu

před 11 lety

deric
Člen | 93

Bylo by možné do dibi přidat podporu pro formátování timestamp? Různé databáze používají (h)různé řetězce pro formátování, bylo by fajn kdyby v dibi byl jednotný formát.

dibi::test('SELECT created %df', 'j.n.Y', 'AS vytvoreno FROM [products]');

Výstupem by mohlo být:

mysql:

SELECT DATE_FORMAT(created, "%e.%c.%Y") AS vytvoreno FROM `products`

postgre:

SELECT to_char(created, "FMDD.FMMM.YYYY") AS vytvoreno FROM products

Pro zadávání formátování v dibi je možné používat formát datumu z MySQL(%e.%c.%Y) nebo php(j.n.Y). Syntaxe by měla být intuitivní… ale teď mě nic lepšího nenapadá.

před 11 lety

David Grudl
Nette Core | 6806

Nebylo by snažší jít touto cestou?

$res = dibi::query('SELECT created FROM products');

// auto-convert column 'created' to timestamp
$res->setType('created', Dibi::FIELD_DATETIME);

foreach ($res as $row) {
    // $row['created'] je unix timestamp
}

před 11 lety

deric
Člen | 93

Jo, to je asi obecnější, akorát trochu složitý zápis. Takže když chci vlastní formátování času, tak nějak takto?

echo date('d.m.Y', $row['created']);

toto by mi přilo hezčí :)

$res->setType('created', dibi::dateformat('d.m.Y') );

před 11 lety

David Grudl
Nette Core | 6806

To není špatný nápad!

před 11 lety

Wamer
Člen | 14

Souhlasím. Tohle by se mi velmi hodilo a ulehčilo by to práci.

před 11 lety

David Grudl
Nette Core | 6806

Tak v aktuální verzi jsem to vyřešil takto:

$res->setType('created', dibi::FIELD_DATETIME, 'd.m.Y');

před 11 lety

Honza M.
Člen | 1674

Šlo by do dibitable přidělat nějaké centrální nastavování typu sloupečku? Aby se to nemuselo řešit po každém výběru?

function __construct() {
    // tohle je asi blbost, ale něco vzdáleně podobného by se mohlo hodit
    $this->setType('created', dibi::FIELD_DATETIME, 'j. n. Y');
}

před 11 lety

David Grudl
Nette Core | 6806

Než to nějak implementuju, můžeš si pomoci sám:

class MyTable extends DibiTable
{
    /**
     * User DibiResult post-processing.
     * @param  DibiResult
     * @return DibiResult
     */
    protected function complete($res)
    {
        $res->setType('created', dibi::FIELD_DATETIME, 'j. n. Y');
        return $res;
    }
}

před 11 lety

David Grudl
Nette Core | 6806

Do DibiTable jsem přidal pole $types, pomocí něhož lze nastavovat typy jednotlivých sloupečků. Ekvivalent zápisu $res->setType('created', dibi::FIELD_DATETIME, 'j. n. Y'); by vypadal takto:

class Products extends DibiTable
{
    public $types = array(
        'created' => array('type' => dibi::FIELD_DATETIME, 'format' =´> 'j. n. Y'),
    );

}

Pokud uvedený typ nepotřebuje políčko format, uveďte ho s hodnotou NULL.

před 11 lety

RaR
Člen | 42

termineDate je int(11) a je v něm uloženo time(). Při následujícím nastavení typu mě to vrací 1.1.1970 pro všechny hodnoty. Jak to mám upravit, aby se vracel datum?

<?php
phpclass Termines extends DibiTable
{
    protected $primary = 'termineId';

    protected $types= array('termineDate' => array('type' => dibi::FIELD_DATETIME, 'format' => 'd.m.Y'),);

    protected $blankRow = array(
    'termineId' => '',
    'termineDate' => '',
        'terminePlace' => '',
    );
}
?>

díky za radu

před 11 lety

David Grudl
Nette Core | 6806

Přidal jsem podporu pro timestamp do dibi, stáhni si poslední verzi.

před 11 lety

RaR
Člen | 42

Super, díky. Už se datum při načtení převádí podle filtru

protected $types= array('termineDate' => array('type' => dibi::FIELD_DATETIME, 'format' => 'd.m.Y'),);

jen při ukládání pomocí

$termine->update((int) $this->getParam('id'), $form->getValues());

zůstane pořád jako string.

"UPDATE `termines` SET `termineDate`='27.06.2008', `terminePlace`='Kolín', `airPrice`='520' WHERE `termineId` IN (93 )"

musím to někde převest zpět na timestamp, nebo se to dá nějak nastavit automaticky.

Editoval RaR (26. 11. 2008 9:20)