Magento: decimal symbol

Dodany: Kwiecień 21st, 2017 | Kategoria: Magento, PHP

Ponieważ w Magento zależnie od ustawionego języka separatorem miejsc dziesiętnych jest kropka lub przecinek, a miałem klienta, który chciał cyfry po tym znaku zamieniać na małe, musiałem znaleźć rozwiązanie. Mimo setek plików XML jednego prostego rozwiązania nie ma, ale jest funkcja która zwraca nam tablicę zawierającą tę i inne cenne informacje o cenach:

Mage::app()->getLocale()->getJsPriceFormat();

1
2
3
$options = Mage::app()->getLocale()->getJsPriceFormat();
echo $options['decimalSymbol']; // returns . (1.5) or , (1,5)
echo $options['groupSymbol']; // returns , (1,000.5) or . (1.000,5)
Tagi: , , , , Brak komentarzy »

Magento: tłumaczenie z innego języka w obecnym

Dodany: Listopad 18th, 2016 | Kategoria: Magento

Załóżmy, że jesteśmy w angielskim sklepie, ale potrzebujemy wyświetlić jedno tłumacznenie z niemieckiego. Zamiast je kopiować albo hardcode-ować, wystarczy:

1
2
3
4
5
6
7
8
/* define */
$translate = new Mage_Core_Model_Translate();
$translate->setLocale(
    Mage::getStoreConfig(Mage_Core_Model_Locale::XML_PATH_DEFAULT_LOCALE, $storeId)
)->init('frontend');
/* use */
echo $translate->translate(array('Text to translate'));
// optional %s arguments should be given as second and next arguments in array

To wszystko.

Brak komentarzy »

Wyłącznie trybu immersji w GMS / włączenie przycisków nawigacji na stałe.

Dodany: Kwiecień 2nd, 2016 | Kategoria: Game Maker

Nowsze wersje androidów automatycznie wyłączają przyciski nawigacji pomagające wyjść z aplikacji (chyba, że telefon ma fizyczne guziki). Aby je przywrócić, należy:

(zalecam wykonać kopię plików w razie czego, poprawki trzeba nanieść ponownie po aktualizacji GM:S).

Przejść do folderu:

%AppData%\GameMaker-Studio\Android\runner\ProjectFiles\src\main\java\YYAndroidPackageDomain\YYAndroidPackageCompany\YYAndroidPackageProduct

edytować plik RunnerActivity.java

I zmienić linijki
1) z:

1680
1681
// if 4.4 (kitkat) or above then go into immersive mode
int vis = 0x1;

na:

1680
1681
// if 4.4 (kitkat) or above then go into immersive mode
int vis = 0;

2) z:

1689
vis = 0x706;

na:

1689
vis = 0;

3) z:

1694
vis = 0x1706;

na:

1694
vis = 0;

Krok 2:
Następnie przechodzimy do folderu:

%AppData%\GameMaker-Studio\Android\runner\ProjectFiles\src\main

i edytujemy AndroidManifest.xml
z:

23
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

na:

23
android:theme="@style/MyTheme"

Krok 3:
Przechodzimy do folderu:

%AppData%\GameMaker-Studio\Android\runner\ProjectFiles\src\main\res

Kopiujemy (duplikujemy) folder values i nazywamy go values-v19

W folderze values (tym oryginalnym) tworzymy plik style.xml

1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyTheme" parent="@android:style/Theme.Light">
    <!-- Any customizations for your app running on devices with Theme.Light here -->
</style>
</resources>

W folderze values-v19 tworzymy plik style.xml

1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyTheme" parent="@android:style/Theme.Holo.NoActionBar.TranslucentDecor">
    <!-- Any customizations for your app running on devices with Theme.Holo here -->
</style>
</resources>

Czyścimy cache w GM:S i odpalamy. Pasek nawigacyjny powinien pozostawać na miejscu, a przycisk return powinien być dostępny.

Tagi: , , , Brak komentarzy »

Magento: HEADERS ALREADY SENT

Dodany: Listopad 13th, 2015 | Kategoria: Magento, PHP

Jeśli nagłówki zostały już wysłane, magento będzie w logach pluć błędem: DEBUG (7): HEADERS ALREADY SENT:, wraz ze stosem plików które doprowadziły do logowania tego błędu w app/code/core/Mage/Core/Controller/Response/Http.php:44

Niestety, lista ta nie mówi zbyt wiele:

[1] /lib/Zend/Controller/Response/Abstract.php:766
[2] /app/code/core/Mage/Core/Controller/Response/Http.php:77
[3] /app/code/core/Mage/Core/Controller/Varien/Front.php:188
[4] /app/code/core/Mage/Core/Model/App.php:347
[5] /app/Mage.php:640
[6] /index.php:78

Wystarczy jednak niewielka modyfikacja i dowiemy się gdzie leży problem. Proponuję skopiować plik app/code/core/Mage/Core/Controller/Response/Http.php do app/code/local/Mage/Core/Controller/Response/Http.php

i w metodzie sendHeaders() zamienić:

43
44
45
46
if (!$this->canSendHeaders()) {
    Mage::log('HEADERS ALREADY SENT: '.mageDebugBacktrace(true, true, true));
    return $this;
}

na

43
44
45
46
47
if (!$this->canSendHeaders()) {
    headers_sent($file, $line);
    Mage::log('HEADERS ALREADY SENT: '. $file .':' . $line);
    return $this;
}
Brak komentarzy »

Magento – reindex Solr

Dodany: Listopad 4th, 2015 | Kategoria: Magento, PHP
1
2
cd /var/www/html/magento/shell
php indexer.php --reindex catalogsearch_fulltext
Tagi: , , Brak komentarzy »

Kilka wersji PHP na raz w różnych katalogach pod jednym Apache [WAMP]

Dodany: Maj 5th, 2015 | Kategoria: Apache, PHP

Należy pobrać fcgi dla apache:

Wklejamy mod_fcgid.so do wamp\bin\apache\apache2.x.x\modules

Otwieramy plik konfiguracyjny apache wamp\bin\apache\conf\httpd.conf. Znajdujemy linijkę:

1
LoadModule php5_module "C:/Wamp/bin/php/php5.5.x/php5apache2_4.dll

I zamieniamy na

1
2
#LoadModule php5_module "C:/Wamp/bin/php/php5.5.x/php5apache2_4.dll
LoadModule fcgid_module modules/mod_fcgid.so

Poniżej dodajemy też konfigurację dla domyślnego PHP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FcgidInitialEnv PATH "C:/wamp/bin/php/php5.5.x;C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/System32/Wbem;"
FcgidInitialEnv SystemRoot "C:/Windows"
FcgidInitialEnv SystemDrive "C:"
FcgidInitialEnv TEMP "C:/wamp/tmp"
FcgidInitialEnv TMP "C:/wamp/tmp"
FcgidInitialEnv windir "C:/WINDOWS"
FcgidIOTimeout 64
FcgidConnectTimeout 16
FcgidMaxRequestsPerProcess 1000
FcgidMaxProcesses 3
FcgidMaxRequestLen 8131072
# Location php.ini:
FcgidInitialEnv PHPRC "C:\wamp\bin\php\php5.5.x"
FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000
Options Indexes FollowSymLinks ExecCGI
AddHandler fcgid-script .php
FcgidWrapper "C:/wamp/bin/php/php5.5.x/php-cgi.exe" .php

Restartujemy WAMPa i sprawdzamy, czy adres http://localhost/?phpinfo=1 działa.

Przechodzimy do konfiguracji VHOSTów do sekcji <Directory> danego hosta, albo tworzymy plik .htaccess (otaczamy wtedy fragmenty w <Files ~ "\.php$">...</Files> w katalogu w którym chcemy innej wersji PHP i dodajemy:

1
FcgidWrapper "D:/wamp/bin/php/php5.3.x/php-cgi.exe" .php

Lub, jeśli nie chcemy, żeby do konfiguracji został użyty ten sam plik INI dla domyślnego PHP:

1
FcgidWrapper "D:/wamp/bin/php/php5.3.x/php-cgi.exe -c D:/wamp/bin/php/php5.3.x/php.ini" .php

Druga wersja jest zapewne tą bardziej pożądaną :)

Źródła: [1], [2], [2], [3], oraz własne metody prób i błędów :)

Tagi: , , , Brak komentarzy »

[Magento] Dodanie opcji do istniejącego atrybutu

Dodany: Kwiecień 24th, 2015 | Kategoria: Magento, PHP

Jeżeli atrybut w Magento istnieje i ma już opcje, można je dodać tak:

1
2
3
4
5
6
7
8
9
10
$arg_attribute = 'nazwa_attr';
$arg_value = '<< Nowa opcja >>';

$attr_id = Mage::getModel('catalog/resource_eav_attribute')->loadByCode('catalog_product', $arg_attribute)->getAttributeId();

$option['attribute_id'] = $attr_id;
$option['value']['<< JAKAŚ NAZWA KLUCZA >>'][0] = $arg_value;

$setup = new Mage_Eav_Model_Entity_Setup('core_setup');
$setup->addAttributeOption($option);
Brak komentarzy »

[Magento] Nazwa identyfikatora akcji dla layoutu

Dodany: Luty 26th, 2015 | Kategoria: Magento

Tworząc w magento layout należy podać identyfikator dla danego kontrolera i akcji. Niestety czasem są z tym problemy, ale można dość szybko znaleźć wyciągnąć ten identyfikator w samej akcji za pomocą:

1
$this->getFullActionName()
Tagi: , , Brak komentarzy »

Interpolacja między kolorami

Dodany: Styczeń 20th, 2015 | Kategoria: PHP

Mamy dwa kolory, chcielibyśmy uzyskać kolor pomiędzy nimi wyrażony w procentach (0% – 100%).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function mixcolors($color1, $color2, $amt)
{
$amt = min(1, max($amt, 0));

$c1_R = hexdec(substr($color1, 0, 2));
$c1_G = hexdec(substr($color1, 2, 2));
$c1_B = hexdec(substr($color1, 4, 2));

$c2_R = hexdec(substr($color2, 0, 2));
$c2_G = hexdec(substr($color2, 2, 2));
$c2_B = hexdec(substr($color2, 4, 2));

$d1 = $c1_R + (($c2_R - $c1_R) * $amt);
$d2 = $c1_G + (($c2_G - $c1_G) * $amt);
$d3 = $c1_B + (($c2_B - $c1_B) * $amt);

$m_p1 = sprintf('%02x', round($d1));
$m_p2 = sprintf('%02x', round($d2));
$m_p3 = sprintf('%02x', round($d3));

return '#' . $m_p1 . $m_p2 . $m_p3;
}

Wynik funkcji 

1
mixcolors('FF0000','00FF00', X)

gdzie X to kolejno 0, 0.25, 0.5, 0.75, 1

ff0000
bf4000
808000
40bf00
00ff00

Tagi: , , , , Brak komentarzy »

Zarezerwowanie pamięci pod wyświetlenie Fatal Errora w PHP

Dodany: Listopad 22nd, 2014 | Kategoria: PHP

Jeśli w PHP zabraknie pamięci, to wyświetli się stosowny komunikat na ten temat i skrypt wysypie się.
Można jednak zarezerwować sobie trochę pamięci, aby wyświetlić własny komunikat o błędzie:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php

error_reporting(0);

ini_set('memory_limit', '1M');

$memory = str_repeat('x', 262144);
   
register_shutdown_function('handleFatalError');
   
function handleFatalError() {
    global $memory;
    unset($memory);
    $error = error_get_last();
    echo $error['message'] . PHP_EOL . $error['type'] . PHP_EOL . $error['type'] . PHP_EOL . $error['file'] . PHP_EOL . $error['line'] . PHP_EOL;
}

// uncomment one of them:

// this_function_doesnt_exists();

// or

$memory_error = str_repeat('x', 500000);

// zaczerpnięte z kodu Yii 2

Brak komentarzy »