tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

CamelCase – automatické řešení

před 7 lety

MartinitCZ
Člen | 590

Ahoj.

Nemáte někdo vyřešenou atumoatickou změnu comments_articles na commentsArticles?

Jde o to, že vždy v tabulkách používám podtržítko, ale při zápisu v latte se mi to vůbec nelíbí.

Samozřejmě, vim o možnosti použítí comments_articles AS commentsArticles, ale kdybych toto měl dělat u všech tabulek, tak se asi zbláznim.

Díky :)

před 7 lety

MartinitCZ
Člen | 590

Nebo alespon nějaký nápad na lepší řešení :) Opravdu bych nejraději zapisoval camelCasem, ale jakékoliv řešení bude lepší, než to s podtržítkem.

před 7 lety

Milo
Nette Core | 1119

Můžeš si pro result nastavit vlastní třídu pro řádky. Ta třída bude dědit DibiRow jen si přepíšeš chování konstruktoru.

před 7 lety

MartinitCZ
Člen | 590

@**Milo**: Díky za info. Vytvořil jsem toto. Funkční to je, ale nejsem si jist kodem. Pokud by něko měl lepší řešení, tak za něj budu rád ;)

1.

public function __construct($arr)
{

    foreach ($arr as $k => $v) {

        // CamelCase
        $this->{preg_replace('/_(.?)/e', "strtoupper('$1')", $k)} = $v;

        $this->$k = $v;
    }

}

2.

public function __construct($arr)
{

    foreach ($arr as $k => $v) {

        // CamelCase
        if (($count = count(($part = explode("_", $k)))) > 1) {

            $property = $part[0];

            for ($i = 1; $i < $count; $i++) {

                $property .= ucfirst($part[$i]);

            }

            $this->$property = $v;

        }

        $this->$k = $v;
    }

}

Editoval martinit (26. 10. 2012 20:02)

před 7 lety

Milo
Nette Core | 1119

S tím preg_replace() to bude pomalé. Druhé bude rychlejší. Já bych to napsal asi takhle:

public function __construct($arr)
{
    foreach ($arr as $k => $v) {
        if (strpos($k, '_') === FALSE) {
            $this->$k = $v;

        } else {
            $property = '';
            foreach (explode('_', $k) as $tmp) {
                $property .= ucfirst($tmp);
            }

            $this->$property = $v;
        }
    }
}

před 7 lety

MartinitCZ
Člen | 590

@**Milo**: Nakonec jsem dal ty řešení dohromady a výsledek je zde:

public function __construct($arr)
{
    foreach ($arr as $k => $v) {

        // Create CamelCase
        if (strpos($k, "_") !== FALSE) {

            $property = "";

            foreach (explode("_", $k) as $tmp) {

                $property .= ucfirst($tmp);

            }

            $this->{lcfirst($property)} = $v;

        }

        $this->$k = $v;

    }
}

Pro zpětnou kompatibilitu jsem si ponechal i klasický zápis.

Ještě jednou díky :)

Editoval martinit (26. 10. 2012 20:30)

před 7 lety

MartinitCZ
Člen | 590

Tak jsem právě zjistil, že mé řešení rozbije ->fetchPairs();.

Editoval martinit (27. 10. 2012 20:29)

před 7 lety

Milo
Nette Core | 1119

Ale jen kvůli tomu, že změníš počet sloupců, ne? Kdybys nezachovával podržítkové názvy (nebo je dal až nakonec), vše funguje.

před 7 lety

MartinitCZ
Člen | 590

@**Milo**: Ano máš pravdu. Poradil bys, jak je dát na konec? Ta zpětná kompatibilita je pro men důležitá. :)

před 7 lety

Milo
Nette Core | 1119

Přímočaře cca takhle. Ale rozmysli to, jestli je ta kompatibilita fakt tak důležitá. Zbytečně se duplikují data.

public function __construct($arr)
{
    $bc = array();

    foreach ($arr as $k => $v) {
        // Create CamelCase
        if (strpos($k, '_') !== FALSE) {
            $property = '';
            foreach (explode('_', $k) as $tmp) {
                $property .= ucfirst($tmp);
            }

            $this->{lcfirst($property)} = $v;
            $bc[$k] = $v;

        } else {
            $this->$k = $v;
        }
    }

    foreach ($bc as $k => $v) {
        $this->$k = $v;
    }
}

Editoval Milo (31. 10. 2012 9:10)