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
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
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ą.
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}
}
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