MarcinPaul.pl

Tag PHP

Aby szybko i beż grzebanie w plikach corowych Magento usunąć niepotrzebne metody sortowania produktów (np. position, relevance) wystarczy edytować plik szablonu toolbar.phtml w katalogu app/design/frontend/…/…/template/catalog/product/list/ dopisując odpowiedni kod w polu select sort-by:

$this->removeOrderFromAvailableOrders('position');
$this->removeOrderFromAvailableOrders('relevance');

Całość może wyglądać tak:

<select onchange="setLocation(this.value)">
 <?php $this->removeOrderFromAvailableOrders('position'); ?>
 <?php $this->removeOrderFromAvailableOrders('relevance'); ?>
 <?php foreach($this->getAvailableOrders() as $_key=>$_order): ?>
 <option value="<?php echo $this->getOrderUrl($_key, 'asc') ?>"<?php if($this->isOrderCurrent($_key)): ?> selected="selected"<?php endif; ?>>
 <?php echo $this->__($_order) ?>
 </option>
 <?php endforeach; ?>
</select>

W podobny sposób możemy usunąć każdy inny atrubut.

· ·

Powyższy błąd najczęściej pojawia się po upgrade Magento do nowszej wersji.

Zazwyczaj blokuje on edycje klienta oraz składanie zamówień w panelu administracyjnym.

Związane jest to z błędnym modelem źródłowym zapisanym w bazie w tabeli eav_attribute dla atrybutu country_id.

Rozwiązanie jest proste, wystarczy najlepiej z poziomy dowolnego pliku PHTML szablonu wykonać poniższy kawałek kodu PHP, który zmieni w/w model na poprawny dla nowszej wersji Magento.

$connection = Mage::getSingleton('core/resource')->getConnection('core_write');
$connection->beginTransaction();
$fields = array();
$fields['source_model'] = 'customer/entity_address_attribute_source_country';
$where = $connection->quoteInto('source_model like ?', 'customer_entity/address_attribute_source_country');
$connection->update('eav_attribute', $fields, $where);
$connection->commit();

·

Często istnieje potrzeba dynamicznego pobierania informacji o sklepie (np. nazwa, tytuł, telefon, adres, e-mail), jego konfiguracji (np. ilość produktów na siatce/liście, od jakiej kwoty dostępna jest darmowa dostawa, ) w szablonach lub stronach/blokach CMS. Szczególnie przydaje się to gdy na jednej instalacji Magento mamy postawionych kilka sklepów.

Można to wykonać w bardzo prosty sposób.

echo Mage::getStoreConfig('sectionName/groupName/fieldName');

sectionNamegroupName oraz fieldName są zawarte w pliku etc/system.xml swojego modułu. Nazwę danego pola możemy sprawdzić prosto za FireBug’a.

Dla przykładu chcemy pobrać nazwę sklepu. Znajduje się ona w System -> Configuration -> General -> Store Information –> Store Name i kod za pomocą którego ją pobierzemy będzie wyglądał tak:

echo Mage::getStoreConfig('general/store_information/name');

Drugi przykład, pobieramy adres e-mail, na który będą wysyłane wiadomości z formularza kontaktowego. Znajduje się on w System -> Configuration -> Contacts -> Email –> Send Emails To i kod jakim go pobierzemy będzie wyglądał tak:

echo Mage::getStoreConfig('contacts/email/recipient_email');

Podobnie można pobrać każda inną informację.

Kilka przykładów:

echo Mage::getStoreConfig('general/store_information/name');
//nazwa sklepu
echo Mage::getStoreConfig('design/head/default_title');
//domyslny tytuł
echo Mage::getStoreConfig('catalog/frontend/grid_per_page');
//produktów na siatce na stronę
echo Mage::getStoreConfig('carriers/freeshipping/free_shipping_subtotal');
//darmowa dostawa od jakiej kwoty
echo Mage::getStoreConfig('contacts/email/recipient_email');
//adres e-mail, na który będą wysyłanie wiadomosci z formularza kontaktowego
echo Mage::getStoreConfig('general/store_information/phone');
//nr telefonu sklepu
echo Mage::getStoreConfig('general/store_information/address');
//adres sklepu
echo Mage::getStoreConfig('trans_email/ident_general/name');
echo Mage::getStoreConfig('trans_email/ident_general/email');
//nazwa nadawcy oraz e-mail dla ogólnego kontaktu
echo Mage::getStoreConfig('trans_email/ident_sales/name');
echo Mage::getStoreConfig('trans_email/ident_sales/email');
//nazwa nadawcy oraz e-mail dla przedstawiciela handlowego
echo Mage::getStoreConfig('trans_email/ident_support/name');
echo Mage::getStoreConfig('trans_email/ident_support/email');
//nazwa nadawcy oraz e-mail dla wsparcia klienta
echo Mage::getStoreConfig('trans_email/ident_custom1/name');
echo Mage::getStoreConfig('trans_email/ident_custom1/email');
//nazwa nadawcy oraz e-mail dla custom kontakt 1
echo Mage::getStoreConfig('trans_email/ident_custom2/name');
echo Mage::getStoreConfig('trans_email/ident_custom2/email');
//nazwa nadawcy oraz e-mail dla custom kontakt 2

W bardzo podobny i prosty sposób można tych wszystkich informacji używać w blokach oraz stronach CMS. Kod powinien wyglądać mniej więcej tak:

{{config path="general/store_information/name"}}
{{config path="design/head/default_title"}}
{{config path="catalog/frontend/grid_per_page"}}
{{config path="carriers/freeshipping/free_shipping_subtotal"}}
{{config path="contacts/email/recipient_email"}}
{{config path="general/store_information/phone"}}
{{config path="general/store_information/address"}}
{{config path="trans_email/ident_general/name"}}
{{config path="trans_email/ident_general/email"}}
{{config path="trans_email/ident_sales/name"}}
{{config path="trans_email/ident_sales/email"}}
{{config path="trans_email/ident_support/name"}}
{{config path="trans_email/ident_support/email"}}
{{config path="trans_email/ident_custom1/name"}}
{{config path="trans_email/ident_custom1/email"}}
{{config path="trans_email/ident_custom2/name"}}
{{config path="trans_email/ident_custom2/email"}}

· ·

Kilka linijek kodu pozwalające na pobranie szczegółowych informacji o regule promocyjnej na podstawie wpisanego kodu rabatowego:

$code = Mage::getSingleton('checkout/cart')->getQuote()->getCouponCode();
$oCoupon = Mage::getModel('salesrule/coupon')->load($code,'code');
$oRule = Mage::getModel('salesrule/rule')->load($oCoupon->getRuleId());
$rule_desc = $oRule->getData('description');
$couponId = Mage::getModel('salesrule/coupon')->load($code,'code')->getRuleId();
$couponObj = Mage::getModel('salesrule/rule')->load($couponId);
$ruleArr = Mage::getModel('salesrule/rule')->load($couponObj->getRuleId())->getStoreLabels();

·

Rozwiązanie błędu reindeksacji indeksu catalog_product_attribute. Wystarczy wyczyścić bazę danych z ‚pustych’ wpisów, np. Magento chce dodać do tabeli catalog_product_index_eav produkty, których już nie ma w sklepie.

delete from `catalog_category_product` WHERE product_id not in (select entity_id from catalog_product_entity);
delete from `catalog_category_product` WHERE category_id not in (select entity_id from catalog_category_entity);
delete from `catalog_product_website` WHERE product_id not in (select entity_id from catalog_product_entity);
delete from `catalog_product_entity_media_gallery` WHERE entity_id not in (select entity_id from catalog_product_entity);
delete from `catalog_product_index_eav_idx` WHERE entity_id not in (select entity_id from catalog_product_entity);
delete from `catalog_product_index_eav` WHERE entity_id not in (select entity_id from catalog_product_entity);
delete from `catalog_product_link` WHERE product_id not in (select entity_id from catalog_product_entity);
delete from `catalog_product_relation` WHERE parent_id not in (select entity_id from catalog_product_entity);

·

Older posts >>