#php #laravel
#php #laravel
Вопрос:
Я хочу заключить массив в кавычки в контроллере, вот мой код, но это не то, что я хочу, начальные и конечные точки по-прежнему пусты. Я перепробовал много кода, но не смог от него избавиться. Спасибо за помощь.
$product = Product::find($id);
$product = collect($product->images->pluck('image_path'))->implode("','");
return $product;
Что я действительно хочу сделать, так это отправить этот массив в код javascript в блейде laravel.
initialPreview: ['{{ $product}}'],
Но на этот раз вывод выглядит следующим образом, и я снова не могу получить желаемый результат.
initialPreview: ['img/uploads/urun/1552304918.jpegamp;#039;,amp;#039;img/uploads/urun/1552304918.jpeg'],
Комментарии:
1. Можете ли вы показать нам пример того, что возвращает image_path и что возвращает ваш текущий код и что он должен возвращать :)?
2.
img/uploads/urun/1552304918.jpeg','img/uploads/urun/1552304918.jpeg
3. @KasperFranz попросил 3 вещи, а вы дали ему 1 вещь? Я думаю, что понимаю, что вы имеете в виду. После ввода вы могли бы просто добавить кавычку к строке, чтобы получить что-то вроде
'img1.jpeg','img2.jpeg'
4. Вы внесли правку в свой пост, поэтому я мог бы ответить и на это.
{{$var}}
экранирует символы, используйте{!! $product !!}
, чтобы не экранировать символы5. @TeunissenStefan извините за это, код оттуда возвращает несколько путей к изображениям из базы данных. Я хочу использовать, я пытаюсь использовать начальный предварительный просмотр для
kartik-v/bootstrap-fileinput
Ответ №1:
Создание строки javascript самостоятельно для этой цели имеет больше скрытых сложностей, чем вы можете себе представить. Вам не только нужно заключить массив в кавычки и добавить запятые, чтобы создать допустимую строку javascript, но вам также необходимо надежно экранировать специальные символы в строках, прежде чем они будут заключены.
Поскольку ваша фактическая цель — создать массив для javascript, в Laravel лучше создать свой php-массив, а затем отложить до @json
для правильной кодировки.
Для построения массива путей:
$product = Product::find($id);
$product_paths = $product->images->pluck('image_path'); // value: ["img/...","img/..."]
Использование в виде блейда (в блоке скрипта):
<script>
//...
initialPreview: @json($product_paths),
</script>
Использование в виде блейда (внутри атрибута HTML):
<!-- Seeding a data-* attribute, e.g. for jQuery -->
<ul data-initial-preview='@json($product_paths)'></ul>
<!-- Seeding a Vue component property -->
<example-component :initial-preview='@json($product_paths)'></example-component>
Примечание: Использование одинарных кавычек '
в этом контексте, а не двойных кавычек "
, важно из-за того, что кавычки экранируются json_encode() за кулисами.
Ответ №2:
Мой Laravel немного заржавел, но это должно быть то, что вы хотите сделать:
$product = Product::find($id);
$product = collect($product->images->pluck('image_path'))
->transform(function ($item, $key) {
return "'" . $item ."'";
})
->implode(",");
return $product;
Изменения:
- Добавлен вызов функции преобразования.
- Удалена кавычка из вызова implode
Это решение может быть красивее, но это очень быстрый способ сделать это.