FAQ Overview

CEBIN Servery

Go to category

Servery CEBIN

1. Server vshosting - (weby, printeq)

vshosting web server- 217.16.184.84 standard weby

Naše projekty
https://nextcloud.cebin.info
https://wallabag.cebin.info/

Aktuální konfigurace:

debian 10 Buster
PHP 7.4
MariaDB 10.3
Mongo 4.4.4

MySQL Admin

dostupnost služeb [1]

problémy hlásit e-mailem nebo telefonicky:

podpora@vshosting.cz

246 035 835

nutno sdělit čtyřmístný kód pro komunikaci

2. Server CEBIN.net - (cloudhosting kamatera - vlastní správa)

Testovací server

virtualserver v nemecku - 183.229.87.37 
admni.cebin.net - ticketovaí systém

PhpMyadmin https://phpmyadmin.cebin.net/

Debian, php 8

 

3. Server kancl  Truenas

server v kanclu - http://85.132.182.11 fuji 

Interní IP adresa: 192.168.0.44.
správa přes www rozhraní 192.168.0.44
Nastavení: přes router Babyoffice s IP 172.16.0.1 vede přes IP 172.1.0.140 na router Informica (Linksys) s IP 192.168.0.254. 
IP adresa: 85.132.182.11
maska sítě: 255.255.255.240
výchozí brána: 85.132.182.1
DNS1: 195.113.144.194
DNS2: 195.113.144.233

4. Server idrive - zálohy (idrive)

idrive.com - webová služba - spravujeme sami

5. Server HomePi - zálohy

spravujeme sami
IP adresa: 84.42.146.70

2025-07-10 20:48
Jan Hrdlicka

Upgrade serverů a technická podpora

VSHOSTING

Monitorování mailové fronty kvůli odesílání spamů přes web:

mailovou frontu monitorujeme, v pripade prekroceni se prislusny Linux administrator, ktery ma na starost monitoring podiva zda se jedna o rozesilani spamu ci ne. Pokud ano problem resi.
Standardne na serveru omezeni nastavene neni. Pokud by k zaplnovani mailove fronty dochazelo nejak casto a chtel by jste omezeni nastavit urcite by to nebyl problem.
V pripade rozesilani spamu a nasledne kdyby jste se dostal na nejaky spamlist bychom po vyreseni zadali o delistaci.
S pozdravem

 

 

Linuxsoft

Zabezpečením provozu počítačových systémů se rozumí:

a) Kontrola provozních parametrů a proaktivní detekce provozních problémů.
b) Aktualizace software a aplikace bezpečnostních záplat.
c) Monitoring služeb.
d) Běžné konfigurační a administrativní změny v rámci oprav a úprav provozu, nikoliv objednané změny.
e) Řešení závad a poruch.
f) Zálohování serverů, včetně pronájmu datového uložiště
g) Doporučení ohledně technického vybavení objednatele v rámci efektivního zajištění provozu počítačových systémů objednatele.
h) 2h administrace v ceně

Upgrade serverů

Zde je situace nejslozitejsi. V zasade delame jen upgrady, ktere mame odzkousene, ze nerozbiji (web) aplikace. Takze php na 5.5 vubec neupgradujeme, protoze nema register_globals. Podobne mysql posledni verze nema default_charset, kernel take jen s vypadkem serveru atd. Naopak napr. upgrade ssh a ftp delame zcela bez vaseho vedomi.

Rozlisujeme totiz podle ITIL dva pripady
- incident
- change

Daji se shrnout pod vety
change - je zmena na pozadani zakaznika, nebo vyvolana zmenou aplikace zakaznika
incident - havarie systemu, oprava problemu, ktery vzniknul nahodne

Ve chvili, kdy si zakaznik nainstaluje napr. novy software XY a zjisti, ze mu spravne nefunguje, je to zmena vyvolana zakaznikem. Kdezto kdyby Vam prestal fungovat stary wordpress kvuli nasim upgradum ci jinym zmenam, pak je to incident. Bohuzel castokrat je situace sporna a tu resime individualne, vetsinou se poptam u svych kolegu a pri vahavych nazorech davame k dobru zakaznika. Idealni je, kdyz ma ve smlouve hodiny zdarma, pak se to nemusi resit vubec. Zrovna upgrade php+apache na verzi z vyvojove vetve debian testing nepovazuji za upgrade, obzvlaste, kdyz byl zpusobeny instalaci nove aplikace. Nicmene, kdyz s tim nesouhlasite, zitra v 17:30 mame poradu, kde to proberu s kolegy.

2020-03-13 11:43
Jan Hrdlicka

FTP

VSH

https://hrdlicka.vshosting.cz/phpmyadmin/

aktualizace skript:
sudo /usr/local/bin/ftp_pass_change uzivatel 'nove_heslo'
pozor - heslo musí být v uvozovkách.

Databáze proftpd

INSERT INTO users (userid, passwd, uid, gid, homedir, shell) VALUES('prihlasovaci_jmeno', PASSWORD('heslo'), 1001, 33,'var/www/nazevdomeny', '/bin/false');

2024-01-15 17:01
Jan Hrdlicka

Maily

primárně jsou všechny maily na cloudmailu u vshostingu, na serveru spravovaném Starlabem máme zpravidla pouze interní maily. Všechny zákaznické e-maily by měly být na vshostingu.

Administrace E-mailů Cloudmail

https://mail.vshosting.cloud

přesun e-mailů do Coudmailu:
https://mailsync.vshosting.cloud/form
https://support.vshosting.cz/content/1/52/cs/migrace-mail%C5%AF-do-cloudmailu.html

pro  export z mail.cebin.cz zaškrtnout port 143 a odškrtnout TLS.

Zařazování e-mailů do blacklistu a whitelistu - kontrola proti spamům

https://support.vshosting.cz/cs/CloudMail/whitelist-a-blacklist/

2024-04-19 11:03
Jan Hrdlicka

Nastavení virtualhosta

a) VSH

přes technickou podporu
vzor žádosti pro Luya:

Dobry den,

Pro luya:
prosím o nastavení nového virtualhosta https://www.xx.xx/
pouze https, http verze http://*.xx.xx a http://xx.xx
přesměrovat na https://www.xx.xx/,
certifikat lets encrypt
Documentroot /var/www/xxx.xx/web/public_html

open_basedir do nadřazeného adresáře  /var/www/xxx.xx/web/


do configu podobne jako u ostatnich virtualhostu prosim pridat řádku:
SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0

V případě, že je aktuálně doména nasměrována jinam (web běží na jiném serveru), je potřeba rozdělit do 2 kroků: nejprve vytvořit virtualhosta na http:

1. prosím o nastavení nového virtualhosta http://www.xx.xx/
Documentroot /var/www/xxx.xx/web/public_html
do configu podobne jako u ostatnich virtualhostu prosim pridat řádku:
SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0

2. nasměrovat doménu na server vshostingu

3. nastavit https lets encrypt:
prosím o nastavení pouze https, http://*.xx.xx a http://xx.xx
přesměrovat na https://www.xx.xx/,
certifikat lets encrypt

Pro Wordpress:
prosím o nastavení nového virtualhosta https://www.xx.xx/
pouze https, http://*.xx.xx a http://xx.xx
přesměrovat na https://www.xx.xx/,
certifikat lets encrypt
Documentroot /var/www/xxx.xx/web

b) Kamatera

Instalace LetsEncrypt certifikátu:

sudo certbot --apache

systemctl restart apache2

Obnova certifikátu:

certbot delete --cert-name mail.cebin.cz
certbot certonly --standalone -d mail.cebin.cz

2023-01-08 10:57
Jan Hrdlicka

DNS

Toto je pouze informativní - DNS již nemáme na vlastních serverech, takže toto je pouze informativní.

Dříve byl primár na našem serveru ns.cebin.cz a sekudnáry přes službu buddydns.com

Sign domain

/usr/sbin/dnssec-signzone -o cebin.cz -3 abcdef named.cebin.cz
/usr/sbin/dnssec-signzone -o informica.cz -3 abcdef named.informica.cz

pro domenu informica.cz se musite zeptat
dig -t axfr informica.cz @mail.cebin.cz
pokud je to autoritativni server pro danou domenu a to je.

Jestli je skutecne autoritativni se dozvite prikazem
whois informica.cz
podle tzv. ns-setu.

Zbytek DNS serveru na celem svete pouze kopiruje data z autoritativnich serveru a neni treba je overovat.

@ IN TXT "v=spf1 mx a include:_spf.vshosting.cloud ip4:217.16.184.84 ip4:88.198.64.154 ~all"

Hromadná změna TTL na primáru:
for i in named.*; do ~sed 's/^$TTL.*/$TTL\t600/' -i $i; done

for i in named.*; do sed 's/^\s*[0-9]*\s*;\s*Serial/\t\t\t2022090201\t; Serial/' -i $i; done

Hromadná změna IP:
for i in named.*; do sed 's/88.198.64.154/159.69.131.247/' -i $i; done

2022-10-17 17:45
Jan Hrdlicka

Backup

Firemní server

Idrive - automaticky

HomePI

1. denne inkrementalni backup na zalozni tisk /backup2
pod danym datumem se zobrazuji pouze zmenene soubory
pokud chci data ziskat, musim rucne namountovat disk   mount/backup2
skript: /etc/cron.daily/zzzbackup2

Účetnictví (pohoda):

Idrive - automaticky -přímo z aplikace Idrive pro Windows

ručně - pro zálohy nastaven sitovy disk - adresář /data-sw/informica/dokumenty/pohoda-zalohy - tyto zalohy se pak zalohuji s celym diskem do irive a HomePi

 

Cebin.eu

Idrive

Cebin.info

Idrive

 

2021-01-23 17:34
Jan Hrdlicka

Šablony e-mailů - tisk do 1000

Formuláře
https://tiskpetkaadmin.cebin.eu/email-templates


1. Poptávka individuální tiskoviny - text e-mailu poptávky se nastavuje v administraci:
https://www.tiskdo1000.cz/admin#!/default/15/forms/form/index

Ostatní formuláře se nastavují přes šablony:
https://tiskpetkaadmin.cebin.eu/email-templates

Popis šablon:
adminorder - pdf příloha objednávky pro admina
adminorderitem - pdf příloha jednotlivých zakázek pro admina
clientorder - indiviuální tiskovina k odsouhlasení
informAdmin3 - informační e-mail přijaté objednávky pro admina (jak pro standardní objednávku, tak i pro individuální tiskovinu)
informCustommer3 - informační e-mail přijaté objednávky pro zákazníka (jak pro standardní objednávku, tak i pro individuální tiskovinu)
orderSummary - šablona přehledu objednávky před odesláním

2022-06-27 13:19
Jan Hrdlicka

WEB REVEL

Widgety - viz. luya trailer jsou nastaveny i pro články

Funguje to tak, že v modulu články do místa, kam chcete vložit widget vložíte: {widget-tepelna-cerpadla-revel}

Funguje to obecně - na stránku se vloží widget, jehož název - "URL Path segment" je ve složených závorkách.

2022-07-08 14:29
Jan Hrdlicka

vue

npm run serve
npm run build

npm install --save-dev vite

https://vuejs.org/tutorial/
https://www.digitalocean.com/community/tutorials/vuejs-v-model-two-way-binding
https://tutorialzine.com/2016/03/5-practical-examples-for-learning-vue-js
https://awesome-vue.js.org/resources/examples.html

 

https://stackoverflow.com/questions/34723680/vuejs-event-on-change-of-element-value

https://www.youtube.com/channel/UCO6jIzhTzSbmaLNq62p-0MA/featured
Vue.js on a real website! Adding Vue.js to a PHP Yii2 application.


$this->registerJsFile("https://cdn.jsdelivr.net/npm/vue/dist/vue.js",['position'=> $this::POS_HEAD]);

https://www.smashingmagazine.com/2018/02/jquery-vue-javascript/
https://medium.com/kaliop/how-to-use-vuejs-instead-of-jquery-ee6003ba323d

https://stackoverflow.com/questions/67885488/how-to-show-a-hidden-div-by-clicking-on-another-div-button-in-vue

https://stackoverflow.com/questions/69295352/vue-js-show-hide-element-on-click

v-model
https://vuejs.org/api/built-in-directives.html#v-text
https://jsfiddle.net/evnctym1/

https://www.jstips.co/en/more/vuejs-how-vuejs-makes-a-copy-update-replace-inside-the-data-binding/

https://vuejs.org/guide/components.html#What-are-Components
https://stackoverflow.com/questions/66644191/refs-returns-undefined-in-vue-js
https://www.nicesnippets.com/blog/vue-js-get-element-by-id-example

https://stackoverflow.com/questions/43499917/vue-components-and-ajax-loaded-html-content


https://stackoverflow.com/questions/46305448/vue-js-calling-function-on-change

 

https://www.codetd.com/en/article/12515792

2025-07-14 11:21
Jan Hrdlicka

Domény nastavení

1. Domainmaster

použít nameservery domainmaster:
nsset: GRDNS
ns.grdns.cz
ns.grdns.it

pro nastavení MX záznamů u domény spustit skript na serveru informica /tools/domainmaster

2. Ignum webglobe

použít nameservery ignumu - předvolené nebo
neset: WEBGLOBECZ
ns1.webglobe.cz
ns2.webglobe.cz
ns3.webglobe.com

2023-11-20 10:17
Jan Hrdlicka

maldet cebin 2024/07

čen 25 2024 17:46:06 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.exe.globals.418 found for /var/www/cenytisku.cz/backend/vendor/friendsofphp/php-cs-fixer/tests/Fixer/Alias/BacktickToShellExecFixerTest.php
čen 26 2024 05:25:34 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.exe.globals.418 found for /var/www/rafo.cz/backend/vendor/friendsofphp/php-cs-fixer/tests/Fixer/Alias/BacktickToShellExecFixerTest.php
čen 28 2024 06:25:40 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.exe.globals.418 found for /var/www/tiskne.cz/backend/vendor/friendsofphp/php-cs-fixer/tests/Fixer/Alias/BacktickToShellExecFixerTest.php
čen 28 2024 06:35:07 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.base64.v23au.188 found for /var/www/tiskne.cz/backend/vendor/ezyang/htmlpurifier/README.md
čen 28 2024 06:37:47 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.base64.v23au.188 found for /var/www/tiskne.cz/backend/vendor/pdepend/pdepend/src/main/php/PDepend/Util/Cache/CacheDriver.php
čen 28 2024 11:53:39 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.exe.globals.418 found for /var/www/tiskne.cz/web/vendor/npm/jquery/test/data/qunit-fixture.html
čen 29 2024 07:11:33 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.exe.globals.418 found for /var/www/petrsuba.cz/backend/vendor/friendsofphp/php-cs-fixer/tests/Fixer/Alias/BacktickToShellExecFixerTest.php
čen 30 2024 13:50:19 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.exe.globals.418 found for /var/www/mojetisky.cz/admin/vendor/friendsofphp/php-cs-fixer/tests/Fixer/Alias/BacktickToShellExecFixerTest.php
čen 30 2024 23:37:19 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.exe.globals.418 found for /var/www/printeq.cz/backend/vendor/friendsofphp/php-cs-fixer/tests/Fixer/Alias/BacktickToShellExecFixerTest.php
čec 01 2024 11:11:44 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.exe.globals.418 found for /var/www/vdubi.printeq.cz/admin/vendor/friendsofphp/php-cs-fixer/tests/Fixer/Alias/BacktickToShellExecFixerTest.php
čec 03 2024 02:22:23 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.exe.globals.418 found for /var/www/tiskdo1000.cz/backendnew/vendor/friendsofphp/php-cs-fixer/tests/Fixer/Alias/BacktickToShellExecFixerTest.php
čec 03 2024 17:38:15 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.exe.globals.418 found for /var/www/eqsoft.eu/cis/backend/vendor/friendsofphp/php-cs-fixer/tests/Fixer/Alias/BacktickToShellExecFixerTest.php
čec 05 2024 17:18:27 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.exe.globals.418 found for /var/www/_bck/mojetisky/admin/vendor/friendsofphp/php-cs-fixer/tests/Fixer/Alias/BacktickToShellExecFixerTest.php
čec 09 2024 18:51:19 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.base64.inject.179 found for /var/www/_bck/api.tiskplus.cz/runtime/debug/65d12c1bee775.data
čec 09 2024 19:27:06 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.base64.inject.179 found for /var/www/_bck/api.tiskplus.cz/runtime/debug/65d12c0e09355.data
čec 09 2024 19:31:45 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.base64.inject.179 found for /var/www/_bck/api.tiskplus.cz/runtime/debug/65d12c187eff3.data
čec 09 2024 19:38:40 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.base64.inject.179 found for /var/www/_bck/api.tiskplus.cz/runtime/debug/65d12c1c5b12b.data
čec 09 2024 19:40:10 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.base64.inject.179 found for /var/www/_bck/api.tiskplus.cz/runtime/debug/65d12c1cbc9e7.data
čec 10 2024 23:53:09 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.base64.inject.179 found for /var/www/_bck/tiskplus/admin/runtime/debug/6506459bab9cc.data
čec 10 2024 23:54:36 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.base64.inject.179 found for /var/www/_bck/tiskplus/admin/runtime/debug/6506459b20383.data
čec 10 2024 23:54:52 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.base64.inject.179 found for /var/www/_bck/tiskplus/admin/runtime/debug/6506458208af8.data
čec 12 2024 14:09:35 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.base64.inject.179 found for /var/www/maxfotbal.cz/appadmin/runtime/debug/6509b3289c9d6.data
čec 12 2024 14:09:37 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.base64.inject.179 found for /var/www/maxfotbal.cz/appadmin/runtime/debug/6509b33ff2017.data
čec 12 2024 14:10:40 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.base64.inject.179 found for /var/www/maxfotbal.cz/appadmin/runtime/debug/6509b30a1b4cc.data
čec 12 2024 19:02:59 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.nested.base64.663 found for /var/www/e-moc-e.cz/_infected/unstyled-master/404.php
čec 15 2024 23:27:30 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.exe.globals.418 found for /var/www/jamacopy.cz/admin/vendor/friendsofphp/php-cs-fixer/tests/Fixer/Alias/BacktickToShellExecFixerTest.php
čec 16 2024 03:33:44 hrdlicka maldet(2066322): {hit} malware hit {HEX}php.exe.globals.418 found for /var/www/reklamniplachta.cz/backend/vendor/friendsofphp/php-cs-fixer/tests/Fixer/Alias/BacktickToShellExecFixerTest.php

2024-08-21 21:18
Jan Hrdlicka

hcdomazlice

Vyskakobací okno:
https://www.hcdomazlice.cz/admin#!/template/cmsadmin~2Fdefault~2Findex/update/78

zapíná se nastavením jako aktivní

2024-09-22 21:50
Jan Hrdlicka

SEO

Go to category

Analýza seo - report

Analýza stránek ....
z hlediska optimalizace pro vyhledávače
pro daná klíčová slova.

Výsledná  zpráva

Přehled

Vaše www stránky
http://www.stranky.cz


Vybrané analyzované stránky konkurence
1.
2.
3.
4.
5.
6.
7.

Analyzovaná klíčová slova
1.
2.
3.

Technické  záležitosti

(validita kódu, technické chyby, přístupnost webu, kvalita url, kvalita navigační struktury)

Popis stávajícího stavu stránek
Návrhy na zlepšení
Detailní analýza

Obsah

(hustota a rozmístění klíčových slov, kvalita textů)

Titulek (Document Title <title>)

Stránky konkurence
Váše stránky
Návrhy na zlepšení
Detailní analýza

 

Popisek  v META tagu (Meta description)

Stránky konkurence
Vaše stránky
Návrhy na zlepšení


Text

(h1, h2, img alt...)
Vaše stránky
Návrhy na zlepšení
Detailní analýza

 

Odkazy

(odkazová popularita, interní odkazy, odchozí odkazy, zpětné odkazy)


Odkazová popularita (Link Popularity)

Návrhy na zlepšení
Detailní analýza


Interní odkazy

Popis stávajícího stavu stránek
Návrhy na zlepšení
Detailní analýza


Odchozí odkazy

Popis stávajícího stavu stránek
Návrhy na zlepšení
Detailní analýza


Zpětné odkazy

Popis stávajícího stavu stránek
Návrhy na zlepšení


Doporučení - shrnutí

2020-09-09 22:58
Jan Hrdlicka

See Think Do Framework

2020-03-21 22:39
Jan Hrdlicka

SEO nástroje

https://linki.cz/seo-nastroje-zdarma/

2020-10-14 16:01
Jan Hrdlicka

Technical SEO audit

https://www.semrush.com/blog/technical-seo-audit/

Semrush’s Site Audit Tool

robots.txt

Sitemap
An HTML sitemap is written so people can understand a site’s architecture and easily find pages.
An XML sitemap is specifically for search engines: It guides the spider so the search engine can crawl a website properly.
site:domain.com inurl:sitemap
site:domain.com filetype:xml
site:domain.com ext:xml

Subdomains
site:domain.com -www

Indexed Versus Submitted Pages
site:domain.com
or
site:www.domain.com


Site Structure
Site structure is how a website is organized. “A good site structure groups content and makes pages easy to reach in as few clicks as possible.” It’s logical and easily expanded as the website grows. Six signs of a well-planned and structured website:

It takes only a few clicks (ideally three) for a user to find the page they want from the homepage.

Navigation menus make sense and improve the user experience.

Pages and content are grouped topically and in a logical way.

URL structures are consistent.

Each page shows breadcrumbs. You have a few types of breadcrumbs to choose from, but the point is to help website users see how they’ve navigated to the page they’re on.

Internal links help users make their way through the site in an organic way.

It’s harder to navigate a site with messy architecture. Conversely, when a website is structured well and uses the elements listed above, both your users and SEO efforts benefit.


3. How To Audit Canonical Tags and Correct Issues

4. How To Fix Internal Linking Issues on Your Site

Your site has two primary types of internal links:
Navigational: Often found in the header, footer, or sidebar
Contextual: Included within the content of the page

2021-04-03 12:02
Jan Hrdlicka

SEO tipy

Důležité jsou interní odkazy - kolikrát lepší než se snažit o externí

Obsahové priority - zjistit co je důležité a tomu dát přednost při tvorbě obsahu - např. parametry produktů

Nešířit vlastní obsah - do heuréky a porovnávačů nedávat pracně vytvořený obsah aby ho nezkopírovala konkurence, stačí dát část popisku

Využít evergreen obsah a ten rotovat a doplňovat - sezónní nabídky, faq, tipy, top 10.

2023-02-22 19:19
Jan Hrdlicka

Seo a jeho místo v marketingovém mixu

Seo místo v  See - Think - Do - Care frameworku je fáze Think, případně Care.

Budování komunity - firemní časopis, soc. sítě - viz aktin a aktin magazín

Může ulehčit zák. podpoře

Sbírat publika z článků a využít obsah pro soc. sítě 

SEO v kontaktu s PPC - vzájemně si předávat data, např. klíč. slova, která nevyužiju pro SEO může využít PPC, sdílení vylučujících slov apod.

vždy udělat analýzu kw, vyplatí se 

cíle a vyhodnocení

důležité je projektové řízení seo

zapojit tým, popsat problém, navrhnout řešení, zhodnotit přínos.  vysvětlit proč je co důležité 

SEO je maratón - plán na 12 měsíců

https://www.distilled.net/seo-forecasting-tool/

přednáška clickhappens.cz 2013 web expo

 

2023-02-22 19:31
Jan Hrdlicka

Top Affordable AI Tools for Technical SEO

1. Labrika

  • Price: Starting at $19/month

  • Key Features: AI-driven audits covering over 230 ranking factors, prioritization of critical issues, white-label reporting, and scheduled audits

  • Why It Stands Out: Labrika is highly regarded for its comprehensive technical SEO audits and actionable insights, making it a favorite among agencies and marketers .digiedh+310Web+3brendanaw.com+3

2. Screaming Frog SEO Spider

  • Price: Free for up to 500 URLs; £149/year for unlimited access

  • Key Features: In-depth site crawling, detection of broken links, duplicate content, and integration with GA4 and GSC

  • Why It Stands Out: A staple in the SEO community, Screaming Frog offers powerful technical analysis at a reasonable price, with the added benefit of local installation and unlimited site usage .Reddit

3. SEO Stack

  • Price: Starting at £49 for three websites

  • Key Features: Google algorithm tracking, automatic URL tracking, AI content auditing, and custom annotations

  • Why It Stands Out: SEO Stack provides a suite of tools designed to simplify data analysis and SEO testing, offering significant value for its price point .ranjeetdigital.com+5Medium+5TechRadar+5

4. Semrush Copilot

  • Price: Included with Semrush subscription (starting at $129/month)

  • Key Features: AI assistant that prioritizes SEO recommendations, flags urgent technical issues, and consolidates data from various Semrush tools

  • Why It Stands Out: Semrush Copilot streamlines the SEO process by providing prioritized insights, saving users time and enhancing efficiency .rankioz.com+2Reddit+2Reddit+2


Summary Table

Tool Starting Price Ideal For Key Strengths
Labrika $19/month Agencies, SMBs Comprehensive audits, actionable insights
Screaming Frog Free / £149/year Freelancers, Consultants Deep crawling, local installation
SEO Stack £49 for 3 websites Data-driven SEOs Algorithm tracking, AI auditing
Semrush Copilot $129/month (with Semrush) All-in-one SEO users Prioritized recommendations, integrated tools

 Final Recommendation

For a balance between affordability and comprehensive technical SEO capabilities, Labrika stands out as a top choice. Its AI-driven audits and user-friendly reports make it suitable for both beginners and seasoned professionals. If you're looking for a free or low-cost option with robust features, Screaming Frog is a reliable alternative, especially for those comfortable with a more hands-on approach.

2025-05-21 09:55
Jan Hrdlicka

Website Metadata for SEO and AI

Essential Meta Tags for SEO & AI Optimization

1. Title Tag

  • Most important on-page SEO element.

  • Keep between 5060 characters.

  • Include your main keyword and a value proposition.

Example:

 
<title>Best Productivity Tools for Teams | Workflow Booster</title>

2. Meta Description

  • Not a ranking factor, but improves click-through rate.

  • Keep 120155 characters.

  • Summarize the page clearly and include keywords naturally.

Example:

 
<meta name="description" content="Discover the best productivity tools to optimize team workflows, automate tasks, and boost collaboration." />

Technical SEO Meta Tags

3. Canonical Tag

Prevents duplicate content problems.

 
<link rel="canonical" href="https://www.example.com/your-page/" />

4. Robots Tag

Controls indexing and following.

 
<meta name="robots" content="index, follow" />

5. Viewport Tag (Mobile SEO)

Must-have for mobile optimization.

 
<meta name="viewport" content="width=device-width, initial-scale=1.0" />

Open Graph (Facebook, LinkedIn, AI Link Previews)

Critical OG Tags

 
<meta property="og:title" content="Your Page Title" /> <meta property="og:description" content="Short description for social media." /> <meta property="og:image" content="https://www.example.com/image.jpg" /> <meta property="og:url" content="https://www.example.com/your-page/" /> <meta property="og:type" content="website" /> <meta property="og:site_name" content="Your Brand" />

Tips:

  • Use 1200630 px images for best social previews.

  • Host images on your own domain.


Twitter Cards

 
<meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:title" content="Your Page Title" /> <meta name="twitter:description" content="Description for Twitter." /> <meta name="twitter:image" content="https://www.example.com/image.jpg" /> <meta name="twitter:url" content="https://www.example.com/your-page/" /> <meta name="twitter:site" content="@YourTwitterHandle" />

AI-Focused Tags (Future-Friendly)

AI systems (ChatGPT, Bard, Perplexity, Bing AI) rely heavily on structured and machine-readable formats.

1. Schema.org Structured Data (JSON-LD)

Most important for AI understanding.

Example (Article):

 
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Article", "headline": "Best Productivity Tools for Teams", "description": "Discover the best productivity tools...", "image": "https://www.example.com/image.jpg", "author": { "@type": "Person", "name": "John Doe" }, "datePublished": "2025-02-03", "publisher": { "@type": "Organization", "name": "Your Brand", "logo": { "@type": "ImageObject", "url": "https://www.example.com/logo.png" } } } </script>

Use specific schema types:

  • Article / BlogPosting

  • Product

  • FAQPage

  • HowTo

  • LocalBusiness

  • Organization

  • Person

  • Event
    AI prefers well-defined structured data.


2. Meta Author Tag

Helps AI identify creators.

 
<meta name="author" content="Your Name or Brand" />

3. Language Tag

Clear language helps AI parsing.

 
<meta http-equiv="Content-Language" content="en" />

Extra Helpful Tags

Favicon

 
<link rel="icon" href="/favicon.ico" />

Theme Color (Mobile UI)

 
<meta name="theme-color" content="#ffffff" />

Alternate Language Tags (Multilingual Sites)

 
<link rel="alternate" href="https://example.com/de/" hreflang="de" /> <link rel="alternate" href="https://example.com/en/" hreflang="en" />

Minimal Recommended Set (Copy & Paste)

 
<title>Your Title</title> <meta name="description" content="Your description here." /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="canonical" href="https://www.example.com/your-page/" /> <meta name="robots" content="index, follow" /> <!-- Open Graph --> <meta property="og:title" content="Your Title" /> <meta property="og:description" content="Your description." /> <meta property="og:image" content="https://www.example.com/img.jpg" /> <meta property="og:url" content="https://www.example.com/your-page/" /> <meta property="og:type" content="website" /> <!-- Twitter --> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:title" content="Your Title" /> <meta name="twitter:description" content="Your description." /> <meta name="twitter:image" content="https://www.example.com/img.jpg" /> <!-- AI + Structured Data --> <script type="application/ld+json">{ ... JSON-LD ... }</script>

If you want, I can also:

Generate a full template for your website
Audit your current meta tags
Create SEO-optimized titles/descriptions for your pages
Just tell me!

 
You said:
for open graph and twitter should i use in web admin two separate items for the same items (og:title, twitter:title) or one common item for social networks (social-tilte usw.)?
 
ChatGPT said:

Short answer: Use both sets of tags (OG + Twitter), but you can manage them from either one combined field OR separate fields in your CMS depending on how flexible you want the content to be.

Heres the full explanation:


Should you use separate items or one common item?

Option A One common social title/description/image field

Recommended for 80% of websites

You create:

  • social_title

  • social_description

  • social_image

And then output them to both OG and Twitter tags:

 
<meta property="og:title" content="{{social_title}}" /> <meta name="twitter:title" content="{{social_title}}" /> <meta property="og:description" content="{{social_description}}" /> <meta name="twitter:description" content="{{social_description}}" /> <meta property="og:image" content="{{social_image}}" /> <meta name="twitter:image" content="{{social_image}}" />

Advantages

  • Easier for editors

  • Automatically consistent across social networks

  • Less configuration in your CMS

Disadvantages

  • You cant customize Twitter differently from Facebook/LinkedIn

For most websites, this setup is perfect.


Option B Two separate sets of fields (OG + Twitter)

Recommended for high-end SEO, large brands, marketing-heavy websites

Fields:

  • og_title

  • og_description

  • og_image

AND

  • twitter_title

  • twitter_description

  • twitter_image

This gives maximum control if you need:

  • Shorter Twitter copy (because space matters more)

  • Different images (Twitter prefers 2:1, FB prefers 1.91:1)

  • A/B tested social content per platform

Advantages

  • Perfect control for each platform

  • Better performance for social campaigns

  • Compatible with enterprise marketing workflows

Disadvantages

  • More work for editors

  • Slightly more complex admin UI


Important Note

Twitter will fallback to OG tags if its own specific tags are missing.

So using only OG tags is technically enough:

  • og:title Twitter uses it

  • og:description Twitter uses it

  • og:image Twitter uses it

But the reverse is NOT true (Facebook will NOT read twitter tags).


Final Recommendation (Practical)

If you are designing a CMS or admin panel, use this:

Best setup today

One set of fields for social media (title, description, image)

Optionally allow overriding Twitter fields if needed.

Example:

 
Social settings: - Social Title - Social Description - Social Image - [Optional] Twitter Title (override) - [Optional] Twitter Description (override) - [Optional] Twitter Image (override)

This gives simplicity + flexibility.

2025-12-08 16:25
Jan Hrdlicka

Sledování viditelnosti značky

Doporuen nstroje do ~100 /msc
 1) Otterly AI  zlat standard pro mal rozpoty

 Cena: ~29 $/msc (Lite)  cca ~27 /msc
 Sleduje: zmnky znaky v generativnch odpovdch (ChatGPT, Perplexity a dal), sentiment, pehled vsledk a linky z AI odpovd.
 Vhody: velmi nzk cena, vhodn pro zatek, multi-AI pokryt i bez velkho mnostv prompt.
 Nevhoda: omezen poet sledovanch prompt na levnm tarifu. 
Spotlight

 2) Rankscale AI  ultra-low-budget monitoring

 Cena: od ~20 $/msc / ~18 
 Sleduje: AI visibility score, zmnky znaky, srovnn s konkurenc nap AI odpovmi.
 Vhody: extrmn levn, jednoduch dashboard, ideln pro pilotn testovn.
 Nevhoda: mn pokroil reporty ne dra platformy. 
Addlly AI

 3) ZipTie.dev  vc prompt za mlo penz

 Cena: ~69 $/msc (Basic)  cca ~63 /msc
 Sleduje: generativn odpovdi nap ChatGPT, Perplexity a Google AI Overviews; 500 AI check msn (~vce prompt ne levn plny u jinch nstroj).
 Vhody: hodn dotaz za nzkou cenu, jednoduch reporting, ideln kdy chce sledovat hodn prompt.
 Nedostane tak hlubok sentiment/kontextov analzy jako u drach platforem. 
Geneo

 4) Riff Analytics (starter)  dobr kompromis za ~50 

 Cena: ~49 $/msc / cca 45 
 Pokud už ti Collabim (a podobné SEO nástroje zaměřené primárně na pozice ve vyhledávačích) nestačí kvůli nástupu AI generovaných odpovědí a chceš se zaměřit na sledování viditelnosti značky v AI prostředích (ChatGPT, Perplexity, Gemini, Google AI Overviews apod.), tak se trh začíná rychle měnit a objevují se moderní nástroje přímo pro tuhle AI brand visibility.

 
 Sleduje: zmnky znaky nap AI modely, sentiment a Share-of-Voice vzhledem ke konkurenci.
 Vhody: dobr pomr cena/vkon pro startupy a mal znaky; pokrv bn modely bez vysokch nklad.
 Limitovan poet prompt v tomhle tarifu. 
Riff Analytics

 5) Free / low-cost doplky

 LLM Rankers / LLMrefs  kolem $79/mo nabz zkladn sledovn 50 klovch slov ve vce modelech.
 Free nstroje (nap. ChatGPT Presence atd.)  run monitoring pes nstroje, kter dl prvn analzu prompt a zmnek  dobr jako doplnk k placenmu nstroji. 
Codedesign
+1

 Tipy pro vbr podle tvch poteb

 Nejni rozpoet / zatek:

Otterly AI Lite (~27 ) bez kompromis na zkladn monitoring

Rankscale AI (~18 ) nejlevnj vbec

 Chce sledovat vce prompt:

ZipTie.dev Basic (500 checks, ~63 )  skvl, kdy chce kvantitu dotaz

 Pokroilej reporting / Share-of-Voice:

Riff Analytics Starter (~45 )  solidn kombinace zmnek + sentimentu

 Rychl doporuen podle elu
Poteba    Nejlep volba
Nejni cena a pestrost    Rankscale AI
Nejlep all-in pro zatenky    Otterly AI
Hodn prompt bez vysok ceny    ZipTie.dev
Share of Voice + sentiment    Riff Analytics
 Jak je pouvat prakticky

 Nainstaluj 12 nstroje zrove (nap. Otterly AI + ZipTie)
 Nastav 2050 klovch prompt/otzky, kter reprezentuj tvoj znaku
 Sleduj msn zmny v zobrazen zmnek, sentimentu a Share-of-Voice
 Porovnvej vsledky s konkurenc = skuten AI viditelnost znaky

 Tip: tyhle nstroje se stle rychle vyvjej, take je dobr zat s levnjmi tarify + zkuebnmi 14-day trialy, abys vidl/a data, kter dostane jet ped zvazkem k placen verzi. 
Codedesign

Chce, abych ti udlal konkrtn kroky a seznam prompt pro poten monitoring (nap. 20 nejdleitjch prompt)? To ti d systm, jak to hned spustit.

2026-01-02 16:25
Jan Hrdlicka

Weby a aplikace

Go to category

Framework nebo cms?

Framework a CMS nelze srovnávat.

Malou analogií by mohlo být:

Framework je například soubor součástek automobilu, které mákonstruktér k dispozici – například pneumatiky. Konstruktér se nemusízajímat o to, z jakých materiálů je pneumatika vyrobena a co je pro jejívýrobu potřeba, jen jí použije (čili nejzákladnější věci nemusířešit, to řeši framework, kontruktér řeší až to, jak to do sebevšechnio pasuje). Vezme takto všechny součástky a z nich složí automobil.Pokud chce kola od traktoru, použije takové součástky aby to do sebezapadlo.

CMS je hotový produkt, jako jeden určitý typ automobilu. Konstuktérapracujícího s automobilem nemusí vůbec zajímat to, že auto má nějakoupneumatiku. Jen využívá toho, co mu automobil nabízí. Hlavní tu je to, žemá omezenější možnosti. Nemůže si najednou vymyslet, že u auta chce tyvelký kola z traktoru, protože tam nepasujou.

Pokud chceš neomezené možnosti za cenu větší časové náročnosti –vol framework.

Pokud chceš nalajnovaná pravidla, která se prostě musí dodržovat, alezvládneš to za den – vol CMS.

Tak jsem si tu zaspamoval a ještě dodám, jak jdou technologie posobě :)

základní PHP → framework → CMS, eshop, statické stránky, atd atd

http://cs.wikipedia.org/wiki/Framework

http://cs.wikipedia.org/…%A1vu_obsahu

  1. Jsi-li lajk a chceš prostě aby to fungovalo a nemáš speciální nároky tak sáhneš po hotové aplikaci (CMS) jako je třeba Wordpress, Joomla!, nebo Contao apod.
  2. Pokud potřebuješ aplikaci, která je nějak specifická a výše zmíněné Ti nestačí, či nevyhovuje, sáhneš po Nette Framework a takovou aplikaci na správu obsahu si napíšeš sám.

2020-03-13 12:04
Jan Hrdlicka

Redesign webu

Fakt, že potřebujete redesign, však nemusí nutně znamenat, že tvůrce původního webu odvedl špatnou práci. Platí to zejména u starších stránek. Celý obor internet marketingu se neustále vyvíjí, mění se grafické trendy, objevují se nové technologie, upravují se strategie - tomu všemu je třeba stránky průběžně přizpůsobovat. Většinu webů čeká redesign jednou za dva roky, přibližně 25 % dokonce každý rok nebo častěji. Jen tak lze udržet krok s konkurencí. Průzkum společnosti TNS Factum, červen 2004 Permanentní redesign Výhody permanentního redesignu Redesing Klasický systém, tj. redesign jednou za dva roky, má nevýhodu v tom, že postupně se snižující kvalita stránek vede k jejich nižší konkurenceschopnosti. Jak ukazuje graf, těsně před tím, než je nový redesign dokončen, stránka výrazně hůře plní své poslání, konkurence v tomto období zbytečně získává cenný náskok. Proto se intervaly mezi jednotlivými redesigny stále více zkracují. Ve světě se také stále častěji skloňuje termín permanentní redesign - průběžné vyhodnocování stavu prezentace a její drobné úpravy tak, aby web stále odpovídal nejmodernějším trendům. U mnoha klientů se tento postup osvědčuje. Významnou výhodu pro stálé uživatele stránek přináší permanentní redesign také v tom, že se jim prezentace náhle nezmění pod rukama. Drobných vylepšení si často ani nevšimnou a pokud ano, pak je mnohdy jen přivítají.

www.adaptic.cz/znalosti/clanky/permanentni-redesign/

Jak redesignovat velký web, nenaštvat stávající uživatele a nezbláznit se z toho

   Redesign rozsáhlého webu se často rodí ve velkých bolestech.
   Řešení ve stylu Arnolda Schwarzeneggera “všechno vylejt” je jedno z těch horších.

Stávající uživatelé (kteří často tvoří nezanedbatelnou část obratu) nikdy nedocení celkový a přes noc nasazený redesign. Ten může být sebelepší, ale uživatelé se na vás stejně sesypou jako vosy. Nikdo totiž nemá rád změny.

Představte si situaci, že v nákupním centru, do kterého chodíte každý den nakupovat, by jednoho dne přestěhovali jednotlivé obchody. A v rámci obchodů by ještě změnili rozmístění regálů a v nich pozice zboží. Navíc by ještě zavedli nové služby pro zákazníky (a zrušili některé staré).

Rozhodně byste z toho neskákali radostí.

Tweak, don’t redesign…

… radí Steve Krug, uznávaný odborník na použitelnost webů a user experience.

   Najděte největší chyby v použitelnosti a ty postupně opravujte. Celkový redesign nic nevyřeší - jen si nasekáte chyby nové.

Jsou známé i příklady, kdy měl robustní redesign negativní vliv na úspěšnost webu. Jeden z amerických obchodních řetězců investoval 100 milionů dolarů do redesignu webu (sic!). V den spuštění a následných měsících ztratil 20 % obratu z webového e-shopu. Trvalo 3,5 roku, než zisky vzrostly na původní úroveň. (zdroj: Jarred Spool na UX LX)

Takže, decentními a postupnými opravami usnadníte pravidelným návštěvníkům přechod na nový design. Podstatné je, servírovat jim úpravy postupně a tak, aby si zvykli. Jako bonus u takového postupu zjistíte, zda daná úprava funguje, nebo ne.

http://jakubspanihel.tumblr.com/post/660275679/jak-redesignovat-velky-web-nenastvat-stavajici

2020-03-13 15:03
Jan Hrdlicka

muster_web launch checklist

2020-03-20 18:30
Andrea

Opensource pro weby

Postavit firemní web firmy na opensrource není dobrý nápad.

1. vede k šablonovitě - všechny weby vypadají podobně, těžko se vytváří přidaná  hodnota a odlišení od konkurence

2. je těžké až nemožné vytvářet řešení na míru (např. databáze lodí s parametry a předvýběrem, import hesel pro klientskou složku, a jakékoliv jiné nestandardní věci). Téměř pro každou nestandardní věc je nutné systém různě "ohýbat", což následně ztěžuje údržbu systému.

3. každý vidí do zdrojového kódu a může zneužít nalezených chyb -  stále častěji se šíří napadení open source www systémů.

4. Joomla je systém pomalý, těžkopádný a má omezené možnosti co se programování týče.

5.  tisíce programátorů, kteří systém a jeho moduly vyvíjejí nejsou pro vás k dispozici - prakticky nemůže existovat nikdo, kdo by rozuměl celému systému a všem jeho modulům, protože je vytvořilo tak velké množství lidí.

Open source bych určitě doporučil na projekty typu diskuzní fórum, Wiki, Sociální síť, blog, CRM systém atd. - zde jsou k dispozici vyzkoušená řešení a není potřeba je přizpůsobovat. Určitě mezi ně nepatří CMS a už vůbec ne E-shop.
Zde se zdánlivá úspora na začátku téměř vždy prodraží později.



    Průběžný vývoj - máte zaručeno, že nepřestaneme s vývojem kdy nás napadne
    Podpora - máte se na koho obrátit, u koho si postěžovat


Co se týče komerčních CMS systému, tak rovněž doporučuji maximální
obezřetnost. Rozhodně se neřiďte podle počtu dostupných modulů apod.,
protože vždy nakonec v budoucnu přijdete na funkci, která jako modul
není připravena a bude Vás to stát nemalé náklady donutit danou firmu k
potřebné úpravě (samozřejmě toto závisí na licenci a dalších podmínkách).

Souhlasím, že open-source je dobrá volba. Otázka je jaký open-source. Z osobních zkušeností bych Mambo ani Joomlu a podobné CMS nedoporučoval.

  1. nekonzistence, což je dost zásadní problém. Na projektu často pracuje řada nadšenců s různými zkušenostmi a různým přístupem. Tu je kousek programován objektově, tu procedurálně, tu je pokus o nějaký šablonovací systém nebo MVC architekturu, který se ale nakonec nepodaří prosadit, takže v kódu zůstanou torza něčeho, co tam vlastně nemá co dělat. Jeden vývojář pracuje raději s tímto, druhý raději s něčím jiným… a výsledek? Podivný, nekonzistentní slepenec.
  2. elementární chyby a nedostatky. Není zas tak vzácné, že se člověk setká s opensource projektem nebo některou jeho komponentou, kde se neošetřují vstupy od uživatele (což je naprosto zásadní bezpečnostní riziko), kde se neřeší nějaká místní specifika (prostě všichni mají weby v angličtině, tak ty ho taky budeš mít v angličtině, co na tom, že chceš faktury s diakritikou nebo v <a href="http://blok.net-vor.cz/prestashop-a-format-data/">Prestashopu lidský formát data</a>). Kdo někdy nasazoval třeba Prestu, potvrdí mi, že korekce různých chyb nebo nedokonalostí tak, aby to nějak důstojně fungovalo, zabere týden až 14 dní. Pokud chcete mít projekt založený na tom, že absolutně netušíte, co kde kdo naprasil, je opensource ideální řešení.
  3. absolutní neflexibilita. Jistě, třeba pro Wordpress nebo Joomlu existují tuny tzv. pluginů, ale stejně – není nic tak zoufale neflexibilního jako opensource. Problém spočívá v tom, že roky vývoje učinily z většiny opensource dost obludné a složité molochy. Úprava jakékoli prkotiny často obnáší úpravu desítek věcí, které na ní závisejí, a leckdy už ani není možné to všechno dohledat a ošetřit. Tím se člověk dostává do situace, že věří ve funkčnost, ale vlastně ani neví, jak je možné, že to funguje. A to je dost špatně – to žádným pluginem nevyřešíte. A studovat měsíc, jak co kdo myslel, za tu dobu se dá udělat slušný eshop po vlastní ose.
  4. molochovitost. To je věc částečně vycházející z bodu výše. Veškeré opensource systémy (eshopy i ty tzv. publikační) vycházejí z předpokladu, že je třeba připravit co nejvíce funkcí, aby to bylo co nejuniverzálnější. Zdánlivá výhoda má dva následky: jednak máte v aplikaci 80 % funkcí, které nevyužíváte, pročež akorát opruzují, druhak se tím vytváří moloch, který je výkonnostně tak zoufalý, že je to poznat i pouhým okem a nejsou na to třeba měření (zkuste si třeba takovou Joomlu a její rychlost načítání jednotlivých stránek; uvidíte sami). Podle mého názoru je v tomto nedocenitelné, když klientovi připravím aplikaci přesně na míru a jen s těmi funkcemi, které potřebuje. To je pak lahoda.
  5. zásadní bezpečnostní rizika. Nutno říci, že situace se trochu zlepšuje, nicméně stále není u každého opensource produktu samozřejmost, že ošetřuje veškeré vstupy od uživatele, že je imunní vůči <a href="http://en.wikipedia.org/wiki/SQL_injection">SQL injection</a> nebo různým krádežím sessions. Pokud vám někdo hackne soukromý blog, asi se nic neděje. Pokud někdo hackne komerční web s nějakými privátními údaji (jména, hesla, čísla karet ad.), nastává pro provozovatele obrovský průšvih. Nemluvím ani o instalaci různých „pluginů“ od různých šikulů, kde člověk absolutně netuší, na jaké je to úrovni a co si instaluje (a leckdy má ještě dobrý pocit, že si aplikaci obohatil).
  6. nulová zodpovědnost tvůrců systému. Což není žádná banalita. Většina opensource se používá pod nějakou z veřejných licencí typu GPL, její součástí bývá to, že produkt si berete, jak leží a běží, tedy bez keců a případné možnosti vymáhat škody, které produkt někomu způsobí (např. krádež čísla kreditní karty kvůli snadnému hacknutí systému, kleknutí serveru kvůli špatnému výkonu ad.).
  7. zoufale nekvalitní a nevalidní HTML kód - tohle je neduh snad všech opensource systémů, troufám si říci bez výjimky. Layout stránek se i v roce 2011 generuje do tabulek, ideálně pěti do sebe vnořených (fuj!), kód je slepený, jak to komu přišlo pod ruku (kousek HTML, kousek XHTML a ještě s chybami, kousek vysmrklý z nějakého wordovského editoru, stylování přímo v kódu – dvakrát fuj!! ad.), výsledek naprosto zoufalý. A jediné, co s tím můžete udělat, je sednout si nad to a za nějaký týden to sjednotit a po někom opravit. To se opravdu vyplatí.
  8. licenční a právní problematika. Pokud si pořídíte aplikaci naprogramovanou na míru, je jasné, že nejste povinni ji dávat k další volné distribuci. U opensource tato povinnost být může – v textu licence může být třeba podmínka, že pokud dílo použijete jako součást jiného díla, stává se nové dílo automaticky opensource. Záleží na konkrétním textu konkrétní licence – ale to stejně nikdo nečte, že? Navíc právní složitost toho, co je nebo není zadarmo, se se všemi důsledky liší stát od státu, vyzná se v tom čert a spoléhat se dneska nejde na nic. Jen abyste pak nebyli překvapení, že něco vlastníte, ale vlastně to nevlastníte.
  9. těžší odstraňování kritických chyb. Tohle také není vyslovená drobnost. Pokud nejste osoba, která se přímo podílí na vývoji opensource produktu, bude dost problematické v případě nějaké kritické chyby ji dohledat – musíte se nejdříve s celou aplikací seznámit, najít části kódu, které danou funkcionalitu zajišťují (a nejspíš budou roztříštěny po deseti na sobě závislých metodách, to se pak hledá opravdu skvěle). Obvykle se jedná o chybu, která zcela znemožňuje funkcionalitu systému (pamatuji např. u Prestashopu chybné počítání DPH, chybné zobrazování faktur nebo matoucí datum, protože jej nebylo možné lokalizovat; např. u Opencartu se zobrazovala v košíku nějaká cena, přestože košík byl prázdný) nebo která umrtvuje některou jeho podstatnou funkci (např. nefunkční doprava zdarma pro Opencart). Pokud si systém vyvíjíte sami, netvrdím, že bude bez bugů, ale asi bude snazší je dohledat a opravit. Pokud používáte opensource, musíte počkat na vydání patche, což může být záležitost týdnů i měsíců.

Myslím, že k rozhodnutí, že opensource pro profesionální řešení opravdu ne, by stačil jakýkoli jeden důvod uvedený výše. A já jich sesmolil cca desítku. Je to dost? Já myslím, že ano. Pokud jsou nesouhlasy / výtky / jiné pohledy, uvítáme v diskusi.

2020-03-22 17:15
Jan Hrdlicka

Mac dns change

sudo vi /etc/hosts   

sudo killall -HUP mDNSResponder

2021-04-02 22:14
Jan Hrdlicka

Vývojový tým

Moderny web je komplexna vec a potrebuje specializaciu.
Minimalne na frontend a na backend. Uplne idealne je ked su k dispozicii
- grafici schopni dodat staticke mockupy rovno v html/css.
-To potom frontendista fakt riesi len ako to ozivit a moze sa venovat business logike v javascripte, bundlingu, ajaxu, restu a pripadne este dopise aj unit testy pre JS.
- Backednista na druhej strane si riesi len business logiku servra, API a data.
- No a ceresnickou na torte su dedikovani testeri, co dopisu automatizovane testy na aplikacne, integracne, penetracne a vykonnostne testy.

Idealna firma ma teda tieto DEDIKOVANE pozicie pre web:
- architekt,
- frontend,
- backend,
- designer,
- tester.

Ak to nemaju tak pojde o kompromis a neprofesionalny vyvoj.

Fullstack developer

Fullstack developer je vývojář, který umí pracovat jak na frontendové, tak na backendové části aplikace.

V praxi to znamená, že zvládá:

Frontend (uživatelské rozhraní) – práce s technologiemi jako HTML, CSS, JavaScript, a frameworky jako React, Angular nebo Vue.

Backend (logika a databáze) – práce se servery, API, databázemi a technologiemi jako Node.js, Java, Python, PHP, .NET apod.

Databáze – relační (MySQL, PostgreSQL) i nerelační (MongoDB, Redis).

DevOps / nasazení – základní znalosti práce se servery, cloudem (AWS, Azure, GCP), kontejnerizací (Docker) nebo CI/CD.

Jednoduše řečeno: Fullstack developer dokáže vytvořit aplikaci „od A do Z“ – od návrhu uživatelského rozhraní až po funkční server a databázi.

Chceš, abych ti ukázal konkrétní příklad toho, co fullstack developer typicky udělá (např. jednoduchá aplikace se serverem a frontendem)?


Fullstack developer

Realizátor – umí kódovat frontend i backend, pracuje s databází, API, nasazením.

Zvládne napsat funkční aplikaci od nuly.

Řeší konkrétní úkoly a implementaci – napíše komponenty, nastaví server, vytvoří databázový model.

Fokus: „Jak to uděláme?“
-----

Softwarový architekt (pro web a mobilní aplikace)

Návrhář a strategický technický lídr – navrhuje celkovou architekturu systému.

Určuje jaké technologie a frameworky použít, jak se budou různé části aplikace propojené (frontend, backend, databáze, API, mobilní aplikace).

Řeší škálovatelnost, bezpečnost, výkon, integraci s externími službami, cloudovou infrastrukturu.

Často vytváří technickou dokumentaci a komunikuje mezi vývojáři, product managery a business týmem.

Fokus: „Co a proč uděláme?“ + „Jak to má do sebe zapadat?“

==Product manager
Product manager (PM) je v týmu něco jako „majitel produktu“ – člověk, který se stará o to, aby se vyvíjelo to správné, pro správné uživatele, ve správný čas.

Hlavní role product managera:

Vizionář – má na starost produktovou strategii a směr vývoje (proč a co budeme stavět).

Spojka mezi byznysem a vývojem – komunikuje se zákazníky, managementem, marketingem i vývojáři.

Prioritizace – rozhoduje, co je nejdůležitější vyvinout (třeba podle hodnoty pro zákazníka nebo dopadu na byznys).

Definice požadavků – píše user stories, připravuje backlog, definuje akceptační kritéria.

Měření úspěchu – sleduje metriky (např. počet aktivních uživatelů, konverze, tržby), zkoumá data a uživatelskou zpětnou vazbu.

Rozdíl oproti vývojovým rolím

Product manager neprogramuje (i když může mít technické znalosti).

Zatímco architekt a developeři řeší „jak to postavíme“, PM řeší „co a proč stavíme“.

Typické role v profesionálním týmu (web + mobil)

Product manager – určuje co a proč se bude vyvíjet.

Product owner (v agilních týmech, někdy PM = PO) – spravuje backlog, píše user stories, komunikuje s vývojem.

UX/UI designer – navrhuje uživatelské rozhraní a zkušenost (wireframy, prototypy, uživatelské testy).

Grafický designer / vizuální designer – stará se o vizuální identitu, ikony, ilustrace, animace.

Frontend developer – staví klientskou část (web, mobilní aplikace v React Native, Flutteru apod.).

Backend developer – staví API, databáze, serverovou logiku.

Mobile developer – pokud nejde o multiplatformní framework, tak nativní vývoj pro iOS (Swift) a Android (Kotlin).

QA tester – testuje aplikaci (manuálně, automatizovaně), hledá chyby.

DevOps / Cloud engineer – zajišťuje CI/CD, nasazování, monitoring, škálovatelnost.

Software architect – navrhuje technologickou architekturu celého řešení.

Scrum master / project manager – stará se o proces, organizaci sprintů, komunikaci, odstraňování překážek.

Role, které se často slučují (hlavně v menších týmech)

UX designer + UI designer + grafický designer → jedna role („product designer“).

Fullstack developer → může kombinovat frontend + backend.

QA tester → někdy částečně přebírá vývojář (např. psaním unit testů), ale u profi týmu se většinou drží odděleně.

Product owner a product manager → v menších firmách je to stejný člověk.

DevOps → u malých týmů tuto roli může částečně zastat backend developer.

Rozdíl mezi malým a velkým/profi týmem

Startup / malý tým:

PM/PO v jedné osobě

Designer (UX/UI/grafika dohromady)

2–3 fullstack vývojáři

QA testování jen částečně (např. vývojáři sami)

DevOps jen základní

Velký/profi tým:

Samostatní UX a UI designéři

Oddělení frontend, backend, mobilní dev

Dedikovaný QA tým (automatické testy, test cases)

DevOps a monitoring jako specializace

Architekt jako technický lídr

Product manager + product owner jasně oddělení

Shrnutí:

Minimální profesionální tým (menší produkt): PM/PO, designer (UX/UI), 2–3 devové (fullstack nebo FE+BE), tester, DevOps (i jen částečně).

Velký profesionální tým: role oddělené a specializované, aby každý měl jasnou odpovědnost.

 

CTO (Chief Technology Officer, česky technický ředitel) je člen vrcholového managementu firmy, který má na starosti technologickou a technickou strategii organizace. Jeho role se může lišit podle velikosti a zaměření firmy (startup vs. korporace, výrobní vs. softwarová firma), ale obecně platí:


Za co CTO zodpovídá

  • Technologická strategie a vize – určuje, jaké technologie budou používány, jak se budou vyvíjet a jak podpoří byznys cíle firmy.

  • Vývoj produktů a služeb – dohlíží na proces vývoje softwaru/hardwaru, kvalitu a efektivitu.

  • Technologická infrastruktura – zodpovídá za architekturu systémů, cloudové prostředí, škálovatelnost, bezpečnost a spolehlivost IT.

  • Inovace – sleduje trendy, hledá nové možnosti, aby firma neztratila technologický náskok.

  • Tým a kultura – vede technické oddělení (vývojáře, IT specialisty, architekty), nastavuje procesy a podporuje růst lidí.

  • Rozpočet a investice do technologií – rozhoduje o alokaci zdrojů a nákupu technologií.

  • Spolupráce s vedením firmy – překládá obchodní cíle do technologického jazyka a naopak.


Pracovní náplň CTO (typicky)

  • Definice a implementace dlouhodobé technologické strategie.

  • Řízení a motivace vývojových a IT týmů.

  • Volba architektury a dohlížení na její správnou implementaci.

  • Nastavování procesů vývoje (Agile, DevOps, CI/CD).

  • Kontrola kvality a bezpečnosti softwaru/systémů.

  • Vyhodnocování a zavádění nových technologií.

  • Úzká spolupráce s CEO, CPO, CIO a dalšími vedoucími.

  • Reprezentace firmy na odborných konferencích, vůči investorům nebo partnerům.

2025-09-18 14:35
Jan Hrdlicka

Sublime Text

CTRL + ALT + P - Přepíná mezi posledními projekty
CTRL + P - GOTO anything (přejít na cokoli, rychlé otevírání souborů)
CTRL + SHIFT + P - Paleta příkazů - mocný nástroj
CTRL + R - Přejít na symbol ( CTRL+P a napsání @ )
CTRL + M - Přejít na druhý konec závorky

CTRL + SHIFT + L - Pro vybrané řádky zapne multiple cursor (násobný kurzor)
CTRL + D - Pro aktuální slovo a další výskyty zapne multiple cursor
CTRL + ALT + šipky - (nahoru a dolů) přidává řádky k multiple cursoru
ALT + F3 - Vybere všechny výskyty slova
CTRL + J - Spojí více řádků do jednoho, parádní s multiple cursor
CTRL + I - Incremental search

CTRL + ALT + šipky - přesouvá vybrané řádky nahoru a dolů
CTRL + SHIFT + / - Zakomentuje nebo odkomentuje výběr, funkční jen na anglické klávesnici

2021-04-12 09:15
Jan Hrdlicka

Ubuntu add to server local site

ssh -oHostKeyAlgorithms=+ssh-dss root@192.168.0.1

~/.ssh/config

Host nas (kancllocal)

  HostName 192.168.0.1

  HostKeyAlgorithms=+ssh-dss

Check ssh key
ls ~/.ssh/id_rsa ~/.ssh/id_rsa.pub

Generate key pair

ssh-keygen -t rsa -b 4096

Copy to server

ssh-copy-id user@remote-server

or copy manualy

cat ~/.ssh/id_rsa.pub | ssh user@remote-server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

check server configuration:
sudo nano /etc/ssh/sshd_config

restart sshd

sudo systemctl restart ssh

2025-04-09 13:32
Jan Hrdlicka

Obchod

Go to category

Podklady pro jednání

1. Jaký problém má být vyřešen?












2. Co od nás klient potřebuje?
Klientovy cíle? (Zvýšit prodej, zvýšit známost značky., prezentace nového výrobku....)












3. Jak se pozná, že cíle bylo dosaženo?
Pokud možno přesné číslo.
















4. Existují nějaké ožehavé oblasti, na které je potřeba si dát pozor?


5. Kdo bude hlavní kontakní osoba?



6. Je možné jednat i se zástupci kontakní osoby?



7. Jaké pravomoci mají jednotlivé osoby?

2020-03-13 12:06
Jan Hrdlicka

Formulář Poptávka webového projektu

Stručný popis projektu

Název vaší prezentace či služby.

Pokud název není dán, uveďte jak by se v ideálním případě měla jmenovat.

Claim

Jednovětný slogan popisující vizii, smysl, cíl vašeho projektu (firmy nebo služby)

Popis

Popište stručně vaši firmu a projekt službu, kterou poptáváte. Jaké jsou vaše konkurenční výhody a co byste rádi vyzdvihli? Máte něco, co konkurence nemá a návštěvníci webu by o tom měli vědět? Máte již nějaké webové stránky? Bude součástí webu prodej zboží či služeb? Pokud ano - viz. dále.

Klíčová slova

Kdybyste měli svůj byznys najít ve vyhledávači a neznali jeho název, jaká slova/fráze byste použili? Seřaďte použitá slova podle důležitosti.

 

(Charakteristika projektu

Řekněte nám, jaké služby budete od nás potřebovat a v jakém předpokládaném rozsahu:

- zpracovat grafický design,

- tvorba HTML šablon (upřesněte počet)

...

Pokud poptáváte předělání stávajícího webu, rádi vám sami navrhneme, co by bylo vhodné udělat.)

Účel a cíle

Aktuální stav

Jak nyní využíváte internet a sociální sítě a co na tom chcete změnit?

Proč chcete nový web / redes ign webu?

Cíl

Co má být primárním cílem webu? Čeho chcete jeho provozováním dosáhnout? Jaké jsou další, sekundární cíle webu?

Seřaďte dle váhy hlavní cíle vašeho webu (např. zlepšení image firmy, propagace nových produktů, zvýšení konverzního poměru - více objednávek, lepší dostupnost a prezentace informací). Pokud se jedná o redesign, jaké jsou jeho důvody (např. grafická zastaralost, špatná orientace návštěvníků, nízký konverzní poměr apod.)?

Cílová skupina

Kdo jsou Vaši návštěvníci a zákazníci (věk, vzdělání, pohlaví, sociální status, příjmová skupina, lokace)

Účel

Jaký problém může váš web pomoci jeho návštěvníkům vyřešit? Proč na něj budou chtít přijít?

Ideální scénář

Co má návštěvník webu udělat od přchodu do opuštění webu v optimálním případě? Jaký je podle vás ideální postup?

-kritické místo--

 

Trh a marketing

Stávající obchodní model

Jak nyní získáváte zákazníky, jaké používáte obchodní kanály? Jaký je váš marketingový model, jak používáte reklamu?

Konkurence

Jaké jsou vaše hlavní konkurenční firmy a jaká je jejich hlavní marketingová strategie? Existují online projekty, které považujtete za přímou konkurenci svého webu? Máte představu co z nich byste chtěli mít na svém webu také a co rozhodně ne?

Vypište konkurenční weby z vašeho oboru (můžete připojit vlastní poznámky).

Konkurenční výhodač

V čem se lišíte od svých konkurentů, co je vaše specialita? Proč budou chtít návštěvníci dávat přednost vám před konkurencí?

Nika

Vidíte ve svém oboru nějakou tržní niku, část trhu, které se nikdo pořádně nevěnuje a váš web by jí mohl využít?  --prostor pro nás - vlastní výzkum, nabídnout klientovi --

Monetizace

Má váš projekt generovat zisk? Pokud ano, jak? -- místo pro ujasnění zda mají být na webu reklamní plochy, případná změna priorit koncepce

Strategie

Máte představu, jak se na web návštěvníci dostanou kromě příchodu z vyhledávačů?

Opakovatelnost

Proč se budou chtít návštěvníci na váš web vracet? Máte představu, jak je k tomu pobízet?

Očekávání

Co se pro vás změní, až bude nový web v provozu? Za jak dlouho vám podle vás začne přinášet efekt?

Koncepce webu

Vizuální styl

Máte pro web připravené logo, je definovaný grafický styl nebo korporátní identita? Jsou dána vizuální pravidla a mají/mohou se případně měnit?

Negativní vymezení

Máte nějaké neoblíbené barvy, vizuální styly, způsoby prezentace? Vídáte na internetu nějaké prvky, kterým se chcete vyhnout?

Vypište weby, které se Vám nelíbí (nemusí být  z Vašeho oboru) a řekněte nám konkrétně, co se Vám na uvedených stránkách nelíbí. Řekněte nám také, jaký vizuální styl nebo barvy nemáte v oblibě a proč si myslíte, že bychom se jich měli v návrhu vyvarovat.

Inspirace

Vypište weby, které se Vám líbí (nemusí být z Vašeho oboru) a napište konkrétně, co se Vám na uvedených stránkách líbí.

Tabu

Existuje něco, co nechcete na webu publikovat? Něco, co jinde vídáte jako běžnou součást webu, ale ve vašem případě o to nestojíte? (informace z dění uvnitř firmy, reference, kontakty na zaměstnance...)

Celkový styl

Má web působit spíše konzervativně, moderně, netradičně, konceptuálně nebo dokonce provokativně a kontroverzně?  Jaké je vaše vnímání zákazníků a váš vztah k nim - profesionálně seriozní, přátelský či rodinný, úslužný a ochotný, rovnocenně partnerský atd. Chcete se prezentocat s profesionálním odstupem nebo naopak navazovat důvěrnější vztah?

 

Technické otázky

Stávající web

Existuje? Pokud ano, do ajké míry je nutné zachovat jeho strukturu, styl, vzhle a obsah? --odpověd asi známe, klientovo potvrzení--

Technické prostředky

Doména, hosting, platforma, drobné úpravy nebo je možné zásadnější změny?

Jedná se o internet nebo i  intranet/extranet, stránky pro mobily, handicapované...

Předpokládaný finanční rozpočet

Je-li dán předem stanovený finanční rozpočet.

Na vlastní design a vývoj, následná podpora a údržba stránek, rozpočet na online marketing v následujícím 1/2 roce

Termín dodání

Máte-li pevně stanoven termín, sdělte nám jej.

Rozhodování

Kdo se bude na vaší straně o projekt starat a kdo bude dělat zásadní rozhodnutí? Jak dlouho taková rozhodnutí budou trvat - hodiny či týdny?

Obsah

Kde se vezme obsah webu a kdo ho zajistí? Do jaké míry lze převést stávající obsah?

Co na stránkách bude za obsah, kdo ho bude tvořit a zodpovídat za něj. Jsou k dispsozici firemní materiály, pokyny (styl jazyka, frazeologie), jsou k dispozici firemní obrázky, fotky, videa, logomanuál, CI manuál?

Připravené podklady

Jaké podklady, které se mohou pro tvorbu

webu hodit, máte připravené k dodání (např. logotyp, grafický manuál, fotografie, texty)? Pokud žádné podklady zatím nemáte, budou k dispozici?

Grafika

Vypište firemní barvy, případně barvy, které chcete v

designu použít. Nemáte-li vlastní představu, můžete nechat plně na našem grafikovi. Jak má stránka vypadat a působit, odkazy na stránky které se líbí, případně na stránky které se nelíbí.

Foto

Pokukd budou potřeba prezentační/produktové foto,

máte k dispozici digitální fotky v profi kvalitě? Chybějící foto se nafotí nebo koupí ilustrační foto z fotobanky?

Jazykové verze

Jaký bude primární jazyk webu? Bude web ve více jazycích? V případě, že ano - jedná se o přesnou kopii struktury a obsahu, nebo bude struktura i obsah jiný? Kdo bude tvořit zodpovídat za obsah cizojazyčných mutací?

Aktualizace

Jak často a v jakém objemu se bude obsah werbu měnit? Kdo bude zodpovědný  za údržbu - bude si chtít klient web spravovat sám? Je na to vyhrazený dostatek prostředků a času?

Údržba stránek

Kdo bude web spravovat a kolik na to bude mít k dispozici času?

Limity

Víte o nějakých omezeních, předpisech a normách, které váš web bude muset dodržovat? (zákony, vyhlášky, pravidla přístupnosti, technické limity, firemní politiku)

Návštěvnost, sociální sítě

Měříte a vyhodnocujete dále návštěvnost webu, zdroje návštěvnosti, bounce rate, konverzní poměr a další důležité aspekty? Můžete poskytnout přístup k těmto statistikám? Propagujete své webové stránky pomocí PPC kampaní, linkbuildingem či tématickým blogem? Máte firemní Facebook nebo Twitter účet?

Existují nějaké jiné formy propagace na kterou by měly stránky navazovat (média, outdoor..)

Propagace

Jaká je plánovaná off-line propagace? (letáky, media,dirrect mailing, pr, spozoring..), jaká je plánovaná on-line propagace - a kdo bude mít na starost - máme navrhnout strategii a následnou realizaci my  nebo na to má klient agenturu případně bude dělat sám?

Ostatní...

doplní klient

2020-03-22 17:19
Jan Hrdlicka

Jak získat víc a lepších klientů

 

Roky, ale co kecám, patnáct let jsem byl při získávání klientů závislý jen na doporučeních. Tak jako většina kolegů designérů. A bylo to dost na houpačce.

Pamatuji si na období, kdy jsem neměl měsíce do čeho píchnout a v kanceláři hrál na počítači Mafii. A pak si pamatuji, jak jsem tři týdny 12 hodin denně retušoval modelky do katalogu. Po dvou týdnech jsem zjistil dvě věci:

Věděl jsem, která modelka má kde pihu a které musím secvaknout zuby.
Při usínání jsem koukal na přítelkyni a v hlavě automaticky retušoval nedokonalosti na pleti.

V té chvíli mi došlo, že mi z práce hrabe a že potřebuji systém, jak získávat pravidelně poptávky.

Mladší kolegové designéři se mě často ptají, jak získat klienty. A jedním dechem dodávají, že by chtěli i lepší (větší, bonitnější) klienty. Protože často dělají za málo peněz nepříliš kreativní práci. Tedy říkají to trochu jinak :).

Na škole i jinde vám určitě říkali: „Dělejte skvělou práci a že klienti (a peníze) si vás najdou.“

No, tak to je, vážení, lež. Neboli jak by řekla slečna Ema: kecy, prdy, beďary.
Mýtus skvělé práce, co se prodává sama

Skvělá práce není zárukou toho, že získáte lepší klienty a víc peněz.

To vám jen říkají lidi, kterým to náhodou vyšlo. Pravděpodobněji to ale byla kombinace tvrdé práce, štěstí, správného načasování a sebepropagace.

Neříkám, že skvělá práce není důležitá. Jen to, že jsou faktory, které jsou pro klienty důležitější.

Existuje hodně šikovných lidí, o kterých nikdo neví. A průměrných lidí, kteří jsou známí. Nakonec já začal psát blog kvůli 1 větě svého kamaráda Michala: „Ondro, ty jsi ten šikovný designér v rohu, o kterém nikdo neví.“

Jak říkal Mike Monteiro v knížce Design is a job: „Vždy dám přednost průměrnému designérovi, který je skvělý obchodník než skvělému designérovi, který svou práci nedokáže klientovi prodat.“
Na čem záleží klientům

Z mých zkušeností je pro klienty nejdůležitější:

Omezení rizika, že projekt nedopadne (horší než předchozí verze, dražší a dodaný pozdě).
Spolehlivý dodavatel (drží termíny, komunikuje, chyby řeší a je jim lidsky sympatický).
Solidně odvedená práce (good enough včas je lepší než perfektní s ročním zpožděním).

Zrovna teď pomáhám na straně klienta s redesignem pro Mountfield a OnlineKoupelny. A je to… zajímavé, vidět to z druhé strany. A to jak byznys pohled klienta, tak celkové fungování agentur. A u toho bych to nechal, ať se někomu nešťourám v otevřené ráně.
Nevýhody doporučení (word of mouth)

Není nic efektivnějšího, než doporučení.

doporučení

Má ale dvě nevýhody:

Je to pasivní systém – když vám vyschne práce, tak máte velmi omezenou možnost, co s tím dělat. Ano, můžete oslovit klienty a požádat je, zda by vás doporučili. Ale jednak to zní trochu zoufale, a jednak je to poměrně neefektivní. Málokdo bude v situaci, že jeho byznys partner aktuálně potřebuje vaši práci.
Doporučení vám přivede stejný typ klienta. Vaši klienti znají jim podobné lidi, ať už velikostí firmy, požadavky na vás i typem práce. Pokud si chcete šáhnout na větší a zajímavější zakázky, tak čisté doporučení není optimální strategie.

Jak tedy získat větší a lepší klienty?

Potřebujete systém, který vám bude generovat poptávky od vašich ideálních potenciálních klientů. Můj systém má 3 stupně:

Získat pozornost potenciálních klientů.
Zůstat v kontaktu a budovat vztah.
Podpořit poptávky a získávat zákazníky.

1. Získání pozornosti potenciálních klientů

Určitě vás napadne firemní blog, sociální sítě nebo newsletter. Problém je v tom, že pravděpodobně nemáte příliš mnoho kontaktů a návštěvnosti.

Pokud vás nikdo nezná, tak je potřeba se trochu prostituovat.

Mně funguje:

přednášení na oborových konferencích
rozhovory a podcasty
firemní workshopy
být kamarád s kolegy s oboru (zdravím HK a JJ) a profesemi před vámi a za vámi.
cílená facebooková reklama

Každému ale bude fungovat něco jiného. Otto Bohuš vyrostl na eknihách, Michelle Losekoot na sociálních sítích… vám může fungovat třeba přednášení, youtube nebo guest posting.

Ideální je kombinace, lidi o vás musí zakopávat opakovaně.

Já takhle objevil Jirku Chlebuse, který tvoří loga. Mj. navrhnul logo pro CoroVent plicní ventilátor. A nebo firmu V kontextu, která navrhla parádní etikety na víno tím, že lisovala vinné bobule a následně je fotili. A nebo Jindru Fialku a jejich space monitor.
2. Zůstat v kontaktu a budovat vztah

Šance, že získáte kontakt ve chvíli, kdy je potenciální zákazník ochotný s vámi spolupracovat je nízká. Na e-shopu je to v jednotkách procent. A u vás to procento nebude o moc vyšší. Takže se nesnažte nový kontakt hned „osejlovat“.

Budujte důvěru, poskytujte užitečný obsah a občas se zmiňte o tom, co děláte. Je to efektivnější, než tlačit na pilu. Hlavní je pravidelnost. Musíte se lidem připomínat užitečným obsahem, aby si na vás vzpomněli, až vás budou potřebovat. Což může klidně být za měsíc. Nebo za dva roky.

A až budete mít dostatečně velkou tlupu, můžete se zmínit, že teď máte volněji a berete nové klienty.
3. Podpořit poptávky a získávat zákazníky

Jak jsem psal v článku o Follow up, většina lidí se vzdá moc brzy. Pokud vás někdo poptá, tak se mu připomínejte tak dlouho, dokud nenastanou 2 situace:

získáte ho jako zákazníka, nebo
vás důrazně odmítne.

A první odmítnutí berte jako důvod se zeptat proč. Jaké má obavy, co je pro zákazníka důležité, jak by měl vypadat ideální výsledek. Jasně, nelámejte to přes koleno, ale zas nestahujte kalhoty, když k brodu je daleko.

Často se stává, že po úvodním kontaktu je chvíli rádiové ticho. Neberte to jako nezájem, klient může řešit tisíc a jednu jinou věc a čeká, že se mu ozvete. Je na vás, abyste to dotáhli.

80 % zakázek potřebuje 5 telefonických hovorů, 44 % lidí to vzdá po prvním telefonátu.

A paměť není dobrý systém, jak se starat o potenciální zakázky. Zkuste třeba trello.

follow up board v trellu
Tip na závěr

Nenechávejte propagaci a opečovávání potenciálních klientů do chvíle, kdy nemáte práci. To už je pozdě. Udělejte si z toho rutinu a minimálně jednou za měsíc se připomeňte užitečným obsahem. Ideálně častěji. Z dlouhodobého pohledu se vám to vrátí v zakázkách, lepším cashflow, menší míře stresu a zajímavější práci.

A jak sháníte zakázky vy?

zdroj: Ilincev blog

2020-09-23 13:34
Jan Hrdlicka

HR

Go to category

Dotazník uchazeče o zaměstnání

Jméno:

 

Vzdělání:


Praxe:

 


Realizované projekty, počet lidí v teamu, podíl práce na projektu.


Reference:


Časové možnosti (omezení, zdravotní, dojíždění atd.)


Preferovaný typ pracovního poměru (hlavní, vedlejší, brigáda, ŽL)

Co byste nejraději dělal/a ?


Možnost nástupu:


Platová představa:


Řidičský průkaz


Kuřák/nekuřák:

2020-03-13 15:00
Jan Hrdlicka

Security

Go to category

Zabezpečení serveru

Doporučené zakázané  funkce php

"exec,system,passthru,readfile,escapeshellarg,proc_close,proc_open,dl,popen"

Pokud dojde k využití bezpečnostní díry v daném php, nepodaří se útočníkovi automaticky spustit svůj kód a útok je neúspěšný.

2020-03-13 15:22
Jan Hrdlicka

Checklist na zabezpečení webových aplikací

https://blog.horejsek.com/bezpecnost/

V poslední době jsem častokrát řešil bezpečnost webů a vzpomínal, cože vše to musím mít v cajku. Tak jsem se rozhodl si sepsat takový check-list. A možná bude užitečný i někomu jinému. :-)

Základem je HTTPS

Bez toho asi nemá smysl ani řešit nic jiného. Takže to je must-have první věc, kterou řešit, pokud chcete web zabezpečit. A ne jen nutně zabezpečit, cokoliv proběhne po drátech nešifrovaně, může kdekoliv po cestě někdo upravit. Třeba se na nás přiživovat vkládáním vlastní reklamy. Jop, i tací poskytovatelé internetu mezi námi existují.

HSTS

Když už je HTTPS nastavené, další krok je mít správně nastavený redirect z HTTP na HTTPS. Aby se nestalo, že lze nějak web prohlížet přes nezabezpečené vody. Když už jste si dali tu práci, ať to má smysl.

Redirect však není vše. Uživatelé často pečou na to, co do prohlížeče zadají, a tak útočník může vylákat oběť na HTTP, i když třeba máme redirecty pořešené. Proto nastavíme HSTS hlavičku, aby prohlížeč ani HTTP nezkoušel a v takovém případě sám přesměroval. (Ano, znamená to, že když podělám SSL, nebude vůbec fungovat web. Ale mnohdy lepší žádný, než nebezpečný.)

Strict-Transport-Security: max-age=31536000; includeSubDomains

Session cookie

Web je nyní zabezpečený a snažíme se našeho uživatele držet od HTTP co nejdále. Ale nikdy si nemůžeme být jisti, co se útočníkovi povede udělat. Proto budeme držet to nejcenější v co největším bezpečí. Mluvím o session v cookie. Rozhodně by měla být nastavena jako HTTP, což znamená, že ji nelze přečíst JavaScriptem. Mít nastaveno taky Secure není taky na škodu. Znamená to, že cookina půjde pouze po šifrovaném spojení.

CSP

Neboli Content Security Policy je hlavička povolující jen určité zdroje. To znamená, že touto hlavičkou lze znemožnit útočníkovi vložit nebezpečný script. Resp. vložit může, ale nic to neudělá. Lze nastavit defaultně pro všechny, případně pro každý typ zvlášť (obrázek, fonty, JavaScripty, …).

Rozhodně je dobré se vyhnout unsafe-inline či dokonce unsafe-eval. Nejlépe dovolit jen vaši doménu, případně ještě ověřené CDNky. A samozřejmě nejen zakázat, ale také zakázané pokusy nahlásit – je dobré vědět, zda se někdo o něco pokouší.

Content-Security-Policy: default-src 'self'; report-uri /csp-report;

Případně lze využít verzi, která jen nebezpečný zdroj napráší. Vhodné do začátku, než se odladí již běžící web, ale rychle bych se dostal do striktního módu.

Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report;

XSS

CSP je fajn, ale pokud se útočníkovi povede dostat do stránky script přes naši samotnou webovou aplikaci, jsme namydlení. Naštěstí prohlížeče obsahují zabudovanou ochranu proti XSS (Cross Site Scripting). Normálně bývá zapnutá, ale jistota je jistota… (A opět lze bonzovat, což je asi to nejužitečnější na této hlavičce.)

X-Xss-Protection: 1; mode=block; report=/xss-report;

Iframe

Iframy se sice už nepoužívají, ale neměli bychom na ně zapomínat. Skrývají totiž potenciální nebezpečí. Útočník může naši stránku dát do iframe, překrýt nějakou zajímavou hrou (třeba klikací reklama v podobě „chytni všechny míče a máš možnost vyhrát nový iPhone“) a donutit tak uživatele kliknout na místa na našem webu, jak potřebuje. Proto je nejlepší úplně zablokovat možnost naši stránku v nějakém iframe mít.

X-Frame-Options: DENY

Typy souboru

Ať už na webu máme nahrávání souborů, které pak i zobrazujeme, či nikoliv, nikdy si nemůžeme být jisti, co se útočníkovi povede. Proto je možnost mu zase jednoduše znepříjemnit práci a to tak, že typ souboru budeme vždy určovat my a prohlížeč se nebude snažit hádat. Tedy pokud útočník nahraje JavaScript či celou HTML stránku, ale my takové věci nepodporujeme, pak prostě jako HTML stránku nevydáme a tudíž se nic nestane.

X-Content-Type-Options: nosniff

CSRF

Už jste si všimli, že e-mailové aplikace se ptají, zda zobrazit obrázky? Je to z důvodu, že pokud jste například přihlášeni na Facebooku a útočník vám poslal e-mail s obrázkem, který není obrázek, ale jen odkaz na smazání účtu, a vy se na takový obrázek chcete podívat… máte po účtu. Teoreticky. Bude to platit na webech, kde takové akce lze provést obyčejným GET požadavkem, což Facebook není.

Základem je veškeré akce nedělat GETem, ale POSTem či ostatními. To ale nezabrání místo obrázku využít například formulář, který uživatel vyplní nevědomky, neb si myslí, že je o něčem úplně jiném. Proto je dobré přidat ke každému požadavku ještě nějaký token. Na serveru vygenerovat token a ten při akci poslat zpět (a zvalidaovat, samozřejmě). Poté útočník musí nejprve zjistit i validní CSRF token, aby mohl takto uškodit. Což je podstatně složitější, neb web máme za SSL.

HPKP

Třešničkou na dortu je HPKP, což určuje, kterým certifikátům věřit. Defaultně prohlížeče věří všem certifikátům autorit, které mají v seznamu věrohodných. Jenže už se stalo, že byla certifikační autorita napadnuta…

Public-Key-Pins: pin-sha256='…'; pin-sha256='…'; max-age=5184000; report-uri=/hpkp-report;

V ukázce je vidět dvakrát pin-sha256. To není překlep, ale první je aktuálně používaný a druhý backup. Například příprava na vyexpirování atp. A opět lze zároveň bonzovat pokusy a nebo pouze bonzovat.

Public-Key-Pins-Report-Only: pin-sha256='…'; pin-sha256='…'; max-age=5184000; report-uri=/hpkp-report;

Hesla

Pokud se spravují hesla, musí se sledovat novinky a mít hesla co nejlépe zabezpečená. Tedy žádné MD5 hashe, ale co nejpomalejší hashovací algoritmus. Jakýkoliv algoritmus je oslaben proti jednomu typu útoku – brute force. Proto je dobré vybrat pomalý algoritmus, aby si nemohl útočník louskat hashe na jeho Raspberry po večerech. Často jsem používal PBKDF2 (default v Djangu), ale nic se nezkazí s bcrypt (náročné na CPU) či scrypt (náročné na paměť), které už jsou rozšířené. Mimochodem výkon lze stále lépe škálovat, než paměť.

Jelikož uniknutí databáze, kterou by mohl začít někdo louskat, nehrozí tak často, je potřeba se zamyslet taky nad přihlašovacím formulářem. Není dobré nechat útočníka v pohodě zkoušet louskat přímo na našem webu. Minimálně si monitorovat nebezpečné množství pokusů, raději s automatickým zpomalováním až blokováním. S blokováním však opatrně, neb se pak může zamezit přístup skutečným uživatelům. Například u naší „interní“ aplikaci víme, odkud se uživatelé přihlašují, takže můžeme podezřelá místa rovnou blokovat. U aplikací pro širokou veřejnost je lepší volbou zpomalování.

Logování

Pokud máte vše až potud, web máte dobře zabezpečen. :-) Ale dovolím si na závěr ještě jednu drobnost. A to, že i na druhé straně, tedy na vašem serveru, je potřeba k citlivým údajům přistupovat opatrně. Základem je mít vypnut debug mód v produkci (a nejlépe i na testu). I když má například Werkzeug debugger nově PIN k aktivaci, je to prostě díra.

Co je ale důležitější, je logování. Logujete si celé požadavky i se vstupními parametry? Všude, včetně login obrazovky? Pak máte logy pravděpodobně plné hesel v čitelné podobě. My jsme si například ve Flasku přetížili Werkzeugový ImmutableOrderedMultiDict, který skryje nebezpečné hodnoty.

Další tip, pokud pracujete v kódu často s citlivými údaji, použít nějaký speciální objekt, který nedovolí nijak zobrazit vnitřní hodnotu. Můžete pak hodnotu přenášet všude možně a máte jistotu, že se po cestě nezaloguje. Něco ve stylu:

class SecretValue(object):

    def __init__(self, secret_value):

        self.__secret_value = secret_value



    def get_secret_value(self):

        return self.__secret_value



    def __str__(self):

        return '--secret-value--'



    def __repr__(self):

        return '<SecretValue>'



>>> v = SecretValue('aaa')

>>> str(v)

'--secret-value--'

>>> repr(v)

'<SecretValue>'

>>> str({'value': v})

"{'value': }"

>>> logging.info(p)

INFO:root:--secret-value--

>>> logging.info('value: {}'.format(v))

INFO:root:value: --secret-value--

Poslední tip je na tracebacky. Python to například nedělá, ale PHP nahradí parametry funkcí za skutečné hodnoty. Docela užitečná věc pro debugování, ale nepraktická na citlivé údaje. Doporučuji takové chování vypnout, pokud lze. Pokud nelze, vybrat si rozumější nástroj. :-)

2020-09-09 23:43
Jan Hrdlicka

WordPress Security

security scan:

https://hackertarget.com/wordpress-security-scan/

Prevention

  • Keep WordPress, themes, and plugins updated
  • Use strong passwords and 2FA
  • Install a security plugin
  • Limit login attempts
  • Use security headers
  • Regular backups
  • Consider a Web Application Firewall (WAF)

Disable xmlrpc

// Disable XML-RPC completely
add_filter('xmlrpc_enabled', '__return_false');

// Remove X-Pingback header
add_filter('wp_headers', function($headers) {
    unset($headers['X-Pingback']);
    return $headers;
});

// Disable pingbacks
add_filter('pings_open', '__return_false', 10, 2);

// Remove RSD link (Really Simple Discovery)
remove_action('wp_head', 'rsd_link');

// Remove Windows Live Writer manifest link
remove_action('wp_head', 'wlwmanifest_link');

Test:
curl -I https://yoursite.com/xmlrpc.php

Securing WordPress REST API Endpoints


# Block access to WordPress REST API
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/wp-json/ [NC]
RewriteRule .* - [R=403,L]

 WordPress Authentication via functions.php

add_filter('rest_endpoints', function($endpoints) {
    // Remove user endpoints
    if (isset($endpoints['/wp/v2/users'])) {
        unset($endpoints['/wp/v2/users']);
    }
    if (isset($endpoints['/wp/v2/users/(?P[\d]+)'])) {
        unset($endpoints['/wp/v2/users/(?P[\d]+)']);
    }
    return $endpoints;
});

Recommended Approach:

  1. Remove user enumeration (always do this):
add_filter('rest_endpoints', function($endpoints) {
    if (isset($endpoints['/wp/v2/users'])) {
        unset($endpoints['/wp/v2/users']);
    }
    if (isset($endpoints['/wp/v2/users/(?P[\d]+)'])) {
        unset($endpoints['/wp/v2/users/(?P[\d]+)']);
    }
    return $endpoints;
});
  • Require authentication for sensitive endpoints while keeping public content accessible for legitimate use cases like mobile apps or headless WordPress setups.
  • Use web server rules only if you don't need the API at all or can whitelist your own services.

3. WordPress Authentication via functions.php

// Disable REST API for non-authenticated users
add_filter('rest_authentication_errors', function($result) {
    if (!is_user_logged_in()) {
        return new WP_Error(
            'rest_disabled',
            'REST API is disabled for public access',
            array('status' => 401)
        );
    }
    return $result;
});

 Selectively Block Specific Endpoints

add_filter('rest_endpoints', function($endpoints) {
    // Remove user endpoints
    if (isset($endpoints['/wp/v2/users'])) {
        unset($endpoints['/wp/v2/users']);
    }
    if (isset($endpoints['/wp/v2/users/(?P[\d]+)'])) {
        unset($endpoints['/wp/v2/users/(?P[\d]+)']);
    }
    return $endpoints;
});

2026-01-06 09:54
Jan Hrdlicka

Jak může útočník získat vaše přihlašovací údaje na veřejné Wi-Fi?

Jak může útočník získat heslo (vysoká úroveň)

  1. Phishing / falešné přihlašovací stránky (evil twin / captive portal)
    Útočník postaví veřejnou Wi-Fi s názvem podobným té vaší (evil-twin) nebo nasadí falešný „captive portal“ — stránku, která vypadá jako legitimní přihlášení služby. Uživatel zadá heslo přímo do podvodné stránky a útočník ho získá. Taková stránka může mít i HTTPS (platný certifikát) — viz níže.

  2. Man-in-the-middle s falešným certifikátem / kompromitovaný certifikační úřad
    HTTPS je bezpečné jen pokud prohlížeč důvěřuje certifikátu. Pokud uživatel ignoruje varování o certifikátu (nebo má v systému nainstalovaný škodlivý kořenový certifikát), útočník může „vidět“ obsah. Kompromitovaný nebo zlovolný CA může vydat certifikát i bez vašeho vědomí (vzácné, ale možné).

  3. Malware nebo keylogger na zařízení
    Pokud je zařízení kompromitováno (malware, keylogger), útočník získá přihlašovací údaje dříve, než je šifrování použije — HTTPS nic neřeší, když jsou údaje ukradeny přímo na koncovém bodě.

  4. DNS nebo router hijacking — přesměrování na podvodnou stránku
    Útočník může změnit DNS nebo upravit provoz přes kompromitovaný router tak, aby vás přesměroval na podvodnou stránku, která vypadá jako originál. Pokud stránka není přesně stejná doména, prohlížeč může upozornit na certifikát — ale mnoho lidí si toho nevšimne.

  5. Znovupoužívání hesel a získání údajů z jiného úniku
    Útočník může získat heslo z úplně jiného úniku a zkusit ho na vaší službě (credential stuffing). HTTPS přenos nebrání tomu, že používáte stejné heslo jinde.

  6. Session hijacking / cookie theft (pokud služba špatně nastaví zabezpečení cookie)
    I když je obsah šifrovaný, pokud stránka používá nezabezpečené cookies nebo nevlastní atributy Secure / HttpOnly / SameSite, může dojít k odcizení session. To je méně pravděpodobné u moderních dobře navržených služeb, ale může se stát.

Proč „mám HTTPS, tak jsem v bezpečí“ není vždy pravda

  • HTTPS chrání data během přenosu mezi vaším zařízením a serverem, ale nechrání: samotné zařízení, falešné stránky, phishing, uživatelské chyby (přijetí varování), nebo chyby serveru (špatné nastavení cookie, znovupoužívání hesel).

  • Pokud zadáte heslo do falešné stránky (i když má zelený symbol zámku — zámek jen říká, že přenos je šifrovaný, ne že stránka je legitimní), útočník ho má.

Praktická doporučení — co dělat na veřejné Wi-Fi

Krátký checklist, který skutečně snižuje riziko:

  1. Používejte dvoufaktorové ověřování (2FA) — i když někdo získá heslo, bez druhého faktoru obvykle nic neudělá. Nejlepší volba: hardwarové klíče (FIDO2) nebo autentifikátor (TOTP). SMS je lepší než nic, ale méně bezpečná.

  2. Používejte jedinečná hesla + správce hesel — zabráníte credential stuffing a phishingu tím, že správcem hesel se automaticky nedoplňují údaje na jiných doménách.

  3. Nepřihlašujte se přes veřejné Wi-Fi k důležitým účtům, pokud to není nutné — nebo používejte VPN, která šifruje celý provoz (snižuje riziko MITM a snoopingu na místní síti).

  4. VPN — spolehlivá placená VPN nebo firemní VPN je silná ochrana v nezabezpečených sítích; ale i VPN může být kompromitována, takže vybírejte důvěryhodného poskytovatele.

  5. Kontrolujte varování o certifikátu — nikdy nepřeskakujte varování „nezabezpečené připojení / certifikát neplatný“ a nedovolujte instalovat neznámé root certifikáty.

  6. Nenechte zařízení automaticky připojovat k otevřeným sítím — vypněte automatické připojování a ověřujte SSID.

  7. Aktualizace OS a aplikací — opravují chyby, které by útočník mohl zneužít.

  8. Používejte správce hesel, který nevyplní přihlašovací údaje na falešné doméně — to je silná obrana proti phishingu.

  9. Pozor na captive portály — pokud vás web přesměruje na přihlášení do „Wi-Fi portálu“, pečlivě si přečtěte, co po vás chtějí. Nikdy tam nezadávejte hesla pro jiné služby (Google, banku, apod.).

  10. Preferujte HTTPS stránky s HSTS a moderním nastavením — většina velkých služeb má HSTS, což znemožňuje SSL-stripping; stále si ale ověřte doménu.

Co dělat, když máte podezření, že heslo uniklo

  • Okamžitě změňte heslo na napadené službě a všude, kde jste heslo znovu použil/a.

  • Zaveďte 2FA na dotčeném účtu.

  • Zkontrolujte zařízení na malware a spusťte antivirovou kontrolu.

  • Pokud šlo o bankovní/platební údaje, kontaktujte banku.


Shrnutí: HTTPS je zásadní, ale není jediná obrana. Útočník často cílí na člověka (phishing), na zařízení (malware), nebo na důvěřující chování (ignorování varování). Nejlepší obrana: MFA (ideálně hardwarová), jedinečná hesla + správce hesel, VPN na veřejných sítích, nepřihlašovat se na veřejných Wi-Fi bez potřeby, a neignorovat varování prohlížeče.

2025-09-15 11:08
Jan Hrdlicka

CEBIN Applications

Go to category

Zammad

server kamatera

systemctl status zammad
systemctl stop zammad

zammad run rails r "Rails.cache.clear"


systemctl start zammad
systemctl restart zammad
systemctl enable zammad

Command line

zammad run rails r '{COMMAND}'
zammad run console
>>Delete task: Ticket.find(id).destroy

 

2024-04-24 12:57
Jan Hrdlicka

QRcode generator - poharbakova

Modul luya

/var/www/eqsoft.eu/web/modules/qrcodes

nazev vzoroveho pdf je napevnod v frontend Defaultcontroller

https://www.eqsoft.eu/qrcodes/default/showqrcode?number=1

spustit skript  /var/www/eqsoft.eu/web/public_html/poharbakova//var/www/eqsoft.eu/web/public_html/poharbakova

který vygeneruje pdf s čísly a kódy  v daném rozsahu a sloučí do jednoho souboru pro tisk.

2024-07-16 13:13
Jan Hrdlicka

CIS Informační systém

task -> order_item

task order_item
account_id account_id
subject item_name
description note


closed_at created
assigned_by created_by

total_price price

id product_id
type: ticket

2025-01-09 13:38
Jan Hrdlicka

Svgeditor

v javascriptu změnit

import.meta.ur na "/api/librarystruct.php"

2025-06-05 11:35
Jan Hrdlicka

Json editor

TODO:

  • Add server-side input validation where needed.
  • Limit the raw JSON import ability to trusted admins.
    If you need, I can add HTTP basic auth or integrate a simple login.
  • Add basic HTTP auth to the single file.
  • Convert to a two-file system (API endpoint + React frontend).
  • Add image uploads and insert links into the HTML content.
  • Harden security (rate-limit, stricter CSRF/session handling).

2025-12-06 10:04
Jan Hrdlicka

Luya Framework

Go to category

Problem with Datepicker on mobile

datepicker-mobile="true" to datepicker

<datepicker datepicker-mobile="true">

https://github.com/720kb/angular-datepicker/issues/247

https://github.com/luyadev/luya-module-admin/issues/408

2020-03-21 13:34
Jan Hrdlicka

LUYA framework todo

401 error
https://github.com/luyadev/luya-module-cms/issues/71

sitemap.xml
Systém automaticky či na vyžádání generuje XML sitemapy.

Lze vytvářet samostatné sitemapy pro jednotlivé typy stránek či sekce navigační struktury.
O každé stránce lze rozhodnout:
zda v sitemapě bude,
s jakou prioritou v sitemapě bude,
jakou bude mít výchozí frekvenci aktualizace,
v které sitemapě bude, lze-li vytvářet více sitemap.

2020-09-09 23:18
Jan Hrdlicka

LUYA setup

composer global require "fxp/composer-asset-plugin:~1.4"

composer create-project luyadev/luya-kickstarter-bootstrap4


composer create-project luyadev/luya-kickstarter:^1.0

mv luya-kickstarter/ web

cd web
cd configs
cp env.php.dist env.php

nastavit databazi:
mysql -u root -p
create database xxx;
grant all on xxx(dbname).* to 'xxx(username)'@'localhost' identified by 'xxxpassword';
flush privileges;

nastavit utf cz kodovani
nastavit db do config.php
copy env.php.dist to env.php

./vendor/bin/luya migrate
./vendor/bin/luya import


./vendor/bin/luya admin/setup
admin@cebin.cz
heslo (doda project manager)
Firstname: Cebin
Lastname: Admin
Language English

./vendor/bin/luya health

vi composer.json
za licence pridat radek
"minimum-stability": "dev",
composer require trk/luya-uikit
./luya import

composer require luyadev/luya-module-matomo
'matomoadmin' => [
'class' => 'luya\matomo\Module',
'serverUrl' => 'https://matomo.example.com', // without trailing slash, use full schema path.
'siteId' => 1,
'apiToken' => 'THE_API_TOKEN',
]

composer require trk/luya-uikit

composer require cebe/luya-module-sitemap

./vendor/bin/luya module/create


Quick NgRest CRUD setup instructions:

Create a (admin) module ./vendor/bin/luya module/create.
Add the module to your application config within the modules section (see the generated README.md file in the module).
Create a migration with a database table ./vendor/bin/luya migrate/create mytable modulename.
After preparation of the migration file (adding table and fields) run the migration command ./vendor/bin/luya migrate.
Run ./vendor/bin/luya admin/crud/create and provide the needed information (like module name, table name, etc.).
Copy the terminal output to the previous generated module file: /admin/Module.php.
Run the import command ./vendor/bin/luya import
Set permission in admin UI under System -> User groups -> Permission

 

Install printeq modules - prepare new printeq app: (preinstalled app is stored in /var/www/printeq.cz/_muster)

require kartik-v/yii2-datecontrol "@dev"
composer require luyadev/luya-module-errorapi
composer require 2amigos/yii2-usuario:~1.0
composer require luyadev/luya-module-crawler:^3.0
composer require luyadev/luya-module-matomo
composer require yiimaker/yii2-email-templates
composer require luyadev/luya-module-forms
./luya migrate
./luya import

composer require luyadev/luya-module-news

composer require kartik-v/yii2-grid "@dev"
composer require --prefer-dist yiisoft/yii2-bootstrap4

2025-07-23 09:33
Jan Hrdlicka

Luya Documentation

Config Variables

admin settings: System->Config Variables

in code:

use luya\admin\models\Config;

<?php $zobrazitcenik = Config::find()->where(['name' =>'zobrazitcenik'])->one()->value;?>

Image Filters

./vendor/bin/luya admin/filter

https://luya.io/guide/app-filters

Flush cache

./yii cache/flush-schema
./luya cache/flush-schema

2022-10-03 11:14
Jan Hrdlicka

Luya Forms

Formuláře (vzor web vosika.cz)
1. nainstalovat forms https://luya.io/packages/luyadev/luya-module-forms
2. nainstalovat recaptcha https://github.com/himiklab/yii2-recaptcha-widget
3. nastavit google kódy site key a secret key https://www.google.com/recaptcha/admin/create
4. upravit FormBlock aby měly formuláře ID kvůli nastavení eventů v analytics
viz. upravy oznacene "JHInf"
5. do formuláře přidat id
6.aby fungovala captcha je potreba pridat do formuláře recaptcha block
7. nastavit matomo analytics
- Tag Manager - přidat Trigger, Tag, Publishnout
- Dashboard - Goals - přidat goal
8. Nastavit GA
- google tagmanager
- google analytics cíle

změněné soubory:

src/FieldBlockTrait.php
src/Forms.php
src/SubmissionEmail.php
src/blocks/FormBlock.php
src/blocks/SelectBlock.php
src/blocks/TextBlock.php
src/messages/en/forms.php
src/views/blocks/FormBlock.php

update:
aby fungoval formId - kvůli identifikaci formuláře pro GA  stačí aktualizovat soubory:
src/blocks/FormBlock.php
src/views/blocks/FormBlock.php

2023-04-20 12:35
Jan Hrdlicka

Luya - allow point in url (pagename.html)

vendor/luyadev/yii-helpers/Inflector.php

ve starších verzích: vendor/luyadev/luya-core/helpers/Inflector.php


//$string = preg_replace('/[`%\+=\{\}\|\\\.<>\/\_]+/u', '', $string); // replace those chars with nothing
$string = preg_replace('/[`%\+=\{\}\|\\<>\/\_]+/u', '', $string); // replace those chars with nothing

2022-03-10 08:54
Jan Hrdlicka

Luya Deployment

How to Run Tests


./vendor/bin/phpunit

Check Coding Standard

In project is used PSR2 Standard

Check coding Standard

vendor/bin/phpcs --standard=PSR2 assets/ configs/ messages/ migrations/ modules/ views/ tests/

Repair bugs in coding Standard

vendor/bin/phpcbf --standard=PSR2 assets/ configs/ messages/ migrations/ modules/ views/ tests/

Run application in docker locally

docker build -t famu . docker run --name=famu -v /srv/http/famu/:/var/www/app -p 127.0.0.1:80:80 --network=php-dev -d famu * Replace /srv/http/famu with path of app on your computer * Replace php-dev with name of network where running db container

Revert application after deployment

dep revert prep dep revert prod

2022-02-19 17:53
Jan Hrdlicka

Excel import

./luya conversion/import/import-accounts /var/www/boftisk.cebin.info/web/firmy.xlsx

https://developpaper.com/yii2-0-framework-to-upload-excel-files-and-import-them-into-the-database/

./luya conversion/import/import-accounts /var/www/www.boftisk.cebin.info/web/firmy.xslx

composer require --prefer-dist moonlandsoft/yii2-phpexcel "*"

composer require phpoffice/phpexcel

2022-03-09 09:45
Jan Hrdlicka

Widgety (bloky, které se opakují na více stránkách)

Řešeno pomocí modulu trailer

Nastaveno např. na frankuv-dvur.cz a revel-pex.com.

Popis:

Blok, který chci nastavit jako widget připravím jako samostatnou stránku. Vhodné je vytvořit pro tento typ stránek vlastní container. Stránku nechám jako offline a neviditelnou, aby se nezobrazovala a neindexovala do vyhledávačů, protože tato stránka se nikdy nemá zobrazit samostatně. 

Následně na stránce, kde chci widget zobrazit přidám modul trailer a do parametrů vložím id stránky widgetu.

U revel-pex.com je widget vyřešen i pro články:
do místa, kam chci vložit widget vložím kód: {widget-tepelna-cerpadla-revel}, kde ve složených závorkách je widget jehož název - "URL Path segment" je ve složených závorkách.

2022-07-08 13:54
Jan Hrdlicka

Luya sitemap

vychází z https://mojetisky.cebin.net

Nyní je v app/modules  viz. mojetisky.cz

nutno vždy odebrat newslettery a aux container v SitemapController.php ř. 102

případně přidat články apod. viz holandskonalodi.cz

u holandskonalodi.cz je nutno převést do apps dle vzoru mojetisky.cz

hack - odstranit duplicitni homepage - v nové verzi již není nutné

hack - odstranit duplicitni homepage: v SitemapController.php, řádek 49 přidat
//JHInformica upravy remove homepage from url list
if($navItem->nav_id == Yii::$app->menu->home->id) continue;

2025-08-26 19:16
Jan Hrdlicka

Show aux content in layout

<?php
use luya\cms\models\NavItemPage;

$page = NavitemPage::find()->where(['nav_item_id' => 128])->one();
if($page)
echo $page->renderPlaceholder('content');
?>

2024-10-24 21:35
Jan Hrdlicka

Luya Errorapi

1. nainstalovat modul
composer require --ignore-platform-req=php luyadev/luya-module-errorapi

2. ./vendor/bin/luya migrate

3. ./vendor/bin/luya import

4. config
https://it-tools.tech/token-generator

'modules' => [

    // ...

    'errorapi' => [

        'class' => 'luya\errorapi\Module',

        'adapters' => [

            [

                'class' => 'luya\errorapi\adapters\MailAdapter',

                'recipient' => ['errors@example.com'],

            ],

            [

                'class' => 'luya\errorapi\adapters\SlackAdapter',

                'token' => 'xyz.xyz.xyz.xyz',

            ],

            [

                'class' => 'luya\errorapi\adapters\SentryAdapter',

                'token' => 'YOUR_SENTRY_USER_AUTH_TOKEN',

                'organisation' => 'organisationslug',

                'team' => 'teamslug',

            ]

        ],

    ],

]
'components' => [

    // ...

    'errorHandler' => [

        'api' => 'https://example.com/errorapi', // where example is the domain you have setup error api above

        'transferException' => true,

    ],

]

2025-01-10 15:00
Jan Hrdlicka

Analytics

Go to category

Cookie lišta / cookie bar

Conset Mode V2
Před ukončením podpory cookies 3. stran nás čeká ještě jedna výzva, a to je Consent mode V2. Už od 1. března 2024 ho musíte mít implementovaný na vašich webových stránkách. Pokud to neuděláte, přestanou se v Google Ads sbírat remarketingová publika a přiřazovat správně konverze k daným uživatelům.

Parametr ad_user_data se vyjadřuje k tomu, jestli mohou být neanonymizovaná data použita v reklamních systémech (např. poslána do Google Ads). Parametrem ad_personalization se dává souhlas k zařazení do publik pro remarketing.


https://matomo.org/faq/new-to-piwik/how-do-i-use-matomo-analytics-without-consent-or-cookie-banner/

https://matomo.org/faq/new-to-piwik/how-can-i-still-track-a-visitor-without-cookies-even-if-they-decline-the-cookie-consent/

https://www.youtube.com/watch?v=mvMyEVr_kMg

https://developers.google.com/tag-platform/devguides/consent#tag-manager

https://www.simoahava.com/analytics/consent-settings-google-tag-manager/

Nastavení cookie lišty:

1. zkopirovat composer.json z nemoricany.cz

2. provest composer update

3. zkopirovat z nemoricany /vendor/dmstr a /vendor/npm-aset

4. zkopírovat /messages/cs/cookie-nonsent.php

5. do config - components přidat 
'cookieConsentHelper' => [
'class' => dmstr\cookieconsent\components\CookieConsentHelper::class
],
do y18n přidat
'cookie-consent*' => [
'class' => 'yii\i18n\PhpMessageSource',
],

6. do main.php přidat

<?php  echo dmstr\cookieconsent\widgets\CookieConsent::widget([



    'name' => 'cookie_consent_status',



    'path' => '/',



    'domain' => '',



    'expiryDays' => 365,



    'message' => \Yii::t('cookie-consent', 'We use cookies to ensure the proper functioning of our website. For an improved visit experience we use analysis products. These are used when you agree with "Statistics".'),



    'save' => \Yii::t('cookie-consent', 'Save'),



    'acceptAll' => \Yii::t('cookie-consent', 'Accept all'),



    'controlsOpen' => \Yii::t('cookie-consent', 'Change'),



    'detailsOpen' => \Yii::t('cookie-consent', 'Cookie Details'),



    'learnMore' => \Yii::t('cookie-consent', 'Privacy statement'),



    'moreInfo' => \Yii::t('cookie-consent', 'Detailed information can be found on the page'),



    'visibleControls' => false,



    'visibleDetails' => false,



    'link' => '/prohlaseni-o-vyuziti-cookies',



    'consent' => [



        'necessary' => [



            'label' => Yii::t('cookie-consent', 'Necessary'),



            'checked' => true,



            'disabled' => true



        ],



        'statistics' => [



            'label' => Yii::t('cookie-consent', 'Statistics'),



            'cookies' => [



                ['name' => '_ga'],



                ['name' => '_gat', 'domain' => '', 'path' => '/'],



                ['name' => '_gid', 'domain' => '', 'path' => '/']



            ],



            'details' => [



                [



                    'title' => Yii::t('cookie-consent', 'Google Analytics'),



                    'description' => Yii::t('cookie-consent', 'Create statistics data')







                ],



                [



                    'title' => Yii::t('cookie-consent', 'Goal'),



                    'description' => Yii::t('cookie-consent', '_ga, _gat, _gid, _gali')







                ]



            ]



        ],



            'marketing' => [



            'label' => Yii::t('cookie-consent', 'Marketing'),



            'cookies' => [



                ['name' => '_ga'],



                ['name' => '_gat', 'domain' => '', 'path' => '/'],



                ['name' => '_gid', 'domain' => '', 'path' => '/']



            ],



            'details' => [



                [



                    'title' => Yii::t('cookie-consent', 'Google Analytics'),



                    'description' => Yii::t('cookie-consent', 'Create statistics data')







                ],



                [



                    'title' => Yii::t('cookie-consent', 'Goal'),



                    'description' => Yii::t('cookie-consent', '_ga, _gat, _gid, _gali')







                ]



            ]



        ]



    ]







]);  ?>

Do css přidat

.cookie-consent-popup {







    animation-name: show;







    animation-duration: 1s;







    animation-timing-function: ease;







    display: none;







   /* position: fixed;







    bottom: 0;







    left: 0;







    width: 100%;*/







    z-index: 999999;







}















.cookie-consent-popup.open {







    display: block;







    opacity: 1;







    animation-name: show;







    animation-duration: 1s;







    animation-timing-function: ease;







}















.cookie-consent-controls {







    max-height: 0;







    overflow: hidden;







    -webkit-transition: max-height 0.5s ease-out;







    -moz-transition: max-height 0.5s ease-out;







    transition: max-height 0.5s ease-out;







}















.cookie-consent-controls.open {







    max-height: 600px;







}















.cookie-consent-details {







    max-height: 0;







    overflow: hidden;







    -webkit-transition: max-height 0.5s ease-out;







    -moz-transition: max-height 0.5s ease-out;







    transition: max-height 0.5s ease-out;







}















.cookie-consent-details.open {







    max-height: 600px;







}















@keyframes show {







    from {opacity: 0;}







    to {opacity: 1;}







}















@keyframes hide {







    from {opacity: 1;}







    to {opacity: 0;}







}























.cookie-consent-popup{







    width: 420px;







    height: auto;







    background-color: #fff;







    position: fixed;







    bottom: 88px;







    border-radius: 10px;







    right: 5%;







    padding: 10px 20px;







    border: 1px solid #3d3728;







}















.cookie-consent-popup label{







    font-weight: normal;







}















@media screen and (max-width: 420px) {







  .cookie-consent-popup{







    width: 90%;







    left:5%;







    bottom: 22px;







    }







}

2024-08-18 10:17
Jan Hrdlicka

Subdomain Tracking with Google Analytics and Google Tag Manager

https://www.analyticsmania.com/post/subdomain-tracking-with-google-analytics-and-google-tag-manager/#no-cross-domain-tracking

2022-04-15 16:50
Jan Hrdlicka

GA4 nastavení

https://www.analyticsmania.com/post/how-to-install-google-analytics-4-with-google-tag-manager/

https://www.optimizesmart.com/how-to-set-up-ecommerce-tracking-in-ga4-google-analytics-4/
https://www.analyticsmania.com/post/datalayer-push/

Wordpress

contaform7 events:
vložit následující kód do functions.php aktuální šablony:
https://contactform7.com/tracking-form-submissions-with-google-analytics/

document.addEventListener( 'wpcf7mailsent', function ( event ) {
gtag( 'event', 'wpcf7_submission', {
'event_category': event.detail.contactFormId,
'event_label': event.detail.unitTag
} );
}, false );
</script>
<?php
}, 10, 0 );

2023-02-21 08:55
Jan Hrdlicka

Facebook pixel

https://www.analyticsmania.com/post/facebook-conversion-tracking-google-tag-manager/

2022-10-03 11:17
Jan Hrdlicka

Digital Marketing

Go to category

Digital Marketing Tools

Google Analytics Data quality

Google Analytics User rights

Testing tools

2020-03-22 13:47
Jan Hrdlicka

Using the data-nosnippet HTML attribute

https://developers.google.com/search/docs/advanced/robots/robots_meta_tag?s=09

2022-08-21 20:59
Jan Hrdlicka

Umělá inteligence AI

AI nástroje:
Claude Max pro https://www.claude.com/pricing/max
Windsurf https://windsurf.com/
Cursor https://cursor.com/
- testovat, zkoušet, každý je dobrý na něco

nejprve pokecat, napiš to do, pak teprve prompt

UX Figma

2. 25 hlavních myšlenek kurzu práce s AI

  1. AI jako nástroj: Vnímejte AI jako "kopilota", ne náhradu člověka.

  2. Kvalitní prompty: Čím přesnější zadání, tím lepší odpověď.

  3. AI mindset: Přijměte AI jako každodenního pomocníka.

  4. Kritické myšlení: AI může generovat nepřesnosti – ověřujte informace.

  5. Přizpůsobení výstupu: AI zvládá různé styly a tón komunikace.

  6. Praktická aplikace v marketingu: Plánování kampaní, tvorba obsahu.

  7. Efektivní práce s texty: Přepisy, překlady, úpravy textů.

  8. Obsahový marketing: Vytvářejte obsah na míru pro platformy.

  9. Automatizace procesů: Plánování schůzek, tvorba šablon, analýzy.

  10. Optimalizace webu a SEO: Návrh klíčových slov a zlepšení webu.

  11. Multimediální obsah: Scénáře, infografiky, videa.

  12. Persony v marketingu: Simulace odborníků pro různá témata.

  13. Vyprávění příběhů: Storytelling zaujme a buduje vztah se zákazníkem.

  14. Tonalita a styl: Přizpůsobte styl komunikace různým kanálům.

  15. Strategie na sociální sítě: Naplánujte obsah dopředu.

  16. Brainstorming nápadů: Získejte neobvyklé inspirace od AI.

  17. Segmentace a analýza zákazníků: Analyzujte potřeby a chování.

  18. Právní aspekty: Tvorba smluv, právní výzkum, checklisty.

  19. Efektivní plánování událostí: Pomoc s organizací eventů.

  20. Automatizace obsahu: Přizpůsobení obsahu na různé platformy.

  21. Podpora růstu podnikání: AI navrhne nové příležitosti a produkty.

  22. Souhrny a analýzy: Rychlá analýza a sumarizace dat.

  23. Budoucí vize: Přemýšlejte o dlouhodobém vlivu AI na vaši práci.

  24. Etika: Uvádějte zdroj AI u obrázků a textů.

 

3. Nástroje a platformy pro práci s textem

  • ChatGPT (OpenAI): Tvorba textů, plánů, a analýz.

  • Claude (Anthropic): Přirozená komunikace a textová analýza.

  • Gemini (Google): Personalizace a analýza obsahu.

  • Microsoft Copilot: Integrace AI do Office aplikací.

  • Perplexity AI: Rychlé odpovědi a dotazy.

  • Poe (Quora): Propojení více AI modelů.

  • Notion AI: Generování textů a poznámek.

 

4. Nástroje pro generování realistických obličejů

  • DALL·E 3 (OpenAI): Skvělá přesnost a proporce.

  • MidJourney: Detailní umělecké obličeje.

  • Adobe Firefly: Profesionální výstupy včetně úprav.

  • Runway ML: Trénování vlastních modelů.

  • Leonardo: Nástroj s kvalitními výsledky, nyní pod Canvou.

 

5. Praktické tipy

  • Přepis textu z videa: Turboscribe.ai.

  • Stahování videí: Yout.com.

  • Tvorba infografik: Infography.in.

  • Myšlenkové mapy: Napkin.ai.

  • Video generátory: Pika Labs, Wondershare.

  • Prezentace: Gama, Beautiful.

 

6. Modely GPT a vytvoření vlastního asistenta

  1. Použití průvodce – nastavení chování asistenta.

  2. Přizpůsobení promptů – přesné zadání pro zaměření na cílové téma.

  3. Integrace dat – nahrávání dokumentů pro lepší kontext.

  4. Použití v praxi – denní úkoly, plánování, strategie.

 

7. Základní principy zadávání promptů

  1. Definujte roli AI.

  2. Buďte konkrétní a přesní.

  3. Poskytujte kontext.

  4. Řetězte prompty (iterace).

  5. Testujte a upravujte zadání.

 

8. Doporučené formáty výstupů

  • Tabulky a plány příspěvků.

  • Myšlenkové mapy.

  • PowerPointové prezentace.

  • Argumenty pro a proti.

  • Skripta a reporty.



______

25 hlavních myšlenek kurzu práce s AI:

  1. AI jako nástroj: Umělou inteligenci vnímejme jako „kopilota“. Uživatel je stále pilotem a rozhoduje o výstupech. Přemýšlejme o ní jako o chytrém pomocníkovi, ne o náhradě člověka.

  2. Kvalitní prompty jsou základem: Čím lepší zadání dáte, tím lepší odpověď dostanete. Místo obecného „Pomoz mi naplánovat event pro děti“ zkuste:
    „Naplánuj zábavný program na dvouhodinovou akci pro děti ve věku 6–10 let. Hlavní téma je ekologie, mělo by to zahrnovat interaktivní hry, kreativní dílnu a krátkou edukativní část.“
    Tím zajistíte, že AI připraví detailní návrh programu, který bude odpovídat vašim potřebám.

  3. AI mindset: Přijměte AI jako každodenního pomocníka. Zkoušejte, co všechno zvládne, a postupně ji zapojte tam, kde vám může ušetřit čas – při psaní, plánování nebo analýze.

  4. Kritické myšlení: AI občas „halucinuje“, tedy generuje nesmyslné nebo nepřesné odpovědi. Ověřujte informace, zejména u faktických dat, a berte AI jako rádce, ne jako zdroj absolutní pravdy.

  5. Přizpůsobení výstupu: AI zvládá upravit tón a styl. Potřebujete seriózní článek nebo odlehčený blog? Stačí zadat: „Použij formální jazyk“ nebo „Piš hravým tónem s vtipnými poznámkami.“ Upraví text tak, aby odpovídal vašemu publiku.

  6. Praktická aplikace v marketingu: Vyzkoušela jsem si plánovat kampaně, osvědčil se ve spolupráci při vymýšlení nápadů na příspěvky. Například: „Navrhni 5 sloganů na nový produkt pro teenagery, který podporuje zdravý životní styl.“ AI zvládne i konkurenceschopné návrhy. Gary Vaynerchuk.docx

  7. Efektivní práce s texty: Od přepisů až po překlady – AI vám pomůže s rutinními úkoly. Například můžete nahrát dokument a požádat: „Převeď tento text do jednoduššího jazyka vhodného pro děti.“ Texty budou čitelnější a rychle hotové.

  8. Obsahový marketing: AI zvládá generovat obsah na míru pro konkrétní cílové skupiny a platformy, včetně strukturovaných příspěvků a návrhů na jejich plánování. Třeba: „Navrhni 5 nápadů na blogové články pro online obchod s kosmetikou, zaměřené na péči o pleť v zimě.“ Výsledky vám zjednoduší práci.

  9. Automatizace procesů: Lze zjednodušit rutinní úkoly, jako je plánování schůzek, správa e-mailů, tvorba šablon smluv, nebo analýza dat. Příklad: „Napiš automatizovanou odpověď na časté dotazy o dostupnosti zboží.“

  10. Optimalizace webu a SEO: AI dokáže analyzovat webové stránky a navrhnout vylepšení včetně SEO optimalizace. Můžeme například požádat: „Navrhni klíčová slova pro blog o prorodinné firemní kultuře, diverzitě, inkluzi a rovnosti.“ Strategie s AI.docx

  11. Multimediální obsah: Generativní AI umožňuje tvořit osnovy a obsahové nápady pro infografiky, scénáře pro videa nebo fotografie.

  12. Persony v marketingu: AI zvládne simulovat odborníky, například SEO specialistu, copywritera nebo datového analytika. Zadáním promtu „Vystupuj jako…. Persona.docx

  13. Vyprávění příběhů: Používání storytellingu je klíčové pro vytváření emocionálního propojení s cílovým publikem. Třeba: „Vymysli příběh zákazníka, který díky našemu produktu vyřešil problém s organizací času.“ Emotivní příběhy se lépe pamatují a sdílejí.

  14. Tonalita a styl: AI se dá přizpůsobit na různé styly komunikace – od formálního přes empatický až po kreativní a humorný​​.

  15. Strategie na sociální sítě: AI může připravit obsah na několik týdnů dopředu, včetně návrhu příspěvků a scénářů pro Reels. Marketingový plán Family Days.docx

  16. Brainstorming nápadů: AI je úžasný nástroj na generování kreativních nápadů. Když se zaseknete, stačí zadat otázku, třeba: „Jaké neobvyklé způsoby mohu využít k propagaci nového produktu v nabídce našich eventů?“ Pomůže s checklisty, newslettery, webináři, blogovými články… Checklist pro HR_Podpora prorodinné firemní politiky a kultury .docx
    Tip: Nebojte se být odvážní – AI zvládá i šílené nápady, které vás mohou inspirovat!

  17. Segmentace a analýza zákazníků: AI analyzuje potřeby a chování zákazníků, pomáhá se segmentací a cílením kampaní. „Jaké jsou hlavní potřeby toho a toho…“

  18. Právní aspekty: Generativní AI nabízí možnosti základního právního výzkumu, generování šablon smluv a kontrolních seznamů.

  19. Efektivní plánování událostí: AI zjednodušuje organizaci seminářů, konferencí a dalších akcí.

  20. Automatizace obsahu: Jeden obsah lze recyklovat a přepracovat na různé platformy (LinkedIn, Facebook, Instagram). Například: „Rozděl tento blogový článek na 5 příspěvků pro LinkedIn.“ Může nám pomoci s emočním zapojením klientů – díky jasně specifikované personě se můžeme doptat na problémy, které daná osoba řeší a nabídnout konkrétní pomoc.

  21. Podpora růstu podnikání: Můžeme se ptát, jak rozšířit podnikání. Například: „Jaké fyzické produkty by se hodily k našemu podnikání?“ K jaké příležitosti apod. Checklist pro HRisty: Checklist pro HR_Podpora prorodinné firemní politiky a kultury .docx

  22. Souhrny a analýzy: AI zvládá sumarizovat velké objemy informací a poskytovat přehledy a návrhy na základě dat​​.

  23. Budoucí vize: Kurzy zdůrazňují dlouhodobé přemýšlení o tom, jak může AI změnit osobní i profesní život, včetně vytváření osobní digitální vize​​.

  24. Etika – u realistických obrázků by měl být uváděn zdroj AI

Tyto body shrnují klíčové aspekty práce s generativní AI, přičemž cílí na praktickou aplikaci a důraz na využití i pro začátečníky s nedůvěrou vůči technologii.





AI nástroje – obrovské množství, každý se vyvíjí ohromnou rychlostí kupředu a každým týdnem zlepšuje své výsledky, funkce a možnosti. Konkrétně Chat GPT během prvních 14 dnů trvání kurzu přidal možnost hlasového zadávání ve free verzi, možnost nahrávání příloh, začal prohledávat web, a dnes už je rozšířená nabídka na generování obrázků a nabídka pracovní plochy.

Kurz byl zaměřen na přístup k AI, na pochopení principů zadávání promtů a ukázání možností. Podělím se o skvělý tip na usnadnění práce s AI. Ukládejte si promty do jednoho dokumentu – excel, word, notino.so, trello…



Na základě informací z kurzu existuje několik hlavních platforem, které umožňují práci s textem pomocí umělé inteligence. Tyto platformy se liší svými funkcemi a zaměřením, ale všechny umožňují zpracovávat a generovat texty efektivním způsobem. Nutno říct, že AI kontrolní nástroje jsou součástí sociálních sítí a pokud obrázek nebo text vygenerovaný AI AI zkontroluje, snižuje dosahy. Metadata budou od roku 2026 povinnou součástí každého obrázku.

1. ChatGPT (OpenAI)

  • Chatovací nástroj schopný generovat texty, odpovídat na otázky, sumarizovat a přepisovat dokumenty.

  • Dostupné verze: zdarma a placená (s pokročilými funkcemi).

  • Použití: psaní článků, návrhy promptů, tvorba marketingového obsahu, načtení obrázku ( přepsání,vysvětlení, recepty z obsahu ledničky, móda – barevné kombinace, co znamená hláška na pračce, čím doplnit interiér, sestavení letního záhonu, vytvoření karikatury z obrázku).

  • V době kurzu si pamatovala jen 1 vlákno, lze mít otevřeno více oken

  • Nabízí různé modely – zmíním zajímavé

    • Prewiew – přemýšlí déle, ale pracuje více do hloubky

    • Canvas – výhodou je možnost úpravy jen části textu přímo v 1 dotazu

    • GPTs Hunters – vhodný pro hluboká témata

    • Chatboti – různá zaměření – copy, marketing, strategie, photo… ve free verzi je mohu využívat, v placené verzi si mohu vlastního bota/asistenta vytvořit (Business Model Canvas – od Jitky Štadlerové)

    • V 1 účtu mohu mít vytvořeno několik asistentů – vhodné pro tým

      • Do dotazovacího řádku vložíme @ vyhledá poslední GPTs, se kterými jsme pracovali

    • Dobré se podívat na nastavení svého GPT

      • temporary chat – neměl by se z něho následně učit

      • Personalizace

      • Profil tvůrce

2. Claude (Anthropic)

  • Zaměřen na porozumění textům a tvorbu výstupů s důrazem na přirozenou komunikaci.

  • Nabízí prompt knihovnu pro návrhy efektivních zadání​​.

  • Dokáže najít shody v několika různých dokumentech.

3. Gemini (Google)

  • Modely s širokými možnostmi práce s textem, včetně analýzy a personalizace obsahu.

  • Pamatuje si napříč vlákny

4. Copilot (Microsoft)

  • Integrace s Microsoft Office (Word, Excel, PowerPoint).

  • Automatizace úkolů, tvorba textů přímo v aplikacích jako Word.

5. Perplexity AI

  • Pokročilé dotazování a generování odpovědí.

  • Alternativa k ChatGPT s rychlými a stručnými výsledky.

6. Poe (Quora)

  • Slučuje různé AI modely na jednom místě, včetně GPT a Claude.

  • Umožňuje experimentování s různými přístupy ke generování textů.

7. Notion AI

  • Integrace s aplikací pro organizaci poznámek a plánování.

  • Umožňuje psaní, sumarizaci, přepis a generování nápadů přímo v pracovních poznámkách.

Nástroje s vynikajícími výsledky v generování realistických lidí a obličejů:



  1. DALL·E (OpenAI)

    • Ve verzi 3 dosahuje velmi dobrých výsledků v generování realistických lidských obličejů. Nabízí přirozené proporce a věrné detaily​​.

    • Model Photo Realistic Image GPT Pro – skvělé výsledky

  2. MidJourney

    • Známý pro schopnost vytvářet umělecky detailní a realistické lidské obličeje.

    • Výsledky jsou velmi estetické, ale mohou působit spíše jako umělecká fotografie než autentická fotka.

  3. Adobe Firefly

    • Díky integraci v Adobe produktech a zaměření na profesionální design generuje velmi realistické obličeje.

    • Je zaměřen na detailní úpravy a výsledky jsou vhodné pro profesionální použití.

  4. Runway ML

    • Nabízí možnosti trénování vlastních modelů, což zvyšuje kvalitu výstupů, včetně generování realistických obličejů.

  5. Leonardo – koupila ho Canva



 

Doporučení:

  • Pro realistické výsledky: Vyzkoušejte MidJourney nebo DALL·E 3, které poskytují spolehlivé výsledky přímo bez nutnosti pokročilé optimalizace.

  • Pro pokročilé uživatele: Pokud máte technické znalosti, využijte Stable Diffusion s předtrénovanými modely zaměřenými na generování lidí (např. ControlNet nebo modely na platformě Hugging Face).

  • Pro profesionální designéry: Adobe Firefly je ideální volba díky integraci s nástroji, jako je Photoshop.





Praktické tipy

Přepis textu z videa - Turboscribe.ai

Yout.com – možnost stažení videa

Filmora – umí vybrat části videa a seskládat je

Napkin.ai – myšlenkové mapy

Gama, Beautiful – prezentace

Pika Labs – video generátor, deformace obrázků

Wondershare – stříhání videa

Infography.in – infografika

Character.ai – možno si povídat se známými osobnostmi, v angličtině

Hallohistory.ai





Modely GPT a vytvoření vlastního asistenta

vytvoření vlastního asistenta v placené verzi ChatGPT (např. ChatGPT Plus s GPT-4) je možné díky funkcím Custom GPTs.

  1. Použití průvodce nastavením

    • V menu vybrat možnost „Vytvořit vlastního GPT“.

    • Aplikace vás provede jednoduchým nastavením, kde určíte, co by měl asistent umět, jaký tón a styl komunikace používat, a jaké informace má prioritně zohlednit.

  2. Přizpůsobení pomocí promptů

    • Definovat základní „startovací prompt“, který nastaví chování a zaměření asistenta.

    • Například: „Jsi virtuální asistent specializovaný na marketing a textovou analýzu, tvým úkolem je radit s reklamními strategiemi, analyzovat obsah a pomáhat vytvářet návrhy kampaní.“ A můžeme se rozloučit.

    • Nebo: Jsi virtuální asistent specializovaný na copywriting, tvým úkolem je sjednotit tone of voice firemních textů, udržovat jednotnou identitu a směřování.

    • Nastavení cílové skupiny a komunikace s ní

      1. Styl komunikace

      2. Tonalita značky

      3. Jakou emoci má komunikace vyvolávat

      4. Archetypy značky

      5. Navrhne fonty a barevnost

      6. Vygeneruje vhodné emotikony, hastagy a klíčová slova vhodná pro značku

      7. Vytvoří moodboard

  3. Integrace vlastních dat a kontextu

    • V placené verzi lze nahrát specifické dokumenty nebo poskytnout tréninková data, aby asistent rozuměl konkrétním potřebám uživatele.

    • Například vložení marketingových plánů nebo stylových příruček pro zachování konzistence výstupů.

  4. Použití v každodenní práci

    • Po nastavení je vlastní GPT dostupný v uživatelském rozhraní jako nový „virtuální asistent“.

    • Můžete ho používat pro specifické úkoly, jako je generování textů, plánování strategií nebo organizace projektů, přičemž výsledky odpovídají vašim požadavkům a stylu.

Výhody:

  • Kompletní přizpůsobení potřebám.

  • Možnost přidání expertních znalostí a nastavení konzistentního tónu komunikace.

Podle informací z kurzu je správné zadávání promptů (tzv. výzev) klíčové pro získání kvalitních výstupů od AI.

1. Definujte roli AI

  • Vždy specifikujte, jakou roli má AI zastávat (např. „Jsi zkušený marketingový stratég“ nebo „Jsi odborník na psaní článků“).

  • Pomáhá to modelu lépe porozumět našim očekáváním a přizpůsobit styl odpovědi​​.

  • Bez tohoto kroku může být odpověď příliš obecná.



2. Buďte konkrétní a přesní

  • Zadání by mělo obsahovat jasné detaily o požadovaném výstupu (např. „Napiš příspěvek na LinkedIn o výhodách práce s AI, tón formální, délka do 200 slov“).

  • Nejednoznačné nebo příliš obecné prompty mohou vést k nekvalitním nebo nesouvisejícím odpovědím​​.

3. Poskytujte kontext

  • Uveďte relevantní informace nebo příklady, aby model lépe pochopil požadavky.

  • Např.: „Tento text má být pro začátečníky, kteří nemají zkušenosti s AI, použij jednoduchý jazyk“.

4. Používejte řetězení promptů

  • Rozdělte úkol do kroků a postupně zpřesňujte výstupy.

  • Např.: „Vytvoř osnovu článku“, poté „Rozveď první bod do odstavce“​​.

5. Testujte a upravujte

  • Pokud výstup nesplňuje očekávání, přepište prompt nebo dodejte další informace.

  • Můžeme pracovat s těmito slovy: více popisný, přesvědčivý, narativní, technický, akademický, kreativní, neformální, formální, dramatický, neobvyklé, netradiční, nekonvenční, pokračuj

  • Můžeme označit známou osobnost, která bude vzorem pro naši komunikaci (Lara Acosta – tip pro odbornici na LinkedIn)

  • Žádný prompt není perfektní napoprvé. Proces testování a úprav je nedílnou součástí optimalizace výsledků.



Závěr:

Klíčem je jasnost, kontext a postupné zpřesňování. Kvalitní prompty nejen zlepší odpovědi AI, ale také ušetří čas při dosažení požadovaných výsledků. Dobré je pracovat s chatem jako s novým pracovníkem v prvních dnech v práci – vše polopatě vysvětlit.



Formáty výstupů

  • Tabulka, plán příspěvků na sociální sítě

  • Argumenty pro a proti

  • Myšlenková mapa

  • Powerpoint

  • skripta



2025-11-17 20:46
Jan Hrdlicka

Sociální sítě

Go to category

Facebook

Facebook
PŘÍSPĚVKY
-    30 odstínů obsahu - nutné mít různorodé příspěvky
Důležitý kvalitní obsah a „kvalitní“ obsah. Rozložení příspěvků by mělo vypadat nějak takhle -
1.)    Humor
2.)    Chytré příspěvky (edukativní, články k tématu apod.)
3.)    Zákulisní – kdo jste (fotky za zákulisí, tým, narozeniny, přípravy akcí apod.)
4.)    Prodejní (odkaz na web, reklama na náš produkt apod.)
- Příspěvky musí být RŮZNORODÉ (kvalitní fotky, odkaz, text, text s fotkou, video) a ÚŽASNÉ!!! 
- Krátké příspěvky!!!
- Ideálně 1-2 příspěvky denně, aby to na facebooku „žilo“, jinak stránka upadne v zapomnění
- V současné době facebook podporuje videa- když dáte video, bude mít velký dosah

ČASY
-    Zkusit co funguje na naší cílovou skupinu
-    Většinou nejlepší večer – 18, 19, 20
-    Nejlepší neděle večer, nejslabší sobota (není potřeba dávat příspěvky, kor v léte :-)

UDÁLOSTI
-    Nebát se tvořit události, mají velký potenciál šíření
-    THINK OUT OF THE BOX - I když se nic objektivně neděje, tvořit události např.: Den, kdy spouštíme nové webové stránky, Sledujeme zatmění slunce apod.

 

Doporučuji svoji FB stránku https://www.facebook.com/vyhnankovaeliska/, doufám, že na ní v budoucnu najdete mnoho inspirace a užitečných tipů. Jestli se vám školení líbilo, budu moc ráda za doporučení.

 

Globální statistiky digitálního světa (najdete tam i konkrétní čísla pro ČR)

https://datareportal.com

 

Návody (pixel, okruhy uživatelů):

https://www.facebook.com/business/help/952192354843755

https://www.facebook.com/business/help/744354708981227

https://www.facebook.com/business/help/231114077092092

 

Co by se Vám ještě mohlo líbit:

https://www.facebook.com/business - tady najdete neuvěřitelné množství obsahu nejen na téma Facebooku, ale i Instagramu, WhatsAppu a dalších byznysově-marketingových možností facebookových platforem

https://www.facebook.com/blueprint - různé kurzy a webináře přímo od Facebooku

https://www.jonloomer.com - obrovský profík se skvělými pokročilými články na téma FB reklam

https://www.modrakrev.cz - nejlepší cesta v rozšiřování znalostí facebookové reklamy v češtině

2020-03-22 17:17
Jan Hrdlicka

Pracovní pozice

Go to category

Account Manager

  • Zodpovídání za prodej a prezentování produktů a služeb společnosti.
  • Vykonávání průzkumu trhu, monitorování konkurenčních aktivit.
  • Oslovování potenciálních klientů s obchodní nabídkou, navazování nových obchodních kontaktů.
  • Poskytování poradenství při výběru vhodného řešení v závislosti na definovaných požadavcích a potřebách klientů.
  • Udržování pravidelné telefonické a e-mailové komunikace s klienty.
  • Organizování a vedení obchodních jednání.
  • Předkládání cenových nabídek, domlouvání konečné podoby smluvních podmínek.
  • Zodpovídání za plnění stanovených obchodních plánů a cílů.

27-54tis. Kč

Key Account Manager

  • Budování a udržování obchodních vztahů s vybranými klíčovými klienty.
  • Identifikování potenciálních klíčových klientů na trhu a jejich postupná akvizice.
  • Participování na přípravě plánu prodeje.
  • Zodpovídání za splnění stanovených obchodních cílů a za finanční výsledky.
  • Monitorování konkurenčních aktivit, situace na trhu, vypracovávání analýz trhu.
  • Připravování a vedení klientských prezentací.
  • Zastupování a prezentování společnosti při obchodních jednáních v souladu s firemní strategií.
  • Vypracovávání cenových kalkulací, sjednávání smluvních podmínek.

36-75tis. Kč

robertnemec.com https://robertnemec.com/account-manager-agentura-plat/
Account manager většinou prodává. Naši „accounti“ neprodávají. Jejich cílem je vymyslet, jak klienta co nejrychleji a co nejlevněji posunout co nejvýše – a pak to také za pomoci našeho týmu zrealizovat. Jak s oblibou říkám, „realizujeme byznys“ klienta.

Account manager je schopen samostatně rozvíjet byznys klienta napříč několika marketingovými kanály. Jeho tým konzultantů má obvykle tři až pět členů. Tým řídí projektový manažer, aby měl SBDM dostatek času vymýšlet, jak vylepšit byznys klienta a mohl s ním vše prodiskutovávat.

Account manažer vymyslí a domluví, co se bude dělat a projektový manažer zařídí, aby to bylo včas, podle stanového rozpočtu a aby byly dosaženy stanovené cíle.

27-54tis. Kč

2020-04-27 08:48
Jan Hrdlicka

Andrea

1. administrativa  - účetní podklady

2. platby - úhrada dodavatelům, vystavování faktur, hlídání neplatičů

3. testování, kontrola

4. drobné admin úpravy obsahu webu

5. nl příprava

6. produlužovánjí domén

7. nastavení mailboxů + pdf, nastavení služeb

8. nabídky - prodpříprava 

 

2022-02-20 10:01
Jan Hrdlicka

Informica

Go to category

SW tools

Knowledge base

kb.eqsoft.eu - Informica internal nowledge base

https://www.cebin.info/ external knowledge base -public instructions, manuals for clients

 

2025-04-09 14:50
Jan Hrdlicka

Ecommerce - Fecmall

Go to category

Fecmall

Editor xhedit je v čínštině
- nastavit v souboru vendor/fancyecommerce/fec-admin/myassets/DwzAsset.php 
'xheditor/xheditor_lang/en.js',

Aktualizace databáze: https://github.com/fecshop/yii2_fecshop/tree/master/migrations

Chyba - nezobrazují se všechny varianty!

nutno v souboru /vendor/fancyecommerce/fecshop/services/helper/AR.php zvýšit hodnotu proměnně $numPerPage z původních 20 na více:  public $numPerPage = 2000;//JHInformica oprava aby se zobrazovaly vsechny varianty

app/appfront/widgets/Page.php

/*JHInformica seo first page*/































$url = preg_replace('/\?p=[1]$/','',$url);































$url = preg_replace('/\&p=[1]$/','',$url);































fecshop/services/cms/StaticBlock.php: 































 /*InformicaJH*/































protected function actionGetStoreContent2ByIdentify($identify, $app = 'common')































    {































        $staticBlock    = $this->_static_block->getByIdentify($identify);































        $content        = $staticBlock['content2'];































        $storeContent   = Yii::$service->store->getStoreAttrVal($content, 'content2');































        $_params_       = $this->getStaticBlockVariableArr($app);































        ob_start();































        ob_implicit_flush(false);































        extract($_params_, EXTR_OVERWRITE);































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































            $key = '{{'.$k.'}}';































            if (strstr($storeContent, $key)) {































                $storeContent = str_replace($key, $v, $storeContent);































            }































        }































        echo $storeContent;































        return ob_get_clean();































    }































        protected function actionGetStoreVideoByIdentify($identify, $app = 'common')































    {































        $staticBlock    = $this->_static_block->getByIdentify($identify);































         $params        = $staticBlock['video'];































      































        ob_start();































        ob_implicit_flush(false);































      































        echo $params;































        return ob_get_clean();































    }































    protected function actionGetParamsByIdentify($identify, $app = 'common')































    {































        $staticBlock    = $this->_static_block->getByIdentify($identify);































        $params        = $staticBlock['params'];































      































        ob_start();































        ob_implicit_flush(false);































      































        echo $params;































        return ob_get_clean();































    }































    































    































    protected function actionGetParams2ByIdentify($identify, $app = 'common')































    {































        $staticBlock    = $this->_static_block->getByIdentify($identify);































        $params        = $staticBlock['params2'];































      































        ob_start();































        ob_implicit_flush(false);































      































        echo $params;































        return ob_get_clean();































    }































/*InformicaJH*/































2023-12-31 19:55
Jan Hrdlicka

Hromadna uprava cen pro vsechny sku jedne spu

/app/appadmin/modules/Catalog/block/productinfo/Manageredit.php

//JHInformica price add
Yii::$app->db->createCommand("UPDATE product_flat SET WHERE spu=\"".$this->_param['spu']."\";")->execute();

2020-12-28 11:28
Jan Hrdlicka

Comgate integrace

composer require ondrs/comgate

app/appfront/modules/Payment/block/comgate/
app/appfront/modules/Payment/controllers/comgate/
config/services/Payment.php
services/Payment.php
u funkce getStandardPaymentArr přidat před podmínku
if ($checkMoneyConfig != Yii::$app->store->enable) {
continue;
}
/*JHInformica hack pro umozneni platby comgate*/
if($payment_type == 'comgate_standard') $checkMoneyConfig = 1;

services/payment/Comgate.php

zaplacený

https://eshopdev.faramugo.cz/payment/comgate/standard/review?id=${id}&refId=${refId}

zrušený

https://eshopdev.faramugo.cz/payment/comgate/standard/cancel?id=${id}&refId=${refId}

nevyřízený

https://eshopdev.faramugo.cz/payment/comgate/standard/cancel?id=${id}&refId=${refId}

url pro předání výsledků platby

https://eshopdev.faramugo.cz/payment/comgate/standard/ipn

 

Povolené ip adresy: 159.69.131.247 217.16.184.84
(testovací server cebin.info a produkční server cebin.eu)

https://eshopdev.faramugo.cz

 

Testování návratu

 

        

2023-10-04 17:45
Jan Hrdlicka

Set Up Ecommerce Tracking with Google Tag Manager:

https://www.analyticsmania.com/post/ecommerce-tracking-with-google-tag-manager/

1. add "public $order" to /vendor/fancyecommerce/fecshop/app/appfront/modules/Payment/controllers/SuccessContorller.php to make variable visible in main layout.

2. insert code int header before gtm code:

<?php if(Yii::$app->controller->id=='success') : 















    ?>  







    <?php if(!empty($this->params['order'])) : 







        $order = $this->params['order'];







        ?>







       <script>







        window.dataLayer = window.dataLayer || [];







        dataLayer.push({







         'transactionId': '<?=$order['order_id']?>',







         'transactionTotal': <?=$order['grand_total']?>, 







         /*'transactionTax': 1.29,*/







         'transactionShipping': <?=$order['base_shipping_total']?>,







         'transactionProducts': [







         <?php 







        $lastElement = end($order['items']);







         foreach($order['items'] as $item): ?>







         {







           'sku': '<?=$item['sku']?>',







           'name': '<?=$item['name']?>',







          /* 'category': 'Apparel',*/







           'price': <?=$item['price']?>,  







           'quantity': <?=$item['qty']?> 







         }







         <?php if($item != $lastElement) : ?>







         ,







          <?php endif; ?>







         <?php endforeach; ?>







         ]







        });







    </script>







    







    <?php   endif; ?>







<?php   endif; ?>  







3. nastavit gtm dle navodu, trigerring pageview je "/payment/success"

 

2022-04-15 16:50
Jan Hrdlicka

Matomo Measure Ecommerce interactions using server-side tracking

composer require matomo/matomo-php-tracker

matomo/matomo-php-tracker/MatomoTracker.php

track order and cart: trackOrderWithMatomo,trackCartWithMatomo

common/models/common/Order
order/frontend/controllers/DefaultController.php

printeqform/frontend/controllers/DefaultController.php

2024-03-23 09:43
Jan Hrdlicka

Nejde obnovit heslo - ani vytvořit uživatele - systém hlásí, že e-mail existuje, ale nejde obnovit heslo -hlásí neplatný e-mail

To se děje v případě, že uživatel se zaregistroval, ale nepotvrdil heslo, takže je sice uložen v tabulce custommer, ale má status=2, staží změnit na status=1
občas je dobré promazat nepotvrzené uživatele delete from `customer` WHERE status = 2, protože se zpravidla jedná o spamy.

2023-10-13 05:58
Jan Hrdlicka

Legislativa

Go to category

Vzorové obchodní podmínky pro e-shopy

https://www.apek.cz/clanky/vzorove-obchodni-podminky-pro-e-obchody

2020-09-09 23:35
Jan Hrdlicka

Musí e-shopy měnit tlačítka pro dokončení objednávky?

https://www.apek.cz/clanky/musi-e-shopy-menit-tlacitka-pro-dokonceni-objednav

Pro účely usnadnění správného uplatňování směrnice o právech spotřebitelů vydalo GŘ pro spravedlnost EK Pokyny, které nám odpověď nabízí. APEK tedy může doporučit e-shopům následující řešení:

  1. Použít přímo na tlačítku některý z navrhovaných textů:
    1. „kupte nyní“
    2. „zaplaťte nyní“
    3. „potvrďte nákup“
  2. Akceptovatelnou variantou by podle dostupných stanovisek mohlo být umístění vhodného textu nejen přímo na tlačítko, ale také hned vedle nebo pod tlačítkem. Zároveň ale rozhodně nedoporučujeme, aby byl tento text součástí jakéhokoli dalšího (například souhlasu s obchodními podmínkami apod.).

2023-02-27 21:26
Jan Hrdlicka

Cookie lišta - právo

navasistrane.com

1. Tlačítla "Odmítnout vše" a "Přijmout vše" by měly mít podobnou barevnost, aby podvědomě nelákaly návštěvníky k bezmyšlenkovitému zakliknutí Přijmout vše. Bylo by možné prosím udělat alespoň to, aby Odmítnout vše bylo v černém rámečku a Přijmou vše v červeném rámečku bez výplně?
 
2. Proklik na Zásady užívání cookies by měl být už v cookies liště, návštěvník webu by si je neměl sám složitě dohledávat. Ideální je, aby odkaz na zásady byl také v patičce webovek.
 
3. Poté, co návštěvník zaklikne nějakou cookies preferenci, měl by mít možnost preference kdykoli co nejjednodušeji změnit (ideálně zase na jeden dva kliky). Koukněte např. jak to mám udělané já - www.navasistrane.com - po udělení preference se objeví vlevo dole taková plovoucí ikona a je možné kdykoli nastavení cookies upravit.
4. Zásady užívání cookies by měly obsahovat i výčet souborů, které se ukládají (např. _ga, _gat apod.) a info o tom, na jak dlouho se ukládají.

vzor - názvy souborů https://www.bestdrive.cz/pravidla-pouzivani-cookies.html

2024-08-02 09:16
Jan Hrdlicka

Wordpress

Go to category

Wordpress instalace

wget https://cs.wordpress.org/latest-cs_CZ.zip
unzip latest-cs_CZ.zip
mv wordpress/ web
rm latest-cs_CZ.zip

update via commandline

/var/www/wp core version
/var/www/wp core update
/var/www/wp plugin update --all
/var/www/wp theme update --all

plugins

GTM
/var/www/wp plugin install duracelltomi-google-tag-manager
FORMS
/var/www/wp plugin install contact-form-7
youtube-embed-plus
seriously-simple-podcasting
events-manager
tinymce-advanced - rozšíření možností editoru např. o tabulky
install smtp-mailer - odesílání přes smtp
install all-in-one-seo-pack - seo
install lazy-blocks - custom blocks

/var/www/wp plugin install wordpress-seo - install yoasts seo


WP code snippets and disable xml rpc
/var/www/wp plugin install insert-headers-and-footers
https://www.wpbeginner.com/plugins/how-to-disable-xml-rpc-in-wordpress/#aioseo-method-1-disabling-wordpress-xml-rpc-with-htaccess

find . -type f -exec chmod 664 {} +
find . -type d -exec chmod 775 {} +
chmod 660 wp-config.php

find . -type f -exec chmod 644 {} +
find . -type d -exec chmod 755 {} +
chmod 640 wp-config.php
chmod o-w wp-config.php

.htaccess
php_flag engine off


Order allow,deny
Deny from all


find . -name "*.php" -type f -delete

find . -name "*.php" -type f -print

Pokud se objeví chyba:
PHP Fatal error: Uncaught ArgumentCountError: Too few arguments to function WP_Widget::__construct(), 0 passed in wp-includes/class-wp-widget-factory.php on line 62 and at least 2 expected wp-includes/class-wp-widget.php:163

vyřeší se ve class-wp-widget-factory.php
//$this->widgets[ $widget ] = new $widget();
$this->widgets[ $widget ] = new $widget( $widget, $widget );

2026-01-06 17:23
Jan Hrdlicka

Cebin users

Go to category

Antikvariat Motyl

Nastavení upozornění (alert) v záhlaví stránek (dovolená apod.)

Nastavuje se  přes admin v luya. https://news.antikvariatmotyl.cz/admin -  Widget oznámení
https://news.antikvariatmotyl.cz/admin#!/template/cmsadmin~2Fdefault~2Findex/update/24https://news.antikvariatmotyl.cz/admin#!/template/cmsadmin~2Fdefault~2Findex/update/1
zobrazení a skrytí se řeší přes visibility daného bloku (ikona hodin u bloku)

Text na titulce e-shopu

Nastavuje se v Luya administraci https://news.antikvariatmotyl.cz/admin#!/template/cmsadmin~2Fdefault~2Findex/update/25

Slevova akce - nastaveni slev

text a výše slevy se nastavuje se v configu - params.php

update product_flat SET special_price = 0.75*price;

update product_flat SET special_to = 1681430399;

U velikonočních a dalších slev je potřeba změnit následující soubory:

/app/appfront/config/patams.php

catalog/category/price.php - nemusí se editovat je nyní v configu
catalog/product/index/price.php - nemusí se editovat je nyní v configu
checkout/cart/index.php - nemusí se editovat je nyní v configu
checkout/onepage/index/review_order.php - nemusí se editovat je nyní v configu
services/product/ProductMysqldb.php - nastavit na ř. 511 aby se při editaci zapisovala snížená special_price

pokud je další sleva i pro registrované, je nutné změnit koeficient zde:
services/cart/Quote - není nutné editova je v configu
Quoteintern - nastaveno nově

Protože při každé změně a editaci se sleva zruší, je potřeba po aktualizaci spustit 
update `product_flat`
set special_price = 0.8 * price
WHERE price <> 0 and special_price = 0;
Není nutné dělat, cena special_price se automaticky přepočítá díky úpravě v  services/product/ProductMysqldb.php - nastavit na ř. 511

bylo by dobré nastavit ve skriptu

Novinky

Modul novinky vytvořen jako widget, v souborech:
/var/www/antikvariatmotyl.cz/appfront/theme/motyl/theme01/cms/article
fecshop/app/appfront/modules/Cms/block/article/Index.php


$row = Yii::$app->db->createCommand("SELECT sku from product_flat WHERE status = 1 AND is_in_stock = 1 AND price <> 0 AND updated_at > ".$time)->queryAll(); (soubor app/appfront/modules/Cms/block/article/Index.php

Změna ceny dopravy

Cena dopravy se nastavuje v souboru /common/config/eshop_local_services/Shipping.php



Předprázdninová sleva 30% na vše

Vážení zákazníci, nabízíme vám Předprázdninovou slevu 30% na veškeré zboží (sleva platí pro registrované zákazníky, pro neregistrované je sleva 20 %).

Váš Antikvariát Motýl

 

Newsletter

SELECT customer_email FROM `sales_flat_order` where created_at > 1739207155 GROUP BY customer_email;

 

Upravené soubory:
fecshop/app/appfront/modules/Catalog/block/category/Index.php
first_product_page, canonical_product_page 

Aukro:

./luya aukro/import/aukro-offers-saver > payload.json
./luya aukro/import/aukro-offer-uploader

Webhooks
webhook nastavený na url: https://news.antikvariatmotyl.cz/aukrofront/default/new-order
webhook pro novou verzi (yii3) je na http://new.antikvariatmotyl.cz/aukro-order-submitted
nastaveno pro eventType = newOrderSubmitted_v3 - v případě dokončení objednávky na základě webhooku systém nastaví u položky status = 2

webhook se nastavuje v adminu aukra zde:  https://aukro.cz/moje-aukro/muj-prodej/nastaveni-api

Antikvariatmotyl - terminate offer in Aukro when item is sold in e-shop.

/var/www/antikvariatmotyl.cz/new/yii process-job-queue - test and add to cron

Method 1: Queue Table (Recommended)
CREATE TABLE php_job_queue (
    id INT AUTO_INCREMENT PRIMARY KEY,
    order_item_id INT,
    processed TINYINT(1) DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
sales_flat_order_item
trigger:
DELIMITER $$

CREATE TRIGGER trg_after_insert_sales_flat_order_item
AFTER INSERT ON sales_flat_order_item
FOR EACH ROW
BEGIN
    INSERT INTO php_job_queue (order_item_id, processed, created_at)
    VALUES (NEW.item_id, 0, NOW());
END$$

DELIMITER ;

PHP Worker Script: Create a PHP script that checks this table periodically (e.g., via a cron job every minute) for processed = 0 rows, executes your logic, and then updates them to processed = 1

2026-01-02 20:17
Jan Hrdlicka

Bataknalodi - nastavení

Kvůli nekompatibilitě jquery a fullcalendar se nezobrazovaly v administraci v kalendáři plavby, bylo potřeba ručně provést downgrade bower-assets/jsuqery z 3.6 na 3.2.1

Vždy na začátku roku změnit letopočet u začátku a konce sezóny:

'seasonStart' => '2026-05-01',
'seasonEnd' => '2026-10-01',
//hlavní sezona musí být v administraci nastavena o jeden den dříve.
cervenci kazdy den
'mainSeasonStart' => '2026-05-31',
'mainSeasonEnd' => '2026-09-01',

Zazálohovat a smazat tabulky:
ship_order
ship_reservation

2026-01-05 20:47
Jan Hrdlicka

Talentdrama

Pluginy:
lazy-block
https://wordpress.org/plugins/contact-form-7/
https://wordpress.org/plugins/seriously-simple-podcasting/
https://wordpress.org/plugins/youtube-embed-plus/outube-embed-plus
https://cs.wordpress.org/plugins/events-manager/

Jak upravit text na stránce Tým v sekci Bannerhorizontal? 

kliknout na přehled dokumentu vlevo nahoře tři vodorovné čárky (nebo zmáčknout Shift+Alt+O) vlevo klikneš na "Bannerhorizontal" a vpravo na Open Editor

2025-11-20 09:09
Jan Hrdlicka

Czech Javelin czechjavelin.cz

Facebook productfeed

./luya conversion/importexport/product-feed > public_html/productfeed.xml

2025-10-30 14:53
Jan Hrdlicka

Isenergy

Support our work

Footer alternating text

added to astra template file desktop-builder-layout.php

Solved by php code - rotate based on current time:

"... about fighting climate change. ",
"... about energy and the environment. ",
"... about energy and the economy. ",
];
$index = time() % count($texts);
echo $texts[$index];
?>

2025-11-26 08:42
Jan Hrdlicka

CzechKG

Admin: https://czechkg.cz/api/admin/admin.php

build:
czechkg
npm run dev:ssr
npm run build:ssr
npm run serve

/*this still works*/
npm run dev    # Development
npm run build  # Production build

Development SSR (npm run dev:ssr) - Server renders full HTML with SEO-friendly content

Production SSR (npm run build:ssr && npm run serve) - Optimized bundles with server-side rendering
Client Build (npm run build) - Standard client-side build works correctly

cd /var/www/czechkg.cz

# Delete old node_modules
rm -rf node_modules

# Fresh install
npm ci --production

# Restart PM2
pm2 restart czechkg-app
pm2 logs czechkg-app
Fuse.js must be installed:
npm install fuse.js --save

2026-01-12 22:31
Jan Hrdlicka

Vesnalilberec

Go to category

Import databáze billboardů a kml map

Databáze billboardů

  • V administraci ve files aktualizovat soubor NOSIC.DBF - pozor - je potřeba aktualizovat tlačítkem "REPLACE", protože musí zůstat stejný název souboru - /var/www/www.vesnaliberec.cz/https/public_html/storage/nosic_556d1e60.dbf
  • pokud se soubor změní (např. při smazání omylem a opětovném nahrání, je potřeba aktualizovat název souboru v /var/www/vesnaliberec.cz/updatenosic.sh
  • Skript pro aktualizaci se spouští automaticky každou hodinu
  • Pokud chci spustit ručně, spustím z příkazové řádky: /var/www/www.vesnaliberec.cz/https/vendor/bin/luya conversion/import/import-billboards /var/www/www.vesnaliberec.cz/https/public_html/storage/nosic_4f3ee1ad.dbf

Příkaz smaže tabulku nosic a naimportuje data z db.

Google map na titulce - kml data

nový soubor nahrát v administraci viz. obr., soubor musí mít název moje_mapa.kml, url https://www.vesnaliberec.cz/file/5/218ca0b4/moje_mapa.kml

Název souboru, je nastaven  napevno v js/gmap.js

2022-03-24 21:18
Jan Hrdlicka

Faramugo

Go to category

Faramugo E-shop

Aktuální šablona je /var/www/eshop.faramugo.cz/appfront/theme/faramugonew/theme01

Titulka

Carousel a obsah titulky je ve Static Blocku s id home-big-img, obrázky se nahrávají do adresáře /appimage/common/appfront/images, zobrazujjí se pak pod url https://img.faramugo.cz/appfront/images/
Zboží na titulce se přidává přes WebsiteConfig ->Appfront Config -> Homepage Config

Šablony objednávek jsou umístny zde: /var/www/faramugo/vendor/fancyecommerce/fecshop/services/email/views/order/create

E-maily

fecshop/services/email/Order.php - e-maily na které chodí kopie objednávek.

Recenze

Na frontendu se přihlásit jako uživatel:
recenze@faramugo.cz recFAR7885go - je možné psát recenze ke každému produktu. V administraci následně lze upravit a nastavit stav potvrzeno "aproved"

Jinak můžou recenze psát pouze registrovaní uživatelé, kteří si přes e-shop zakoupili daný produkt.

Doprava
Nastavení výše poštovného pro dodání zdarma:
upraven soubor  //vendor/fancyecommerce/fecshop/services/Shipping.php tak, aby se četlo z parametru
nastaveno v parametru /common/config/params-local.php

Nastavení EAN

Zákaznická úprava, přidání atributu do databáze. Info pro programátora a admina:

ALTER TABLE `product_flat` ADD `ean` VARCHAR(150) NULL DEFAULT NULL AFTER `sku`;

 

Import Yate

./luya conversion/import/read-xml-yate
fotky nahrát do @appimage/common/media/catalog/product/

app/appfront/modules/Catalog/block/product/Index.php
app/appadmin/modules/Catalog/block/productinfo/index/BatchAttr.php
app/appadmin/modules/Catalog/block/productinfo/index/Attr.php
services/product/ProductMysqldb.php
services/product/ProductApi.php

Zobrazení title, description, short_description a meta_description z canonical produktu (produkt s nejvyšším score, dohoda že to bude č. 100

Zákaznická úprava v souboru /var/www/eshop.faramugo.cz/vendor/fancyecommerce/fecshop/app/appfront/modules/Catalog/block/product/index

100)

Excel Import

nejprve nahrat excelovy soubor s produkty do /var/www/eshop.faramugo.cz/appadmin/runtime/upload/

nazev souboru se musí shodovat s tím, který je v  vendor/fancyecommerce/fecshop/app/appadmin/modules/Catalog/block/productupload/Manager.php

pak spustit:  https://eshopadmin.faramugo.cz/catalog/productupload/managerupload

struktura souboru musí být dle vzoru v příloze

--------

Call to undefined method PHPExcel_Calculation::unsetInstance()
Failed to prepare SQL: INSERT INTO `full_search_product` (`lang`, `product_id`, `name`, `spu`, `sku`, `score`, `status`, `is_in_stock`, `url_key`, `price`, `cost_price`, `special_price`, `special_from`, `special_to`, `final_price`, `image`, `created_at`, `sync_updated_at`) VALUES (:qp0, :qp1, :qp2, :qp3, :qp4, :qp5, :qp6, :qp7, :qp8, :qp9, :qp10, :qp11, :qp12, :qp13, :qp14, :qp15, :qp16, :qp17)

2025-07-26 15:19
Jan Hrdlicka

Konfigurátor Faramugo

Konfigurátor je samostatná aplikace ve vuejs vložená na stránky 3 produktů se spu xujo-08, xujo-81, xujo-87
https://eshop.faramugo.cz/xujo-08-l 
https://eshop.faramugo.cz/xujo-81-l
https://eshop.faramugo.cz/xujo-87-l

zdrojáky jsou na testovacím serveru cebin.info v adresáři /srv/www/eshopdev.faramugo.cz/_source

3  aplikace se se liší pouze parametry bund, jinak jsou totožné. V budoucnu je možné nahradit jednou aplikací s načítáním parametrů (nutno vyřešit jak)  https://stackoverflow.com/questions/63848765/how-can-we-pass-parameters-to-an-already-built-vue-js-app

 

2022-08-04 11:42
Jan Hrdlicka

Konfigurátor Faramugo

Konfigurátor je samostatná aplikace ve vuejs vložená na stránky 3 produktů se spu xujo-08, xujo-81, xujo-87
https://eshop.faramugo.cz/xujo-08-l 
https://eshop.faramugo.cz/xujo-81-l
https://eshop.faramugo.cz/xujo-87-l

zdrojáky jsou na testovacím serveru cebin.info v adresáři /srv/www/eshopdev.faramugo.cz/_source

3  aplikace se se liší pouze parametry bund, jinak jsou totožné. V budoucnu je možné nahradit jednou aplikací s načítáním parametrů (nutno vyřešit jak)  https://stackoverflow.com/questions/63848765/how-can-we-pass-parameters-to-an-already-built-vue-js-app

Propojení s e-shopem

Propojení s e-shopem funguje tak, že výstup z konfigurátoru je uložen do skrytého inputboxu "note", jehož obsah je pak uložen k objednávce.

Bylo nutné provést následující úpravy e-shopu:
Do 2 tabulek přidat parametry "note"
ALTER TABLE `sales_flat_cart_item` ADD `note` MEDIUMTEXT NULL DEFAULT NULL AFTER `qty`;
ALTER TABLE `sales_flat_order_item` ADD `note` MEDIUMTEXT NULL DEFAULT NULL AFTER `qty`;

Provést úpravy v souborech:
app/appfront/modules/Checkout/block/cart/Index.php
app/appfront/modules/Checkout/controllers/OnepageController.php
app/appfront/modules/Checkout/controllers/CartController.php
services/cart/QuoteItem.php
services/cart/Quote.php
services/order/Item.php
services/Cart.php

+ úpravy v šabloně. Úpravy jsou označené "JHInformica" a týkají se parametru "note".

Pro mobilní verzi bude potřeba zřejmě upravit i app/apphtml

2022-08-04 11:46
Jan Hrdlicka

Nemo Říčany

Go to category

Dutchmasters

Go to category

Holandskonalodi.cz

Import obrázků

stažené obrázky lodí umístit do adresáře tmp. Spustit skript 
./vendor/bin/luya conversion/import/importphotos

Pozor problem s cahce, pokud v configu je aktivovana Filecache, nefunguji formulare.

Aktualizace lodí

Do adresáře /var/www/holandskonalodi.cz/web nahrát soubor cenik.xlsx se strukturou sloupců

seo cena1 cena2 cena3 cena4 cena5 cena6 cena7 cena8 cena9 cena10 cena11 cena12 cena13 cena14 cena15 cena16 cena17 cena18 cena19 cena20 cena21 cena22 cena23 cena24 cena25 cena26 cena27 cena28 cena29 cena30 cena31 poplatky kauce

 

spustit z příkazové řádky skript ./vendor/bin/luya conversion/import/all
pozor - nefunguje se starším php 7.4, je potřeba spustit:
/usr/bin/php8.1 ./vendor/bin/luya conversion/import/all

v config/env-local.php změnit datumy rok a začátek a konec sezony

Info ke všem detailům lodí

proměnná allship_info_alert - nastavit jinou hodnotu než 0

Info o sezóně apod. "Ceník platný pro sezónu xxx." se upravuje u kategorií loděnic https://www.holandskonalodi.cz/admin#!/default/7/shipadmin/cat/index

Zrušení loděníce

v administraci ship->cat

Skript pro hromadnou úpravu fotek lodí - nastavení bílého okraje u fotek na výšku, aby měly všechny stejný rozměr

1. roztřídění fotek - na výšku a na šířku
for f in ./*.jpg
do
r=$(identify -format '%[fx:(h>w)]' "$f")
if [[ r -eq 1 ]]
then
mv "$f" portrait
else
mv "$f" landscape
fi
done

2. přidání bílého okraje po stranách
mogrify -background white -gravity center -resize x621 -extent 730x621 *.jpg

URL Vyfiltrování lodí konkrétní loděnice

https://www.holandskonalodi.cz/jakou-lod/vyber-lode?ArticleSearch%5Bcat_id%5D=<číslo loděnice>

2025-12-02 18:29
Jan Hrdlicka

Holandsko.cz

Import tipů ze skriptu:
./luya conversion/import/import-tips /var/www/holandsko.cz/web/Holandsko_akce_2023_aw.xlsx

 

Synchronizace kamatera->ostrá
rsync -avzhe ssh /var/www/holandsko.cebin.net/web/vendor/ jhrdlicka@217.16.184.84:/var/www/holandsko.cz/web/vendor/

2023-02-22 19:05
Jan Hrdlicka

Holandskonalodi - events a konverze

Nový formulář loď na míru - react

await saveCurrentStep(currentStep, stepData);
      //await saveDraft(formData);
      window.dataLayer = window.dataLayer || [];
      window.dataLayer.push({
        event: 'form_step_next',
        form_name: 'boat_inquiry_form',
        step_from: currentStep,
        step_to: currentStep + 1
      });


            window.dataLayer = window.dataLayer || [];
      window.dataLayer.push({
        event: 'form_submission_success',
        form_name: 'boat_inquiry_form',
        form_id: formId
      });

2025-10-27 13:08
Andrea

PrintEQ Users

Go to category

Promoworks

l-shop:
php yii import/update-lshop-materials CZ_Major_CZ_EUR_07.07.2025.csv

php yii import/download-uttproductfile > utteam.xml
php yii import/get-uttproducts

php yii import/download-uttpricesfile > uttprices.xml
php yii import/get-uttprices

php yii import/update-lshop-stock

php yii import/update-ascolour-materials ascolour.csv

php yii import/materials > materials.json

Crontab:

#Promoworks
2  0  *  *  *  php -f /var/www/promoworks.cz/backend/yii import/update-exchange-rate
2  0  *  *  *  php -f /var/www/promoworks.cz/backend/yii import/update-lshop-stock
2  0  *  *  *  php -f /var/www/promoworks.cz/backend/yii import/download-uttproductfile > /var/www/promoworks.cz/backend
2  1  *  *  *  php -f /var/www/promoworks.cz/backend/yii import/get-uttproducts

2025-12-17 16:08
Jan Hrdlicka

printland.sk - problém po imporut

po importu se smažou tabulky, nutno je znovu vložit:

INSERT INTO `admin_auth` (`id`, `alias_name`, `module_name`, `is_crud`, `route`, `api`, `pool`) VALUES
(1, 'module_permission_page_blocks', 'cmsadmin', 1, NULL, 'api-cms-navitempageblockitem', NULL),
(2, 'module_permission_page', 'cmsadmin', 1, NULL, 'api-cms-navitempage', NULL),
(3, 'menu_group_item_env_websites', 'cmsadmin', 1, NULL, 'api-cms-website', NULL),
(4, 'menu_group_item_env_layouts', 'cmsadmin', 1, NULL, 'api-cms-layout', NULL),
(5, 'menu_group_item_env_themes', 'cmsadmin', 1, NULL, 'api-cms-theme', NULL),
(6, 'menu_group_item_env_container', 'cmsadmin', 1, NULL, 'api-cms-navcontainer', NULL),
(7, 'menu_group_item_elements_group', 'cmsadmin', 1, NULL, 'api-cms-blockgroup', NULL),
(8, 'menu_group_item_elements_blocks', 'cmsadmin', 1, NULL, 'api-cms-block', NULL),
(9, 'menu_group_item_env_redirections', 'cmsadmin', 1, NULL, 'api-cms-redirect', NULL),
(10, 'menu_group_protocol_model_event_logger', 'cmsadmin', 1, NULL, 'api-cms-log', NULL),
(11, 'module_permission_add_new_page', 'cmsadmin', 0, 'cmsadmin/page/create', NULL, NULL),
(12, 'module_permission_update_pages', 'cmsadmin', 0, 'cmsadmin/page/update', NULL, NULL),
(13, 'module_permission_delete_pages', 'cmsadmin', 0, 'cmsadmin/page/delete', NULL, NULL),
(14, 'module_permission_edit_drafts', 'cmsadmin', 0, 'cmsadmin/page/drafts', NULL, NULL),
(15, 'menu_group_item_env_config', 'cmsadmin', 0, 'cmsadmin/config/index', NULL, NULL),
(16, 'menu_node_cms', 'cmsadmin', 0, 'cmsadmin/default/index', NULL, NULL),
(17, 'menu_group_item_env_permission', 'cmsadmin', 0, 'cmsadmin/permission/index', NULL, NULL);

INSERT INTO `admin_group_auth` (`group_id`, `auth_id`, `crud_create`, `crud_update`, `crud_delete`) VALUES
(1, 1, 1, 1, 1),
(1, 2, 1, 1, 1),
(1, 3, 1, 1, 1),
(1, 4, 1, 1, 1),
(1, 5, 1, 1, 1),
(1, 6, 1, 1, 1),
(1, 7, 1, 1, 1),
(1, 8, 1, 1, 1),
(1, 9, 1, 1, 1),
(1, 10, 1, 1, 1),
(1, 11, 0, 0, 0),
(1, 12, 0, 0, 0),
(1, 13, 0, 0, 0),
(1, 14, 0, 0, 0),
(1, 15, 0, 0, 0),
(1, 16, 0, 0, 0),
(1, 17, 0, 0, 0);

2025-07-31 13:06
Jan Hrdlicka

Indigoprint

Go to category

Indigoprint Printeq dokumentace

Pohoda - externí sklad

http://printeqadmin3.informica.local/site/externalstorage

Pohoda

aktualizace pohledávek po splatnosti ./yii receivables/index

Accounts - import firem z Pohody

Budou se importovat pouze nové tj. ty jejichž ič v printeq není a dále se při importu doplní acount_id zákazníka pohody pokud se shodují iča a acount_id neexistuje

./yii accountupdate/index

account_id = id z pohody

type P právnická, O fyzická - z w1p, v pohodě toto rozlišení není

2020-12-09 20:26
Jan Hrdlicka

Firma provoz

Go to category

Telefony - nastvení

O2 mobil

rušení hlasové schránky: Na svém telefonu vytočte ##002# a sledujte displej telefonu. Po vytočení vám telefon zobrazí hlášku, že máte zrušena všechna přesměrování, tudíž i přesměrování do hlasové schránky. čekající hovor na lince: Tato funkce se někdy přenosem zruší. Aktivujete: vytočte *43#

2020-12-21 12:41
Jan Hrdlicka

Srovnání interního zaměstnance a externího spolupracovníka v přehledné tabulce

Zde je srovnání interního zaměstnance a externího spolupracovníka v přehledné tabulce:

Kritérium Interní zaměstnanec Externí spolupracovník
Vazba na firmu Pevnější, dlouhodobější vztah. Volnější, často projektový vztah.
Náklady Vyšší (mzda, benefity, školení, zázemí). Nižší, placeno na základě projektu/hodin.
Flexibilita Menší – pevná pracovní doba, pracovní smlouva. Větší – možnost spolupráce podle potřeby.
Dostupnost Stále k dispozici během pracovní doby. Pouze v rámci sjednaného času/projektu.
Znalost firmy Lepší znalost interních procesů a kultury. Omezenější, méně času na adaptaci.
Kontinuita práce Větší stabilita, možnost dlouhodobé práce. Práce končí s projektem.
Specializace Obecnější dovednosti, možnost rozvoje. Vysoce specializované dovednosti na konkrétní úkoly.
Řízení a dohled Vyžaduje více řízení a vedení. Nižší potřeba řízení, odpovědnost na spolupracovníkovi.
Riziko fluktuace Vyšší – odchody mohou být pro firmu nákladné. Nižší – jednoduché ukončení spolupráce.
Právní rámec Větší administrativní náročnost (smlouvy, ZP). Jednodušší – např. smlouva o dílo či kontrakt.

Závěr:

  • Interní zaměstnanec je vhodnější pro dlouhodobé úkoly, které vyžadují hlubokou znalost firmy, stabilitu a kontinuální podporu.

  • Externí spolupracovník je ideální pro krátkodobé nebo specializované projekty, kdy firma potřebuje flexibilitu a chce snížit fixní náklady.

Výběr závisí na konkrétních potřebách a strategii firmy.

2025-05-25 21:25
Jan Hrdlicka

CIS help

  • Open:
    The ticket has been created but no action has been taken yet. It awaits assignment or initiation of work.

  • In Progress:
    Work on the ticket is actively being carried out. Tasks are underway but not yet complete.

  • Assigned:
    The ticket has been allocated to a specific individual or team but work has not started yet.

  • Work completed

    Indicates that the assigned individual has completed their tasks for the ticket. The ticket is now awaiting review by a manager or another designated party who has the authority to either approve the resolution or send it back for further work.

    This status serves as an intermediary step to ensure quality control and proper oversight in ticket resolution workflows.

  • Resolved:
    The issue has been addressed and a solution has been implemented. The ticket is ready for closure, pending verification.

  • Late:
    The ticket’s resolution deadline has passed, and it remains unresolved.

  • Waiting for custommer

    Indicates that the ticket is on hold because further action depends on input, feedback, or a response from the client. The clock for resolution time may pause in this status, depending on the SLA or internal policy.

    This status helps distinguish tickets that are delayed due to external dependencies rather than internal inefficiencies.

2025-06-12 17:00
Jan Hrdlicka

JS Agency, Maxfotbal

Go to category

Maxfotal eshop

common/config/fecshop_local_services/Shipping.php - cena dopravy

Zákaznické úpravy ve vendors/fecmal:

fecshop\services\cms\Staticblock actionGetParamsByIdentify

app/appfront/modules/Catalog/block/product/Index.php
app/appfront/widgets/Page.php
app/appfront/helper/Format.php:
app/appadmin/modules/Catalog/block/productinfo/Manageredit.php
app/appadmin/modules/Config/block/appfrontpayment/Manager.php
app/console/modules/Product/controllers/MongodatatomysqlController.php
services/email/Order.php
services/cart/QuoteItem.php
services/product/Price.php

services/product/ProductMysqldb.php

services/product/ProductMongodb.php

 

services/Url.php: /*JHInformica - producttfeed*/
/*JHInformica - producttfeed*/
public function homeUrl()
{ if(defined('STDIN') ) {
return 'https://www.maxfotbal.cz';
}
return Yii::$app->getHomeUrl();

}


app/apphtml5/helper/Format.php: { if($price == floor($price)) $bits = 0; //JHInformica Remove useless zero digits from decimals

2022-01-29 15:13
Jan Hrdlicka

Other Users

Go to category

FAMU

Deploy

Při pushi do branch "test" se změny propíší na https://disptest.studiofamu.cz/

U produkce je nastavení stejné, pokud se pushne do "master" tak se aplikace nahraje na produkci.

A pokud je potřeba aktualizovat famu.cebin.info, zůstáva funkční starý příkaz který se dá spustit z localhostu: "dep deployer prep"


dispecink - testdisp : disp2020
student produkce - teststud : stud3030
vypujcni oddeleni zvuk - testodd : odd4040
produkcni - testprod : prod5050
pedagog - testped : ped6060

Luya-Admin module

Pro to aby to bylo zahrnuto v klasickém procesu je potřeba commitnout změnu do modulu a pak tento modul aktualizovat v hlavní aplikaci - Aktualizuje se informace u gitu na jaký commit sumodul odkazuje, a toto poté commitnout do hlavní větve.

Ve zkratce: Hlavní repozitář odkazuje na konkrétní commit submodulu. Pokud se submodul aktualizuje aktualizuje se také tato reference která se dá pak commitnout do hlavního repozitáře.

 

2021-03-01 08:36
Jan Hrdlicka

Cebin Services

Go to category

Newslettercenter

Copy returning mail to cebin.net:

Variant 1 - synchronize imap accounts:  (works only when mail server is installed on destination computer)

cd /home/honza/imapsync-master

./imapsync --host1 imap.vshosting.cloud --user1 projektanti@revelpex.com --password1 xxx --host2 mail.cebin.cz --user2 projektanti@revelpex.com --password2 xxx

Variant 2

Nainstalovat getmail apt-get install getmail6
přihlásit se jako uživatel honza, nastavit  mailbox v .getmail/getmailrc
spustit getmail

https://wiki.archlinux.org/title/Backup_Gmail_with_getmail

 

Analyze returned emails:
https://libsisimai.org/en/start/#install

/home/honza/sisimail/

Delete mailbox:

server: cebin.info - home/honza/maily/delete_emails.py - pred tim nastavit mailbox a adresar (inbox, trash)

Kdo kliknul na odkaz?

SELECT distinct email FROM nl_clicks WHERE `nl_newsletter_id` = 6

Způsob 2

./luya nlcentercmd/default/clicks 17 > nl17.txt

odstranění duplicit: sort nl17.txt | uniq

 

Alternativní rozesílání přes mail. program:
https://www.mailerlite.com/

 

Čištěni

delete from nl_contact_contactlist
where contact_id in (
select
nl_contact_contactlist.contact_id
from
nl_contact_contactlist
left join
nl_contact
on nl_contact_contactlist.contact_id = nl_contact.id
where id is NULL);

Aktuální stav:
jsagency
boftisk
revel
holandskonalodi
faramugo
antikvariatmotyl
babyoffice

 

2025-04-14 16:40
Jan Hrdlicka

Designer

Problém s MPDF - fix:
/vendor/mpdf/mpdf/src/Mpdf.php
Fix in page 10163:
if ($pagesel || (isset($this->page_box['using']) && $this->page_box['using']))

Velikost dokumentu:

pdfinfo -box xx.pdf | grep TrimBox

From order_item:
http://tiskne.informica.local/designer/default/renderpdf/{order_item.id}

From basket:
https://tiskne.cz/designer/default/renderpdf/?producthash={baskethash}&b=1

command line: php -f /var/www/tiskne.cz/web/luya designer/default/renderpdf

sync templates: rsync -avzhe ssh /var/www/projects/tiskne/web/public_html/media/pdf-templates/xxx/ jhrdlicka@217.16.184.84:/var/www/tiskne.cz/web/public_html/media/pdf-templates/xxx/

Admin

http://printeqadmin3.informica.local/document-template

https://admin.tiskne.cz/document-template/view?id=xxx

Duplikace dokumentů

1. Vytvořit document template
2. Zkopírovat ./luya conversion/import/duplicate-document puvodni_id nove_id

Nastavení dokumentů

1. změřím velikost pdf včetně ořezových značek a přesahů v pointech. (např. 665x912),
změřím rozdíl oproti čistému formátu (např. 35p a zapíšu tuto hodnotu do offset_print_x a offset_print_y)
změřím rozdíl velikostí čistého formátu od ořezu  spadávky (např. 15p a tuto hodnotu zapíšu do offset_preview_x a offset_preview_y), není-li tato hodnota stanovena - počítám 3mm tj. 8p.

2. Do skriptu pdf2png.sh pro generování png náhledů z pdf, který je v každé složce mustru v adresáři /public_html/media/pdf-templates upravím hodnoty. Pdfcrop margins zvolím jako rozdíl offset_print_x-offset_preview_x-  tj. v tomto případě 35-15=20

#!/bin/bash































































































































































































































































name="267"































































































































imagesize="630x877"































































































































thumbsize="315x438"































































































































































































































































pdfcrop --margins "-20 -20 -20 -20"  $name.pdf































































































































convert $name-crop.pdf $name.png































































































































for f in *.png;































































































































do































































































































 echo "Processing $f"































































































































convert $f -resize $imagesize! $f































































































































convert $f -background white -gravity South -extent $imagesize $f































































































































































































































































t=$(echo $f | cut -f 1 -d '.')































































































































thumb="${t}_ico.png" 































































































































































































































































#convert $f -resize $thumbsize! $thumb































































































































































































































































convert $f -resize $thumbsize! $thumb































































































































































































































































done

Skript pro ořezání šnajtků - pokud jsou vyexportovány ve vzoru

dir=0244;number=244;cd $dir;convert $number-preview-0.png -crop +18+18 -crop -18-18 $number-preview-0.png;convert $number-preview-1.png -crop +18+18 -crop -18-18 $number-preview-1.png;cd ..;

2025-11-28 11:04
Jan Hrdlicka

PrintEQ nastavení

Zkontrolovat sesssion

chybou frameworku yii se nedrží session!

nutno otestovat a zkontrolovat aby ve /vendror/yiisoft/web/User bylo zakomentováno:

/* if ($this->getIdentity(false) === null) {
$this->switchIdentity(null);
}*/

Vyčištění databáze:

SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE TABLE `account`;
TRUNCATE TABLE `account_machine`;
TRUNCATE TABLE `addition_material`;
TRUNCATE TABLE `address`;
TRUNCATE TABLE `admin_storage_file`;
TRUNCATE TABLE `admin_storage_folder`;
TRUNCATE TABLE `admin_storage_image`;
TRUNCATE TABLE `admin_user_auth_notification`;
TRUNCATE TABLE `admin_user_device`;
TRUNCATE TABLE `admin_user_group`;
TRUNCATE TABLE `admin_user_login`;
TRUNCATE TABLE `basket`;
TRUNCATE TABLE `category`;
TRUNCATE TABLE `cms_log`;
TRUNCATE TABLE `cms_nav`;
TRUNCATE TABLE `cms_nav_item`;
TRUNCATE TABLE `cms_nav_item_page`;
TRUNCATE TABLE `cms_nav_item_page_block_item`;
TRUNCATE TABLE cms_nav_item_redirect;
TRUNCATE TABLE contact;
TRUNCATE TABLE coupon;
TRUNCATE TABLE deliverynote_item;
TRUNCATE TABLE deliverynote;
TRUNCATE TABLE document_template;
TRUNCATE TABLE document_template_item;
TRUNCATE TABLE document_template_section;
TRUNCATE TABLE document_template_section_type;
TRUNCATE TABLE email_template;
TRUNCATE TABLE email_template_translation;
TRUNCATE TABLE g_gallery;
TRUNCATE TABLE g_photo;
TRUNCATE TABLE invoice;
TRUNCATE TABLE invoice_item;
TRUNCATE TABLE kanban_board;
kanban_board_user_assignment
kanban_bucket
kanban_task
TRUNCATE TABLE material;
TRUNCATE TABLE materialgroup;
TRUNCATE TABLE materialsheet;
TRUNCATE TABLE materialsubgroup;
TRUNCATE TABLE material_machine;
TRUNCATE TABLE order;
TRUNCATE TABLE order_item;
TRUNCATE TABLE passage;
pas_correction_quantity
pas_correction_weight
TRUNCATE TABLE person;
TRUNCATE TABLE postpress;
TRUNCATE TABLE postpress_type;
TRUNCATE TABLE pricelist;
TRUNCATE TABLE product_machine;
TRUNCATE TABLE product_material;
TRUNCATE TABLE profile;
TRUNCATE TABLE sheet;
TRUNCATE TABLE social_account;
TRUNCATE TABLE source;
TRUNCATE TABLE source_bucket;
TRUNCATE TABLE source_type;
TRUNCATE TABLE tbl_dynagrid;
TRUNCATE TABLE tbl_dynagrid_dtl;
TRUNCATE TABLE tmp_uploaded_files;
TRUNCATE TABLE token;
TRUNCATE TABLE uploaded_files;
TRUNCATE TABLE uploaded_orderfiles;
TRUNCATE TABLE userauth_user;
TRUNCATE TABLE versioning_record;
TRUNCATE TABLE versioning_route;
delete FROM `user` WHERE id > 2
change 2
delete FROM `machine` WHERE id > 3
delete FROM `product` WHERE id > 4
upravit settings_settings
SET FOREIGN_KEY_CHECKS = 1;
kontrola dashboard panel

2024-08-01 10:45
Jan Hrdlicka

Babyoffice

Go to category

Babyoffice newslettercenter

Správa newsletteru

https://babyoffice.cebin.info/admin

nutno v db přepsat nl_contact novými adresami, dělá se přes shell příkazem:

./luya nlcentercmd/import/import-contacts /var/www/babyoffice.cz/news/nazev_xls_souboru.xlsx

je potřeba zkontrolovat v souboru /var/www/babyoffice.cz/web/modules/nlcenter/commands/ImportController.php klíče (první řádky excelu) - nyní je nastaveno na "Email", "Oslovení", "Pohlaví" (Email je povinný, ostatní položky volitelné)
- v budoucnu to sjednotíme a nastavíme, aby se dalo nahrávat přes administraci místo cmd.

2023-01-10 13:22
Jan Hrdlicka

Bataknalodi+cyklolod

Go to category

Bataknalodi.cz

Zálohová faktura 

Text pod nadpisem "Odběratel" se nastavuje v configu - parametr sellerAddress

2022-05-13 12:50
Jan Hrdlicka

PrintEQ

Go to category

Nastavení objednávek, stavy objednávek, automatické e-maily při změně stavu objednávky

Stavy objednávek se nastavují v tabulce order_status. Podle parametru status_order_type se určuje, zda se zobrazí u poptávky nebo u objednávky. Pokud je hodnota NULL, zobrazí se daný stav u obou.

Při změně kterých stavů má systém odesílat klientovi a/nebo adminovi E-mail se nastavuje v /backend/configs/params_local.php

'informCustomerStatusIds'=> [..], // seznam stavů e-mail zákazníka
'informAdminStatusIds'=> [...], //seznam stavů e-mail pro admina
'informAdminStatusSendPdf'=> [...], //s e-mailem se pošle i příloha v pdf
'sendOnlyOnePdf'=> true,
'disableClientOrderConfirm'=> true,

2022-05-08 10:22
Jan Hrdlicka

Zdroje a kalkulace nákladů

Během kalkulace ještě nejní znám zdroj, ke kterému budou přiřazeny jednotlivé kalkulace.

V tomto případě se náklady počítají pomocí cost_price, která je přiřazena postpressu. U strojů se řeší přes parametr machine_evaluation.

Během výroby produkcční přiřadí jednotlivé skutečné zdroje, obsluha k nim pak doplní skutečný čas nebo počet (podle typu)

2022-05-09 14:49
Jan Hrdlicka

E-mailové šablony - yiimaker nastavení v adminu

/email-templates/default/index

yiimaker/yii-email-templates/src/views/default/update.php

přidat do widgetu Imperavi Redactor
nastavení [
'settings' => [
'paragraphize' => false,
'replaceDivs' => false,
'linebreaks' => true,
'enterKey' => false
]
]

Do configu bootstrap.php přidat:


\Yii::$container->set(
\ymaker\email\templates\repositories\EmailTemplatesRepositoryInterface::class,
\ymaker\email\templates\repositories\EmailTemplatesRepository::class
);

Do configu main.php do sekce modules přidat:

'email-templates' => [
'class' => \ymaker\email\templates\Module::class,
'languageProvider' => [
'class' => \motion\i18n\ConfigLanguageProvider::class,
'languages' => [
/* [
'locale' => 'en-US',
'label' => 'English',
],*/
[
'locale' => 'cs-CZ',
'label' => 'Česky',
],

do sekce components přidat:

'templateManager' => [
'class' => \ymaker\email\templates\components\TemplateManager::class,
],
],
'defaultLanguage' => [
'locale' => 'cs-CZ',
'label' => 'Česky',
],
],
],

Do configu main.php sekce i18n přidat:

'email-templates*' => [
'class' => 'yii\i18n\PhpMessageSource',
'basePath' => '@backend/translations',
'fileMap' => [
'email-templates' => 'email-templates.php',
'app/error' => 'error.php',
],
],

Objednávky v PDF

styl nastavit v backend/web/css/orderemplate

 

2024-11-14 11:16
Jan Hrdlicka

E-mailové šablony - objednávky, PDF soubory

/email-templates/default/index

adminorder - název (key) šablony pro celou objednávku
adminorderitem - název (key) dílčí šablony pro položku objednávky

clientorder - šablona pro odesílání klientovi z frontendu

2022-05-12 12:01
Jan Hrdlicka

Ukládání cen v objednávce

Ceny se ukládají v tabulce Order

Ceny dopravy:
delivery_price
delivery_price_vat

Celková cena:
total_price
total_price_vat

Interní cena dodání, která se neúčtuje zákazníkovi
delivery_price_intern
delivery_price_intern_vat

Úprava db tabulek u všech projektů nastavit:
ALTER TABLE `order` ADD `delivery_price_vat` DECIMAL(10,4) NOT NULL DEFAULT '0' AFTER `delivery_price`;
ALTER TABLE `order` CHANGE `delivery_price` `delivery_price` DECIMAL(10,4) NOT NULL DEFAULT '0.00';
ALTER TABLE `order` ADD `delivery_price_intern_vat` DECIMAL(10,4) NULL DEFAULT NULL AFTER `delivery_price_intern`;
ALTER TABLE `order` CHANGE `delivery_price_intern` `delivery_price_intern` DECIMAL(10,4) NULL DEFAULT NULL;

2023-02-27 23:04
Jan Hrdlicka

Checklist PrintEQ

filepuloads files musí být kódování unicode
ALTER TABLE `uploaded_files` CHANGE `filenames` `filenames` TINYTEXT CHARACTER SET utf8 COLLATE utf8_czech_ci NULL DEFAULT NULL;

2023-02-28 13:04
Jan Hrdlicka

PrintEQ comgate integrace

od 1.8.2024 nutnost přidat i jméno a příjmení 
htps://www.comgate.cz/blog/nove-parametry-platby-kartou
jméno plátce a jeho e-mailová adresa nebo telefonní číslo.
rozšíření parametrů metody /v1.0/create.
V případě použití Comgate PHP SDK stačí aktualizovat balíček na verzi v1.0.10 (composer update) a použít připravené metody. Aktuální PHP SDK najdete na GitHub.
composer update comgate/sdk --ignore-platform-req=php

upraveno u:
mojetisky.cz
petrsuba.cz
rafo.cz

Nové používající comgate např. mojetisky.cz, petrsuba.cz
Url paid
https://xxx.xxx/comgate-response?refId=${refId}&id=${id}
Url cancelled
https://xxx.xxx/comgate-response?refId=${refId}&id=${id}
Url pending
https://xxx.xxx/comgate-response?refId=${refId}&id=${id}
Url for payment result transfer
https://xxx.xxx/comgate-result

od 1.8. rafo.cz používá také comgate
staré používající Agamo - např. rafo.cz
Admin - comgate - návratové adresy
Url paid
https://xxx.xx.xx/comgate-response?refId=${refId}
Url cancelled
https://xxx.xx.xxz/comgate-response?refId=${refId}
Url pending
https://xxx.xx.xx/comgate-response?refId=${refId}
Url for payment result transfer
https://xxx.xx.xx/comgate-response
IP whitelist

testování návratu: 

&lt;form id=&quot;w0&quot; name=&quot;deffered&quot; action=&quot;https://mojetisky.cebin.net/comgate-result&quot; method=&quot;post&quot;&gt;

&lt;input type=&quot;hidden&quot; name=&quot;merchant&quot; value=&quot;467736&quot;&gt;
&lt;input type=&quot;hidden&quot; name=&quot;test&quot; value=&quot;true&quot;&gt;
&lt;input type=&quot;hidden&quot; name=&quot;price&quot; value=&quot;299900&quot;&gt;
&lt;input type=&quot;hidden&quot; name=&quot;curr&quot; value=&quot;CZK&quot;&gt;
&lt;input type=&quot;hidden&quot; name=&quot;label&quot; value=&quot;Mojetisky.cz+433&quot;&gt;

&lt;input type=&quot;hidden&quot; name=&quot;refId&quot; value=&quot;433&quot;&gt;
&lt;input type=&quot;hidden&quot; name=&quot;method&quot; value=&quot;CARD_CZ_COMGATE&quot;&gt;

&lt;input type=&quot;hidden&quot; name=&quot;email&quot; value=&quot;j.h%40informica.cz&quot;&gt;
&lt;input type=&quot;hidden&quot; name=&quot;transId&quot; value=&quot;8E7H-WXAL-SVNF&quot;&gt;
&lt;input type=&quot;hidden&quot; name=&quot;secret&quot; value=&quot;uSrjlbL0saIKhnDPJy98s7MqBLGfowiT&quot;&gt;
&lt;input type=&quot;hidden&quot; name=&quot;email&quot; value=&quot;info%40informica.cz&quot;&gt;
&lt;input type=&quot;hidden&quot; name=&quot;status&quot; value=&quot;PAID&quot;&gt;
&lt;input type=&quot;hidden&quot; name=&quot;fee&quot; value=&quot;unknown&quot;&gt;
&lt;input type=&quot;hidden&quot; name=&quot;vs&quot; value=&quot;823390672&quot;&gt;
&lt;!-- &lt;input type=&quot;hidden&quot; name=&quot;cat&quot; value=&quot;PHYSICAL&quot;&gt;--&gt;

&lt;input type=&quot;submit&quot; value=&quot;submit&quot;&gt;
&lt;/form&gt;

2024-08-01 07:25
Jan Hrdlicka

Social login

zkopířovat:
vendor/yiisoft/yii2-authclient (úpravy kvůli loginu přes seznam)
vendor/2amigos/yii2-usuario

Google

https://console.cloud.google.com/

ApisServices -> Credentials

OAuth 2.0 Client IDs

Authorized JavaScript origins
https://www.mojetisky.cz

Authorized redirect URIs
https://www.mojetisky.cz/user/security/auth?authclient=google

Seznam

https://vyvojari.seznam.cz/

url přesměrování: https://www.rafo.cz/user/security/auth?authclient=seznam

Facebook

https://developers.facebook.com/apps/?show_reminder=true

 

2023-10-06 18:12
Jan Hrdlicka

PrintEQ dashboard

https://admin.tiskne.cz/dashboard/dashboard/update?id=6

2023-12-12 12:25
Jan Hrdlicka

update glyphicons to fa icons in order_status table

UPDATE order_status SET icon = REPLACE(icon,'glyphicon','fa');
UPDATE order_status SET icon = REPLACE(icon,'fa-ok','fa-check');
UPDATE order_status SET icon = REPLACE(icon,'fa-remove-sign','fa-times-circle');
UPDATE order_status SET icon = REPLACE(icon,'fa-euro','fa-euro-sign-alt');
UPDATE order_status SET icon = REPLACE(icon,'fa-send','fa-paper-plane');
UPDATE order_status SET icon = REPLACE(icon,'fa-export','fa-download');
UPDATE order_status SET icon = REPLACE(icon,'fa-log-in','fa-sign-in');
UPDATE order_status SET icon = REPLACE(icon,'fa-refresh','fa-sync-alt');
UPDATE order_status SET icon = REPLACE(icon,'fa-log-in','fa-sign-in');

2023-12-12 17:48
Jan Hrdlicka

Update order_surcharges - make independent on payment

delete FROM `order_surcharges` WHERE payment_id is NULL;
update `order_surcharges` set payment_id = NULL;
DELETE c1 FROM order_surcharges c1
INNER JOIN order_surcharges c2
WHERE
c1.id > c2.id AND
c1.delivery_id = c2.delivery_id AND
c1.threshold = c2.threshold
;

2024-02-01 18:40
Jan Hrdlicka

Admin Vendor - úpravy

User
Ve vendor/2amigos  Services/UserCreateService.php nutno zakomentovat posílání e-mailů - pokud jako admin vytvářím uživatele v administraci, e-mail se mu neposílá

/email-templates - úprava příst. práv - pouze admin
/vendor/yiimaker/yii2-email-templates/src/controllers/DefaultController.php

/settings/backend - úprava příst. práv - pouze admin
/vendor/execut/yii2-settings/controllers/BackendController.php

2024-03-05 11:10
Jan Hrdlicka

Frontend Vendor úpravy

Problém - v subjectu e-mailu se vymaže mezera

v souboru /web/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/AbstractHeader.php
upravit 

:
//foreach (preg_split('~(?=[\t ])~', $string ?? '') as $token) {

foreach (preg_split('~(?<=[\t ])~', $string) as $token) { // regexp

2024-03-05 13:02
Jan Hrdlicka

malfini dodavatel triček

mojetisky.cz - používá pro exprot jejich xmlfeed

export dat
https://shop.malfini.com/cz/cs/account/exports

B2B rest api – návod je na odkaze níže
https://shop.malfini.com/cz/cs/article/b2b-rest-api


Další možností je navštívit naše cloudové uložiště, kde jsou podklady jako fotky, produktové obrázky, produktové karty, tabulky velikostí ke stažení

https://shop.malfini.com/cz/cs/article/swivle

2024-09-01 20:40
Jan Hrdlicka

PrintEQ - e-mailové šablony - nastavení vlastní grafiky

Hlavní šablona frontend:
/mail/layouts/html.php

u registračních, potvrzovacích e-mailů je hlavní šablona v
/modules/user/frontend/views/default/mail

Nová registrace - žádost o potvrzení e-mailu a dokončení
/modules/user/frontend/views/default/mail/welcome.php

Potvrzení registrace
/modules/user/frontend/views/default/mail/confirmation.php

Poděkování a kupón na slevu
cms newRegistrationCoupon

Zapomenuté heslo
/modules/user/frontend/views/default/mail/confirmation.php

Opětovné potvrzení
/modules/user/frontend/views/default/mail/reconfirmation.php

Obnova hesla
/modules/user/frontend/views/default/mail/recovery.php

Administrace šablona

2024-11-14 11:15
Jan Hrdlicka

Printeq Titulka - úvodní obrazovka

template úvodní obrazovky je zde:

www/mojetisky.cebin.net/backend/vendor/yii-usuario/yii-usuario-views-bootstrap4/src/views/security/login.php

2025-03-26 10:44
Jan Hrdlicka

Printeq Analytics

 ./luya conversion/import/export-logs > calculation_log.json

./luya conversion/import/export-machines > machines.json
./luya conversion/import/export-materials > materials.json
./luya conversion/import/export-products > products.json
./luya conversion/import/export-users > users.json

config:
 'visitorId' => [
            'class' => 'app\components\VisitorId',
            'cookieName' => 'visitor_id', // Optional
            'cookieExpireDays' => 365,    // Optional
        ],
params:  'website_id' => 1,

common/models/common/calculation.php

add widget app\components\VisitorId

modules/printeqform/frontend/controllers/DefaultController.php

modules/cart/Cart.php

order/frontend/controllers/DefaultController.php:        $cart->saveToLog();

common\models\common\Product::getProductNameById()' 

most calculated products
most buyed products

users s nejvíce kalkulacema

users s nejvice objednavkama
users s největším obratem


Order amount trend for the last month (base currency)
Trends in the number of orders in the last month
Number of registered users in the last month

2025-09-08 17:27
Jan Hrdlicka

Printeqadmin App Modernization

Introduce service classes (business logic out of controllers)

Reduce Yii:: static calls

Add PSR-3 logging (Monolog)

Improve test coverage

Isolate domain logic

This gives you 80% of the benefits with 20% of the cost.

Keep Yii2 for backend logic and API endpoints.

Build React components for views (e.g., order table, order form).

Communicate via JSON endpoints (REST API or Yii2 controller actions returning JSON).

Gradually replace old jQuery interactions.

2026-01-01 19:39
Jan Hrdlicka

PrintEQ - SQL

Remove attributes:
ALTER TABLE `account`
  DROP `city`,
  DROP `country`,
  DROP `postalcode`,
  DROP `street1`,
  DROP `state`,
   DROP `officefax`,
  DROP `street2`;

vyřešit delivery phone

2026-01-19 12:23
Jan Hrdlicka

Tiskne

Go to category

E-mailové šablony

E-mailové šablony jsou zde https://admin.tiskne.cz/email-templates

dodání je informCustommer5 a jednotlivé způsoby dodání jsou delivery1,2 a 3,

konkrétně Plzeň je zde: https://admin.tiskne.cz/email-templates/default/update?id=8

Při editaci prosím pozor na výrazy ve slozenych závorkách {}, které označují proměnné, které se automaticky nahradí konkrétními daty (např. číslem objednávky atd.).Takže je nemažte ani neměňte.

Pof emailTemplateBye je podpis, který je na konci e-mailu posílaných zákazníkům.

2022-05-12 17:19
Jan Hrdlicka

Tiskdo1000

Go to category

Forms - úpravy - individuální tiskovina

modul luya-forms upraveny soubory:

Model.php
Forms.php
SubmissionEmail.php
FieldBlockTrait.php
/blocks/FormBlock.php
/blocks/SelectBlock.php
/blocks/TextBlock.php

/views/blocks/FormBlock.php

2023-05-15 13:50
Jan Hrdlicka

Revel, Easypex

Go to category

REVEL CMS

Aktualizace katalogů a letáku

PDF verze je pouze jedna - na webu https://www.revel-pex.com/ke-stazeni-revel. Z webu easypex je se odkazuje na revel. Při aktualizaci je potřeba vyměnit náhledové obrázky na webu revel-pex a easypex a pdf na webu revelpex. 
Soubory (pdf i obrázky) je nejlepší nahradit pomocí replace tj. v administraci v modulu "Files" kliknout na (i) vpravo u souboru a pak kliknout na "Replace" víz. obr.

Pak se na serveru zbytečně nehromadí staré neaktuální soubory.

Na webu easypex  obrázky vyměnuji zde https://easypex.eu/admin#!/template/cmsadmin~2Fdefault~2Findex/update/60 - rozkliknout blok Gallery Album a v něm vyměnit náhledové obrázky

Na webu revel vyměnuji obrázky a pdf v bloku PdfBlock zde:
https://www.revel-pex.com/admin#!/template/cmsadmin~2Fdefault~2Findex/update/53
https://www.revel-pex.com/admin#!/template/cmsadmin~2Fdefault~2Findex/update/55
https://www.revel-pex.com/admin#!/template/cmsadmin~2Fdefault~2Findex/update/56 

Po aktualizaci je nutno aktualizovat názvy souborů v  Goals v Analytics.cebin.info
https://analytics.cebin.info/index.php?module=Goals&action=manage&idSite=8&period=range&date=previous7&idContainer=YS4Sv1Yt&showaddsite=false

REVEL cms layouty stránek
https://www.revel-pex.com/admin#!/default/19/cmsadmin/layout/index
Homepage - titulka
Main - standardní layout - zobrazuje se pouze obsah
Signpost - zobrazuje se obsah (pokud na stránce nějaký je) a pod ním seznam podstránek ve formě čtvercových bloků
pokud je v sekci SEO zvolen obrázek, zobrazí se v bloku kromě textu i obrázek.
Twocol - dvousloupcový design - použitý např. zde https://www.revel-pex.com/sortiment/system-revel-pex
Newsletter - pouze obsah bez záhlaví a zápatí, používá se pro zobrazení newsletterů.

Bloky
CalltoactionBlock - blok s textem a tlačítkem - používá se pro odkazy na kontaktní formulář
Jumbotron block - - upoutávka obsahující nadpis, obrázek, text a odkaz (bootstrap jumbotron https://getbootstrap.com/docs/4.0/components/jumbotron/)
CardBlock - čtvercový prvek obsahující obrázek, nadpis a obsah (bootstrap card https://getbootstrap.com/docs/4.0/components/card/)
Info1ColBlock - blok pro zobrazení produktů - nadpis, cena, odznak, odkaz, obsah - používá se např. pro zobrazení tepelného čerpadla s cenou
PdfBlock - pro zobrazení pdf souborů (katalogy, letáky)
SlickSlider - carousel na titulce
TextImageBlock - text s obrázkem např. na titulce pod carouselem


Bloky pro layout
LaoutrowBlock, LayoutColBlcok - pro zobrazení mřížky bootstrapu row a col (bootstrap grid https://getbootstrap.com/docs/4.0/layout/grid/)

Moduly
- news - novinky, články, blog
- dictionary - slovník pojmů
- nlcenter - tvorba newsletterů
- forms - tvorba formulářů
- galleries - tvorba galerií
- crawler - statistika vyhledávání - search queries atd.

2024-03-11 13:49
Jan Hrdlicka

SW development

Go to category

JS Libraries

https://www.shepherdjs.dev/

2024-11-06 11:26
Jan Hrdlicka

PHP

Check whether an array key is undefined:

if (isset($array['age']))
+ Fast and does not trigger warnings.
- Returns false for keys that exist but contain null.

if (array_key_exists('age', $array))
+ Pros: Detects even null values.
- Slightly slower than isset().

$age = $array['age'] ?? 'Unknown'; // If 'age' is undefined, use 'Unknown'
+ The cleanest way to provide default values.
- Requires PHP 7+.

2025-04-03 13:14
Jan Hrdlicka

Development Environments

Aspect Development Server Stage Server Preproduction Server
Purpose Active development and debugging of features Feature and functionality testing Production-readiness validation
Configuration Loosely configured, may not mimic production Similar to production, but not exact Identical to production
Data Mock data, test data, or local databases Mock or sanitized data Real or anonymized production data
Testing Unit tests, local integration tests Functional, UI, and regression testing Performance, load, and end-to-end testing
Access Developers only Developers, QA, and stakeholders Operations, release teams, and performance testers
Changes Allowed Frequent, active debugging and code changes Flexible (debugging permitted) Locked down (minor fixes only)
Deployment Frequency Continuous (frequent builds) Regular updates during the testing phase Rare, only near final release
Tools/Processes Local development tools, CI/CD pipelines Testing frameworks, bug tracking tools Monitoring tools, deployment scripts

Setup reacat app:

.env.development
.env.staging
.env.production

npm run build        # uses production
NODE_ENV=staging npm run build

Option 2 (better for containers - docker, kubernetes): Runtime environment variables
public/config.json
{
  "apiUrl": "https://prod.example.com"
}

fetch('/config.json')
  .then(r => r.json())
  .then(config => {
    window.APP_CONFIG = config;
    // render app here
  });
window.APP_CONFIG.apiUrl

Option 3: Inject env variables via the hosting server (Nginx, Node)
<script src="/env.js"></script>
window.env = {
  API_URL: "https://prod.example.com"
};
window.env.API_URL

2025-12-10 16:53
Jan Hrdlicka

Python tool - create mysql query

https://www.online-python.com/

# Online Python - IDE, Editor, Compiler, Interpreter
a = ['L','M','S','XL','XXL','XXXL']
print ('insert into material (materialsubgroup_id,name,description,param,order_no) values ')
for i in range(355,370):
    k=0
    for j in range(len(a)):
        print("("+str(i)+",'"+a[j]+"','Dámská mikina Urban "+a[j]+"'"+",'"+a[j]+"',"+str(k) +"),")
        k=k+1

2025-04-30 13:49
Jan Hrdlicka

Bootstrap sass - from scss->css

sudo apt update
sudo apt install -y nodejs npm
npm install -g sass
sass bootstrap.scss bootstrap.css

2025-05-13 11:58
Jan Hrdlicka

DDD and MVC architecture

What is DDD Architecture?

Domain-Driven Design (DDD) is an architectural approach and methodology for software development that emphasizes focusing on the core domain and its logic. It helps in creating software systems that closely reflect the real-world problems they are designed to solve.

Key principles of DDD:

  1. Ubiquitous Language: A common language shared by technical and non-technical stakeholders.

  2. Bounded Contexts: Clear boundaries for different parts of the system to maintain separation of concerns.

  3. Entities and Value Objects: Modeling real-world concepts with entities (objects with a distinct identity) and value objects (immutable and defined by their attributes).

  4. Aggregates: Clusters of domain objects treated as a single unit for consistency.

  5. Repositories: Abstract data stores to handle persistence.

  6. Services: Operations that don't naturally belong to entities or value objects.

DDD aligns software design with business needs and focuses heavily on the domain layer, which represents the core business logic.


MVC Architecture

Model-View-Controller (MVC) is a design pattern for organizing the structure of software systems, commonly used in web and application development. It separates the application into three interconnected components:

  1. Model: Represents the data and business logic of the application.

  2. View: Handles the presentation layer, rendering UI components.

  3. Controller: Mediates user input, processes it, and updates the Model or View.


Comparison Between DDD and MVC

Feature DDD (Domain-Driven Design) MVC (Model-View-Controller)
Focus Focused on the domain layer and business logic. Focused on separating UI, logic, and data.
Complexity Designed for complex systems with rich domains. Suitable for simpler systems or straightforward UI-driven applications.
Separation of Concerns Emphasizes separating domain logic via entities, value objects, and bounded contexts. Emphasizes separating UI logic from business logic and data.
Business Logic Placement Encapsulated in the domain model. Typically placed in the Model.
Scalability Scales well for large, evolving business domains. Scales for smaller, simpler applications but can become unwieldy for complex systems.
User Interaction User interaction is not a central concern; focuses on domain integrity. Explicitly manages user interaction and UI changes.
Repositories Uses repositories as abstractions for persistence. Often integrates data access directly into the Model.
Suitability Best for enterprise-grade applications or systems with rich, evolving business rules. Best for web applications with clear separation between UI and logic.
Flexibility Highly flexible; requires significant design upfront. Straightforward; often tightly coupled with frameworks (e.g., Rails, Django).

Use Case Examples

  • DDD: A complex e-commerce platform where pricing, inventory, and order systems have rich business rules and domain logic.

  • MVC: A blog or content management system where the focus is on rendering views and CRUD operations.


Integration

In practice, you can use DDD principles within the Model of an MVC framework. For example, the domain layer in DDD can act as the Model in MVC, while Views and Controllers manage presentation and user interaction separately.

2025-05-21 13:23
Jan Hrdlicka

nodejs installation globally on ubuntu

sudo apt remove nodejs
sudo apt autoremove

sudo apt update
sudo apt upgrade

sudo apt install nodejs npm
sudo n latest (or number of version)

node -v

echo 'export PATH=/usr/local/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

2025-06-03 13:40
Jan Hrdlicka

Git, bitbucket

1. Nastavení projektu a klonování úložiště

  • git clone [URL]

    • Klonuje vzdálené úložiště na váš lokální počítač.

    • Příklad: git clone https://bitbucket.org/username/repo.git


2. Kontrola stavu a historie

  • git status

    • Zobrazuje aktuální stav pracovního adresáře a indexu.

    • Ukazuje, které soubory byly změněny, přidány nebo jsou připraveny k potvrzení.

  • git log

    • Zobrazuje historii potvrzení (commitů) v projektu.

    • Příklad: git log --oneline zobrazuje stručný přehled.


3. Přidání a potvrzení změn

  • git add [soubor]

    • Přidá soubor(y) do indexu pro příští commit.

    • Příklad: git add file.txt

  • git add .

    • Přidá všechny změněné soubory v aktuálním adresáři.

  • git commit -m "Zpráva"

    • Vytvoří commit s popisnou zprávou o provedených změnách.

    • Příklad: git commit -m "Přidání nové funkce"


4. Odesílání a synchronizace změn

  • git push

    • Odesílá změny do vzdáleného úložiště.

    • Příklad: git push origin main

  • git pull

    • Stáhne změny z vzdáleného úložiště a sloučí je s lokálním kódem.

    • Příklad: git pull origin main


5. Práce s větvemi

  • git branch

    • Zobrazuje seznam větví v úložišti.

    • Příklad: git branch -a zobrazí všechny větve, včetně vzdálených.

  • git branch [jméno_větve]

    • Vytvoří novou větev.

    • Příklad: git branch nová-větev

  • git checkout [jméno_větve]

    • Přepne se na danou větev.

    • Příklad: git checkout nová-větev

  • git checkout -b [jméno_větve]

    • Vytvoří a přepne se na novou větev.

    • Příklad: git checkout -b vývojová-větev

  • git merge [jméno_větve]

    • Sloučí změny z jiné větve do aktuální.

    • Příklad: git merge vývojová-větev


6. Řešení konfliktů

  • git mergetool

    • Spustí vizuální nástroj pro řešení konfliktů.

  • git status

    • Ukáže soubory s konflikty.

  • git add [soubor]

    • Po vyřešení konfliktu přidá soubor pro commit.

  • git commit -m "Vyřešení konfliktů"

    • Potvrdí změny po vyřešení konfliktů.


7. Ostatní užitečné příkazy

  • git stash

    • Dočasně uloží necommitované změny.

    • Příklad: git stash save "Rozdělané změny"

  • git stash apply

    • Aplikuje uložené změny zpět.

  • git remote -v

    • Ukazuje, jaká vzdálená úložiště jsou připojená.

  • git fetch

    • Stáhne změny z vzdáleného úložiště bez jejich sloučení.


Typický pracovní postup s Bitbucket:

  1. Klonování úložiště: git clone [URL]

  2. Práce na kódu: Úpravy v souborech.

  3. Přidání změn: git add .

  4. Commit změn: git commit -m "Popis změn"

  5. Odeslání do vzdáleného úložiště: git push origin main

Pomocí těchto příkazů můžete efektivně pracovat s Gitem na Bitbucketu.

2025-06-09 18:43
Jan Hrdlicka

Data storage

ChatGPT said:

The choice of where and how to save changes in a Vue.js application depends on your application's requirements and the desired user experience. Here’s a breakdown of the options:

1. Send Data to Server

  • When to Use:

    • If changes need to be persistent across sessions and devices.

    • If collaboration or real-time updates across users is required.

    • If data security and backup are priorities.

  • Implementation:

    • Use a debounce or throttle function to minimize the frequency of updates to the server.

    • Use REST APIs or WebSocket for communication.

    • Example using axios for REST API:

      javascript
      import axios from 'axios'; const saveChanges = debounce((data) => { axios.post('/api/save-changes', data) .then(response => console.log('Changes saved!')) .catch(error => console.error('Error saving changes:', error)); }, 300); // Delay to reduce server load

2. Local Storage

  • When to Use:

    • For small, non-sensitive data that doesn't require cross-device availability.

    • To save state temporarily and load it on page reload.

  • Pros:

    • Simple and fast.

    • No server dependency.

  • Cons:

    • Limited to 5MB.

    • Data is tied to the browser and device.

  • Implementation:

    javascript
    const saveToLocalStorage = (key, data) => { localStorage.setItem(key, JSON.stringify(data)); }; const loadFromLocalStorage = (key) => { return JSON.parse(localStorage.getItem(key)); };

3. Session Storage

  • When to Use:

    • For temporary data that only needs to persist for the current browser session.

    • Similar to local storage but data is cleared when the page session ends.

  • Implementation:
    Similar to local storage:

    javascript
    sessionStorage.setItem('key', JSON.stringify(data)); const data = JSON.parse(sessionStorage.getItem('key'));

4. IndexedDB

  • When to Use:

    • For larger and more complex data storage.

    • When you need structured storage like a database.

    • For offline-first applications with large amounts of data.

  • Pros:

    • Supports more data than local storage (usually 50MB or more).

    • Can store complex objects.

  • Cons:

    • More complex API than local or session storage.

  • Implementation:
    Using a library like dexie.js simplifies IndexedDB operations:

    javascript
    import Dexie from 'dexie'; const db = new Dexie('MyDatabase'); db.version(1).stores({ changes: '++id, data' }); const saveToIndexedDB = async (data) => { await db.changes.add({ data }); }; const loadFromIndexedDB = async () => { return await db.changes.toArray(); };

Recommendations

  • For Immediate Saving to Server:

    • Use REST APIs or WebSocket for real-time applications.

    • Add debouncing to avoid overwhelming the server with too many requests.

  • For Local Persistence:

    • Use localStorage or sessionStorage for simple and small-scale needs.

    • Use IndexedDB for larger datasets or offline capabilities.

Hybrid Approach

You can combine strategies for a robust solution:

  • Use IndexedDB or local storage for instant local saves and offline support.

  • Periodically sync changes to the server in the background for persistence.

This approach balances performance, user experience, and data reliability.

2025-06-11 15:16
Jan Hrdlicka

Colorize svg with css

  1. varianta

    <img src="black-image.svg" class="colorize-img" alt="SVG Image" />

    <style>
      .colorize-img {
        filter: invert(14%) sepia(92%) saturate(750%) hue-rotate(328deg) brightness(93%) contrast(101%);
      }
    </style>
    use: [https://angel-rs.github.io/css-color-filter-generator/

    1. Inline SVG with fill or stroke

    If the SVG code is included directly in your HTML, you can use CSS to change the color by targeting the fill or stroke attributes.

    Example:

    html
    • Use fill for elements filled with color (e.g., rect, circle).

    • Use stroke for elements that have an outline (e.g., lines, paths).


    2. Using an External SVG with the filter Property

    If the SVG is used as an img tag and cannot be edited inline, you can use the filter property to apply a colorization effect. This approach works by applying a color overlay on the entire image.

    Example:

    html
    <img src="image.svg" class="colorize-img" alt="SVG Image" /> <style> .colorize-img { filter: invert(24%) sepia(86%) saturate(745%) hue-rotate(330deg) brightness(96%) contrast(91%); } </style>

    You can generate specific color filter values using online tools.


    3. Using mask or background

    This method is useful for applying colors to SVGs used as background images.

    Example with mask:

    html
    <div class="colored-svg"></div> <style> .colored-svg { width: 100px; height: 100px; background: red; /* Desired color */ -webkit-mask: url('image.svg') no-repeat center; mask: url('image.svg') no-repeat center; -webkit-mask-size: contain; mask-size: contain; } </style>

    Example with background:

    html
    <div class="svg-bg"></div> <style> .svg-bg { width: 100px; height: 100px; background-image: url('image.svg'); background-color: red; /* Background color to show through the SVG */ -webkit-mask: url('image.svg') no-repeat center; mask: url('image.svg') no-repeat center; } </style>

    4. Using CSS Variables for Reusable Color Changes

    Inline SVGs can use CSS variables to make color changes reusable and dynamic.

    Example:

    html

    Notes:

    • Inline SVGs give you the most flexibility for styling.

    • For external SVGs, filter or mask are good alternatives when you cannot edit the SVG directly.

    • If you have a choice, prefer inline SVGs when you anticipate the need for frequent customization.

    Let me know which method you'd like more details about!

     
    You said:
    use method 2 and filter from black to this color #E5097F
     
    ChatGPT said:

    To use Method 2 with a filter to colorize a black SVG image to #E5097F, you can calculate the filter values for the desired color. Here's how you can do it:


    HTML & CSS Example:

    html
    <img src="black-image.svg" class="colorize-img" alt="SVG Image" /> <style> .colorize-img { filter: invert(14%) sepia(92%) saturate(750%) hue-rotate(328deg) brightness(93%) contrast(101%); } </style>

    Explanation:

    1. Base Color: Start with the black SVG image (#000000).

    2. Target Color: The desired color is #E5097F (a pinkish shade).

    3. Filter Values:

      • invert(14%): This adjusts the base black color.

      • sepia(92%): Adds richness and warmth to the hue.

      • saturate(750%): Intensifies the color vibrancy.

      • hue-rotate(328deg): Shifts the hue to match the target pink color.

      • brightness(93%): Controls the overall lightness.

      • contrast(101%): Adjusts the contrast slightly for better matching.

    These filter values are calculated using online tools or trial-and-error to closely match the target color.


    How to Generate Filters for Other Colors:

    You can use an online tool like CSS Filter Generator by Angelos Chalaris (search for it) to compute filter values for any color.

     

  2. varianta

2025-06-17 13:13
Jan Hrdlicka

Captcha

https://www.cloudflare.com/application-services/products/turnstile/

1. hCaptcha

  • Website: https://www.hcaptcha.com

  • Pros:

    • Free for most users (Pro plan available).

    • Privacy-focused (GDPR/CCPA compliant).

    • Often used as a drop-in replacement for reCAPTCHA.

  • Cons:

    • Some users find the challenges as annoying as reCAPTCHA.

    • Can be difficult for users with accessibility needs.


2. Cloudflare Turnstile

  • Website: https://www.cloudflare.com/products/turnstile/

  • Pros:

    • Invisible CAPTCHA (no challenge to solve).

    • Super fast and frictionless.

    • Doesn’t track users or require cookies.

    • Free to use, even if you're not a Cloudflare customer.

  • Cons:

    • Still in relatively early adoption, so community support is smaller.


3. Friendly Captcha

  • Website: https://friendlycaptcha.com

  • Pros:

    • Privacy-first (no user tracking, GDPR compliant).

    • No image selection – uses a cryptographic puzzle in the background.

    • Accessible and user-friendly.

  • Cons:

    • Paid plans for higher usage.

    • More backend-oriented (less visible to the user).


4. GeeTest CAPTCHA

  • Website: https://www.geetest.com

  • Pros:

    • Uses “slide to verify” CAPTCHA – interactive and fast.

    • AI-powered risk analysis.

    • Customizable for your brand.

  • Cons:

    • Mostly used in China and APAC markets.

    • Not as privacy-friendly as some others.


5. Botpoison

  • Website: https://botpoison.com

  • Pros:

    • Invisible protection – no user interaction.

    • Easy to integrate with JavaScript.

    • Works well with SPAs and forms.

  • Cons:

    • Less proven than older CAPTCHA solutions.

    • May not work as well in extremely high-risk scenarios.


Honorable Mentions

  • MTCaptcha – Enterprise-ready, privacy-focused, accessible.

  • KeyCAPTCHA – Combines CAPTCHA with advertising or promotional content.

  • CaptchaFox – Open-source CAPTCHA system focused on ethical data handling.


Recommendation Summary

Use Case Best Alternative
Privacy-focused Friendly Captcha, Turnstile
Frictionless/invisible Cloudflare Turnstile, Botpoison
High traffic / scale hCaptcha, Turnstile
Chinese market GeeTest
Accessibility concerns Friendly Captcha

2025-08-08 19:40
Jan Hrdlicka

AI Agents andTools

https://inspector.dev/php-ai-agent-summarizing-youtube-videos/

2025-08-13 02:59
Jan Hrdlicka

Forms, multipart forms

Ukládání do databáze a předávání identifikátoru. Při prvním odeslaném formuláři si veškerá získaná data uložíme do databázové tabulky a vygenerujeme náhodný identifikár (třeba 10 znaů dlouhý řetězec), který budeme předávat mezi stránkami jako parametr. Výhoda je ta, že při zpracování libovolného formuláře nově získaná a zvalidovaná data rovnou zapíšeme do tabulky, přičemž v případě selhání máme fyzicky zálohované i rozepsané formuláře a můžeme se podle nich zařídit. Například při nedokončené objednávce můžeme uživateli poslat e-mail, že ji nedokončil a zvýšit tak šanci na prodej.

2. Honeypot (skryté pole)

3. Rate limiting & throttling
Na serveru omezíš počet požadavků z jedné IP za určité časové období (např. max 5 formulářů za minutu).

Výhoda: chrání proti útokům se stovkami requestů.

Nevýhoda: nemusí zabránit chytrému spamu z různých IP.

2025-09-10 07:36
Jan Hrdlicka

Vue and React comparision

React and Vue are both popular JavaScript frameworks for building user interfaces, but they have distinct philosophies and approaches. Here's a comprehensive comparison:

Philosophy & Approach

React follows a "just the library" philosophy. It focuses solely on the view layer and gives you complete freedom in how you structure your application. React embraces functional programming concepts and uses a unidirectional data flow.

Vue takes a more opinionated, "progressive framework" approach. It provides more built-in functionality out of the box and can be incrementally adopted in existing projects. Vue combines the best of both template-based and component-based approaches.

Syntax & Templates

React uses JSX (JavaScript XML), which allows you to write HTML-like syntax directly in JavaScript:

 
const Component = () => {
  const [count, setCount] = useState(0);
  return <div onClick={() => setCount(count + 1)}>{count}</div>;
};

Vue uses HTML-based templates with special directives, which feels more familiar to traditional web developers:

 
<template>
  <div @click="increment">{{ count }}</div>
</template>
<script>
export default {
  data() {
    return { count: 0 };
  },
  methods: {
    increment() { this.count++; }
  }
};
</script>

Learning Curve

React has a steeper learning curve. You need to understand JSX, functional programming concepts, hooks, and often additional libraries for routing and state management.

Vue is generally considered more beginner-friendly. Its template syntax is closer to standard HTML, and its API is more intuitive for developers coming from other frameworks.

Performance

Both frameworks offer excellent performance:

React uses a virtual DOM and reconciliation algorithm. Performance optimization requires understanding concepts like useMemo, useCallback, and React.memo.

Vue also uses a virtual DOM but with a more efficient reactivity system. Vue 3 introduced a composition API and better tree-shaking, making it very performant out of the box.

Ecosystem & Tooling

React has a massive ecosystem with countless third-party libraries. Popular tools include:

  • Create React App / Vite for project setup
  • React Router for routing
  • Redux/Zustand for state management
  • Next.js for full-stack development

Vue has a more centralized ecosystem with official libraries:

  • Vue CLI / Vite for project setup
  • Vue Router (official routing solution)
  • Vuex/Pinia for state management
  • Nuxt.js for full-stack development

Community & Job Market

React has a larger community and job market. It's backed by Meta (Facebook) and has wider industry adoption, especially in large enterprises.

Vue has a passionate, growing community. While smaller than React's, it's very active and supportive. Vue is backed by a dedicated team and has strong adoption in Asia and among independent developers.

Key Strengths

React Strengths:

  • Massive ecosystem and community
  • Excellent for large, complex applications
  • Strong TypeScript support
  • Flexible architecture
  • Better job market opportunities

Vue Strengths:

  • Gentler learning curve
  • Excellent developer experience
  • Built-in solutions reduce decision fatigue
  • Great documentation
  • Smaller bundle sizes
  • Better performance out of the box

When to Choose Which

Choose React when:

  • Building large, complex applications
  • Your team has strong JavaScript/functional programming skills
  • You need maximum flexibility and ecosystem options
  • You're working in an enterprise environment
  • You prioritize job market opportunities

Choose Vue when:

  • You want faster development with less boilerplate
  • Your team includes developers new to modern JavaScript frameworks
  • You prefer convention over configuration
  • You're building small to medium-sized applications
  • You want excellent developer experience with minimal setup

Both frameworks are excellent choices for modern web development. React offers more flexibility and has a larger ecosystem, while Vue provides a more streamlined development experience with sensible defaults. The choice often comes down to team preferences, project requirements, and long-term maintenance considerations.

2025-09-15 08:47
Jan Hrdlicka

Skripty od ChatGPT (či jiné AI)

Jak zadávat požadavky ChatGPT

  • Dát modelu specifikaci prostředí: OS, verze Pythonu/Node, dostupné knihovny, omezení (proxy, firewally).
  • Požadovat strukturovaný výstup (JSON/patch/diff), aby se dal snadno aplikovat.
  • Žádat nejmenší nutnou změnu („minimal patch“), ne vždy celý soubor.
  • Nechat si vypsat edge cases a generovat k nim testy.
  • Požadovat komentáře k designovým volbám (proč X, ne Y).

Spouštění & konfigurace

  • Konfigurační vrstva: .env / YAML / CLI přepínače; precedence (ENV > CLI > config).
  • Verbose / dry-run / debug módy.
  • Exit kódy a jednotná chybová hlášení pro skriptování v CI.

Logování & pozorovatelnost (navázat na tvé body)

  • Úrovně logů (INFO/DEBUG/WARN/ERROR) + strukturované logy (JSON).
  • Rotace logů (size/time-based), ne jen „promazat při startu“.
  • Notifikace: při pádu/úspěchu (e-mail, webhook, systémové upozornění), nejen „beep“.
  • Měření doby běhu, počty zpracovaných položek, jednoduché metriky.

Spolehlivost & odolnost

  • Timeouty na IO/HTTP a retry s exponenciálním backoffem + jitter.
  • Idempotence (bezpečné opakování po pádu).
  • Dočasné soubory a atomické zápisy (write-temp → rename).
  • Zámky/file locking u souběžných běhů.
  • Graceful shutdown (SIGINT/SIGTERM).

Bezpečnost

  • Správa tajemství (API klíče jen z ENV/secret manageru; nikdy do repo).
  • Sanitizace vstupů; pozor na shell injection u subprocess.
  • Omezení přístupů (práce jen v určeném adresáři, práva souborů).
  • Redakce logů (nevypisovat PII/klíče).

Testování & kvalita

  • Nechat ChatGPT vygenerovat unit testy (pytest/unittest) a falešná data.
  • Lint/format (ruff/flake8, black, prettier) + type hints (mypy/pyright).
  • CI kontrola: testy, lint, bezpečnostní skeny (např. bandit).

Závislosti & prostředí

  • Reproducibilita: requirements.txt/poetry.lock, pipx pro CLI, verze nástrojů.
  • Virtuální prostředí/containers (Docker) pro izolaci.
  • Kompatibilita napříč OS (cesty, kódování, CRLF/LF, lokály).

Vstup/Výstup & data

  • Kódování (UTF-8), normalizace konců řádků.
  • Validace vstupních souborů (CSV/JSON schéma).
  • Streamování velkých dat, batching, caching (např. HTTP etag/If-Modified-Since).
  • Progres (tqdm) u dlouhých běhů.

Paralelizace & výkon

  • Volba mezi asyncio / threads / multiprocessing (IO vs CPU bound).
  • Omezení souběhu (semafory, rate-limit), aby se nezahltily API/disky.
  • Profilace (time/perf counter) a základní optimalizace paměti.

Integrace ChatGPT API (pokud používáš)

  • Volba modelu a determinismus (seed), temperature pro stabilnější kód.
  • JSON/structured output a tools/function calling (schémata, Pydantic).
  • Kontrola nákladů: logování tokenů, metriky, rozumné promptování.
  • Fallback modelů, rate-limit handling, streaming vs. celé odpovědi.
  • Chunking delších souborů, kontextová okna, cache odpovědí.

Síť & provoz

  • Proxy podpora (HTTP/HTTPS), timeouts, retry politiky.
  • Plánování: cron/Systemd/Task Scheduler, watchdog, restart po chybě.
  • Zdravotní kontrola (health-check) pro dlouho běžící služby.

Dokumentace & údržba

  • Krátké README: jak spustit, požadavky, příklady.
  • Verzování skriptu a changelog.
  • Licence/poznámky ke třetím knihovnám.

UX drobnosti

  • Barevný/čistý CLI výstup (ale s přepínačem –no-color).
  • Interaktivní potvrzení u nevratných operací, –yes pro automatizaci.
  • Sensible defaults + jasná nápověda –help.

Co si nechat od ChatGPT rovnou vygenerovat

  • Skeleton projektu (struktura adresářů).
  • Konfig šablony (.env.example, YAML).
  • Makefile/Taskfile pro běžné úlohy (test, lint, run).
  • CI workflow (GitHub Actions/GitLab CI).
  • Migrační plán/refactor diff a rollback instrukce.

2025-09-17 15:15
Jan Hrdlicka

PrintEQ errors

'Call to a member function addResult() on bool'


// ensure we have a valid Calculation object (calculatePrint may return false on error)
if (!is_object($calculation) || !method_exists($calculation, 'addResult')) {
$tmp = new Calculation();
$tmp->errors[] = 'Chyba při výpočtu tisku';
$calculation = $tmp;
}

2025-10-17 16:35
Jan Hrdlicka

Pass variable to react

Option 1: Pass via a global JS variable (Recommended)

<?php
  $id = 123; // or from $_GET['id'], database, etc.
?>
<!DOCTYPE html>
<html>
  <head>
    <script>
      window.APP_CONFIG = {
        id: <?php echo json_encode($id); ?>
      };
    </script>
    <script crossorigin src="/assets/index-CMEaKdhP.js"></script>
    <link rel="stylesheet" crossorigin href="/assets/index-_BL4jukc.css">
  </head>
  <body>
    <div id="root"></div>
  </body>
</html>

const id = window.APP_CONFIG?.id;
console.log('ID from PHP:', id);

// Example: fetch data from API
useEffect(() => {
  if (id) {
    fetch(`/api/data?id=${id}`)
      .then(res => res.json())
      .then(setData);
  }
}, [id]);

2025-10-31 09:04
Jan Hrdlicka

CURL

   curl -X POST http://your-domain/orderconfirmed \
     -H "Content-Type: application/json" \
     -d '{"hash":"your-hash-value"}'

   curl -X POST http://your-domain/orderconfirmed \
     -H "Content-Type: application/x-www-form-urlencoded" \
     -d "hash=your-hash-value"

2025-12-30 19:58
Jan Hrdlicka

API call restrictions

The API key method is simplest for internal scripts, while JWT is better if you need token expiration and more security.

  1. API Key Authentication (Simple & Effective

<?php
// api/config.php
define('VALID_API_KEYS', [
    'abc123xyz789' => 'analytics_script',
    'def456uvw012' => 'reporting_script',
    'ghi789rst345' => 'backup_script'
]);

// api/auth.php
function validateApiKey() {
    $headers = getallheaders();
    $apiKey = $headers['X-API-Key'] ?? $_GET['api_key'] ?? null;
    
    if (!$apiKey || !array_key_exists($apiKey, VALID_API_KEYS)) {
        http_response_code(401);
        echo json_encode(['error' => 'Unauthorized - Invalid API key']);
        exit;
    }
    
    return VALID_API_KEYS[$apiKey];
}

// api/endpoint.php
require_once 'config.php';
require_once 'auth.php';

$scriptName = validateApiKey();

// Your API logic here
echo json_encode([
    'status' => 'success',
    'data' => 'Your data here',
    'accessed_by' => $scriptName
]);

Client script usage:

<?php
$apiKey = 'abc123xyz789';
$url = 'https://your-domain.com/api/endpoint.php';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'X-API-Key: ' . $apiKey
]);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
print_r($data);

2. JWT Token Authentication (More Secure)

<?php
// Install: composer require firebase/php-jwt
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
// api/jwt_auth.php
class JWTAuth {
    private static $secret = 'your-secret-key-change-this'; // Store in environment variable
    
    public static function generateToken($clientId, $expiresIn = 3600) {
        $payload = [
            'iss' => 'your-domain.com',
            'aud' => 'your-api',
            'iat' => time(),
            'exp' => time() + $expiresIn,
            'client_id' => $clientId
        ];
        
        return JWT::encode($payload, self::$secret, 'HS256');
    }
    public static function validateToken() {
        $headers = getallheaders();
        $authHeader = $headers['Authorization'] ?? '';
        
        if (!preg_match('/Bearer\s+(.*)$/i', $authHeader, $matches)) {
            http_response_code(401);
            echo json_encode(['error' => 'No token provided']);
            exit;
        }
        
        $token = $matches[1];
        
        try {
            $decoded = JWT::decode($token, new Key(self::$secret, 'HS256'));
            return $decoded->client_id;
        } catch (Exception $e) {
            http_response_code(401);
            echo json_encode(['error' => 'Invalid token: ' . $e->getMessage()]);
            exit;
        }
    }
}
// api/get_token.php - Script calls this first to get token
require_once 'jwt_auth.php';
$clientId = $_POST['client_id'] ?? '';
$clientSecret = $_POST['client_secret'] ?? '';
// Validate client credentials
$validClients = [
    'script1' => 'secret123',
    'script2' => 'secret456'
];
if (!isset($validClients[$clientId]) || $validClients[$clientId] !== $clientSecret) {
    http_response_code(401);
    echo json_encode(['error' => 'Invalid credentials']);
    exit;
}
$token = JWTAuth::generateToken($clientId);
echo json_encode([
    'access_token' => $token,
    'token_type' => 'Bearer',
    'expires_in' => 3600
]);
// api/protected_endpoint.php
require_once 'jwt_auth.php';
$clientId = JWTAuth::validateToken();
echo json_encode([
    'status' => 'success',
    'data' => 'Your protected data',
    'client' => $clientId
]);

3. IP Whitelisting

<?php
// api/ip_whitelist.php
function validateIP() {
    $allowedIPs = [
        '192.168.1.100',
        '10.0.0.5',
        '203.0.113.45'
    ];
    
    $clientIP = $_SERVER['REMOTE_ADDR'];
    
    // If behind proxy, get real IP
    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $clientIP = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])[0];
    }
    
    if (!in_array($clientIP, $allowedIPs)) {
        http_response_code(403);
        echo json_encode(['error' => 'Access denied from IP: ' . $clientIP]);
        exit;
    }
}
// api/endpoint.php
require_once 'ip_whitelist.php';
validateIP();
// Your API logic

4. Combined Approach (Recommended)

<?php
// api/secure_auth.php
class SecureAuth {
    private static $apiKeys = [
        'abc123xyz789' => [
            'name' => 'analytics_script',
            'allowed_ips' => ['192.168.1.100'],
            'rate_limit' => 100 // requests per hour
        ]
    ];
    
    public static function validate() {
        // Check IP
        self::validateIP();
        
        // Check API Key
        $apiKey = self::getApiKey();
        
        // Check rate limit
        self::checkRateLimit($apiKey);
        
        return self::$apiKeys[$apiKey]['name'];
    }
    
    private static function getApiKey() {
        $headers = getallheaders();
        $apiKey = $headers['X-API-Key'] ?? null;
        
        if (!$apiKey || !isset(self::$apiKeys[$apiKey])) {
            http_response_code(401);
            echo json_encode(['error' => 'Invalid API key']);
            exit;
        }
        
        return $apiKey;
    }
    
    private static function validateIP() {
        $clientIP = $_SERVER['REMOTE_ADDR'];
        $apiKey = getallheaders()['X-API-Key'] ?? null;
        
        if ($apiKey && isset(self::$apiKeys[$apiKey])) {
            $allowedIPs = self::$apiKeys[$apiKey]['allowed_ips'];
            if (!in_array($clientIP, $allowedIPs)) {
                http_response_code(403);
                echo json_encode(['error' => 'IP not authorized']);
                exit;
            }
        }
    }
    
    private static function checkRateLimit($apiKey) {
        session_start();
        $key = 'rate_limit_' . $apiKey;
        $limit = self::$apiKeys[$apiKey]['rate_limit'];
        $window = 3600; // 1 hour
        
        if (!isset($_SESSION[$key])) {
            $_SESSION[$key] = ['count' => 0, 'start' => time()];
        }
        
        $data = $_SESSION[$key];
        
        // Reset if window expired
        if (time() - $data['start'] > $window) {
            $_SESSION[$key] = ['count' => 1, 'start' => time()];
            return;
        }
        
        // Check limit
        if ($data['count'] >= $limit) {
            http_response_code(429);
            echo json_encode(['error' => 'Rate limit exceeded']);
            exit;
        }
        
        $_SESSION[$key]['count']++;
    }
}

5. Store Keys Securely

<?php
// .env file (never commit to git)
// API_KEY_SCRIPT1=abc123xyz789
// API_KEY_SCRIPT2=def456uvw012

// config.php
function getApiKeys() {
    return [
        getenv('API_KEY_SCRIPT1') => 'analytics_script',
        getenv('API_KEY_SCRIPT2') => 'reporting_script'
    ];
}

6. Complete Example with .htaccess Protection

# .htaccess - Force HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# Deny access to sensitive files
<Files "config.php">
    Require all denied
</Files>

2026-01-09 21:28
Jan Hrdlicka

External change css in vue.js app

Nejlepší řešení: CSS proměnné (design tokens) Tailwind konfigurovat přes CSS variables // tailwind.config.js export default { theme: { extend: { colors: { primary: 'rgb(var(--color-primary) / <alpha-value>)', success: 'rgb(var(--color-success) / <alpha-value>)', } } } } Použít je v komponentách

Barvy definovat mimo aplikaci /* theme.css – měnitelné bez buildění / :root { --color-primary: 37 99 235; / blue-600 / --color-success: 22 163 74; / green-600 */ }

Nebo dynamicky: <script> document.documentElement.style.setProperty( '--color-primary', '220 38 38' // red-600 ) </script>

Přepínání témat (light / dark / custom klient) :root[data-theme="blue"] { --color-primary: 37 99 235; }

:root[data-theme="red"] { --color-primary: 220 38 38; }

document.documentElement.dataset.theme = 'red'

nebo předevinovat po tailwindu /* overrides.css – načíst až po tailwind.css */ .btn-primary { background-color: rgb(var(--color-primary)); color: white; }

2026-01-11 12:44
Jan Hrdlicka

Správa serveru

Go to category

Composer

--ignore-platform-req=php - přidat na konec composer require  pokud systém hlásí problém s kompatibilitou php

error: Unknown package has no name defined.

The problem seems to be with parsing vendor/composer/installed.json Once I deleted it - install went well. Even without deleting other files. This one is generated one. You can also simply remove whole vendor/composer directory.

2025-01-29 15:55
Jan Hrdlicka

Change php versions

sudo a2enmod php8.1
sudo a2dismod php8.2
sudo service apache2 restart

sudo a2enmod php8.2
sudo a2dismod php8.1
sudo service apache2 restart

fpm:

sudo a2enconf php8.1-fpm
sudo a2disconf php8.2-fpm
sudo service apache2 restart

2025-08-21 16:31
Jan Hrdlicka

Switch php versions

update-alternatives --config php

https://www.baeldung.com/linux/switch-php-versions

2024-10-30 10:48
Jan Hrdlicka

Website health check

website health check is a comprehensive audit and monitoring process to evaluate the overall performance, security, and functionality of a website. The goal is to identify and fix potential issues before they negatively impact user experience, search engine rankings, or business operations. 
Think of it as a regular tune-up for your online presence, ensuring it is running optimally. 
 
Key Areas of a Website Health Check
A thorough website health check typically examines several critical areas: 
  • Performance and Speed: This involves testing how quickly pages load on different devices (desktop and mobile). A slow website can lead to a high "bounce rate" (visitors leaving quickly) and lower search engine rankings.
  • Security: Checks are performed to identify vulnerabilities, security threats, and potential loopholes that could be exploited by hackers. This includes ensuring SSL certificates are correctly installed and up-to-date.
  • Functionality: This verifies that all interactive elements, such as links, forms, and third-party integrations (like payment systems or booking tools), are working correctly. Broken features can frustrate users and result in lost business.
  • User Experience (UX) and Accessibility: The check assesses how easy the website is to navigate and use for all visitors, including those with disabilities. It ensures the site is mobile-responsive, as much traffic comes from mobile devices.
  • Search Engine Optimization (SEO) & Visibility: This analysis ensures the website can be easily found and indexed by search engines like Google. It covers aspects like keyword optimization, content quality, and technical SEO elements (like Core Web Vitals) to boost organic traffic.
  • Software and Infrastructure: For websites built on platforms like WordPress, the check includes updating the core software, plugins, and libraries to ensure they are secure and compatible. It also covers server reliability and uptime. 
 
Why are they important?
Regular website health checks help you:
  • Prevent costly problems: Catching issues early, such as security vulnerabilities or performance degradation, prevents major data breaches or downtime.
  • Improve customer satisfaction: A fast, functional, and secure website provides a seamless user experience, which retains visitors and encourages sales or engagement.
  • Maintain search visibility: Search engines favor healthy, high-performing websites. Regular checks help maintain or improve your ranking in search results.
  • Ensure compliance: Audits can identify potential legal or regulatory problems, such as GDPR (General Data Protection Regulation) issues or accessibility standards failures. 
Many free tools are available for basic checks, such as Google PageSpeed Insights for performance and Google Search Console for SEO health and errors. 

2025-12-15 10:50
Jan Hrdlicka

Node.js server with Apache pm2

sudo npm install -g pm2
pm2 start npm --name "react-ssr-app" -- serve

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod lbmethod_byrequests
sudo systemctl restart apache2

npm run build
node dist/server/index.js
or better using:
pm2 start dist/server/index.js --name ssr-app
pm2 save
pm2 delete 0
pm2 restart 0

2025-12-15 21:39
Jan Hrdlicka

ssh and rsync without password

ssh-keygen -t ed25519 -C "ubuntu-to-debian-rsync"
ssh-copy-id user@debian_server_ip

(Volitelné) Explicitní SSH klíč Pokud máš více klíčů:
rsync -avz -e "ssh -i ~/.ssh/id_ed25519" /data/ user@debian:/backup/data/

(Doporučeno) Omezení klíče jen na rsync
Na Debian serveru v authorized_keys:
command="rsync --server --daemon ." ssh-ed25519 AAAA...
nebo aspoň
from="IP_UBUNTU" ssh-ed25519 AAAA...

2026-01-20 10:14
Jan Hrdlicka

Rafo

Go to category

Rafo luya forms

problém chyba Getting unknown property: luya\forms\Model::_attributeHints nefungovalo ani po zkopírování modulu z tiskplus.cz

Fixnuto následovně:

Forms.php zakomentováno
public function setAttributeHint($attribute, $hint)
{
//JHIfix - zakomentovano - nefungovalo u rafa $this->model->_attributeHints[$attribute] = $hint;

}

nefungovali labels
fixnuto:
blocks/TextBlock.php
//JHFIx - nezobrazoval se label
return $this->getVarValue('isTextarea') ? $activeField->textArea(['rows' => $this->getCfgValue('textareaRows', null)])->label($this->getVarValue($this->varLabel)) : $activeField->textInput()->label($this->getVarValue($this->varLabel));
}

2023-02-23 10:57
Jan Hrdlicka

Přílohy e-mailů obch. podmínky a Reklamační formulár

nastavuje se v configu frontendu - Luya:
'emailAttachements' => ['1'=> ['https://www.rafo.cz/storage/obchodni-podminky_7e0190ab.pdf',
'https://www.rafo.cz/storage/odstoupeni-od-smlouvy_4984ddcc.pdf'],
'-4'=> ['https://www.rafo.cz/storage/obchodni-podminky_7e0190ab.pdf',
'https://www.rafo.cz/storage/odstoupeni-od-smlouvy_4984ddcc.pdf'],
],

1 a -4 jsou stavy objednávek ve kterých příloha přijde (1= nová, -4 = nová objednávka odložená platba ke schválení - při zaškrtnutí platba kartou online)
Pozn. u rafo.cz platba online se přesměrování na platební bránu neprovede ihned po objednání, ale až po schválení objednávky, kdy přijde uživateli e-mail s proklikem na web a provedení platby. 

Soubory se nahrávají přes administraci https://www.rafo.cz/admin/login a jsou v sekci Soubory->Dokumenty
Při aktualizaci je nutno dát "Replace", aby zůstal zachován název souboru, jinak by se musel název souboru změnit v configu frontendu - Luya.

2023-03-27 13:30
Jan Hrdlicka

RAFO CMS nastavení

Menu, položky a pořadí

se nastavuje v  Systém->Konfigurace proměnné. Do položky přidat id dané stránky. 

Obrázek se bere ze SEO

Obsah stránek - rozcestníků (stránky obsahující podstránky) se upravuje ručně na dané stránce.

2024-05-06 16:53
Jan Hrdlicka

Onlineplatba generování platby

pokud zadáte url https://www.rafo.cz/onlineplatba?generate=1

a kliknete na "Generovat URL", tak se vygeneruje url v modrém boxu, které když zadáte do prohlížeče, tak se zobrazí nadefinované hodnoty.

https://www.rafo.cz/onlineplatba 

2024-03-21 18:02
Jan Hrdlicka

mgrconsulting

Go to category

CMS mgrconsulting

Základní návod CMS:

Stránky (pages) - https://www.cebin.info/index.php?action=faq&cat=19&id=41&artlang=cs

Práce s bloky: https://www.cebin.info/index.php?action=faq&cat=19&id=43&artlang=cs

SEO - nastavení titulků, metapopisků - https://www.cebin.info/index.php?action=faq&cat=19&id=42&artlang=cs

Práce s textem - markdown značky - https://www.cebin.info/index.php?action=faq&cat=19&id=44&artlang=cs

Layouty

  • Homepage - titulní stránka
  • Main - základní layout - pouze obsah
  • Mainwithimage - layout stránky, kde je na začátku před obsahem obrázek

Bloky

předdefinované:
  • Heading - nadpisy H1, H2, ...
  • Carousel - foto v úvodu stránky

upravené na míru:

  • TextimageBlock - zobrazení bloků Headhunging, IT requirement a RPO s proklikem na "více"
Bloky pro práci s mřížkou bootstrapu:
  • ColBlock
  • RowBlock

Tagy

blockquote - zvýrazněný text na stránkách
označení v Markdown textu: ">" 
např. > Relocation package for free

Moduly

předdefinované:
  • Files - nahrávání souborů a obrázků
  • Forms - práce s formuláři
moduly na míru:

Jobsoffer - nastavení pracovních pozic

  • Jobsoffer - pracovní pozice
  • Contact - nastavení členů týmu - zobrazuje se na stránce https://mgrconsulting.cz/en/our-team ve formě vizitek a u jednotlivých inzerátů

2023-07-28 16:50
Jan Hrdlicka

Mojetisky

Go to category

Mojetisky.cz

Lamina a ražba

  Lesk 1/0 + 150,- příprava Lesk 1/1 Mat 1/0 + 150,- příprava Mat 1/1 Nepoškrabatelné Mat Antiscuff 1/0 + 150,- příprava Nepoškrabatelné Mat Antiscuff 1/1 Samet 1/0 (soft) + 150,- příprava Samet 1/1 (soft) Zlatá ražba 1/0 + 150,- příprava Zlatá ražba 1/1 Růžová ražba 1/0 + 150,- příprava Růžová ražba 1/1 Efektová ražba 1/0 + 150,- příprava Efektová ražba 1/1
Vizitky laminoleskvizitky1s laminoleskvizitky2s laminomatvizitky1s laminomatvizitky2s - - laminosofttouchvizitky1s laminosofttouchvizitky2s zlatarazbavizitky1s zlatarazbavizitky2s ruzovarazbavizitky1s ruzovarazbavizitky2s efektovarazbavizitky1s efektovarazbavizitky2s
Digi SRA3 laminodigilesk1s laminodigilesk2s laminodigimat1s laminodigimat2s - - laminosofttouchdigi1s laminosofttouchdigi2s zlatarazbadigi1s zlatarazbadigi2s ruzovarazbadigi1s ruzovazbadigi2s efektovarazbadigi1s efektovarazbadigi2s
353 x 500 mm laminolesk1s laminolesk2s laminomat1s laminomat2s laminoantiscuff1s laminoantiscuff1s laminosofttouch1s laminosofttouch2s - - - - - -
500 x 707 mm laminolesk1s laminolesk2s laminomat1s laminomat2s laminoantiscuff2s laminoantiscuff2s laminosofttouch1s laminosofttouch2s - - - - - -
333 x 700 mm laminolesk1s laminolesk2s laminomat1s laminomat2s - - laminosofttouch1s laminosofttouch2s - - - - - -

2023-12-11 09:21
Jan Hrdlicka

Slevové kupony


1. sleva při registraci 15 %.

Po potvrzení registrace, tzn. pokud uživatel vyplní a odešle formulář https://www.mojetisky.cz/user/register, přijde mu do e-mail potvzrovací odkaz. V okamžiku kdy odkaz potvrdí mu systém vytvoří slevový kupon odešle e-mail se slevovým kupónem.

Text e-mailu je možno editovat zde https://admin.mojetisky.cz/email-templates/default/update?id=10 - místo proměnných {coupon_code} a {coupon_valid_to}

systém automaticky doplní hodnoty.

2. sleva na další objednávku 10%.
Slevu systém vygeneruje a e-mail automaticky odešle v okamžitku, pokud v administraci  v detailu objednávky změníte stav "Dodáno" na nao.

Text e-mailu měníte zde https://admin.mojetisky.cz/email-templates/default/update?id=11

Platnosti všech kódů jsou nastaveny na 6 měsíců. Nastavuje se v configu. Kód 1 - registrační je v configu frontendu, Kód 2 nová objednávka je v configu backendu.
'createCodeAtRegister'=> ['value'=> 15, 'is_percent' => 1,'valid_to' => '+6 months'],
'createCodeAtOrder'=> ['value'=> 10, 'is_percent' => 1,'valid_to' => '+6 months'],

2023-12-11 09:20
Jan Hrdlicka

Napojení na idoklad

Skript pro import a synchronizaci účtů

./luya conversion/import/import-idoklad-accounts

Firmy jsou synchronizovány - na stránce https://admin.mojetisky.cz/account/index
je ve sloupci Externí ID nastaveno číslo firmy pod kterým je vedena v idokladu - viz. obr.
Firmy které toto číslo nemají skript v idokladu nenašel, při psaní faktrury se tedy vytvoří firma.

Návod je zde: https://www.printeq.cz/dokumentace/fakturace

Máte 2 možnosti - buď systém vytvoří fakturu a ihned jí odešle, nebo pouze fakturu vytvoří a musíte jí z iDokladu odeslat ručně.
https://www.printeq.cz/storage/0_detail-faktura_4d96bca9.png

Pokud neexistuje firma, automaticky se doplní do kontaků v iDokladu. Pokud u firmy neexistuje e-mail, doplní se do iDokladu z adresáře kontatků aplikace https://admin.mojetisky.cz/account/index

2023-12-11 10:06
Jan Hrdlicka

Modernivcelar.eu

Go to category

modernivcelar.eu - vkládání obrázků, info

Vkládání obrázků do textu

Postup je následující:

1. vytvořím obrázek pomocí snímku části obrazovky (ve Windows lze použít např. program lightschot

2. obrázek nahraju na server v adminstraci - správa souborů https://www.modernivcelar.eu/admin#!/template/admin~2Fstorage~2Findex

3. kliknu na obrázek pravým tlačítkem myši a zvolím "Zobrazit obrázek - otevřít obrázek v novém panelu "

4. url obrázku zkopíruju a přes ikonu obrázku vložím do textu.

Změněné komponenty z vendors:

/bootstrap3/ImageBlock - upraveno tak, že po kliknutí na obrázek se zvětší, přidáno tlačítko s odkazem a text tlačítka je obsah caption. Pokud je prázdný tak se zobrazí "více".

2024-03-04 14:37
Jan Hrdlicka

Změna pořadí autorů

1. V přehledu článků kliknout na záložku "Autoři" u daného článku

2. Pomocí šipek změnit pořadí autorů

2024-03-04 14:53
Jan Hrdlicka

Kantynafotolab

Go to category

Jídelní lístek

Pokud je v administrsaci zapomenutá stará položka,
jídelní lístek se rozhodí, je potřeba aby si uživatel hlídal a staré položky dával offline nebo je mazal.

2024-04-29 10:31
Jan Hrdlicka

Nextcloud

Go to category

Nextcloud gridview

Display Grid View as default in shared links

  1. Open core/js/public/publicpage.js.
  2. Inside the window.addEventListener('DOMContentLoaded', function () { closure, add the JS.
  3. Save.

Append #view-grid to any shared URL.
For example...
https://YourDrive.com/s/daBAWTg3aa3FMLS#view-grid

// Execute if onlyOnViewGrid is false or if the URL hash is "#view-grid"



let onlyOnViewGridUrl = true;



if (!onlyOnViewGridUrl || (onlyOnViewGridUrl && window.location.hash === "#view-grid")) {



    $('#view-toggle').removeClass('icon-toggle-pictures').addClass('icon-toggle-filelist');



    $('.files-filestable').addClass('view-grid');



}

2024-07-19 10:17
Jan Hrdlicka

Nextcloud install and update

Before update - delete nextcloud.log file and set config_is_read_only = false in config/config.php

sudo -u nextcloud /usr/bin/php /var/www/nextcloud.cebin.info/web/updater/updater.phar 

sudo -u nextcloud /usr/bin/php /var/www/nextcloud.cebin.info/web/occ db:add-missing-primary-keys

2025-11-23 14:00
Jan Hrdlicka

Yii2

Go to category

yii2 validation rules

[['number_of_pieces1'],'number','min'=>$this->min_pieces, 'tooSmall' => 'Minimální náklad je 10 ks.','on' => self::SCENARIO_DEFAULT],
[['number_of_pieces1'],'number','max'=>$this->max_pieces, 'tooBig' => 'Maximální náklad je 1000 ks.','on' => self::SCENARIO_DEFAULT],

[['width','height'], 'compare', 'compareValue' => 2, 'operator' => '>=', 'type' => 'number'],
[['width'], 'number', 'max' => 100,'message' => 'Maximální šířka je 50 cm.' ],
[['height'], 'compare', 'compareValue' => 50, 'operator' => '<=', 'type' => 'number','message' => 'Maximální výška je 50 cm.'],
[['number_of_pieces1','number_of_pieces2','number_of_pieces3'], 'compare', 'compareValue' => 1000, 'operator' => '<=', 'type' => 'number'],
[['width','height',], 'custom_validation','skipOnEmpty' => false, 'skipOnError' => false]

 

public function custom_validation($attribute, $params,$validator){
if(empty($this->$attribute ) || (!is_numeric($this->$attribute ))){
$validator->addError($this, $attribute, 'Šířka a výška musí být číslo větší než 0');
}
}

    public function custom_validation($attribute, $params,$validator){
        if(empty($this->$attribute ) || (!is_numeric($this->$attribute ))){
           $validator->addError($this, $attribute, 'Šířka a výška musí být číslo větší než 0');
        }   else  {
            if( is_numeric($this->width) 
            && is_numeric($this->height) 
            && ($this->width * $this->height > 500)
        ) {
                
                if('width' == $attribute) {//aby se nezobrazovalo 2x pri vysce a sirce
                    $validator->addError($this, $attribute,'Max rozměr je 0.5 m<sup>2</sup>. 
Pro velké samolepky prosím přejděte na <a href="https://www.rafo.cz/velke-samolepky">velké samolepky</a>');
                }
            }    
        }   
        
    }

umber of pieces - /common/models/products/CalculationForm

(pokud je pouze1kalkulace, použije se pouze pravidlo number_pieces1)

[['number_of_pieces1','number_of_pieces2','number_of_pieces3'], 'piecesCriteria'],


public function piecesCriteria()
{ if(empty($this->number_of_pieces1)){
$this->addError('number_of_pieces1','Počet kusů nesmí být prázdný.');
}
if(empty($this->number_of_pieces2)){
$this->addError('number_of_pieces2','Počet kusů nesmí být prázdný.');
}
if(empty($this->number_of_pieces3)){
$this->addError('number_of_pieces3','Počet kusů nesmí být prázdný.');
}
// if(!preg_match('/[0-9]*/',$this->number_of_pieces1)){
}

2025-05-15 14:20
Jan Hrdlicka

Kartik DetailView

Test, zda je nový záznam nebo editace:
if($model->isNewRecord)

U nového záznamu zobrazit edit mód, u editace view mód:

if($model->isNewRecord) {
$mode = DetailView::MODE_EDIT;
} else {
$mode = DetailView::MODE_VIEW;
}

echo DetailView::widget([
....
'mode'=>$mode,

2025-03-31 16:50
Jan Hrdlicka

Directus

Go to category

Directus

Got it You want to install Directus on Debian. Ill give you a clean, step-by-step guide for a typical setup. Directus is a Node.js + SQL database app, so youll need Node, npm (or yarn), and a database (MySQL, PostgreSQL, or SQLite).


Step 1. Update system

 
sudo apt update && sudo apt upgrade -y

Step 2. Install Node.js + npm

Directus requires Node.js 18+.

 
# Install curl if not available sudo apt install -y curl # Add Node.js LTS repo (replace 18.x with 20.x if you want the latest LTS) curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - sudo apt install -y nodejs # Verify node -v npm -v

Step 3. Install a database

Directus supports PostgreSQL, MySQL/MariaDB, or SQLite.
Example with MariaDB (MySQL-compatible):

 
sudo apt install -y mariadb-server mariadb-client sudo systemctl enable mariadb sudo systemctl start mariadb

Secure the installation:

 
sudo mysql_secure_installation

Create a database and user for Directus:

 
CREATE DATABASE directus CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'directus_user'@'localhost' IDENTIFIED BY 'your_password'; GRANT ALL PRIVILEGES ON directus.* TO 'directus_user'@'localhost'; FLUSH PRIVILEGES; EXIT;

Step 4. Install Directus (globally or per project)

Option A: Global install

 
sudo npm install -g directus

Option B: Project install

 
mkdir ~/directus-project && cd ~/directus-project npm init directus-project .

Step 5. Configure Directus

Run the init command if you installed globally:

 
npx directus init

Provide:

  • Database client: mysql (or postgres, sqlite3)

  • Database host: 127.0.0.1

  • Database name: directus

  • Database user: directus_user

  • Database password: your_password

  • Port: 3306 (MySQL default)

This creates a .env file with config.


Step 6. Start Directus

 
npx directus start

By default, Directus runs on http://localhost:8055.
The first time you open it, youll be prompted to create an admin account.


Step 7. Run as a service (optional)

To keep Directus running in the background:

  1. Create a systemd service file:

     
    sudo nano /etc/systemd/system/directus.service
  2. Add:

     
    [Unit] Description=Directus Headless CMS After=network.target [Service] Type=simple User=www-data WorkingDirectory=/home/youruser/directus-project ExecStart=/usr/bin/npx directus start Restart=always [Install] WantedBy=multi-user.target
  3. Enable + start service:

     
    sudo systemctl daemon-reload sudo systemctl enable directus sudo systemctl start directus

At this point, Directus should be running at http://your-server-ip:8055


Do you want me to also show you how to set up NGINX reverse proxy + HTTPS (Lets Encrypt) so Directus can be accessed on a clean domain (e.g. cms.example.com)?

You said:
http://my-ip-address:8055 does not work
ChatGPT said:

Got it if http://your-ip:8055 doesnt load, lets troubleshoot step by step.


1. Check if Directus is running

Run this in the project folder:

 
npx directus start

You should see logs like:

 
Server started at http://0.0.0.0:8055

If you dont, there may be a DB config or Node.js issue.


2. Check port binding

By default, Directus sometimes binds to localhost only (127.0.0.1), so it wont be reachable externally.

Edit your .env file in your Directus project:

 
PORT=8055 HOST=0.0.0.0

Then restart Directus:

 
npx directus start

Now it should be listening on all interfaces.


3. Check firewall (UFW/iptables)

On Debian, port 8055 might be blocked. Run:

 
sudo ufw allow 8055/tcp sudo ufw reload

Check if its open:

 
sudo ufw status

4. Verify listening process

Run:

 
ss -tulnp | grep 8055

You should see something like:

 
tcp LISTEN 0 511 0.0.0.0:8055 0.0.0.0:* users:(("node",pid=12345,fd=23))

If it only shows 127.0.0.1:8055, then its still binding to localhost fix .env as above.


5. Access via IP

Try again from your browser:

 
http://YOUR_SERVER_IP:8055

If youre on the same machine, http://localhost:8055 should also work.


Question: Do you want me to also show you how to expose Directus on port 80/443 with Nginx + domain (so you can use http://cms.example.com instead of :8055)? That usually solves firewall + port headaches.

You said:
can directus be used as administration of web applications modules? for example products (e-shop), newsletter, blog, events, accounts and contacts usw...
ChatGPT said:

Yes Directus can absolutely be used as the administration backend for web application modules like products, newsletters, blogs, events, accounts, contacts, etc. In fact, thats exactly what it was designed for: managing structured data through a nice admin interface, while exposing it as an API for your frontend(s).

Lets map your examples:


Example Modules in Directus

Module How it works in Directus Notes
Products (E-shop) Create a products collection with fields (name, price, description, SKU, images, stock, category relation). Add categories collection with relation. Directus manages product data, but youd implement checkout, cart, payments in your app (Directus is not an e-commerce engine like Magento/Shopify).
Newsletter Create a subscribers collection (email, name, preferences). Integrate via API with email providers (e.g. Mailchimp, SendGrid). Directus manages subscribers + campaigns metadata, external service handles sending.
Blog Create a posts collection with fields (title, content, slug, author relation, tags). Add categories or tags collections with relations. Editors can draft/publish posts. API delivers content to frontend.
Events Create events collection (title, date, time, location, description). Relate to venues, organizers. Supports filtering, queries by date range, etc.
Accounts & Contacts Create users or contacts collection with relations to companies/organizations. Use Directus RBAC for access control. You can separate Directus system users (admins/editors) from application users stored in a custom collection.

What Directus Does Well

  • Data modeling: Any relational data structure (1-to-1, 1-to-many, many-to-many) can be modeled.

  • Admin UI out of the box: Non-developers can add/edit products, blog posts, events, contacts without coding.

  • API-first: Everything you store is instantly available via REST & GraphQL.

  • Permissions: Fine-grained role/field/row-level access for different teams.

  • Versioning / revisions: Built-in history of changes to records.

  • Multilingual: Support for translations in your content.


What Directus Does Not Do

  • Business workflows like checkout, payments, order management youd implement this logic in your app, using Directus just for data.

  • Complex marketing automation (newsletters, push campaigns) integrate with specialized services.

  • Full CMS templating engine Directus is headless, so you need to build the frontend (Vue, React, Next.js, etc.).


Positioning

Think of Directus as:

  • Admin UI + Database wrapper it gives you a clean admin for structured data.

  • API layer REST/GraphQL for your frontend(s).

  • Access control + workflows manage who can edit what, keep revision history.

So yes: Products, Newsletter subscribers, Blog, Events, Accounts/Contacts all very natural to model in Directus.


Do you want me to sketch out a sample schema (collections & relations) in Directus for an e-shop + blog + events project, so you see how modules map into Directus?

You said:
yes
ChatGPT said:

Perfect Lets design a sample schema in Directus for your use case:

  • E-Shop (Products, Categories, Orders)

  • Blog (Posts, Tags, Authors)

  • Events (Events, Venues, Organizers)

  • Accounts & Contacts

This will give you a starting point for modeling your modules.


E-Shop Module

Collections

  • products

    • id (primary key)

    • name (text)

    • slug (text, unique)

    • description (rich text)

    • price (decimal)

    • stock (integer)

    • image (file relation)

    • category (many-to-one categories)

    • created_at (datetime)

    • updated_at (datetime)

  • categories

    • id

    • name

    • slug

  • orders

    • id

    • customer (relation contacts)

    • status (enum: pending, paid, shipped, cancelled)

    • total_amount (decimal)

    • created_at

  • order_items

    • id

    • order (many-to-one orders)

    • product (many-to-one products)

    • quantity (integer)

    • price (decimal snapshot at order time)


Blog Module

Collections

  • posts

    • id

    • title

    • slug

    • content (rich text or markdown)

    • author (relation users or contacts)

    • tags (many-to-many tags)

    • status (enum: draft, published)

    • published_at (datetime)

  • tags

    • id

    • name


Events Module

Collections

  • events

    • id

    • title

    • slug

    • description

    • start_date (datetime)

    • end_date (datetime)

    • venue (relation venues)

    • organizer (relation organizers)

    • image (file relation)

  • venues

    • id

    • name

    • address

    • city

    • country

  • organizers

    • id

    • name

    • contact (relation contacts)


Accounts & Contacts

Collections

  • contacts

    • id

    • first_name

    • last_name

    • email

    • phone

    • company (relation companies)

  • companies

    • id

    • name

    • address

    • city

    • country


Relations Overview

  • Products Categories (many products per category).

  • Orders Order Items Products (classic e-commerce order structure).

  • Posts Tags (many-to-many).

  • Events Venues (many-to-one).

  • Events Organizers Contacts (organizer tied to a contact).

  • Contacts Companies (many contacts per company).


How it looks in Directus

  • Editors will see all collections in the admin panel.

  • You can configure permissions so, for example:

    • Marketing can manage Blog & Events.

    • Sales team can manage Products & Orders.

    • Support can manage Contacts.

  • Everything is exposed automatically via REST & GraphQL API for your Vue/React frontend.


Do you want me to also sketch an example Vue/React frontend flow that consumes these Directus APIs (e.g. product listing, blog, events calendar)?

You said:
yes
ChatGPT said:

Alright Lets outline how a Vue/React frontend would consume your Directus backend (Products, Blog, Events, Contacts).

Directus automatically exposes REST and GraphQL endpoints. Ill show both, but most people go with REST first because its simpler.


1. Base API Setup

REST endpoint

 
http://your-domain.com/items/{collection}

Examples:

  • Products /items/products

  • Blog posts /items/posts

  • Events /items/events

GraphQL endpoint

 
http://your-domain.com/graphql

2. Example: Product Listing (E-shop)

REST (Vue/React)

 
// Vue/React fetch example const res = await fetch('http://your-domain.com/items/products?fields=id,name,price,image,category.name'); const products = await res.json(); console.log(products.data);

GraphQL

 
query { products { id name price image { id title } category { name } } }

3. Example: Blog

REST

 
const res = await fetch('http://your-domain.com/items/posts?fields=title,slug,content,tags.name,author.first_name&filter[status][_eq]=published'); const posts = await res.json();

GraphQL

 
query { posts(filter: { status: { _eq: "published" } }) { id title slug content tags { name } author { first_name last_name } } }

4. Example: Events Calendar

REST

 
const res = await fetch('http://your-domain.com/items/events?fields=title,start_date,end_date,venue.name,organizer.name'); const events = await res.json();

GraphQL

 
query { events { id title start_date end_date venue { name } organizer { name } } }

5. Example: Contacts (CRM module)

REST

 
const res = await fetch('http://your-domain.com/items/contacts?fields=first_name,last_name,email,company.name'); const contacts = await res.json();

GraphQL

 
query { contacts { id first_name last_name email company { name } } }

6. Frontend Flow

In Vue/React your flow could be:

  • Products page

    • GET /items/products

    • Show list when user clicks GET /items/products/:id

  • Blog

    • GET /items/posts?filter[status][_eq]=published

    • Show list of published posts

    • Blog detail GET /items/posts/:id

  • Events calendar

    • GET /items/events?sort=start_date

    • Display in calendar component

  • Contacts / Accounts

    • Admin-only views in your frontend app (protected by JWT login from Directus).


7. Authentication

  • Public content (products, blog, events) allow public role in Directus with read permissions.

  • Private content (contacts, orders, admin functions) require JWT auth:

 
// Login to Directus const res = await fetch('http://your-domain.com/auth/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email: 'admin@example.com', password: 'yourpassword' }) }); const { data } = await res.json(); const token = data.access_token; // Use token for protected routes const res2 = await fetch('http://your-domain.com/items/contacts', { headers: { Authorization: `Bearer ${token}` } });

Would you like me to prepare a Vue 3 starter project that already connects to Directus (products/blog/events) so you can see working components?

You said:
how to use web frontend (vue or react) to call directus backend
ChatGPT said:

Great question You already have Directus running as the backend. Now, lets connect it to a Vue or React frontend. Ill give you both approaches, and you can pick the framework your team prefers.


1. API Options in Directus

Directus exposes:

  • REST API easier to start with

  • GraphQL API more flexible for custom queries

  • JavaScript SDK (@directus/sdk) recommended, works in Vue & React

Ill show you the SDK way (cleaner) and also raw fetch for REST/GraphQL.


2. Install Directus SDK

In your frontend project:

 
npm install @directus/sdk

3. Vue Example (Vue 3 + Composition API)

 

4. React Example (React + Hooks)

 
import React, { useEffect, useState } from "react"; import { Directus } from "@directus/sdk"; export default function Products() { const [products, setProducts] = useState([]); const directus = new Directus("http://your-domain.com"); useEffect(() => { async function fetchProducts() { const response = await directus.items("products").readByQuery({ fields: ["id", "name", "price", "category.name"], limit: 10, }); setProducts(response.data); } fetchProducts(); }, []); return ( <div> <h1>Productsh1> <ul> {products.map((p) => ( <li key={p.id}> {p.name} {p.price} {p.category && `(${p.category.name})`} li> ))} ul> div> ); }

5. Authentication

For protected endpoints (like orders, contacts), you need a login flow.

 
// Login const auth = await directus.auth.login({ email: "admin@example.com", password: "yourpassword", }); // Token stored automatically // Now you can fetch private data const contacts = await directus.items("contacts").readByQuery();

You can also persist sessions in localStorage or cookies.


6. REST without SDK (if you prefer)

 
// Vue/React fetch const res = await fetch('http://your-domain.com/items/products?fields=id,name,price'); const data = await res.json(); console.log(data);

Summary:

  • Use @directus/sdk easiest way in Vue/React.

  • Public content = no login needed (configure Public role in Directus).

  • Private content = authenticate once, then call API with JWT.

2025-11-23 13:58
Jan Hrdlicka

Directus info

https://directus.io/built-with-directus/skriptfabrik-website-cms
https://ctrk.klclick.com/l/01K5Z1ZTDH7WD42PD1KS9WJKE7_1
https://weframetech.com/blog/strapi-vs-directus
https://www.klaviyo.com/

CREATE DATABASE directus; GRANT ALL PRIVILEGES ON directus.* TO 'directus'@'localhost' IDENTIFIED BY 'DSf2356er-ee'; FLUSH PRIVILEGES; EXIT;
admin@cebin.cz

https://directus.io/docs/tutorials/self-hosting/deploy-directus-to-an-ubuntu-server

curl -s https://get.directus.io/ |  bash  apt update  apt install directus-cli -y

https://www.youtube.com/watch?v=h-8kiY3YjLs
https://www.youtube.com/watch?v=VaaNr8tI4KY

systemctl enable directus
systemctl start directus

http://83.229.87.37:8055/

2025-11-23 13:59
Jan Hrdlicka

React Forms

Go to category

React Forms

2025-11-24 13:54
Jan Hrdlicka

React forms DB

forms_submission_value must have unique (submission_id, attribute). 
otherwise, in multi-step forms, when returning from the next step, the values ​​will be re-entered and not overwritten.

ALTER TABLE forms_submission_value
ADD UNIQUE KEY uniq_submission_attribute (submission_id, attribute);

If there are duplicities remove them:

DELETE f   (or SELECT * for test)
FROM forms_submission_value f
JOIN (
    SELECT MAX(id) AS keep_id, submission_id, attribute
    FROM forms_submission_value
    GROUP BY submission_id, attribute
    HAVING COUNT(*) > 1
) x
  ON f.submission_id = x.submission_id
 AND f.attribute = x.attribute
WHERE f.id <> x.keep_id;

 

2025-11-24 13:54
Jan Hrdlicka

UNIX commandline

Go to category

PDF manipulation

sudo apt install qpdf

Remove a specific page using qpdf
qpdf input.pdf output.pdf --pages input.pdf <page-ranges> (1-5 6-7) --

Join / merge two PDFs using qpdf
qpdf --empty merged.pdf --pages file1.pdf file2.pdf --

Example: pages 1–3 from file1 + page 5 of file2:
qpdf --empty merged.pdf --pages file1.pdf 1-3 file2.pdf 5 --

2025-11-28 09:17
Jan Hrdlicka

SQL

Go to category

Backup and restore mysql database

mysqldump db_name -u root -p > file.sql
mysql -u root -p db_name < file.sql

2025-12-30 12:12
Jan Hrdlicka

Adding db user

 mysql> create database db_name;

mysql> grant all on db_name.* to 'user'@'localhost' identified by 'password';

mysql> flush privileges;

2025-12-30 12:15
Jan Hrdlicka

Update SELECT, Delete Select

update content 
set param_b1 = 0,param_b2 = 1, param_i1 = 2

WHERE id IN (
   SELECT * FROM (       
SELECT category.id  FROM category
left join content
on content.id = category.content_id
WHERE category.id = 6

    ) AS p
)

DELETE FROM material_machine WHERE id IN ( SELECT * FROM ( SELECT material_machine.id FROM material_machine left join material on material.id = material_machine.material_id WHERE material.id is null ) AS p )

2025-12-30 15:57
Jan Hrdlicka

Find and Replace text in the entire table using a MySQL query

UPDATE table
 SET column = replace(column, 'old-text', 'new-text')

2025-12-30 16:05
Jan Hrdlicka

Finding duplicate items in sql table

SELECT email,
COUNT(email) AS NumOccurrences
FROM User
GROUP BY email
HAVING ( COUNT(email) > 1 )==MySQL Query GROUP BY day / month / year]== SELECT COUNT(id),YEAR(date), MONTH(date)
from dbname
GROUP BY YEAR(date), MONTH(date);

2025-12-30 16:07
Jan Hrdlicka

Drop All Tables in MySQL Database in One Step

mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP | mysql -u[USERNAME] -p[PASSWORD] [DATABASE])
echo 'SET foreign_key_checks = 0;'; 
 (mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | 
     grep ^DROP); 
 echo 'SET foreign_key_checks = 1;') | \
    mysql -u[USERNAME] -p[PASSWORD] -b [DATABASE]

2025-12-30 16:08
Jan Hrdlicka