Не создается экземпляр изображение определенного стиля

Аватар пользователя y-vo y-vo 6 апреля в 18:04

Приветствую. Есть тип материала, есть несколько статей этого типа. У данного типа материала есть поле field_image и есть стиль изображений 352х198. Так вот - ранее у всех изображений этого поля создавались экземпляры этих изображений данного стиля, однако у этой статьи подобного нет в соответствующей папке.
Может ли это быть связано с тем что статья была создана раньше чем данный стиль изображений? И можно ли как то сгенерировать его если это так?
Покопался, нашел эту тему https://drupal.ru/node/143296 , понял что файла изначально там и не должно быть, он генерируется при обращении к его адресу. Но мне при попытке открыть адрес данного изображения выдает Access Denied. Хотя для других статей все работает. С чем это может быть связано?

Лучший ответ

Аватар пользователя charOFF charOFF 8 апреля в 18:22
1

Видимо $image_uri - пусто. Посмотрел внимательнее на исходный код. Действительно, я предполагал, что в $image_uri содержится uri оригинальной картинки, а на самом деле нет. field_first_game_to_compare это же у вас ссылка на ноду. Тогда должно быть как-то так

$first_game_image_uri = $game->field_image['und'][0]['uri'];
$new_image_url = image_style_url($style, $first_game_image_uri);

Т.е. второй аргумент функции image_style_url должен быть uri картинки полностью, например "public://my-picture.jpg" . Он содержится в $node->field_image['und'][0]['uri']

Комментарии

Аватар пользователя ivnish ivnish 6 апреля в 18:20
1

Стили обычно генерируются при первом обращении к файлу.

Попробуйте удалить файл из поля и добавить заново

Аватар пользователя y-vo y-vo 6 апреля в 18:21

Спасибо, нашел статью как раз об этом. Перезагрузить пробовал, не помогает. Кэш чистил после этого.

Аватар пользователя marassa marassa 6 апреля в 18:20
1

Стилизованная картинка должна сгенерироваться автоматически при первом запросе к ней. Как сейчас отображается эта статья? Поле картинки у нее заполнено? Какой URL картинки генерируется на странице статьи?

Аватар пользователя y-vo y-vo 6 апреля в 18:27

Спасибо, да, поле изображения заполнено, в самой статье она отображается корректно, а вот не отображается именно та что должна быть в определенном стиле. При этом в статье оно тоже определенного стиля(367х313) и там все нормально.
Правда в статье к урл изображения добавляется какой то аргумент(?itok=TAr3dhfR), а там где я програмно загружаю стиль этого в урл нет.

Аватар пользователя y-vo y-vo 6 апреля в 18:38

Сложно объяснить) В общем у человека зарубежный развлекательный сайт, ему понадобился тип материала сравнения двух игр с возможностью голосования пользователями за какую из них они. Я ему сделал, там нужно было подгружать изображение игры и сам виджет голосования соответственно.
Проще будет посмотреть наверное https://enygames.com/content/grim-dawn-vs-titan-quest не знаю можно ли давать ссылки.

Аватар пользователя marassa marassa 6 апреля в 18:36
1

y-vo wrote: в статье к урл изображения добавляется какой то аргумент(?itok=TAr3dhfR), а там где я програмно загружаю стиль этого в урл нет.

Так вот оно в чем дело, то есть недостающего стиля нет на странице, сгенерированной Друпалом, а Вы откуда-то извне хотите его получить программно? itok используется для предотвращения потенциальной атаки, чтобы злоумышленник не завалил ваш сервер командами сгенерить все стили всех картинок на сервере. После того как картинка уже сгенерена, itok не проверяется, но чтобы ее сгенерить он нужен. Если Вас волнует ровно одна картинка ровно в одной статье, сделайте вы этот файл вручную и забудьте про проблему. Если Вам регулярно надо получать стилизованные картинки извне друпаловских страниц, то можно либо отключить эти itok'и (подставив себя под потенциальную, хотя и крайне маловероятную DOS-атаку) либо подсмотреть в коде ядра как они формируются и научиться их генерить.

Аватар пользователя y-vo y-vo 6 апреля в 18:42

Ого, интересная информация, спасибо! Все время интересно было зачем оно там и откуда взялось. Ну я не совсем напрямую обращаюсь к адресу, строго говоря это совсем не так, я его получаю вот таким образом:

<?php
              $image_uri      
$node->field_first_game_to_compare['und'][0]['uri']; // or any public://my_image
              
$game node_load($node->field_first_game_to_compare['und'][0]['nid']);
              
$first_game_image_file_name $game->field_image['und'][0]['filename'];
              
$style          '352x198';
              
$derivative_uri image_style_path($style$image_uri);
              
$success        file_exists($derivative_uri) || image_style_create_derivative($style$image_uri$derivative_uri);
              
$new_image_url  file_create_url($derivative_uri) .'/'.$first_game_image_file_name;
            
?>
            <img src="<?php echo $new_image_url;  ?>" alt="<?php echo $game->title;  ?>">
            <?php print $node->rate_first_compared_game['#markup']; ?>

Проблема в том что во всех других статьях это работает, а именно тут нет.

Аватар пользователя marassa marassa 6 апреля в 18:56
1

А так?

image_style_create_derivative(image_style_load($style), $image_uri, $derivative_uri);

Но вообще я в семёрке ничего не понимаю - так, нагуглилось что-то...

Аватар пользователя y-vo y-vo 6 апреля в 19:11

хм, то есть вот так в итоге должно выглядеть?

<?php
              $image_uri      
$node->field_first_game_to_compare['und'][0]['uri']; // or any public://my_image
              
$game node_load($node->field_first_game_to_compare['und'][0]['nid']);
              
$first_game_image_file_name $game->field_image['und'][0]['filename'];
              
$style          '352x198';
              
$derivative_uri image_style_path($style$image_uri);
              
$success        file_exists($derivative_uri) || image_style_create_derivative(image_style_load($style), $image_uri$derivative_uri);
              
$new_image_url  file_create_url($derivative_uri) .'/'.$first_game_image_file_name;
            
?>
            <img src="<?php echo $new_image_url;  ?>" alt="<?php echo $game->title;  ?>">
            <?php print $node->rate_first_compared_game['#markup']; ?>

Так остальные как и раньше отображаются, а эта нет, очень странно, при попытке перейти по адресу этого изображения со стилем вообще пишет Access Denied

Аватар пользователя charOFF charOFF 6 апреля в 21:48
1

Чтобы получить URL картинки нужного стиля с уже добавленным токеном itok используйте функцию image_style_url

$new_image_url = image_style_url($style, $image_uri);

При запросе такого урла картинка должна сгенериться, если ее еще нет.
В вашем коде, насколько я вижу, $new_image_url в конечном итоге формируется не правильный. Если токена в урле нет или он не соответствует пути, то и будет отдаваться Access Denied. Но в любом случае такие сложности с генерацией картинки не нужны, достаточно сформировать правильный урл, если я правильно понял задачу.

Аватар пользователя charOFF charOFF 8 апреля в 18:22
1

Видимо $image_uri - пусто. Посмотрел внимательнее на исходный код. Действительно, я предполагал, что в $image_uri содержится uri оригинальной картинки, а на самом деле нет. field_first_game_to_compare это же у вас ссылка на ноду. Тогда должно быть как-то так

$first_game_image_uri = $game->field_image['und'][0]['uri'];
$new_image_url = image_style_url($style, $first_game_image_uri);

Т.е. второй аргумент функции image_style_url должен быть uri картинки полностью, например "public://my-picture.jpg" . Он содержится в $node->field_image['und'][0]['uri']

Аватар пользователя y-vo y-vo 8 апреля в 20:00

Да, так и правда работает и добавляет еще и itok при этом, большое спасибо!

Аватар пользователя y-vo y-vo 6 апреля в 19:56

Пришлось ресайзить в ручную и загружать в папку, сразу начало отображаться, хотелось бы конечно понять причину, особенно если это окажется не единичным случаем в итоге.

Аватар пользователя VasyOK VasyOK 6 апреля в 21:13

А на хостинге спросить? Может с правами на запись файла намучено. Может дисковая квота закончилась.

Аватар пользователя y-vo y-vo 8 апреля в 17:57

Да вроде нормально все, там вдс, я сам устанавливал, настраивал, да и 2 года это все работало, а вот именно тут что то пошло не так.