четверг, 31 января 2013 г.

Magento: выключение всех модулей в local code pool

Magento позволяет быстро и безболезненно выключить все модули, котолые лежат в local code pool (app/code/local). Для этого нужно открыть файл app/etc/local.xml и установить true для ноды disable_local_modules:

    
        ...
        true
        ...
    
    ...


Если у вас включено кеширование, то после сохранения изменений нужно очистить кеш.

Это действие предотвратит использование любого кода из вашего local code pool и поможет разобраться с проблемами переопределения кода.
Читать далее

воскресенье, 20 января 2013 г.

PHP: кавычки в str_replace()

Недавно передо мной стала задача удаления некоторых ASCII Device Control Characters из текста. Поскольку удалять нужно было определенные символы, я решил использовать str_replace(). В процессе имплементации было обнаружено разное поведение функции, в зависимости от типа кавычек, в которых мы передаем первый параметр.

Одинарные кавычки
str_replace('\x07', '', $text);
В этом случае функция ищет вхождения плейнтекста '\x07'.

Двойные кавычки
str_replace("\x07", '', $text);
В этом случае функция ищет вхождения ASCII символа '\x07'.
Читать далее

суббота, 8 декабря 2012 г.

Очистка memcache

Очистить memcache можно двумя способами: варварским и нормальным. "Варварский" это перезапуск сервиса memcached. "Человеческий" это присоединиться по telnet к memcache и выполнить команду flush_all.

Например,
telnet 127.0.0.1 11211 // присоединяемся
flush_all // чистим
quit // разрываем соединение

Читать далее

суббота, 10 ноября 2012 г.

Magento: обновление отдельного атрибута продукта

При работе с Magento часто возникают ситуации, когда нужно обновить значение какого-то одного атрибута + его значение во flat-таблице. Такая ситуация может возникнуть в cron-скриптах, которые обрабатывают данные от третьего ресурса. Например, мы используем комментарии от Disqus и хотим раз в день забирать от них кол-во комментариев для каждого продукта. Сохранять модель в цикле это самоубийство, потому на помощь приходит Mage_Eav_Model_Entity_Abstract::saveAttribute().

Предположим, у нас есть атрибут продукта 'disqus_comment_count' и мы как-то (например, с помощью API) получаем от Disqus новые значения комментариев.
/** @var $productFlatIndexer Mage_Catalog_Model_Product_Flat_Indexer */
$productFlatIndexer = Mage::getModel('catalog/product_flat_indexer'); // модель для обновления значения атрибута во flat-таблице
$storeId = 1; // необходимый store id

/** @var $productCollection Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection */
$productCollection = Mage::getResourceModel('appstore_extension/product_collection');

/** @var $product AppStore_Extension_Model_Product */
foreach ($productCollection as $product) {
    $product->setDiscusCommentCount($newCommentValue);
    $product->getResource()
        ->saveAttribute($product, 'disqus_comment_count');

    // Обновляем значение атрибута во flat-таблице стора
    $productFlatIndexer->updateAttribute('disqus_comment_count', $storeId, $product->getId());
}
Вот и все. Стоит сказать, что Mage_Catalog_Model_Product_Flat_Indexer::updateAttribute() в цикле это не лучшее решение. Если логика приложения позволяет вынести вызов этого метода из цикла и обновить значение атрибута для пачки продуктов - смело делайте это.
Читать далее

Установка и настройка Pure-FTPd на FreeBSD

На днях понадобилось устанавливать Pure-FTPd на FreeBSD. Вот небольшой мануал:
sudo portsnap fetch update
cd /usr/ports/ftp/pure-ftpd
sudo make config install clean (убедитесь что включена опция "Support for TLS")
sudo ee /usr/local/etc/pure-ftpd.conf
sudo echo pureftpd_enable="YES" >> /etc/rc.conf (см. конфиг ниже)
sudo /usr/local/etc/rc.d/pure-ftpd start
rehash
sudo pure-pw useradd LOGIN -u UID -g GID -d /home/igor/ftp -m (введите ваш LOGIN, UID и GID. UID можно найти в /etc/group, GID такой же как UID)

FTP сервер настроен. Если вам нужна поддержка SSL/TLS, выполните следующее:
sudo mkdir -p /etc/ssl/private
sudo openssl req -x509 -nodes -newkey rsa:1024 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem You should skip all questions pressing Enter or enter any appropriate values
sudo chmod 600 /etc/ssl/private/*.pem
sudo ee /usr/local/etc/pure-ftpd.conf Add "TLS 1" at the end of file and save
sudo /usr/local/etc/rc.d/pure-ftpd restart

Содержимое конфига pure-ftpd.conf:
ChrootEveryone              yes
TrustedGID                  1004
BrokenClientsCompatibility  no
MaxClientsNumber            20
Daemonize                   yes
MaxClientsPerIP             8
VerboseLog                  no
DisplayDotFiles             yes
AnonymousOnly               no
NoAnonymous                 yes
SyslogFacility              none
# FortunesFile              /usr/share/fortune/zippy
DontResolve                 yes
# MaxIdleTime               15
PureDB                      /usr/local/etc/pureftpd.pdb
UnixAuthentication          yes
LimitRecursion              10000 8
AnonymousCanCreateDirs      no
MaxLoad                     4
#AntiWarez                  yes
Umask                       133:022
MinUID                      1000
ProhibitDotFilesWrite       no
ProhibitDotFilesRead        no
AnonymousCantUpload         yes
AltLog                      clf:/var/log/pureftpd.log
#Quota                      100000000:1200
MaxDiskUsage                95
CustomerProof               yes
NoTruncate                  yes
IPV4Only                    yes

Эти шаги помогут вам установить и запустить ftp-сервер. Для кастомизации читаем "man pure-pw" или отправляемся сюда.
Читать далее

пятница, 12 октября 2012 г.

Magento: создаем кастомный JS валидатор

Год назад я уже писал о плагине Validation для Prototype, который используется в Magento. Стандартные валидаторы это хорошо. Но что делать, если нужно создать кастомный? Например, очень часто необходимо комбинировать существующими или изменить текст ошибки валидатора.

Делается это очень просто. Допустим, у нас есть поле, которое мы валидируем стандартными классами:


Для создания кастомного валидатора необходимо убрать валидационный класс "validate-length", но параметры оставить. Они нам еще пригодятся.

Добавляем валидатор




Мы убрали стандартный валидационный класс "validate-length" и заменили его на кастомный "required-title", в котором использовали логику стандартного валидатора.

Можно добавить сразу несколько валидаторов





Читать далее

воскресенье, 19 августа 2012 г.

Magento: открываем в нужную табу после редиректа

Очень часто при работе с бекендом в Magento требуется сделать редирект на страницу и открыть определенную табу. Например, представим что у нас в табе находится грид, в котором мы производим delete mass action. После выполнения этого действия необходимо вернуться на эту же страницу и открыть табу с гридом. Делается это очень просто.

Сначала необходимо взять имя табы из хендла, в котором она описана:

    sms_reply_tab
    navoq_magicsms/adminhtml_sms_tab_reply

Названием добавленной табы является содержимое тега .

Теперь можно выполнять редирект:
$this->_redirect("*/navoq_magicsms/edit", array(
    'id'         => $sms->getId(),
    'active_tab' => 'sms_reply_tab',
));

Таба откроется благодаря параметру active_tab, в который мы передаем имя табы.
Читать далее