Thursday, November 24, 2011

... was not found in haystack

Повідомлення яке ви бачите в заголовку може з'явитись в тому випадку, якщо ви використовуєте мульті-елементи форми Zend  і вони передають масиви даних. Збудником помилки є валідатор масивів який включений по замовчуванню, виключити його можна ось так: 
$your_form_element->setRegisterInArrayValidator(false);

Замітка по ajax і jquery

Так приблизно виглядає запит ajax для спілкування js із сервером на якому у вас працює скоріш за все php.
 $.ajax({
      url: "необхідні урл",
      data: (необхідні дані),
      success: function(data){
                   обробляємо успішну відповідь
      },
      error: function(msg){
                  обробляємо помилку що виникла
      },
      dataType: "необхідний тип даних",
      type: "МЕТОД ПЕРЕДАЧІ",
});


По заголовку ($.ajax ) зрозуміло що використовується jquery. Про сам ajax і про той же jquery і про них разом можна багато чого почитати користуючись гуглом).
Я хотів тільки привернути увагу до обробки відповідей від сервера, а саме якщо ви використовуєте передачу даних в форматі JSON який вказується в dataType, то не потрібно сподіватись що дані повернуться в якомусь іншому форматі). Записати дані форми найпростіше так: $("#form_name").serialize(). Отримані дані поміщаються в змінну data що передається в функцію в якості аргумента, щоб побачити ці дані вам не вистачить написати alert(data) так як це виведе тільки [object Object] чи щось в тому дусі, отже пишемо alert(JSON.stringify(data)) що і виведе нам всю структуру json об'єкта, що прийшов із сервера. При невдалому опрацюванні запиту буде викликатись функція з error, а в якості аргумента буде передаватись відповідь, та вона на відміну від попереднього випадку не змінюється від типу передачі, і дані з неї можна отримати написавши так: alert(msg.responseText).
І того маємо наступне:
$.ajax({
      url: "mysite.com/mypage",
      data: ($("#form_name").serialize()),
      success: function(data){
                   alert(JSON.stringify(data));
      },
      error: function(msg){
                  alert(msg.responseText);
      },
      dataType: "JSON",
      type: "POST",
});


А ось лінк по даній темі): api.jquery.com/jQuery.ajax

Friday, November 4, 2011

Працюємо з core в magento і залишаємо його буз змін

Із серії тих же заміток для початківців:

Напевно ви вже знаєте що вносити будь які зміни в ядро magento не є хорошим тоном і взагалі неправильним варіантом користування magento оскільки вона передбачає модульність і надає всі можливості для того щоб в ядро не вносити взагалі ніяких поправок.

Для такого типу файлів як блоки все дуже просто, а саме потрібно продублювати їєрархію папок до до тих файлів які ви хочете поміняти або підкорегувати в LOCAL, ну і не забути розмістити в вашій локалній ієрархії самі файли які ви вже змінили, але якщо ви бажаєте щоб і блоки і модулі були не просто продубльовані в локал, а містились в каталозі вашого модуля то потрібно дещо також змінити файл конфігурації і розмістити файли в відповідному місці, але про це згодом тому що контролери мене більше цікавлять на даний момент))

Отже що до такого типу файлів як контролери то тут трохи складніше, оскільки просте дублювання в локал навіть і не розглядається, для мене підійшов наступний метод розширення контролера,  в моєму випадку це був контролера ядра CustomControler, який можна знайти в контролерах Adminhtml.

Thursday, November 3, 2011

Нюанси Magento для початківців (Attribute)

Це перша і сподіваюсь не остання із із серії записок про Magento для початківців:

Припустимо ви добавили атрибут( розгляну на прикладі customer) і наш атрибут добавляється прекрасно в усі необхідні таблички (eav_attribute, customer_eav_attribute), але в мене постало запитання в тому як добавити даний атрибут до конкретного користувача??
я намагався вирішити питання так:


$customer = Mage::getModel('customer/customer')->load($customerId);
$customer->setMyattribute(myvalue);
$customer->save();


але дане рішення не буде ніяк впливати) якщо атрибут ще не є створеним в певній табличці (customer_entity_int, customer_entity_text і т.д.) тобто його ще не було для даного користувача і ніяких даних цей атрибут ще не зберігає. В такому випадку потрібний наступний блок:

$customer = Mage::getModel('customer/customer')->load($customerId);
$customer->setMyattribute(myvalue);
$customer->getResource()->saveAttribute($customer, 'myattribute');


ось цей запис додасть ваш атрибут у відповідну табличку в залежності від типу атрибуту( якщо інт то в табличку атрибутів інт і т.д.)
Після того як наш атрибут вже є доступним, то його можна змінювати і першим методом!

Friday, August 19, 2011

Нюанс .css(jquery) і .style(js)

Це замітка відносно нюанів між методами style в JavaScript і css в JQuery. На даний момент я найшов одну розбіжність, але в подальшому я буду доповнювати дану замітку якщо ще щось знайду.
Отже перша розбіжність це те що .css('background') нічого не поверне на відміну від .style.background який повертає всі значення даного атрибуту до прикладу url() no-repeat і т.д.
Для того щоб отримати дані атрибути з допомогою .css потрібно писати кожний атрибут роздільно, припустимо якщо вам треба дізнатись url() то пишемо .css('background-image').
На цьому і все, продовження буде))

Sunday, August 14, 2011

Глюк Eclipse+PDT на Linux

Можливо не у всіх, але в моєму випадку спостерігалась дивна поведінка екліпса яка виражалась в тому що ніби ні з того ні з сього переставали працювати функціональні клавіші такі як Ctrl+A,S,V,.. Незнаю як кого, а мене такий глюк бісив, а потім десь незамітно все ставало на совї місця. А одного разу я все ж таки зрозумів чого воно так стаєтся, та не треба лякатися бо все набагато простіше ніж я думав, а саме такий баг виклакався тим що коли переводилась мова на російську або українську клавіші змінивше своє призначення переставали виконувати інше функціональне призначення окрім набору літер.
Вирішення просте: переведіть розкладку на USA і буде вам щастя))

Чому не визначається висота елемента з допомогою JS

Це скоріше не стаття а замітка яка стосується визначення висоти елемента з допомогою JavaScript. Всі знають що є багато способів це зробити, а саме з допомогою методу в jQuery .height() або стандартними способами типу .offsetHeight, .clientHeight потрібного елемента також можна отримати дані з CSS відповідного елемента getComputedStyle або currentStyl. Якщо висота елемента є динамічною то її можна визначити першим способом але тільки в тому випадку якщо елемент є видимим!!!
Отже якщо display встановлений в none, то висота такого елемента буде 0, саме на цьому я і хотів наголосити даною заміткою щоб ви не наступали на такі граблі)
Але якщо все ж таки потрібно визначити висоту елемента і прицьму щоб його ніхто не бачив то можна використати такий спосіб:
position: absolute;
left: -9999px;
top: -9999px;

це якщо потрібні якісь ємнісні операції, а інакше можна просто показати елемент, визначити його характеристики і сховати при цьому користувач просто на просто не встигне побачити те що йому і не треба було бачити))