Autor Zpráva
Ikki
Profil
Ahoj,
mám v databázi hodnotu kategorie1, kategorie2, kategorie3, které potřebuji vyobrazit v Select2.
Vše funguje jak má i s testovacími daty, ale ve chvíli kdy to zkusím zpracovat přes PHP, narážím na nejspíš banalitu.

V JS se předávají hodnoty v tomto formátu;
var selectedValues = ["kategorie1", "kategorie2", "kategorie3"];

Jenže v případě, že to vypíšu napřímo, vznikne string ve tvaru "kategorie1, kategorie2, kategorie3"

Jak tenhle string přepsat a přidat do něj úvozovky tak, aby string splňoval tvar pro JS?

Zkoušel jsem explode, regex, preg_replace, implode, ale asi chybně.
implode('", "', array($detailData['category']));

výsledek implode se tváří jako;
string(45) "kategorie1, kategorie2, kategorie3"

Takže vlastně implode ani array jako kdyby nefungoval.


Díky moc!
Kajman
Profil
V php se ze stringu pole dělá funkcí explode ne implode.

Pokud je v php pole, tak na předání do js lze použít
json_encode($pole);
Ikki
Profil
Ahoj,
děkuji za odpověď.
json_encode mě napadl taktéž, problém je v tom, že pole ve výsledku vypadá skoro stejně -> ["kategorie1, kategorie2, kategorie3"]
Select ale pobírá jen ["kategorie1", "kategorie2", "kategorie3"], dokonce ani s explode se mi nepodařilo vměstnat " " mezi kategorie.
Keeehi
Profil
Ikki:
Začněme tím, že ukládat více hodnot do jednoho řádku nebo buňky v databázi není zrovna dobrý nápad.
Ta hodnota se v databázi vezme kde? K čemu všemu se používá?
Jestli je to jen pro tento jeden případ, bude lepší, když v databázi budeš mít přímo uložený ten JSON. Tedy že hodnota bude už přímo ["kategorie1", "kategorie2", "kategorie3"]
Samozřejmě, že to jde transformovat i po vytažení z databáze z hodnoty co tam máš teď. Ale když už ten návrh DB není ideální, pojďme to vyřešit nejlépe jak to jen v rámci omezení jde.
Ikki
Profil
Keeehi:
to samozřejmě vím, ale bohužel je to tak nastavené z původního systému, který musím zachovat.
Pak se to nějakým záhadným způsobem využívá k vyhledávání a vypisování na základě kategorií v administraci, což mi zase v tomto případě přijde logičtější než vyhledávat ve dvou tabulkách. Jiný důvod mě k tomuto zápisu nenapadá.
Zadává jí tam člověk právě prostřednictvím Select2 v administraci - vše funguje víceméně v pohodě, ale v administraci při editaci položky nejsou vidět aktuální kategorie, které se vypisují z databáze.

Nejblíže k řešení jsem se dostal využitím funkce str_replace -
str_replace(', ', '", "', $detailData['category']);
který vrátí
string(49) "kategorie1", " kategorie2", " kategorie3", jenže tady opět nastává problém s mezerou za ", kterou se mi zatím nepodařilo odstranit.

Napadlo mě využít k tomu ještě trim, ale nezkoušel jsem, zatím.

Děkuji za odpověď!
Keeehi
Profil
Ikki:
No nemáš pravdu. str_replace jak ji máš napsanou tady tu mezeru samozřejmě odstraní. Aby tam zůstala, musely by ve vstupu být dvě za sebou. Nebo jsi měl v prvním parametru ',' a ne ', ' jak píšeš sem. Někde děláš chyby z nepozornosti.
Je nějaký problém, aby bylo v databázi uloženo už ["kategorie1", "kategorie2", "kategorie3"] a ne kategorie1, kategorie2, kategorie3? Je mnohem lepší vhodně upravit ty data při ukládání, než tady při výpisu. A pokud do PHP jako hodnota přichází už řetězec a ne pole, s úpravou by se mělo začít už v javascriptu, který tu hodnotu vytváří.
anonym_
Profil *
Ikki:
Explode toho stringu do pole a pak json_encode.

json_encode(explode(', ', $str));
Keeehi
Profil
anonym:
Když už mu chceš "pomoct" tak by bylo dobré, aby to alespoň nebylo závislé na tom, že tam ta mezera je.
json_encode(array_map('trim', explode(',', $str)))
anonym_
Profil *
Keeehi:
Tak ta mezera tam evidentně je. Nevíme, jestli ten string vzniká ručně, nebo jak implode z nějaké sady checkboxů, nebo jinak. Navíc, když už teoretizujeme, tak čárka může být i ve jméně kategorie (a může tam cíleně být bez mezery). A nebo taky ne.

Čili, pokud máme dané "zadání", oddělovač ", " je relevantní. Cokoliv dalšího jsou spekulace, kterých si můžeme vymyslet dalších X.
Ikki
Profil
Keeehi:
nakonec jsem dal na tebe a v celém systému to přepsal tak, aby se ukládal encode.
Tvůj kód fungoval perfektně, problém byl poté na straně výpisu při rozvoji externího modulu, takže ve výsledku by to dalo více práce.

Díky moc!

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0