Ваша ошибка в предположении, что $this->helper('catalog/image')->init($_product, 'image')
возвращает экземпляр Varien_Image
, хотя на самом деле задействованы два промежуточных класса:
Mage_Catalog_Helper_Image
и Mage_Catalog_Model_Product_Image
.
Помощник catalog/image
является беспорядком, хотя в последних версиях он был немного убран (например, больше нет частных методов). Тем не менее, некоторые геттеры все еще защищены, и в этом нет реальной необходимости.
Вот мой обходной путь:
/* @var $imageHelper Mage_Catalog_Helper_Image */
// Initialize the image helper
$imageHelper = Mage::helper('catalog/image')->init($_product, 'image')
->constrainOnly(true)
->keepAspectRatio(true)
->keepFrame(false)
->setWatermarkImageOpacity(0);
// Get the catalog/product_image instance
/* @var $imageModel Mage_Catalog_Model_Product_Image */
$reflection = new ReflectionClass($imageHelper);
$property = $reflection->getProperty('_model');
$property->setAccessible(true);
$imageModel = $property->getValue($imageHelper);
// Initialize the missing values on the image model
// Usually done in Mage_Catalog_Helper_Image::__toString()
if (! $imageModel->isCached())
{
$getWatermarkMethod = $reflection->getMethod('getWatermark');
$getWatermarkMethod->setAccessible(true);
$imageModel->setBaseFile($_product->getImage())
->resize()
->setWatermark($getWatermarkMethod->invoke($imageHelper));
// Crop the image using the image processor
// $imageModel->getImageProcessor() returns a Varien_Image instance
$imageModel->getImageProcessor()->crop(10, 20, 30, 40);
// Generate the image according to the set parameters and
// get the URL while bypassing the helper to avoid reinitialization
$url = $imageModel->saveFile()->getUrl();
}
echo $url . "\n";
Было бы проще использовать модель catalog/product_image
или Varien_Image
напрямую, но таким образом все настройки водяного знака Magento по-прежнему применяются.
В любом случае не чисто.
Я надеюсь, что получатели на помощнике будут обнародованы в будущих выпусках.