SlideShare a Scribd company logo
1 of 44
Download to read offline
Optymalizacja pracy z 
instancjami 
local / staging / production 
Krystian Szymukowicz 
(k.szymukowicz@sourcebroket.net)
INSTANCJE APLIKACJI 
Jakich potrzebujemy? 
Czym mogą się różnić między sobą?
Z czym się zmierzymy? 
Production 
(current) 
Production 
Backup 
Production 
Beta Replication 
Integration 1 Integration 2 Integration n 
Local 
Developer 1 
Local 
Developer 2 
Local 
Developer n-1 
Local 
Developer n 
1 2 3 
4 
n 
Integration n-1 
[timestamp] Previous
Domeny 
Production 
Backup 
Production 
Replication 
[timestamp] 
Integration 1 Integration 2 Integration n 
Local 
Developer 1 
Local 
Developer 2 
Local 
Developer n-1 
Local 
Developer n 
1 
n 
Integration n-1 
Domeny: 
yyy.loc 
Domeny: 
yyy.loc 
Domeny: 
yyy.loc 
Domeny: 
yyy.loc 
Domeny: 
yyy.myagency.com 
Domeny: 
yyy-2.myagency.com 
Domeny: 
yyy-m.myagency.com 
Domeny: 
yyy-n.myagency.com 
Domeny: 
www1.yyy.com 
Domeny: 
www.yyy.com 
Domeny: 
beta.yyy.com 
4 
Domeny: 
www.yyy.com 
3 
Production 
Beta Previous (current) 
Domeny: 
prev.yyy.com 
2
Domeny - multilang z multidomain 
Production 
Backup 
Production 
Replication 
Integration 1 Integration 2 Integration n 
Local 
Developer 1 
Local 
Developer 2 
Local 
Developer n-1 
Local 
Developer n 
1 
n 
Integration n-1 
Domeny: 
- yyy.loc 
- pl.yyy.loc 
- de.yyy.loc 
- ch.yyy.loc 
- …..... 
Domeny: 
- yyy.loc 
- de.yyy.loc 
- pl.yyy.loc 
- ch.yyy.loc 
- …..... 
Domeny: 
- yyy.loc 
- ple.yyy.loc 
- de.yyy.loc 
- ch.yyy.loc 
- …..... 
Domeny: 
- yyy.loc 
- pl.yyy.loc 
- de.yyy.loc 
- ch.yyy.loc 
- …..... 
Domeny: 
- yyy.myagency.com 
- pl.yyy.myagency.com 
- de.yyy.myagency.com 
- …. 
Domeny: 
- yyy.myagency.com 
- pl.yyy-1.myagancy.com 
- de.yyy-1.myagancy.com 
– …... 
Domeny: 
- yyy.myagency.com 
- pl.yyy-3.myagancy.com 
- de.yyy-3.myagancy.com 
– …... 
Domeny: 
- yyy.myagency.com 
- pl.yyy-3.myagancy.com 
- de.yyy-3.myagancy.com 
– …... 
Domeny: 
- www1.yyy.com 
- www1.yyy.pl 
- www1.yyy.de 
4 
Domeny: 
- www.yyy.com 
- www.yyy.pl 
- www.yyy.de 
- ... 
Domeny: 
- beta.yyy.com 
- beta.yyy.pl 
- beta.yyy.de 
- ... 
3 
Production 
Beta Previous (current) 
Domeny: 
- prev.yyy.com 
- prev.yyy.pl 
- prev.yyy.de 
- ... 
2 
Domeny: 
- www.yyy.com 
- www.yyy.pl 
- www.yyy.de 
- ... 
[timestamp]
Solr – ustawienia hostów / core 
Production 
Backup 
Production 
Replication 
Core: 
- /solr/live-yyy-1-0-en_EN/ 
- /solr/live-yyy-1-1-pl_PL/ 
- /solr/live-yyy-1-2-de_DE/ 
- ….. 
Path: www.yyy.com 
site.solr.noindex = 1 
Integration 1 Integration 2 Integration n 
Local 
Developer 1 
Local 
Developer 2 
Local 
Developer n-1 
Local 
Developer n 
Integration n-1 
Core: 
- /solr/live-yyy-1-0-en_EN/ 
- /solr/live-yyy-1-1-pl_PL/ 
- /solr/live-yyy-1-2-de_DE/ 
- ….. 
Path: www.yyy.com 
site.solr.noindex = 1 
Production 
Beta Previous (current) 
Core: 
- /solr/beta-yyy-1-0-en_EN/ 
- /solr/beta-yyy-1-1-pl_PL/ 
- /solr/beta-yyy-1-2-de_DE/ 
- ….. 
Path: www.yyy.com 
Core: 
- /solr/live-yyy-1-0-en_EN/ 
- /solr/live-yyy-1-1-pl_PL/ 
- /solr/live-yyy-1-2-de_DE/ 
- ….. 
Path: www.yyy.com 
Core: 
- /solr/dev-yyy-1-0-en_EN/ 
- /solr/dev-yyy-1-1-pl_PL/ 
- /solr/dev-yyy-1-2-de_DE/ 
- ….. 
Path: yyy.myagency.com 
Core: 
- /solr/dev-yyy-1-0-en_EN/ 
- /solr/dev-yyy-1-1-pl_PL/ 
- /solr/dev-yyy-1-2-de_DE/ 
- ….. 
Path: yyy.myagency.com 
Core: 
- /solr/dev-yyy-1-0-en_EN/ 
- /solr/dev-yyy-1-1-pl_PL/ 
- /solr/dev-yyy-1-2-de_DE/ 
- ….. 
Path: yyy.myagency.com 
Core: 
- /solr/dev-yyy-1-0-en_EN/ 
- /solr/dev-yyy-1-1-pl_PL/ 
- /solr/dev-yyy-1-2-de_DE/ 
- ….. 
Path: yyy.myagency.com 
Core: 
- /solr/local-yyy-1-0-en_EN/ 
- /solr/local-yyy-1-1-pl_PL/ 
- /solr/local-yyy-1-2-de_DE/ 
- ….. 
Path: yyy.myagency.com 
Core: 
- /solr/local-yyy-1-0-en_EN/ 
- /solr/local-yyy-1-1-pl_PL/ 
- /solr/local-yyy-1-2-de_DE/ 
- ….. 
Path: yyy.myagency.com 
Core: 
- /solr/local-yyy-1-0-en_EN/ 
- /solr/local-yyy-1-1-pl_PL/ 
- /solr/local-yyy-1-2-de_DE/ 
- ….. 
Path: yyy.myagency.com 
Core: 
- /solr/local-yyy-1-0-en_EN/ 
- /solr/local-yyy-1-1-pl_PL/ 
- /solr/local-yyy-1-2-de_DE/ 
- ….. 
Path: yyy.myagency.com 
[timestamp]
Różne – google/wtyczki 
Production 
Backup 
Production 
Replication 
DEFAULT FOR ALL INSTANCES: 
Integration 1 Integration 2 Integration n 
Local 
Developer 1 
Local 
Developer 2 
Local 
Developer n-1 
Local 
Developer n 
Integration n-1 
general { 
preventIndexingByBots = 1 
google.ga.disable = 1 
search.indexing.disable = 1 
} 
Production 
Beta Previous (current) 
general { 
preventIndexingByBots = 1 
google.ga.disable = 1 
email = my11@gmail.com 
} 
general { 
preventIndexingByBots = 1 
google.ga.disable = 1 
email = my11@gmail.com 
} 
general { 
preventIndexingByBots = 1 
google.ga.disable = 1 
email = my11@gmail.com 
} 
general { 
preventIndexingByBots = 1 
google.ga.disable = 1 
email = my11@gmail.com 
} 
general { 
preventIndexingByBots = 1 
google.ga.disable = 1 
email = my11@gmail.com 
search.disable = 1 
search.indexing.disable = 1 
} 
general { 
preventIndexingByBots = 1 
google.ga.disable = 1 
email = my11@gmail.com 
search.disable = 1 
search.indexing.disable = 1 
} 
general { 
preventIndexingByBots = 1 
google.ga.disable = 1 
email = my11@gmail.com 
search.disable = 1 
search.indexing.disable = 1 
} 
general { 
preventIndexingByBots = 1 
google.ga.disable = 1 
email = my11@gmail.com 
search.disable = 1 
search.indexing.disable = 1 
} 
general { 
preventIndexingByBots = 1 
google.ga.disable = 1 
} 
general { 
} 
general { 
} 
general { 
search.indexing.disable = 1 
} 
[timestamp] 
general { 
email = office@yyy.com 
}
Dobrze jest ustawić takie domyślne wartości 
dla niebezpiecznych ustawień, 
które czynią najmniej szkody 
i nadpisać je w wyższych kontekstach.
Programista wdrażający się do projektu może 
zapomnieć lub nie być świadomy, że musi 
ustawić kontekst. 
Wówczas użyte zostaną bezpieczne wartości 
domyślne.
DEFAULT BEZPIECZNY 
Production 
Backup 
Production 
Replication 
Integration 1 Integration 2 Integration n 
Local 
Developer 1 
Local 
Developer 2 
Local 
Developer n-1 
Local 
Developer n 
Integration n-1 
general { 
overwriteAllEmails > 
} 
Production 
Beta Previous (current) 
general { 
} 
general { 
} 
general { 
} 
general { 
} 
general { 
} 
general { 
} 
general { 
} 
general { 
search.indexing.disable = 0 
} 
general { 
google.ga.disable = 0 
preventIndexingByBots = 0 
overwriteAllEmails > 
} 
plugin.solr { 
[beta version settings] 
search.indexing.disable = 0 
} 
general { 
google.ga.disable = 0 
preventIndexingByBots = 0 
overwriteAllEmails > 
} 
plugin.solr { 
[live version settings] 
search.indexing.disable = 0 
} 
DEFAULT BEZPIECZNY: 
general { 
google.ga.disable = 1 
preventIndexingByBots = 1 
email = test.myagency@gmail.com 
overwriteAllEmails = test.myagency@gmail.com 
} 
plugin.solr { 
[developers testing version] 
indexing.disable = 1 
} 
[timestamp]
TIP 
general.overwriteAllEmails 
Jeżeli general.overwriteAllEmails jest ustawiony w evencie SwiftMailera modyfikujemy email tak, żeby wysyłal 
zawsze na naszego specjalnie spreparowanego emaila. 
Email testowy: 
test.myagency+office_yyy.com@gmail.com 
Email docelowy: 
office@yyy.com
TIP 
linkowanie mediów 
Im więcej instancji tym gigabajty mediów sprawiają większy problem. 
Rozwiązaniem może być tworzenie linków symbolicznych do pojedynczych plików. 
Skasować wówczas możemy tylko link a nie prawdziwy plik.
Podsumujmy ustawienia
Ustawienia dla każdej instancji w notacji TS 
Przykład dla strony bez języków 
general { 
google.ga.disable = 1 
preventIndexingByBots = 1 
email = test.myagency@gmail.com 
overwriteAllEmails = test.myagency@gmail.com 
} 
domains { 
main = www.yyy.loc 
} 
plugin { 
solr { 
host = yyy.myagancy.com 
path { 
en = /solr/testing-yyy-1-0-en_EN/ 
} 
} 
}
Ustawienia dla każdej instancji w notacji TS 
Przykład dla strony z językami w jednej domenie 
general { 
preventIndexingByBots = 1 
google { 
ga.disable = 1 
} 
search { 
indexing.disable = 1 
frontend.disable = 1 
backend.disable = 1 
} 
} 
domains { 
main = www.yyy.loc 
} 
plugin { 
solr { 
host = yyy.myagancy.com 
path { 
en = /solr/testing-yyy-1-0-en_EN/ 
pl = /solr/testing-yyy-1-1-PL_PL/ 
de = /solr/testing-yyy-1-2-de_DE/ 
} 
} 
} 
www.yyy.com 
www.yyy.com/pl 
www.yyy.com/de
Ustawienia dla każdej instancji w notacji TS 
Przykład dla strony z językami w wielu domenach 
general { 
preventIndexingByBots = 1 
google { 
ga.disable = 1 
} 
search { 
indexing.disable = 1 
frontend.disable = 1 
backend.disable = 1 
} 
} 
domains { 
england = www.yyy.loc 
poland = pl.yyy.loc 
germany = de.yyy.loc 
} 
plugin { 
solr { 
host = yyy.myagancy.com 
path { 
en = /solr/testing-yyy-1-0-en_EN/ 
pl = /solr/testing-yyy-1-1-PL_PL/ 
de = /solr/testing-yyy-1-2-de_DE/ 
} 
} 
} 
www.yyy.loc 
pl.yyy.loc 
de.yyy.loc
World of all applications 
World of TYPO3
Gdzie będziemy używali tych informacji?
Zwyczajowe miejsce tych danych 
to stałe w Typoscript
Gdzie będziemy używali tych informacji? 
WARUNKOWE RENDEROWANIE FRONTENDU 
TS SETUP: 
lib.header_search > 
lib.header_search = COA 
lib.header_search.if.isFalse = {$general.search.frontend.disable} 
lib.header_search.wrap = <div class="search clearfix">|</div> 
lib.header_search.10 < plugin.tx_solr_pi_search
Gdzie będziemy używali tych informacji? 
WARUNKOWE WYSYŁANIE HEADERÓW 
TS SETUP: 
[globalVar = LIT:1 = {$general.preventIndexingByBots}] 
config.additionalHeaders = X-Robots-Tag:noindex,nofollow 
[end]
Gdzie będziemy używali tych informacji? 
MULTILANG DLA DOMEN NARODOWYCH 
TS SETUP: 
// Poland version 
[globalString = IENV:HTTP_HOST = {$domains.poland}] || [globalVar = GP:L = 1] 
config { 
sys_language_uid = 1 
language = pl 
locale_all = pl_PL.UTF-8 
htmlTag_langKey = pl 
} 
plugin.tx_solr.index.queue.pages.indexer.frontendDataHelper.host = {$domains.poland} 
[end]
Gdzie będziemy używali tych informacji? 
CORE i PATH DLA SOLR 
TS SETUP: 
plugin.tx_solr { 
solr { 
host = {$plugin.tx_solr.solr.host} 
path = {$plugin.tx_solr.solr.path.en} 
} 
} 
[globalString = IENV:HTTP_HOST = {$domains.poland}] || [globalVar = GP:L = 1] 
plugin.tx_solr.solr.path = {$plugin.tx_solr.solr.path.pl} 
[end] 
[globalString = IENV:HTTP_HOST = {$domains.germany}] || [globalVar = GP:L = 2] 
plugin.tx_solr.solr.path = {$plugin.tx_solr.solr.path.de} 
[end]
Gdzie będziemy używali tych informacji? 
KONFIGURACJA REALURL DLA DOMEN 
$TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['_DEFAULT']; 
$TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com']['pagePath']['rootpage_id'] = 1; 
$TYPO3_CONF_VARS['EXTCONF']['realurl']['beta.yyy.com'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com']; 
$TYPO3_CONF_VARS['EXTCONF']['realurl']['yyy-1.myagency.com'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com']; 
$TYPO3_CONF_VARS['EXTCONF']['realurl']['yyy-2.myagency.com'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com']; 
…. 
…. 
….. 
$TYPO3_CONF_VARS['EXTCONF']['realurl']['yyy.loc'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com']; 
unset($TYPO3_CONF_VARS['EXTCONF']['realurl']['_DEFAULT']); 
REAL URL DOKUMENTACJA O $TYPO3_CONF_VARS['EXTCONF']['realurl']['_DEFAULT'] 
_DEFAULT 
Key 
_DEFAULT 
Type 
->siteCfg or pointer to other key with ->siteCfg in same array 
Description 
(Deprecated) Configuration of default Speaking URL coding if no matches was found for the specific HOST name. 
Warning! This is a legacy feature. The use of this option is highly discouraged because it leads to hard to detect errors with speaking URLs, 
wrong page id resolution, etc. Users are strongly recommended not to use _DEFAULT with multidomain web sites. This will not work correctly 
and be removed in future versions completely.
Jak zmieniać stałe TS w zależności 
od instancji? 
METODA 1 
1. W każdej z instancji utworzyć plik ze stałymi w lokalizacji typo3conf/constants_local.ts 
i wylączyć ten plik z GIT 
3. Dodać includowanie tego pliku w odpowiednim miejscu w TYPO3 
<INCLUDE_TYPOSCRIPT: source="typo3conf/constants_local.ts"> 
WADY: 
1. Przy dużej liczbie stałych i instancji TYPO3 wzrasta ryzyko błędów. 
2. Brak śledzenia zmian z wykorzystaniem systemów wersjonowania. 
3. Brak automatycznej propagacji zmian z wykorzystaniem systemów wersjonowania.
Jak zmieniać stałe TS w zależności od instancji? 
METODA 2 
1. Utworzyć pliki ze stalymi zależnymi od instancji i dodać do GIT: 
fileadmin /typoscript/ constants/ constants_default.ts 
fileadmin /typoscript/ constants/ constants_default_local.ts 
fileadmin /typoscript/ constants/ constants_default_staging.ts 
fileadmin /typoscript/ constants/ constants_default_live.ts 
fileadmin /typoscript/ constants/ constants_local.ts 
fileadmin /typoscript/ constants/ constants_integration-1.ts 
fileadmin /typoscript/ constants/ constants_integration-n.ts 
fileadmin /typoscript/ constants/ constants_..........ts 
fileadmin /typoscript/ constants/ constants_beta.ts 
fileadmin /typoscript/ constants/ constants_prev.ts 
fileadmin /typoscript/ constants/ constants_backup.ts 
fileadmin /typoscript/ constants/ constants_live.ts 
2. Utworzyć plik typo3conf/constants_local.ts w każdej z instancji, wyłączyć go z GIT i dodać jego includowanie w 
TYPO3 <INCLUDE_TYPOSCRIPT: source="FILE:typo3conf/constants_local.ts"> 
3. Dodać w nim includowanie pliku zależne od instancji 
<INCLUDE_TYPOSCRIPT: source="FILE:fileadmin/typoscript/constant/constants_default_local.ts"> 
<INCLUDE_TYPOSCRIPT: source="FILE:fileadmin/typoscript/constant/constants_local.ts">
Jak zmieniać stałe TS w zależności od instancji? 
METODA 2 
WADY: 
1. Przy dużej liczbie stałych i instancji TYPO3 wzrasta ryzyko błędów. 
2. Brak śledzenia zmian z wykorzystaniem systemów wersjonowania. 
3. Brak automatycznej propagacji zmian z wykorzystaniem systemów wersjonowania. 
1. Nie mamy określonego kontekstu na poziomie PHP. 
2. Nie uzyskamy stałych na niskim poziomie, kiedy nie ma jeszcze obiektu TSFE /realurl, eID, pliki ext_tables.php/ 
3. Uzyskanie tych danych w BE wymaga sparsowania całego drzewa TS. 
4. W warunkach w stałych nie można używać stałych. 
To nie zadziała w sekcji stałych: 
[globalString = IENV:HTTP_HOST = {$domains.poland}] || [globalVar = GP:L = 1] 
plugin.tx_solr.solr.path = {$plugin.tx_solr.solr.path.pl} 
[end]
PROPERTYMANAGER
Po co jest propertymanager? 
1. Plik ze zmiennymi kontekstu wybierany automatycznie na podstawie kontekstu 
określonego w VHOST / .htaccess / PHP – zmniejszamy liczbę miejsc konfiguracji. 
2. Zmienne dostępne w PHP i w Typoscript. 
3. Możliwość korzystania w PHP ze zmiennych na niskim pozimie. (index.php / 
ext_localconf.php etc) 
4. Głośna informacja jeżeli zmianna kontekstowa nie jest ustawiona dla kontekstu a są do 
niej odwołania. 
5. Parsing TS jest cachowany. Usuwanie cachu – „Clear all cache” 
6. Warunki ze „stałymi” w warunkach w sekcji CONSTANTS działają.
Przykładowa konfiguracja I 
W Extension Manager ustawiamy sciezkę do pliku głównego: files/resources/private/typosctipt/context/context_default.txt 
config.tx_propertymanager { 
required = 1 
context { 
default { 
email = test.myagency@gmail.com 
overwriteAllEmails = test.myagency@gmail.com 
} 
default_staging < .default 
default_live < .default 
default_live { 
email = test.myagency@yyy.com 
overwriteAllEmails = test.myagency@gmail.com 
} 
kontekst1 < .default_live 
kontekst1 { 
…...... 
} 
} 
} 
<INCLUDE_TYPOSCRIPT: source="FILE:files/resources/private/typosctipt/context/context_local.txt"> 
<INCLUDE_TYPOSCRIPT: source="FILE:files/resources/private/typosctipt/context/context_integration-1.ts"> 
<INCLUDE_TYPOSCRIPT: source="FILE:files/resources/private/typosctipt/context/context_integration-2.ts"> 
<INCLUDE_TYPOSCRIPT: source="FILE:files/resources/private/typosctipt/context/context_integration-3.ts"> 
… <INCLUDE_TYPOSCRIPT: source="FILE:files/resources/private/typosctipt/context/context_beta.ts"> 
<INCLUDE_TYPOSCRIPT: source="FILE:files/resources/private/typosctipt/context/context_beta.ts"> 
<INCLUDE_TYPOSCRIPT: source="FILE:files/resources/private/typosctipt/context/context_34234234.ts"> 
<INCLUDE_TYPOSCRIPT: source="FILE:files/resources/private/typosctipt/context/context_prev.ts"> 
<INCLUDE_TYPOSCRIPT: source="FILE:files/resources/private/typosctipt/context/context_live.ts">
Przykładowa konfiguracja II 
Przykładowa zawartość: files/resources/private/typosctipt/context/context_local.ts 
config.tx_propertymanager { 
context { 
local < .default_local 
} 
}
Przykładowa konfiguracja III 
Przykładowa zawartość: files/resources/private/typosctipt/context/context_live.ts 
config.tx_propertymanager { 
context { 
live < .default_live 
live { 
google.ga.disable = 0 
... 
} 
} 
}
Jak ustalić kontekst? 
1) VHOST 
<VirtualHost 127.0.0.1:80> 
DocumentRoot "T:workspace-typo3projectsprojekt - client1.loc" 
ServerName www.client1.loc 
SetEnv CONTEXT_IDENTIFIER local 
</VirtualHost> 
2) .htaccess 
SetEnv CONTEXT_IDENTIFIER local_developer1 
3) Ustawiając $GLOBALS['CONTEXT_IDENTIFIER'] w pliku wyłączonym z GIT 
a) w TYPO3 < 6.0 w pliku typo3conf/localconf_local.php 
i includowanym w typo3conf/localconf.php 
b) w TYPO3 > 6.0 w pliku AdditionalConfiguration.php
Jak wykorzystać dane z kontekstów? 
W PHP: 
$propertymanager = t3lib_div::makeInstance('tx_propertymanager_Manager'); 
$domains = $propertymanager->getProperty('domains.'); 
echo($domains['poland']); 
W CONSTANTS z poniższą notacją: 
general { 
email_1 = {@email} 
email_2 = {@tx_myextension->getValue('email')} 
otherValue = {@tx_myextension->getSomeValue()} 
} 
domains { 
poland = {@domains.poland} 
germany = {@domains.germany} 
….. 
} 
[globalString = IENV:HTTP_HOST = {@domains.germany}] || [globalVar = GP:L = 2] 
plugin.tx_solr.solr.path = {@plugin.tx_solr.solr.path.de} 
[end] 
W SETUP już standardowo używamy zwykłych CONSTANTS 
plugin.tx_ext { 
emailAdmin = {$email} 
}
Realurl? 
KONFIGURACJA REALURL DLA DOMEN 
$TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['_DEFAULT']; 
$TYPO3_CONF_VARS['EXTCONF']['realurl']['beta.yyy.com'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com']; 
$TYPO3_CONF_VARS['EXTCONF']['realurl']['yyy-1.myagency.com'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com']; 
$TYPO3_CONF_VARS['EXTCONF']['realurl']['yyy-2.myagency.com'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com']; 
…. 
…. 
….. 
$TYPO3_CONF_VARS['EXTCONF']['realurl']['yyy.loc'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com']; 
unset($TYPO3_CONF_VARS['EXTCONF']['realurl']['_DEFAULT']); 
include_once(PATH_site . '/typo3conf/ext/propertymanager/Classes/class.tx_propertymanager_Manager.php'); 
/** @var /* tx_propertymanager_Manager $propertymanager */ 
$propertymanager = t3lib_div::makeInstance('tx_propertymanager_Manager'); 
$domains = $propertymanager->getProperty('domains.'); 
foreach($domains as $domain) { 
$TYPO3_CONF_VARS['EXTCONF']['realurl'][$domain] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['_DEFAULT']; 
} 
unset($TYPO3_CONF_VARS['EXTCONF']['realurl']['_DEFAULT']);
RESTRICTFE
Wady autoryzacji .htaccess 
1) długość autoryzacji to sesja 
Użytkownik zamknie przeglądarkę i musi autoryzować się raz jeszcze 
2) żeby działała autoryzacja musimy zmienić 
plik vhosta lub htaccess. 
Do modyfikacji VHOSTa nie zawsze mamy dostęp 
a modyfikacja .htaccess wiąże się z jego wyłączeniem z GIT
Co może restrictfe?
Extension manager
Profil użytkownika
Aktywacja 
W pliku typo3conf/localconf_local.php /out off git/ 
$TYPO3_CONF_VARS['EXTCONF']['restrictfe']['enable'] = '0';
Zalety 
1) Długość autoryzacji ustawiana dowolnie 
Użytkownik autoryzuje się raz – ogląda wielokrotnie po zamknięciu / otwarciu przegladarki. 
Autozycacja trzymana w cookie, przy czym możemy wyczyścić po stronie TYPO3 autoryzację. 
2) Strona powitalna nowej witryny 
Ponieważ template pojawiający się bez autoryzacji jest dowolny więc można przygotować 
stronę powitalną (Witamy! Już niedługo w tym miejscu będzie witryna naszej firmy ABC”). 
Użytkownicy, którzy zalogują się do TYPO3 w BE ekranu powitalnego nie zobaczą. 
3) Brak autoryzacji dla określonych IP i headerów 
Są wtyczki do przegladarek/proxy, które ustawiają header do każdego requestu. 
4 ) Nie trzeba modyfikować .htaccess 
Htaccess może pozostać w GIT. 
5 ) Można wykorzysta na LIVE do blokady wersji językowych 
Witryna jest już LIVE, ale dodano nową wersję językową, którą trzeba przetłumaczyć. 
yyy.com/cz/ - bez blokady możliwość zindeksowania przez googla 
6 ) Tylko jedno hasło do BE! 
User ma tyko hasło do BE – nie potrzebuje hasła do .htaccess
Połączenie PROPERTYMANAGER I RESTRICTFE 
Wyłączenie widoku określonych domen językowych 
include_once(PATH_site . '/typo3conf/ext/propertymanager/Classes/class.tx_propertymanager_Manager.php'); 
/** @var tx_propertymanager_Manager $propertymanager */ 
$propertymanager = t3lib_div::makeInstance('tx_propertymanager_Manager'); 
$domains = $propertymanager->getProperty('domains.'); 
foreach($domains as $domain) { 
if( $_SERVER['HOST'] == $domain['url'] && $domain['restrictfe']) 
$TYPO3_CONF_VARS['EXTCONF']['restrictfe']['enable'] = TRUE; 
}
Dziękuję za uwagę 
Krystian Szymukowicz 
(k.szymukowicz@sourcebroker.net) 
RESTRICTFE 
http://typo3.org/extensions/repository/view/restrictfe 
PROPERTYMANAGER 
k.szymukowicz@sourcebroker.net

More Related Content

Viewers also liked

Desing of Factorial Experiments
Desing of Factorial ExperimentsDesing of Factorial Experiments
Desing of Factorial ExperimentsRamon Saviñon
 
Aps anethomepage upgrade for committee_showrevised
Aps anethomepage upgrade for committee_showrevisedAps anethomepage upgrade for committee_showrevised
Aps anethomepage upgrade for committee_showrevisedpollykarpowicz
 
Aligning Creative Approaches Towards Re-engineering Our Tourism Education a...
Aligning Creative Approaches Towards Re-engineering  Our Tourism Education a...Aligning Creative Approaches Towards Re-engineering  Our Tourism Education a...
Aligning Creative Approaches Towards Re-engineering Our Tourism Education a...TIBFI
 
Ccm energy solutions, About us
Ccm energy solutions, About usCcm energy solutions, About us
Ccm energy solutions, About usYvon Dugmore
 
An Empirical Study of Spreadsheet Authors’ Mental Models in Explaining and De...
An Empirical Study of Spreadsheet Authors’ Mental Models in Explaining and De...An Empirical Study of Spreadsheet Authors’ Mental Models in Explaining and De...
An Empirical Study of Spreadsheet Authors’ Mental Models in Explaining and De...Bennett Kankuzi
 
Assignment ib- twists and turns in globalisation (autosaved)
Assignment ib- twists and turns in globalisation (autosaved)Assignment ib- twists and turns in globalisation (autosaved)
Assignment ib- twists and turns in globalisation (autosaved)krishymohan
 
3 mẫu sơ mi nam hot nhất hè này
3 mẫu sơ mi nam hot nhất hè này3 mẫu sơ mi nam hot nhất hè này
3 mẫu sơ mi nam hot nhất hè nàyQuang Trung
 
Nanjangud
NanjangudNanjangud
NanjangudVani Mp
 
Pembukaan Presentasi Bahsa Inggris
Pembukaan Presentasi Bahsa Inggris Pembukaan Presentasi Bahsa Inggris
Pembukaan Presentasi Bahsa Inggris Gandreva Satria
 
Ccm energy solutions, about us
Ccm energy solutions, about usCcm energy solutions, about us
Ccm energy solutions, about usYvon Dugmore
 
Bộ sưu tập áo khoác mùa đông
Bộ sưu tập áo khoác mùa đôngBộ sưu tập áo khoác mùa đông
Bộ sưu tập áo khoác mùa đôngQuang Trung
 
Creative Kit Profile
Creative Kit ProfileCreative Kit Profile
Creative Kit ProfileCreative Kit
 

Viewers also liked (15)

Desing of Factorial Experiments
Desing of Factorial ExperimentsDesing of Factorial Experiments
Desing of Factorial Experiments
 
Aps anethomepage upgrade for committee_showrevised
Aps anethomepage upgrade for committee_showrevisedAps anethomepage upgrade for committee_showrevised
Aps anethomepage upgrade for committee_showrevised
 
Power and efficiency(i)
Power and efficiency(i)Power and efficiency(i)
Power and efficiency(i)
 
Aligning Creative Approaches Towards Re-engineering Our Tourism Education a...
Aligning Creative Approaches Towards Re-engineering  Our Tourism Education a...Aligning Creative Approaches Towards Re-engineering  Our Tourism Education a...
Aligning Creative Approaches Towards Re-engineering Our Tourism Education a...
 
Ccm energy solutions, About us
Ccm energy solutions, About usCcm energy solutions, About us
Ccm energy solutions, About us
 
An Empirical Study of Spreadsheet Authors’ Mental Models in Explaining and De...
An Empirical Study of Spreadsheet Authors’ Mental Models in Explaining and De...An Empirical Study of Spreadsheet Authors’ Mental Models in Explaining and De...
An Empirical Study of Spreadsheet Authors’ Mental Models in Explaining and De...
 
Actividad jueves 25
Actividad jueves 25Actividad jueves 25
Actividad jueves 25
 
Assignment ib- twists and turns in globalisation (autosaved)
Assignment ib- twists and turns in globalisation (autosaved)Assignment ib- twists and turns in globalisation (autosaved)
Assignment ib- twists and turns in globalisation (autosaved)
 
3 mẫu sơ mi nam hot nhất hè này
3 mẫu sơ mi nam hot nhất hè này3 mẫu sơ mi nam hot nhất hè này
3 mẫu sơ mi nam hot nhất hè này
 
Nanjangud
NanjangudNanjangud
Nanjangud
 
Pembukaan Presentasi Bahsa Inggris
Pembukaan Presentasi Bahsa Inggris Pembukaan Presentasi Bahsa Inggris
Pembukaan Presentasi Bahsa Inggris
 
Ccm energy solutions, about us
Ccm energy solutions, about usCcm energy solutions, about us
Ccm energy solutions, about us
 
Analisis numerico
Analisis numericoAnalisis numerico
Analisis numerico
 
Bộ sưu tập áo khoác mùa đông
Bộ sưu tập áo khoác mùa đôngBộ sưu tập áo khoác mùa đông
Bộ sưu tập áo khoác mùa đông
 
Creative Kit Profile
Creative Kit ProfileCreative Kit Profile
Creative Kit Profile
 

Similar to TYPO3 - optymalizacja pracy z instancjami

Zastosowanie buildout przy wdrażaniu projektów opartych o framework Django
Zastosowanie buildout przy wdrażaniu projektów opartych o framework DjangoZastosowanie buildout przy wdrażaniu projektów opartych o framework Django
Zastosowanie buildout przy wdrażaniu projektów opartych o framework DjangoDominik Szopa
 
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof ŚlusarskiWJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof ŚlusarskiKrzysztof Ślusarski
 
Przykład wdrożenia nowych funkcjonalności i nowej szaty graficznej na stronie...
Przykład wdrożenia nowych funkcjonalności i nowej szaty graficznej na stronie...Przykład wdrożenia nowych funkcjonalności i nowej szaty graficznej na stronie...
Przykład wdrożenia nowych funkcjonalności i nowej szaty graficznej na stronie...Paweł Wawrzyniak
 
Automatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPAutomatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPLaravel Poland MeetUp
 
OSGi, deklaratywnie
OSGi, deklaratywnieOSGi, deklaratywnie
OSGi, deklaratywnieCode-House
 
Podstawy AngularJS
Podstawy AngularJSPodstawy AngularJS
Podstawy AngularJSSages
 
WordUp Trójmiasto - Sage 9 w praktyce
WordUp Trójmiasto - Sage 9 w praktyceWordUp Trójmiasto - Sage 9 w praktyce
WordUp Trójmiasto - Sage 9 w praktyceDawid Urbański
 
Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014Tomasz Dziuda
 
Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016
Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016
Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016PROIDEA
 
Django od developerki po produkcję (linux)
Django od developerki po produkcję (linux)Django od developerki po produkcję (linux)
Django od developerki po produkcję (linux)Marcin Grzybowski
 
Angular js warsztaty stopień 2
Angular js   warsztaty stopień 2Angular js   warsztaty stopień 2
Angular js warsztaty stopień 2Marcin Wosinek
 
Word up warszawa 2015
Word up warszawa 2015Word up warszawa 2015
Word up warszawa 2015Tomasz Dziuda
 

Similar to TYPO3 - optymalizacja pracy z instancjami (13)

Zastosowanie buildout przy wdrażaniu projektów opartych o framework Django
Zastosowanie buildout przy wdrażaniu projektów opartych o framework DjangoZastosowanie buildout przy wdrażaniu projektów opartych o framework Django
Zastosowanie buildout przy wdrażaniu projektów opartych o framework Django
 
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof ŚlusarskiWJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
 
Przykład wdrożenia nowych funkcjonalności i nowej szaty graficznej na stronie...
Przykład wdrożenia nowych funkcjonalności i nowej szaty graficznej na stronie...Przykład wdrożenia nowych funkcjonalności i nowej szaty graficznej na stronie...
Przykład wdrożenia nowych funkcjonalności i nowej szaty graficznej na stronie...
 
Automatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPAutomatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHP
 
OSGi, deklaratywnie
OSGi, deklaratywnieOSGi, deklaratywnie
OSGi, deklaratywnie
 
Efektywnie i efektownie
Efektywnie i efektownieEfektywnie i efektownie
Efektywnie i efektownie
 
Podstawy AngularJS
Podstawy AngularJSPodstawy AngularJS
Podstawy AngularJS
 
WordUp Trójmiasto - Sage 9 w praktyce
WordUp Trójmiasto - Sage 9 w praktyceWordUp Trójmiasto - Sage 9 w praktyce
WordUp Trójmiasto - Sage 9 w praktyce
 
Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014
 
Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016
Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016
Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016
 
Django od developerki po produkcję (linux)
Django od developerki po produkcję (linux)Django od developerki po produkcję (linux)
Django od developerki po produkcję (linux)
 
Angular js warsztaty stopień 2
Angular js   warsztaty stopień 2Angular js   warsztaty stopień 2
Angular js warsztaty stopień 2
 
Word up warszawa 2015
Word up warszawa 2015Word up warszawa 2015
Word up warszawa 2015
 

TYPO3 - optymalizacja pracy z instancjami

  • 1. Optymalizacja pracy z instancjami local / staging / production Krystian Szymukowicz (k.szymukowicz@sourcebroket.net)
  • 2. INSTANCJE APLIKACJI Jakich potrzebujemy? Czym mogą się różnić między sobą?
  • 3. Z czym się zmierzymy? Production (current) Production Backup Production Beta Replication Integration 1 Integration 2 Integration n Local Developer 1 Local Developer 2 Local Developer n-1 Local Developer n 1 2 3 4 n Integration n-1 [timestamp] Previous
  • 4. Domeny Production Backup Production Replication [timestamp] Integration 1 Integration 2 Integration n Local Developer 1 Local Developer 2 Local Developer n-1 Local Developer n 1 n Integration n-1 Domeny: yyy.loc Domeny: yyy.loc Domeny: yyy.loc Domeny: yyy.loc Domeny: yyy.myagency.com Domeny: yyy-2.myagency.com Domeny: yyy-m.myagency.com Domeny: yyy-n.myagency.com Domeny: www1.yyy.com Domeny: www.yyy.com Domeny: beta.yyy.com 4 Domeny: www.yyy.com 3 Production Beta Previous (current) Domeny: prev.yyy.com 2
  • 5. Domeny - multilang z multidomain Production Backup Production Replication Integration 1 Integration 2 Integration n Local Developer 1 Local Developer 2 Local Developer n-1 Local Developer n 1 n Integration n-1 Domeny: - yyy.loc - pl.yyy.loc - de.yyy.loc - ch.yyy.loc - …..... Domeny: - yyy.loc - de.yyy.loc - pl.yyy.loc - ch.yyy.loc - …..... Domeny: - yyy.loc - ple.yyy.loc - de.yyy.loc - ch.yyy.loc - …..... Domeny: - yyy.loc - pl.yyy.loc - de.yyy.loc - ch.yyy.loc - …..... Domeny: - yyy.myagency.com - pl.yyy.myagency.com - de.yyy.myagency.com - …. Domeny: - yyy.myagency.com - pl.yyy-1.myagancy.com - de.yyy-1.myagancy.com – …... Domeny: - yyy.myagency.com - pl.yyy-3.myagancy.com - de.yyy-3.myagancy.com – …... Domeny: - yyy.myagency.com - pl.yyy-3.myagancy.com - de.yyy-3.myagancy.com – …... Domeny: - www1.yyy.com - www1.yyy.pl - www1.yyy.de 4 Domeny: - www.yyy.com - www.yyy.pl - www.yyy.de - ... Domeny: - beta.yyy.com - beta.yyy.pl - beta.yyy.de - ... 3 Production Beta Previous (current) Domeny: - prev.yyy.com - prev.yyy.pl - prev.yyy.de - ... 2 Domeny: - www.yyy.com - www.yyy.pl - www.yyy.de - ... [timestamp]
  • 6. Solr – ustawienia hostów / core Production Backup Production Replication Core: - /solr/live-yyy-1-0-en_EN/ - /solr/live-yyy-1-1-pl_PL/ - /solr/live-yyy-1-2-de_DE/ - ….. Path: www.yyy.com site.solr.noindex = 1 Integration 1 Integration 2 Integration n Local Developer 1 Local Developer 2 Local Developer n-1 Local Developer n Integration n-1 Core: - /solr/live-yyy-1-0-en_EN/ - /solr/live-yyy-1-1-pl_PL/ - /solr/live-yyy-1-2-de_DE/ - ….. Path: www.yyy.com site.solr.noindex = 1 Production Beta Previous (current) Core: - /solr/beta-yyy-1-0-en_EN/ - /solr/beta-yyy-1-1-pl_PL/ - /solr/beta-yyy-1-2-de_DE/ - ….. Path: www.yyy.com Core: - /solr/live-yyy-1-0-en_EN/ - /solr/live-yyy-1-1-pl_PL/ - /solr/live-yyy-1-2-de_DE/ - ….. Path: www.yyy.com Core: - /solr/dev-yyy-1-0-en_EN/ - /solr/dev-yyy-1-1-pl_PL/ - /solr/dev-yyy-1-2-de_DE/ - ….. Path: yyy.myagency.com Core: - /solr/dev-yyy-1-0-en_EN/ - /solr/dev-yyy-1-1-pl_PL/ - /solr/dev-yyy-1-2-de_DE/ - ….. Path: yyy.myagency.com Core: - /solr/dev-yyy-1-0-en_EN/ - /solr/dev-yyy-1-1-pl_PL/ - /solr/dev-yyy-1-2-de_DE/ - ….. Path: yyy.myagency.com Core: - /solr/dev-yyy-1-0-en_EN/ - /solr/dev-yyy-1-1-pl_PL/ - /solr/dev-yyy-1-2-de_DE/ - ….. Path: yyy.myagency.com Core: - /solr/local-yyy-1-0-en_EN/ - /solr/local-yyy-1-1-pl_PL/ - /solr/local-yyy-1-2-de_DE/ - ….. Path: yyy.myagency.com Core: - /solr/local-yyy-1-0-en_EN/ - /solr/local-yyy-1-1-pl_PL/ - /solr/local-yyy-1-2-de_DE/ - ….. Path: yyy.myagency.com Core: - /solr/local-yyy-1-0-en_EN/ - /solr/local-yyy-1-1-pl_PL/ - /solr/local-yyy-1-2-de_DE/ - ….. Path: yyy.myagency.com Core: - /solr/local-yyy-1-0-en_EN/ - /solr/local-yyy-1-1-pl_PL/ - /solr/local-yyy-1-2-de_DE/ - ….. Path: yyy.myagency.com [timestamp]
  • 7. Różne – google/wtyczki Production Backup Production Replication DEFAULT FOR ALL INSTANCES: Integration 1 Integration 2 Integration n Local Developer 1 Local Developer 2 Local Developer n-1 Local Developer n Integration n-1 general { preventIndexingByBots = 1 google.ga.disable = 1 search.indexing.disable = 1 } Production Beta Previous (current) general { preventIndexingByBots = 1 google.ga.disable = 1 email = my11@gmail.com } general { preventIndexingByBots = 1 google.ga.disable = 1 email = my11@gmail.com } general { preventIndexingByBots = 1 google.ga.disable = 1 email = my11@gmail.com } general { preventIndexingByBots = 1 google.ga.disable = 1 email = my11@gmail.com } general { preventIndexingByBots = 1 google.ga.disable = 1 email = my11@gmail.com search.disable = 1 search.indexing.disable = 1 } general { preventIndexingByBots = 1 google.ga.disable = 1 email = my11@gmail.com search.disable = 1 search.indexing.disable = 1 } general { preventIndexingByBots = 1 google.ga.disable = 1 email = my11@gmail.com search.disable = 1 search.indexing.disable = 1 } general { preventIndexingByBots = 1 google.ga.disable = 1 email = my11@gmail.com search.disable = 1 search.indexing.disable = 1 } general { preventIndexingByBots = 1 google.ga.disable = 1 } general { } general { } general { search.indexing.disable = 1 } [timestamp] general { email = office@yyy.com }
  • 8. Dobrze jest ustawić takie domyślne wartości dla niebezpiecznych ustawień, które czynią najmniej szkody i nadpisać je w wyższych kontekstach.
  • 9. Programista wdrażający się do projektu może zapomnieć lub nie być świadomy, że musi ustawić kontekst. Wówczas użyte zostaną bezpieczne wartości domyślne.
  • 10. DEFAULT BEZPIECZNY Production Backup Production Replication Integration 1 Integration 2 Integration n Local Developer 1 Local Developer 2 Local Developer n-1 Local Developer n Integration n-1 general { overwriteAllEmails > } Production Beta Previous (current) general { } general { } general { } general { } general { } general { } general { } general { search.indexing.disable = 0 } general { google.ga.disable = 0 preventIndexingByBots = 0 overwriteAllEmails > } plugin.solr { [beta version settings] search.indexing.disable = 0 } general { google.ga.disable = 0 preventIndexingByBots = 0 overwriteAllEmails > } plugin.solr { [live version settings] search.indexing.disable = 0 } DEFAULT BEZPIECZNY: general { google.ga.disable = 1 preventIndexingByBots = 1 email = test.myagency@gmail.com overwriteAllEmails = test.myagency@gmail.com } plugin.solr { [developers testing version] indexing.disable = 1 } [timestamp]
  • 11. TIP general.overwriteAllEmails Jeżeli general.overwriteAllEmails jest ustawiony w evencie SwiftMailera modyfikujemy email tak, żeby wysyłal zawsze na naszego specjalnie spreparowanego emaila. Email testowy: test.myagency+office_yyy.com@gmail.com Email docelowy: office@yyy.com
  • 12. TIP linkowanie mediów Im więcej instancji tym gigabajty mediów sprawiają większy problem. Rozwiązaniem może być tworzenie linków symbolicznych do pojedynczych plików. Skasować wówczas możemy tylko link a nie prawdziwy plik.
  • 14. Ustawienia dla każdej instancji w notacji TS Przykład dla strony bez języków general { google.ga.disable = 1 preventIndexingByBots = 1 email = test.myagency@gmail.com overwriteAllEmails = test.myagency@gmail.com } domains { main = www.yyy.loc } plugin { solr { host = yyy.myagancy.com path { en = /solr/testing-yyy-1-0-en_EN/ } } }
  • 15. Ustawienia dla każdej instancji w notacji TS Przykład dla strony z językami w jednej domenie general { preventIndexingByBots = 1 google { ga.disable = 1 } search { indexing.disable = 1 frontend.disable = 1 backend.disable = 1 } } domains { main = www.yyy.loc } plugin { solr { host = yyy.myagancy.com path { en = /solr/testing-yyy-1-0-en_EN/ pl = /solr/testing-yyy-1-1-PL_PL/ de = /solr/testing-yyy-1-2-de_DE/ } } } www.yyy.com www.yyy.com/pl www.yyy.com/de
  • 16. Ustawienia dla każdej instancji w notacji TS Przykład dla strony z językami w wielu domenach general { preventIndexingByBots = 1 google { ga.disable = 1 } search { indexing.disable = 1 frontend.disable = 1 backend.disable = 1 } } domains { england = www.yyy.loc poland = pl.yyy.loc germany = de.yyy.loc } plugin { solr { host = yyy.myagancy.com path { en = /solr/testing-yyy-1-0-en_EN/ pl = /solr/testing-yyy-1-1-PL_PL/ de = /solr/testing-yyy-1-2-de_DE/ } } } www.yyy.loc pl.yyy.loc de.yyy.loc
  • 17. World of all applications World of TYPO3
  • 18. Gdzie będziemy używali tych informacji?
  • 19. Zwyczajowe miejsce tych danych to stałe w Typoscript
  • 20. Gdzie będziemy używali tych informacji? WARUNKOWE RENDEROWANIE FRONTENDU TS SETUP: lib.header_search > lib.header_search = COA lib.header_search.if.isFalse = {$general.search.frontend.disable} lib.header_search.wrap = <div class="search clearfix">|</div> lib.header_search.10 < plugin.tx_solr_pi_search
  • 21. Gdzie będziemy używali tych informacji? WARUNKOWE WYSYŁANIE HEADERÓW TS SETUP: [globalVar = LIT:1 = {$general.preventIndexingByBots}] config.additionalHeaders = X-Robots-Tag:noindex,nofollow [end]
  • 22. Gdzie będziemy używali tych informacji? MULTILANG DLA DOMEN NARODOWYCH TS SETUP: // Poland version [globalString = IENV:HTTP_HOST = {$domains.poland}] || [globalVar = GP:L = 1] config { sys_language_uid = 1 language = pl locale_all = pl_PL.UTF-8 htmlTag_langKey = pl } plugin.tx_solr.index.queue.pages.indexer.frontendDataHelper.host = {$domains.poland} [end]
  • 23. Gdzie będziemy używali tych informacji? CORE i PATH DLA SOLR TS SETUP: plugin.tx_solr { solr { host = {$plugin.tx_solr.solr.host} path = {$plugin.tx_solr.solr.path.en} } } [globalString = IENV:HTTP_HOST = {$domains.poland}] || [globalVar = GP:L = 1] plugin.tx_solr.solr.path = {$plugin.tx_solr.solr.path.pl} [end] [globalString = IENV:HTTP_HOST = {$domains.germany}] || [globalVar = GP:L = 2] plugin.tx_solr.solr.path = {$plugin.tx_solr.solr.path.de} [end]
  • 24. Gdzie będziemy używali tych informacji? KONFIGURACJA REALURL DLA DOMEN $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['_DEFAULT']; $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com']['pagePath']['rootpage_id'] = 1; $TYPO3_CONF_VARS['EXTCONF']['realurl']['beta.yyy.com'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com']; $TYPO3_CONF_VARS['EXTCONF']['realurl']['yyy-1.myagency.com'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com']; $TYPO3_CONF_VARS['EXTCONF']['realurl']['yyy-2.myagency.com'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com']; …. …. ….. $TYPO3_CONF_VARS['EXTCONF']['realurl']['yyy.loc'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com']; unset($TYPO3_CONF_VARS['EXTCONF']['realurl']['_DEFAULT']); REAL URL DOKUMENTACJA O $TYPO3_CONF_VARS['EXTCONF']['realurl']['_DEFAULT'] _DEFAULT Key _DEFAULT Type ->siteCfg or pointer to other key with ->siteCfg in same array Description (Deprecated) Configuration of default Speaking URL coding if no matches was found for the specific HOST name. Warning! This is a legacy feature. The use of this option is highly discouraged because it leads to hard to detect errors with speaking URLs, wrong page id resolution, etc. Users are strongly recommended not to use _DEFAULT with multidomain web sites. This will not work correctly and be removed in future versions completely.
  • 25. Jak zmieniać stałe TS w zależności od instancji? METODA 1 1. W każdej z instancji utworzyć plik ze stałymi w lokalizacji typo3conf/constants_local.ts i wylączyć ten plik z GIT 3. Dodać includowanie tego pliku w odpowiednim miejscu w TYPO3 <INCLUDE_TYPOSCRIPT: source="typo3conf/constants_local.ts"> WADY: 1. Przy dużej liczbie stałych i instancji TYPO3 wzrasta ryzyko błędów. 2. Brak śledzenia zmian z wykorzystaniem systemów wersjonowania. 3. Brak automatycznej propagacji zmian z wykorzystaniem systemów wersjonowania.
  • 26. Jak zmieniać stałe TS w zależności od instancji? METODA 2 1. Utworzyć pliki ze stalymi zależnymi od instancji i dodać do GIT: fileadmin /typoscript/ constants/ constants_default.ts fileadmin /typoscript/ constants/ constants_default_local.ts fileadmin /typoscript/ constants/ constants_default_staging.ts fileadmin /typoscript/ constants/ constants_default_live.ts fileadmin /typoscript/ constants/ constants_local.ts fileadmin /typoscript/ constants/ constants_integration-1.ts fileadmin /typoscript/ constants/ constants_integration-n.ts fileadmin /typoscript/ constants/ constants_..........ts fileadmin /typoscript/ constants/ constants_beta.ts fileadmin /typoscript/ constants/ constants_prev.ts fileadmin /typoscript/ constants/ constants_backup.ts fileadmin /typoscript/ constants/ constants_live.ts 2. Utworzyć plik typo3conf/constants_local.ts w każdej z instancji, wyłączyć go z GIT i dodać jego includowanie w TYPO3 <INCLUDE_TYPOSCRIPT: source="FILE:typo3conf/constants_local.ts"> 3. Dodać w nim includowanie pliku zależne od instancji <INCLUDE_TYPOSCRIPT: source="FILE:fileadmin/typoscript/constant/constants_default_local.ts"> <INCLUDE_TYPOSCRIPT: source="FILE:fileadmin/typoscript/constant/constants_local.ts">
  • 27. Jak zmieniać stałe TS w zależności od instancji? METODA 2 WADY: 1. Przy dużej liczbie stałych i instancji TYPO3 wzrasta ryzyko błędów. 2. Brak śledzenia zmian z wykorzystaniem systemów wersjonowania. 3. Brak automatycznej propagacji zmian z wykorzystaniem systemów wersjonowania. 1. Nie mamy określonego kontekstu na poziomie PHP. 2. Nie uzyskamy stałych na niskim poziomie, kiedy nie ma jeszcze obiektu TSFE /realurl, eID, pliki ext_tables.php/ 3. Uzyskanie tych danych w BE wymaga sparsowania całego drzewa TS. 4. W warunkach w stałych nie można używać stałych. To nie zadziała w sekcji stałych: [globalString = IENV:HTTP_HOST = {$domains.poland}] || [globalVar = GP:L = 1] plugin.tx_solr.solr.path = {$plugin.tx_solr.solr.path.pl} [end]
  • 29. Po co jest propertymanager? 1. Plik ze zmiennymi kontekstu wybierany automatycznie na podstawie kontekstu określonego w VHOST / .htaccess / PHP – zmniejszamy liczbę miejsc konfiguracji. 2. Zmienne dostępne w PHP i w Typoscript. 3. Możliwość korzystania w PHP ze zmiennych na niskim pozimie. (index.php / ext_localconf.php etc) 4. Głośna informacja jeżeli zmianna kontekstowa nie jest ustawiona dla kontekstu a są do niej odwołania. 5. Parsing TS jest cachowany. Usuwanie cachu – „Clear all cache” 6. Warunki ze „stałymi” w warunkach w sekcji CONSTANTS działają.
  • 30. Przykładowa konfiguracja I W Extension Manager ustawiamy sciezkę do pliku głównego: files/resources/private/typosctipt/context/context_default.txt config.tx_propertymanager { required = 1 context { default { email = test.myagency@gmail.com overwriteAllEmails = test.myagency@gmail.com } default_staging < .default default_live < .default default_live { email = test.myagency@yyy.com overwriteAllEmails = test.myagency@gmail.com } kontekst1 < .default_live kontekst1 { …...... } } } <INCLUDE_TYPOSCRIPT: source="FILE:files/resources/private/typosctipt/context/context_local.txt"> <INCLUDE_TYPOSCRIPT: source="FILE:files/resources/private/typosctipt/context/context_integration-1.ts"> <INCLUDE_TYPOSCRIPT: source="FILE:files/resources/private/typosctipt/context/context_integration-2.ts"> <INCLUDE_TYPOSCRIPT: source="FILE:files/resources/private/typosctipt/context/context_integration-3.ts"> … <INCLUDE_TYPOSCRIPT: source="FILE:files/resources/private/typosctipt/context/context_beta.ts"> <INCLUDE_TYPOSCRIPT: source="FILE:files/resources/private/typosctipt/context/context_beta.ts"> <INCLUDE_TYPOSCRIPT: source="FILE:files/resources/private/typosctipt/context/context_34234234.ts"> <INCLUDE_TYPOSCRIPT: source="FILE:files/resources/private/typosctipt/context/context_prev.ts"> <INCLUDE_TYPOSCRIPT: source="FILE:files/resources/private/typosctipt/context/context_live.ts">
  • 31. Przykładowa konfiguracja II Przykładowa zawartość: files/resources/private/typosctipt/context/context_local.ts config.tx_propertymanager { context { local < .default_local } }
  • 32. Przykładowa konfiguracja III Przykładowa zawartość: files/resources/private/typosctipt/context/context_live.ts config.tx_propertymanager { context { live < .default_live live { google.ga.disable = 0 ... } } }
  • 33. Jak ustalić kontekst? 1) VHOST <VirtualHost 127.0.0.1:80> DocumentRoot "T:workspace-typo3projectsprojekt - client1.loc" ServerName www.client1.loc SetEnv CONTEXT_IDENTIFIER local </VirtualHost> 2) .htaccess SetEnv CONTEXT_IDENTIFIER local_developer1 3) Ustawiając $GLOBALS['CONTEXT_IDENTIFIER'] w pliku wyłączonym z GIT a) w TYPO3 < 6.0 w pliku typo3conf/localconf_local.php i includowanym w typo3conf/localconf.php b) w TYPO3 > 6.0 w pliku AdditionalConfiguration.php
  • 34. Jak wykorzystać dane z kontekstów? W PHP: $propertymanager = t3lib_div::makeInstance('tx_propertymanager_Manager'); $domains = $propertymanager->getProperty('domains.'); echo($domains['poland']); W CONSTANTS z poniższą notacją: general { email_1 = {@email} email_2 = {@tx_myextension->getValue('email')} otherValue = {@tx_myextension->getSomeValue()} } domains { poland = {@domains.poland} germany = {@domains.germany} ….. } [globalString = IENV:HTTP_HOST = {@domains.germany}] || [globalVar = GP:L = 2] plugin.tx_solr.solr.path = {@plugin.tx_solr.solr.path.de} [end] W SETUP już standardowo używamy zwykłych CONSTANTS plugin.tx_ext { emailAdmin = {$email} }
  • 35. Realurl? KONFIGURACJA REALURL DLA DOMEN $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['_DEFAULT']; $TYPO3_CONF_VARS['EXTCONF']['realurl']['beta.yyy.com'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com']; $TYPO3_CONF_VARS['EXTCONF']['realurl']['yyy-1.myagency.com'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com']; $TYPO3_CONF_VARS['EXTCONF']['realurl']['yyy-2.myagency.com'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com']; …. …. ….. $TYPO3_CONF_VARS['EXTCONF']['realurl']['yyy.loc'] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['www.yyy.com']; unset($TYPO3_CONF_VARS['EXTCONF']['realurl']['_DEFAULT']); include_once(PATH_site . '/typo3conf/ext/propertymanager/Classes/class.tx_propertymanager_Manager.php'); /** @var /* tx_propertymanager_Manager $propertymanager */ $propertymanager = t3lib_div::makeInstance('tx_propertymanager_Manager'); $domains = $propertymanager->getProperty('domains.'); foreach($domains as $domain) { $TYPO3_CONF_VARS['EXTCONF']['realurl'][$domain] = $TYPO3_CONF_VARS['EXTCONF']['realurl']['_DEFAULT']; } unset($TYPO3_CONF_VARS['EXTCONF']['realurl']['_DEFAULT']);
  • 37. Wady autoryzacji .htaccess 1) długość autoryzacji to sesja Użytkownik zamknie przeglądarkę i musi autoryzować się raz jeszcze 2) żeby działała autoryzacja musimy zmienić plik vhosta lub htaccess. Do modyfikacji VHOSTa nie zawsze mamy dostęp a modyfikacja .htaccess wiąże się z jego wyłączeniem z GIT
  • 41. Aktywacja W pliku typo3conf/localconf_local.php /out off git/ $TYPO3_CONF_VARS['EXTCONF']['restrictfe']['enable'] = '0';
  • 42. Zalety 1) Długość autoryzacji ustawiana dowolnie Użytkownik autoryzuje się raz – ogląda wielokrotnie po zamknięciu / otwarciu przegladarki. Autozycacja trzymana w cookie, przy czym możemy wyczyścić po stronie TYPO3 autoryzację. 2) Strona powitalna nowej witryny Ponieważ template pojawiający się bez autoryzacji jest dowolny więc można przygotować stronę powitalną (Witamy! Już niedługo w tym miejscu będzie witryna naszej firmy ABC”). Użytkownicy, którzy zalogują się do TYPO3 w BE ekranu powitalnego nie zobaczą. 3) Brak autoryzacji dla określonych IP i headerów Są wtyczki do przegladarek/proxy, które ustawiają header do każdego requestu. 4 ) Nie trzeba modyfikować .htaccess Htaccess może pozostać w GIT. 5 ) Można wykorzysta na LIVE do blokady wersji językowych Witryna jest już LIVE, ale dodano nową wersję językową, którą trzeba przetłumaczyć. yyy.com/cz/ - bez blokady możliwość zindeksowania przez googla 6 ) Tylko jedno hasło do BE! User ma tyko hasło do BE – nie potrzebuje hasła do .htaccess
  • 43. Połączenie PROPERTYMANAGER I RESTRICTFE Wyłączenie widoku określonych domen językowych include_once(PATH_site . '/typo3conf/ext/propertymanager/Classes/class.tx_propertymanager_Manager.php'); /** @var tx_propertymanager_Manager $propertymanager */ $propertymanager = t3lib_div::makeInstance('tx_propertymanager_Manager'); $domains = $propertymanager->getProperty('domains.'); foreach($domains as $domain) { if( $_SERVER['HOST'] == $domain['url'] && $domain['restrictfe']) $TYPO3_CONF_VARS['EXTCONF']['restrictfe']['enable'] = TRUE; }
  • 44. Dziękuję za uwagę Krystian Szymukowicz (k.szymukowicz@sourcebroker.net) RESTRICTFE http://typo3.org/extensions/repository/view/restrictfe PROPERTYMANAGER k.szymukowicz@sourcebroker.net