Oznámení
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)