четверг, 29 декабря 2011 г.

Новогоднее поздравление из Индии

$productIds = array();
foreach ($ids as $categoryId) {
    $category = Mage::getModel('catalog/category')->load($id);
    if ($category->getId()) {
        foreach ($category->getProductCollection() as $product) {
            $productIds[] = $product->getId();
        }
    }
}

Читать далее

пятница, 16 декабря 2011 г.

Как узнать количество места в *nix

Первым делом читаем:
$ man df

Если после этого все-равно ничего не получается, то подскажу несколько примеров использования данной утилиты
1. Узнать общее количество места на дисках:
$ df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/ad0s1a    496M    334M    122M    73%    /
devfs          1.0K    1.0K      0B   100%    /dev
/dev/ad0s1e    1.9G     30M    1.7G     2%    /tmp
/dev/ad0s1f     13G     11G    1.1G    91%    /usr
/dev/ad0s1d    2.9G    881M    1.8G    32%    /var

2. Узнать количество месте в определенной папке:
$ du -hd 1 /var
2.0K    /var/.snap
2.0K    /var/account
6.0K    /var/at
2.0K    /var/audit
 14K    /var/backups
4.0K    /var/crash
4.0K    /var/cron
765M    /var/db
2.0K    /var/empty
2.0K    /var/heimdal
 96M    /var/log
 19M    /var/mail
4.0K    /var/msgs
 52K    /var/named
2.0K    /var/preserve
 56K    /var/run
2.0K    /var/rwho
 20K    /var/spool
320K    /var/tmp
 24K    /var/yp
2.0K    /var/games
881M    /var

Где 1 - уровень вложенности.
Читать далее

вторник, 13 декабря 2011 г.

Интересное поведение PHPUnit_Framework_Assert::assertEquals()

Сегодня узнал интересное поведение PHPUnit_Framework_Assert::assertEquals().

Данная проверка проходит так:
$result = true;
$this->assertEquals('You have not enough rights', $result, "bla bla bla");

и так:
$result = 'You have not enough rights';
$this->assertEquals('You have not enough rights', $result, "bla bla bla");

Интересно, правда? Чтобы тесты вернули свою актуальность, необходимо добавить еще один асерт - PHPUnit_Framework_Assert::assertInternalType():
$result = true;
$this->assertInternalType('string', $result);
$this->assertEquals('You have not enough rights', $result, "bla bla bla");

Читать далее

среда, 9 ноября 2011 г.

SVN: Обновление на старую ревизию

Иногда возникает необходимость обновить проект на более старую ревизию. Иными словами - "откатиться". Сделать это можно с помощью такой команды:
 svn update -r REV
где REV это номер необходимой ревизии.

Читать далее

суббота, 5 ноября 2011 г.

Удаление кеша SVN credentials в *nix

Вчера возникла необходимость передать свою виртуальную машину, с которой я работаю другому работнику. Причина была в том, что у него после ребута посыпалась файловая система. После нескольких попыток реанимации было принято решение об экспорте/импорте моей виртуалки.

Все успешно перенесли, но осталась необходимость сбросить SVN credentials в FreeBSD, чтобы он не комитил под моим именем. Все оказалось достаточно просто, т.к. все креденшелы лежат в папке .subversion/auth/svn.simple. Удаляем нужный файл/запись и все. При следующем операции с репозиторием необходимо будет ввести новые авторизационные данные.
Читать далее

среда, 2 ноября 2011 г.

Запаковать контент с помощью tar gz

tar -zcvf packagename.tar.gz folder/

Читать далее

пятница, 21 октября 2011 г.

Need help: phpStorm + PHPUnit

Есть такие составляющие
1. Сервер на FreeBSD с проектами, которые расшарены по самбе
2. Установленный PHPUnit 3.5.14
3. phpStorm с проиндексированными проектами. Работую через самбу

На данный момент я запускаю интеграционные тесты из консоли командой
phpunit

Что я хочу: настроить запуск текстов из IDE.
В чем проблема: phpUnit и php находятся на виртуальной машине. Тоесть, IDE не может к ним подключиться.

Есть у кого варианты решения кроме создания симлинков и добавления прав на чтение?
Читать далее

четверг, 20 октября 2011 г.

Как тренируют настоящих вебмастеров


Верстать сайты, сидя в противогазе - настоящий дзен.
Читать далее

среда, 19 октября 2011 г.

Эффективная работа с унаследованным кодом


Взял на прошлой неделе в рабочей библиотеке книгу Эффективная работа с унаследованным кодом. На выходных получилось ее только пролистать, а вот вчера руки дошли до полноценного читательного процесса. Что я могу сказать? В книге очень много нового для меня, но в то же время я вижу много воды, неправильные термины. Например, модульное тестирование называется блочным. Читать книгу скучно. Но я планирую пропускать воду и находить только интересные моменты. Посмотрим что из этого получится.

Это вторая техническая книга с подобным переводом, которая попадает мне в руки. Первой была CMS Drupal 6. Но там все вообще было грустно, так как функции "кладут обратно правду" (return true).
Читать далее

понедельник, 17 октября 2011 г.

Magento Forms: Prototype Javascript Validation


Javascript валидация не является основной проверкой введенных данных пользователями, но ее использование необходимо для повышения юзабилити сайта. Кроме того, уменьшается количество запросов на сервер и повышается его производятельность, т.к. первичная валидация происходит у пользователя в браузере. У Magento есть своя удобная валидация, о которой сегодня и пойдет речь.

Javascript валидация в Magento

Для валидации форм в Magento используется файл form.js (js/varien/form.js), в котором находятся все необходимые Javascript функции. Во время валидации используется класс Validation, который является частью Javascript библиотеки Prototype. Его работа заключается в проверке определенных html-классов. Каждое имя класса говорит валидатору какой тип проверки можно использовать.

Учимся валидировать

Добавить Javascript валидацию для вашей формы очень просто. Во-первых, необходимо создать объект Form (form.js), который будет с ней работать.

Первый параметр в это примере является ID вашей формы. Второй параметр определяет стоит ли делать фокус на первом input-элементе. Если он определен как true, то курсор будет автоматически переведен на первый input-поле. Вы можете отключить данную функциональность, устанавливая второй параметр как false.

Теперь, когда вы создали Javascript объект, который определяет форму, необходимо добавить валидационные правила в ваши input-поля.





Классы 'required-entry' and 'validate-email' отвечают за валидацию полей. Если любое из них ее не пройдет, то форма не будет отправлена, а пользователь увидит специальные сообщения об ошибках.

Magento Javascript Validation Classes

Существует много валидационных классов. Я нашел вот такой список. Под классами описаны ошибки, которые показываются пользователи в случае фейла валидации. Для большей информации используйте Google, экспериментируйте с кодом или связывайтесь со мной.

validate-select
Please select an option

required-entry
This is a required field

validate-number
Please enter a valid number in this field

validate-digits
Please use numbers only in this field. please avoid spaces or other characters such as dots or commas

validate-alpha
Please use letters only (a-z or A-Z) in this field.

validate-code
Please use only letters (a-z), numbers (0-9) or underscore(_) in this field, first character should be a letter.

validate-alphanum
Please use only letters (a-z or A-Z) or numbers (0-9) only in this field. No spaces or other characters are allowed

validate-street
Please use only letters (a-z or A-Z) or numbers (0-9) or spaces and # only in this field

validate-phoneStrict
Please enter a valid phone number. For example (123) 456-7890 or 123-456-7890

validate-phoneLax
Please enter a valid phone number. For example (123) 456-7890 or 123-456-7890

validate-fax
Please enter a valid fax number. For example (123) 456-7890 or 123-456-7890

validate-date
Please enter a valid date

validate-email
Please enter a valid email address. For example johndoe@domain.com.

validate-emailSender
Please use only letters (a-z or A-Z), numbers (0-9) , underscore(_) or spaces in this field.

validate-password
Please enter 6 or more characters. Leading or trailing spaces will be ignored

validate-admin-password
Please enter 7 or more characters. Password should contain both numeric and alphabetic characters

validate-cpassword
Please make sure your passwords match

validate-url
Please enter a valid URL. http:// is required

validate-clean-url
Please enter a valid URL. For example http://www.example.com or www.example.com

validate-identifier
Please enter a valid Identifier. For example example-page, example-page.html or anotherlevel/example-page

validate-xml-identifier
Please enter a valid XML-identifier. For example something_1, block5, id-4

validate-ssn
Please enter a valid social security number. For example 123-45-6789

validate-zip
Please enter a valid zip code. For example 90602 or 90602-1234

validate-zip-international
Please enter a valid zip code

validate-date-au
Please use this date format: dd/mm/yyyy. For example 17/03/2006 for the 17th of March, 2006

validate-currency-dollar
Please enter a valid $ amount. For example $100.00

validate-one-required
Please select one of the above options.

validate-one-required-by-name
Please select one of the options.

validate-not-negative-number
Please enter a valid number in this field

validate-state
Please select State/Province

validate-new-password
Please enter 6 or more characters. Leading or trailing spaces will be ignored

validate-greater-than-zero
Please enter a number greater than 0 in this field

validate-zero-or-greater
Please enter a number 0 or greater in this field

validate-cc-number
Please enter a valid credit card number.

validate-cc-type
Credit card number doesn't match credit card type

validate-cc-type-select
Card type doesn't match credit card number

validate-cc-exp
Incorrect credit card expiration date

validate-cc-cvn
Please enter a valid credit card verification number.

validate-data
Please use only letters (a-z or A-Z), numbers (0-9) or underscore(_) in this field, first character should be a letter.

validate-css-length
Please input a valid CSS-length. For example 100px or 77pt or 20em or .5ex or 50%

validate-length
Maximum length exceeded

Читать далее

пятница, 14 октября 2011 г.

box.net дарит 50GB для пользователей iOS


box.net сегодня начал замечательную акцию - 50GB в подарок для пользователей iOS девайсов. Акция продлится 50 дней, место дарится навсегда! Я уже зарегистрировал там аккаунт, мне дали 5GB места, но после авторизации с iPhone количество свободного пространства на сервере было увеличено до 50GB. Пруфлик: http://blog.box.net/2011/10/12/were-giving-ios-users-insane-amounts-of-free-storage-box50gb/.
Читать далее

Реиндекс в Magento с помощью модели

Иногда необходимо сделать реиндекс в Magento прямо в PHP коде. Сделать это можно так:
$processCollection = Mage::getResourceModel('index/process_collection');
/** @var $process Mage_Index_Model_Process */
foreach ($processCollection as $process) {
    $process->reindexAll();
}

Читать далее

четверг, 13 октября 2011 г.

Конец испытательного срока


Ура! Я знал что этот момент когда-нибудь настанет. 3.5 месяца моего пребывания на испытательном сроке позади. Теперь я полноправный сотрудник Magento, Inc., an eBay Company (X.Commerce). Спасибо всем кто причастен к этому :)
Читать далее

Посещаемость



Некоторым известно, что я поддерживаю ресурс http://videobzor.com. Проект сугубо аматорский и не подразумевает пока что какой-либо финансовой выгоды. Сначала он ресурс проектировался как склад видеобзоров на различную тематику, но со временем все свелось к узконаправленному ресурсу с видео тест-драйвов. В начале сентября я забросил его, но посещаемость держалась на уровне 100-150 хосто в день. В начале сентября она упала ниже 100 хостов и я решил поднять ее, начал обновлять сайт. В результате, посещаемость начала расти. Пиком стало 200 хостов, после чего все выровнялось на свои стандартные ~150 хостов/день. Думаю менять дизайн и что-то в структуре. Есть пожелания?
Читать далее

среда, 12 октября 2011 г.

Отключение кеширования в Magento


Встроенное кеширование Magento очень полезно для быстродействия, но мешает нормальной разработке под эту систему. Сегодня я расскажу об его выключении.

Для его выключения нужно пройти в админку и зайти в System => Cache Management


У вас загрузится страничка с примерно таким содержанием


Выбираете все типы кеша и ставите им disable status


Для чистки кеша можно нажать на кнопку Flush Magento Cache или удалить (очистить) папку var/cache. Не волнуйтесь, в случае ее удаления, она снова создастся в файловой системе.

Внимание! Если вы запретили использования кеша в админке, то это не еще факт что он у вас не создается ;) Так что при каких-либо проблемах при девелопменте под Magento, не забывайте очищать кеш.

Читать далее

Online RSS

Я не представляю как можно пользоваться веб-приложением с таким ужасным интерфейсом


Есть такие? Просто мне плеваться хочется на него :) Есть альтернативы? Дома читаю только с помощью MobileRSS для iOS.
Читать далее

Online GTD. Связываем яблочные девайсы.

На прошлой работе долго искал GTD программу для Windows или веб-клиент + клиенты под iOS. В результате, ничего подходящего не нашел. И вот сегодня я нашел такой сервис: Flow.

Заходим на сайт и сразу видим они могут нам предложить


Внутри нас ожидает полноценное веб-приложение, которое позволяет привести в порядок все свои домашние/рабочие дела. Думаю, сервис подойдет для небольших команд (до 10 человек). Интерфейс очень напоминает Things, который в свою очедь потерял множество покупателей из-за отсутствия веб-версии.

Напоследок хочу предупредить, что сервис платный. Цена составляет 9.99$/месяц или 100$/год. Согласитесь, это не большая цена за порядок в голове.
Читать далее

PayPal начал отправлять платежи в Россию! Украина опять ...

А Украина под Угандой. Пруфлинк - http://www.paypal.com/cgi-bin/webscr?cmd=_display-approved-signup-countries-outside
Мне оно не особо нужно, но "за державу обидно" (с)
Читать далее

среда, 14 сентября 2011 г.

Очистка кеша WSDL при использовании SoapClient

Сейчас работаю с платежной системой Zuora. Вчера возникла проблема с сохранением кастомных атрибутов на сервере. Проблема заключалась в том, что атрибут не сейвился у определенного объекта. Общаемся мы с помощью стандартного SoapClient. После просмотра реквеста, оказалось что данный атрибут даже не отправляется на сервис, т.к. SoapClient() юзал не отредактированный WSDL, а из кеша. Чтобы очистить кеш, нужно прописать:
ini_set("soap.wsdl_cache_enabled", 0);
или
$client = new SoapClient('http://somewhere.com/?wsdl', array('cache_wsdl' => 0));

Читать далее

воскресенье, 28 августа 2011 г.

Получение статуса авторизации кастомера в Magento

Всем привет!

Хочу вам показать простой, но очень важный скрипт проверки статуса авторизации кастомера в Magento:
/** @var $session Mage_Customer_Model_Session  */
$session = Mage::getSingleton('customer/session');
if ($session->isLoggedIn()) {
    // logged in
} else {
    // not logged in
}

Читать далее

Отключение "Billing Agreements" и "Recurring Profiles" в Magento

Всем привет!

Среди новых функциональностей, введенных в Magento 1.4.1.0, появились "Billing Agreements" и "Recurring Profiles".

Но они не всегда нужна, а отключить их из админки не является возможным.

Для скрытия ссылок с блока навигации кастомера в "My Account", вы можете скопировать billing_agreement.xml и recurring_profile.xml с /app/design/frontend/base/default/layout/sales/ в /app/design/frontend/default/yourtheme/layout/sales/.

После копирования файлов в их новое месторасположение вы должны отредактировать их. Найдите следующий код в billing_agreement.xml:

    
        billing_agreementssales/billing_agreement/
    


Замените его на:

    
        
    


Найдите следующий код в recurring_profile.xml:

    
        recurring_profilessales/recurring_profile/
    


Замените его на:

    
        
    


Внимание! С помощью этих действий вы только удалите ссылки с блока навигации, но не отключите функциональность.
Читать далее

Возвращение

Последние 2 месяца работа с (и на) Magento. За все это время мне встречались многие интересные моменты, о которых я хотел рассказать, но не было желания и места. В пятницу я вспомнил об этом блоге, который задумывался как "быдлокодерский". Его и продолжу.

Итак, теперь:
http://siv-sid.livejournal.com - записки о жизни и работе без кода
http://siv-sid.blogspot.com - записки о программировании и работе с кодом
Читать далее

понедельник, 24 января 2011 г.

Узнаем количество ОЗУ в FreeBSD

# less /var/log/messages | grep "real memory"

Читать далее

У меня появился VDS



Ура! У меня с сегодняшнего дня есть VDS от ИТЛ с родненькой FreeBSD на борту. А это означает что я буду вспоминать свое счастливое админское детство и постить разные штуки для FreeBSD ^_^
Читать далее

суббота, 1 января 2011 г.

Обнаружение iPad с помощью PHP



Месяц назад я стал обладателем iPad. Я не буду рассказывать о всех прелестях и перспективах данного продукта, т.к. для этого есть специализированные обзоры.

Наверняка, каждый веб-разработчик захочет кастомизировать свой дизайн под посетителей с "таблетками". Поскольку user agent сего девайса имеет вид:
Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10
делается это очень просто:
$isiPad = (bool) strpos($_SERVER['HTTP_USER_AGENT'],'iPad');

Если вы хотите создать отдельную мобильную версию сайта, то достаточно отредактировать .htaccess:
RewriteCond %{HTTP_USER_AGENT} ^.*iPad.*$
RewriteRule ^(.*)$ http://ipad.yourdomain.com [R=301]

Читать далее