It is not possible to have store view pricing in Magento.
You can switch price scope to website in the system configuration at Catalog > Price > Catalog Price Scope.
Customizing Magento to use store scope pricing is possible but it is a lot of work, breaks compatibility with many extensions, and makes the system quite brittle and hard to update, so it is not advisable.
A better aproach is to create more websites with one store view each to separate the pricing between the,.
Also, regarding the differences in the display between the product listing pages and the product detail page, in the listing pages the collection joins in the price index table to fetch all pricing information, which is then set on the product model as the final_price
property.
On product detail pages the final price is calculated on the fly, based on the EAV price attributes (price, special_price, special_from_date, special_to_date, group_price) and the tax settings and customer group and product tax class ids.
My advice again is to rethink your approach.
My preferred way of doing catalog price adjustments is via observer.
Two event need to be observed to make it work.
The first event is catalog_product_load_after
. In this event observer method you can make price adjustments for the product detail page, for example.
public function catalogProductLoadAfter(Varien_Event_Observer $event)
{
$product = $event->getData('product');
$product->setPrice(19.99); // example values...
$product->setSpecialPrice(17.99);
}
The second event that needs to be observed is for product listing pages and for the cart items: catalog_product_collection_load_after
.
public function catalogProductCollectionLoadAfter(Varien_Event_Observer $event)
{
$products = $event->getData('collection');
foreach ($products as $product) {
$product->setPrice(19.99);
// set the final_price for the value used on product listing pages
$product->setFinalPrice(17.99);
// set the regular price data for the cart items because the final_price
// will be recalculated on the fly
$product->setSpecialPrice(17.99);
}
}
Please note that the above code is just written here, its not tested and then copied over, so it might contain typos. However the approach works.
One thing to be aware of using this approach of changing the product prices on the fly is that it does not work with the layered navigation price filter.
The price segments displayed in the layered navigation are precalculated, and adjusting them requires an indexer rewrite, which is beyond the scope of this answer.
->load()
, when this kills your performance? You have several ways to set promotion prices, why are you not using one of them (temporary price on the product and catalog price rules)?