Редактор Magento 1.8.1.0 WYSIWYG не отображает миниатюры в диспетчере изображений
Я публикую это для комментариев об ошибке и для того, чтобы помочь всем, у кого есть такая же проблема. (ответ, опубликованный мной)
При использовании редактора WYSIWYG и вставке изображений диспетчер изображений не отображает миниатюры изображений.
Глядя на URL-адрес изображения, созданный magento, я вижу, что в URL-адресе отсутствует часть /wysiwyg/
Http://site.domain/media//.thumbs/ex_logo_sm.jpg?rand=1392103618
Это выглядит чисто отсутствует, как было отмечено двойником // в URL
3 answers
Отслеживая код, мне кажется, что в вспомогательной подпрограмме, расположенной в Mage_Cms_Helper_Wysiwyg_Images::getBaseUrl()
Процедура такова:
public function getBaseUrl()
{
return Mage::getBaseUrl('media') . '/';
}
И внесение изменений в
public function getBaseUrl()
{
return Mage::getBaseUrl('media') . Mage_Cms_Model_Wysiwyg_Config::IMAGE_DIRECTORY . '/';
}
Устраняет проблему.
Это называется из Mage_Cms_Model_Wysiwyg_Images_Storage::getThumbnailUrl()
return str_replace('\\', '/', $this->getHelper()->getBaseUrl() . $thumbSuffix) . $randomIndex;
, который явно выводит неправильный URL-адрес без константы на месте.
У нас была такая же проблема на клиентском сайте, на самом деле в игре было довольно много элементов, и я могу предложить вероятное объяснение того, как была вызвана несуществующая проблема с изображением, хотя, казалось бы, это не должно быть возможно:
Проблема, описанная выше, присутствовала, когда Magento проверял наличие
media/wysiwyg/.thumbs/image.jpg
, в отличие от правильного расположенияmedia/wysiwyg/.thumbs/wysiwyg/image.jpg
, и, если присутствует, отображал ссылку на неправильный URL-адресhttp://example.com/media//wysiwyg/.thumbs/image.jpg
fd-
У нас было Установлен APPSEC-212, который ввел использование
realpath()
для устранения проблемы безопасности, однако сочетание этого и использования символической ссылки в нашем каталогеmedia
приводило к тому, чтоMage_Cms_Model_Wysiwyg_Images_Storage::getThumbsPath()
возвращал каталогmedia/wysiwyg/.thumbs
, в отличие отmedia/wysiwyg/.thumbs/wysiwyg
- причина в том, что этот метод выполняет условную проверку, которая не оценивалась как истинная, поскольку наш каталог мультимедиа был расширен с помощьюrealpath()
и поэтому не возвращал 0 для проверкиstrpos()
, см. Проверку ниже, строка 6:{[ 19]}public function getThumbsPath($filePath = false) { $mediaRootDir = Mage::getConfig()->getOptions()->getMediaDir(); $thumbnailDir = $this->getThumbnailRoot(); if ($filePath && strpos($filePath, $mediaRootDir) === 0) { $thumbnailDir .= DS . dirname(substr($filePath, strlen($mediaRootDir))); } return $thumbnailDir; }
Это это уникально для нас, но мы также отказывали в доступе к каталогам dotfile и ранее не замечали в этом проблемы, потому что мы никогда не обслуживали их, пока не установили APPSEC-212, поэтому даже когда мы исправили проблему, мы получали 404-е на что-либо в
.thumbs
Проблема, с которой мы столкнулись, все еще существует в версии 1.9.1.0 (последняя версия на момент написания) - я предполагаю, что никто не заметит, потому что изображения по-прежнему отображаются "на лету" без использования .thumbs
каталог, только с введением APPSEC-212 в сочетании с символическим каталогом media
, который привел к созданию файлов большого пальца в неправильном расположении, что затем привело к тому, что неправильно проверенный путь вернул значение true, и мы впоследствии увидели 404 на наших изображениях.
Как ни странно, APPSEC-212 устранил бы проблему, если бы не наш каталог с символическими ссылками media
.
Кстати, вот наши модификации:
В app/code/core/Mage/Cms/Helper/Wysiwyg/Images.php :
@@ -89,7 +89,7 @@ public function getStorageRoot()
*/
public function getBaseUrl()
{
- return Mage::getBaseUrl('media') . '/';
+ return Mage::getBaseUrl('media') . '/' . Mage_Cms_Model_Wysiwyg_Config::IMAGE_DIRECTORY . '/';
}
/**
В app/code/core/Mage/Cms/Model/Wysiwyg/Images/Storage.php :
@@ -336,7 +336,7 @@ public function getThumbnailUrl($filePath, $checkFile = false)
$mediaRootDir = $this->getHelper()->getStorageRoot();
if (strpos($filePath, $mediaRootDir) === 0) {
- $thumbSuffix = self::THUMBS_DIRECTORY_NAME . DS . substr($filePath, strlen($mediaRootDir));
+ $thumbSuffix = self::THUMBS_DIRECTORY_NAME . DS . substr($filePath, strlen(realpath(Mage::getConfig()->getOptions()->getMediaDir())));
if (! $checkFile || is_readable($mediaRootDir . $thumbSuffix)) {
$randomIndex = '?rand=' . time();
@@ -405,8 +405,8 @@ public function resizeOnTheFly($filename)
*/
public function getThumbsPath($filePath = false)
{
- $mediaRootDir = Mage::getConfig()->getOptions()->getMediaDir();
- $thumbnailDir = $this->getThumbnailRoot();
+ $mediaRootDir = realpath(Mage::getConfig()->getOptions()->getMediaDir());
+ $thumbnailDir = realpath($this->getThumbnailRoot());
if ($filePath && strpos($filePath, $mediaRootDir) === 0) {
$thumbnailDir .= DS . dirname(substr($filePath, strlen($mediaRootDir)));
На самом деле существует несколько ошибок, сходящихся вместе.
По умолчанию Magento, похоже, сохраняет большие пальцы в каталоге media/wysiwyg/.thumbs/wysiwyg/
. Но Mage_Cms_Model_Wysiwyg_Images_Storage::getThumbnailUrl()
ищет большой палец в media/wysiwyg/.thumbs/
.
Ошибка срабатывает только в том случае, если большой палец находится в media/wysiwyg/.thumbs/
. Я не смог выяснить, при каких условиях большой палец сохраняется в неправильном каталоге. Но, по крайней мере, это объясняет, почему только некоторые серверы показывают эту проблему.
Итак, в дополнение к тому, что сказал ProxiBlue, вам придется изменить Mage_Cms_Model_Wysiwyg_Images_Storage::getThumbnailUrl()
из
public function getThumbnailUrl($filePath, $checkFile = false)
{
$mediaRootDir = $this->getHelper()->getStorageRoot();
if (strpos($filePath, $mediaRootDir) === 0) {
$thumbSuffix = self::THUMBS_DIRECTORY_NAME . DS . substr($filePath, strlen($mediaRootDir));
if (! $checkFile || is_readable($mediaRootDir . $thumbSuffix)) {
$randomIndex = '?rand=' . time();
return str_replace('\\', '/', $this->getHelper()->getBaseUrl() . $thumbSuffix) . $randomIndex;
}
}
return false;
}
До
public function getThumbnailUrl($filePath, $checkFile = false)
{
$mediaRootDir = Mage::getConfig()->getOptions()->getMediaDir() . DS;
if (strpos($filePath, $mediaRootDir) === 0) {
$thumbSuffix = self::THUMBS_DIRECTORY_NAME . DS . substr($filePath, strlen($mediaRootDir));
if (! $checkFile || is_readable($this->getHelper()->getStorageRoot() . $thumbSuffix)) {
$randomIndex = '?rand=' . time();
return str_replace('\\', '/', $this->getHelper()->getBaseUrl() . $thumbSuffix) . $randomIndex;
}
}
return false;
}
Предпочтительно путем настройки модуля, а не путем перезаписи основного файла.