Здравствуйте. Покритикуйте мою реализацию вотермарки. Требования были такие - ее можно включать и выключать для каждого товара индивидуально и от меня требование, чтобы она была одинакового размера на любом разрешении изображения.
Вот модификатор
<file path="catalog/model/tool/image.php">
<operation>
<search><![CDATA[public function resize($filename, $width, $height)]]></search>
<add position="replace"><![CDATA[public function resize($filename, $width, $height, $watermark = false)]]></add>
</operation>
<operation>
<search><![CDATA[$image_new = 'cache/' . utf8_substr($filename, 0, utf8_strrpos($filename, '.')) . '-' . (int)$width . 'x' . (int)$height . '.' . $extension;]]></search>
<add position="replace"><![CDATA[
if ($watermark) {
$image_new = 'cache/' . utf8_substr($filename, 0, utf8_strrpos($filename, '.')) . '-' . (int)$width . 'x' . (int)$height . '_wm.' . $extension;
} else {
$image_new = 'cache/' . utf8_substr($filename, 0, utf8_strrpos($filename, '.')) . '-' . (int)$width . 'x' . (int)$height . '.' . $extension;
}
]]></add>
</operation>
<operation>
<search><![CDATA[if ($width_orig != $width || $height_orig != $height) {]]></search>
<add position="replace"><![CDATA[if ($width_orig != $width || $height_orig != $height || $watermark) {]]></add>
</operation>
<operation>
<search><![CDATA[$image->resize($width, $height);]]></search>
<add position="after"><![CDATA[
if ($watermark) {
$watermark_resized = $this->resize($this->config->get('config_watermark'), $width, $height);
$watermark_resized = preg_replace('/.*image\//', '', $watermark_resized);
$image->watermark(new Image(DIR_IMAGE . $watermark_resized), 'middlecenter');
}
]]></add>
</operation>
</file>
Я спрашивают только про модель изображения.
Передаю вотермарку доп параметром.
Если включена вотермарка, добавляю _wm к имени файла, т.к. и на сервере чтобы сгенерировался файл при отключении/включении и чтобы из кэша браузера бралось нужное изображение
Тут серверу немного лишней работы придется сделать, если марка включена. По дефолту, если целевое разрешение файла сходится с исходным, файл просто копировался. Теперь будет лишний раз ресайзиться. Иначе просто марка не применяется к таким изображениям.
Вот тут мне больше всего не нравится. Чтобы марка была под размер изображения, сначала прогоняю ее через resize, но в итоге я получаю имя файла на сервере. Если эту ссылку передать в new Image - вылезает ошибка, что не может подгрузить файл. В конструктор Image нужно передавать путь до файла от корня сервера. И поэтому я удаляю все, что идет до cache в пути изображения. Вот тут может есть более изящное решение?