MarcinPaul.pl

Archiwum z miesiąca Październik 2011

Prosty kawałek kodu jQuery ustawiający domyślny tekst w polach formularza input oraz textarea. Kod składa się z dwóch funkcji jQuery: blur (powoduje ustawienie wartości dla pola, które jest nieaktywne) oraz focus (zeruje wartość pola po jego kliknięciu).

jQuery(document).ready(function() {
    jQuery(".defaultText").focus(function() {
        if (jQuery(this).val() == jQuery(this)[0].title) {
            jQuery(this).removeClass("defaultTextActive");
            jQuery(this).val("");
        }
    });
    jQuery(".defaultText").blur(function() {
        if (jQuery(this).val() == "") {
            jQuery(this).addClass("defaultTextActive");
            jQuery(this).val(jQuery(this)[0].title);
        }
    });
    jQuery(".defaultText").blur();        
});

·

Paź/11

27

Bloki statyczne w Magento

Kod pobierający treść bloku statycznego (CMS), który można stosować w dowolnym miejscu strony:

<?php echo $this->getLayout()->createBlock('cms/block')->setBlockId('identyfikator')->toHtml() ?>

Można również pobrać osobno tytuł oraz treść bloku:

<?php
	$block = Mage::getModel('cms/block')->load('identifier');
	echo $block->getTitle();
	echo $block->getContent();
?>

·

Bardzo prosta funkcja zliczająca wszystkie produkty z uwzględnieniem ich statusu, widoczności oraz dostępności. Należy ją umieścić w modelu dla kategorii w Corze Magento – /app/code/core/Mage/Catalog/Model/Category.php.

public function getFrontentProductCount() {
	$collection = Mage::getResourceModel('catalog/product_collection')
		->addCategoryFilter($this)
		->joinField('stock_status','cataloginventory/stock_status','stock_status',
			'product_id=entity_id', array(
			'stock_status' => Mage_CatalogInventory_Model_Stock_Status::STATUS_IN_STOCK,
			'website_id' => Mage::app()->getWebsite()->getWebsiteId(),
			))
		;
	Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);
	Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);
	return $collection->count();
}

Następnie w dowolnym miejscu frontend’u, mając ID kategorii odwołujemy się do danego modelu i funkcji.

$loadedCategory = Mage::getModel('catalog/category')->load($_category->getEntityId());
echo $loadedCategory->getFrontentProductCount();

·

Ostatnio w pracy na jednej z instalacji Magento (po upgrade z wersji 1.3.2.4 na 1.4.1.1), gdzie było dodanych kilka widoków sklepów, pojawił się problem z zapisem cech kategorii (tylko w przypadku, gdy kategoria była dodana po wyborze jednego z widoków sklepów). Okazało się, że nie można zapisać cechy z odznaczona opcją ‚Użyj wartości domyślnej’ (dla danego widoku sklepu). Po zapisie checkbox automatycznie ustawiał się na zaznaczony, a wartość cechy pozostała taka, jaka została wybrana lub w ogóle się nie zapisała.
Problem tkwił w tym, że cecha kategorii została zapisana tylko do danego widoku sklepu. Nie została zapisana do widoki zerowego (0), czyli widoku panelu administracyjnego.
Można to sprawdzić w bazie danych w tabeli ‚catalog_category_entity_varchar‚. Na poniższych obrazkach widać zrzut tej tabeli kiedy kategoria była tworzona na widoku konkretnego sklepu (obrazek 1) oraz na widoku ogólnym (obrazek 2).

Widok sklepu

Widok ogólny

Na pierwszym obrazku widać, że tylko 4 atrybuty zostały zapisane do widoku zerowego, reszta do konkretnego widoku sklepu (3).
Rozwiązaniem problemu jest tworzenie kategorii i podkategorii tylko z widoku ogólnego. Jednak nie w każdym przypadku jest to możliwe. Może zaistnieć sytuacja, że osobą zalogowana w panelu administracyjnym nie ma uprawnień do tego, aby widzieć całe drzewo kategorii, a co za tym idzie nie może dodawać kategorii na widoku ogólnym (widzi tylko kategorie z danego widoku sklepu). Tutaj konieczne jest ręczne dodanie do bazy wpisów dla danych cech kategorii do widoku zerowego (0). Można to zrobić edytując plik ‚app/code/core/Mage/Adminhtml/controllers/Catalog/CategoryController.php‚ i znając ‚attribute_id‚ danej cechy kategorii dla której chcemy dodać wpis do widoku zerowego. W pliku odnajdujemy funkcję ‚saveAction()‚ (linia ok. 250) i w sekcji ‚try‚ w pierwszej kolejności sprawdzamy, czy dodajemy, czy edytujemy kategorię, następnie po ‚$category->save();‚ prostym if’em sprawdzamy czy dodajemy kategorię z innego widoku niż zerowy (0), łączymy się z bazą danych i wykonujemy niezbędne wpisy do tabeli catalog_category_entity_varchar.
Kod może wyglądać mniej więcej tak:

try {
	$nowa = false;
	if(!$category->getId()) {
		$nowa = true;
	}
	$category->save();
	if($storeId != 0 && $nowa):
		$read = Mage::getSingleton('core/resource')->getConnection('core_read');
		$wynik = $read->query("
			INSERT INTO sklep_catalog_category_entity_varchar (entity_type_id, attribute_id, store_id, entity_id, value) VALUES
				(3, 36, 0, ".$category->getId().", ''),
				(3, 39, 0, ".$category->getId().", ''),
				(3, 48, 0, ".$category->getId().", ''),
				(3, 52, 0, ".$category->getId().", ''),
				(3, 40, 0, ".$category->getId().", ''),
				(3, 49, 0, ".$category->getId().", ''),
				(3, 50, 0, ".$category->getId().", ''),
				(3, 35, 0, ".$category->getId().", ''),
				(3, 51, 0, ".$category->getId().", '');
		");
	endif;
	Mage::getSingleton('adminhtml/session')
		->addSuccess(Mage::helper('catalog')
		->__('The category has been saved.'));
	$refreshTree = 'true';
}

Na poniższym obrazku widać, że zapytania się wykonały i wpisy zostały dodane.

Widok sklepu

·

Prosty sposób na ‚wyciągnięcie’ wszystkich wartości atrybutu (value oraz label) na podstawie jego kodu:

$attribute = Mage::getModel('odpowiedni/model')->getAttribute('kod_atrybutu');
$options = $attribute->getSource()->getAllOptions(false);
foreach ($options as $option) {
    $myArray[$option['value']] = $option['label'];
}

W podobny sposób możemy ‚wyciągać’ cechy klienta, produktu, adresu klienta, itd. itp. Należy tylko wskazać odpowiedni model oraz podać odpowiedni kod attrybutu.

·