Обернуть источники изображений базы данных, хранящиеся в базе данных, в виде массива для Yii2 Carousel - PullRequest
0 голосов
/ 15 ноября 2018

Я использую yii\bootstrap\Carousel, и имя файла моего изображения хранится в базе данных.Поэтому мне нужно извлечь имена файлов изображений и обернуть их в качестве источника изображения и действительного URL-адреса, прежде чем передавать их в виджет Карусель.Я пытался выполнить эту задачу с контроллера, но я получаю вызов, в результате которого в массиве ничего не передается или возвращается сообщение об ошибке Invalid argument supplied for foreach().Вот мой код:

Действие представления контроллера:

/**
 * Displays a single Listing model.
 * @param integer $id
 * @return mixed
 */
public function actionView($id)
{
    $model = $this->findModel($id);

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        return $this->redirect(['view', 'id' => $model->listing_id]);
    } else {
        $count = \common\models\ListingImages::find()->count();
        // $query = new yii\db\Query;
        $images = \common\models\ListingImages::find()->where(['listing_id' => $model->listing_id])->all();

        if($count>0){
            $directory = Yii::$app->params['uploadUrl']; 
            $items = [];
            foreach($images as $image){
                $image_url_link = $image->image_url_link;
                $path = '@web/'. $directory . $image_url_link;
                $image_path = Html::img($path);
                $items = ArrayHelper::merge($image_path, $items);
            }
        } else {
            $items = [];
        }

        // echo var_dump($items);
        return $this->render('view', ['model' => $model, 'items' => $items]);
    }
}

А вот мой код view.php:

<?php

use yii\helpers\Html;
use kartik\detail\DetailView;
use kartik\datecontrol\DateControl;
use yii\helpers\ArrayHelper;

/**
 * @var yii\web\View $this
 * @var common\models\Listing $model
 */

$this->title = $model->listing_title;
$this->params['breadcrumbs'][] = ['label' => Yii::t('app', 'Listings'), 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;

?>
<div>
    <p>
        <?= Html::a('Update', ['update', 'id' => $model->listing_id], ['class' => 'btn btn-primary']) ?>
        <?= Html::a('Delete', ['delete', 'id' => $model->listing_id], [
            'class' => 'btn btn-danger',
            'data' => [
                'confirm' => 'Are you sure you want to delete this Listing?',
                'method' => 'post',
            ],
        ]) ?>
    </p>

    <?php if (Yii::$app->session->hasFlash('delete_unsuccessful')): ?>
        <div class="alert alert-error alert-dismissable">
        <button aria-hidden="true" data-dismiss="alert" class="close" type="button">×</button>
        <h4><i class="icon fa fa-check"></i>Unable to Delete!</h4>
        <?= Yii::$app->session->getFlash('delete_unsuccessful') ?>
        </div>
    <?php endif; ?>
</div>

<div class="row">
    <div class="col-md-8">
        <div class="box box-info">
            <div class="box-header with-border">
                <h3 class="box-title">Listing Images</h3>
            </div>
            <!-- /.box-header -->
            <div class="box-body">
                <?php echo yii\bootstrap\Carousel::widget(['items'=>$items]); ?>
            </div>
        </div>
    </div>
</div>

Что я ожидаю в массиве itemsэто что-то вроде

$items=[
  '<img src="http://placehold.it/1000x1000?text=Product+01">', 
'<img src="http://placehold.it/1000x1000?text=Product+02">', 
'<img src="http://placehold.it/1000x1000?text=Product+03">', 
'<img src="http://placehold.it/1000x1000?text=Product+04">', 
'<img src="http://placehold.it/1000x1000?text=Product+05">', 
'<img src="http://placehold.it/1000x1000?text=Product+06">', 
'<img src="http://placehold.it/1000x1000?text=Product+07">', 
'<img src="http://placehold.it/1000x1000?text=Product+08">'
];

Пожалуйста, помогите мне, где я иду не так.Кажется, я не могу найти ответ в Интернете.

РЕДАКТИРОВАТЬ

Это то, что я получаю, когда я var_dump переменная $images непосредственно перед функцией if ...

array(5) { [0]=> object(common\models\ListingImages)#167 (12) { ["filename"]=> NULL ["image"]=> NULL ["_attributes":"yii\db\BaseActiveRecord":private]=> array(7) { ["image_id"]=> int(9) ["listing_id"]=> int(28) ["image_url_link"]=> string(36) "sLgINOnRlkJuu6uKYwnAchcJswaiHxM-.jpg" ["updated_at"]=> string(19) "2018-11-09 12:48:34" ["created_at"]=> string(19) "2018-11-09 12:48:34" ["created_by"]=> int(2) ["active"]=> string(1) "Y" } ["_oldAttributes":"yii\db\BaseActiveRecord":private]=> array(7) { ["image_id"]=> int(9) ["listing_id"]=> int(28) ["image_url_link"]=> string(36) "sLgINOnRlkJuu6uKYwnAchcJswaiHxM-.jpg" ["updated_at"]=> string(19) "2018-11-09 12:48:34" ["created_at"]=> string(19) "2018-11-09 12:48:34" ["created_by"]=> int(2) ["active"]=> string(1) "Y" } ["_related":"yii\db\BaseActiveRecord":private]=> array(0) { } ["_relationsDependencies":"yii\db\BaseActiveRecord":private]=> array(0) { } ["_errors":"yii\base\Model":private]=> NULL ["_validators":"yii\base\Model":private]=> NULL ["_scenario":"yii\base\Model":private]=> string(7) "default" ["_events":"yii\base\Component":private]=> array(0) { } ["_eventWildcards":"yii\base\Component":private]=> array(0) { } ["_behaviors":"yii\base\Component":private]=> array(0) { } } [1]=> object(common\models\ListingImages)#178 (12) { ["filename"]=> NULL ["image"]=> NULL ["_attributes":"yii\db\BaseActiveRecord":private]=> array(7) { ["image_id"]=> int(10) ["listing_id"]=> int(28) ["image_url_link"]=> string(36) "ZKTPUE_dR7P3lF7CT9UZnOcC0ZL2Ws43.jpg" ["updated_at"]=> string(19) "2018-11-09 12:48:34" ["created_at"]=> string(19) "2018-11-09 12:48:34" ["created_by"]=> int(2) ["active"]=> string(1) "Y" } ["_oldAttributes":"yii\db\BaseActiveRecord":private]=> array(7) { ["image_id"]=> int(10) ["listing_id"]=> int(28) ["image_url_link"]=> string(36) "ZKTPUE_dR7P3lF7CT9UZnOcC0ZL2Ws43.jpg" ["updated_at"]=> string(19) "2018-11-09 12:48:34" ["created_at"]=> string(19) "2018-11-09 12:48:34" ["created_by"]=> int(2) ["active"]=> string(1) "Y" } ["_related":"yii\db\BaseActiveRecord":private]=> array(0) { } ["_relationsDependencies":"yii\db\BaseActiveRecord":private]=> array(0) { } ["_errors":"yii\base\Model":private]=> NULL ["_validators":"yii\base\Model":private]=> NULL ["_scenario":"yii\base\Model":private]=> string(7) "default" ["_events":"yii\base\Component":private]=> array(0) { } ["_eventWildcards":"yii\base\Component":private]=> array(0) { } ["_behaviors":"yii\base\Component":private]=> array(0) { } } [2]=> object(common\models\ListingImages)#179 (12) { ["filename"]=> NULL ["image"]=> NULL ["_attributes":"yii\db\BaseActiveRecord":private]=> array(7) { ["image_id"]=> int(11) ["listing_id"]=> int(28) ["image_url_link"]=> string(36) "vSZYiTTk1-bPk9MNGQ4RuU1Rih3adfgJ.jpg" ["updated_at"]=> string(19) "2018-11-09 12:48:35" ["created_at"]=> string(19) "2018-11-09 12:48:35" ["created_by"]=> int(2) ["active"]=> string(1) "Y" } ["_oldAttributes":"yii\db\BaseActiveRecord":private]=> array(7) { ["image_id"]=> int(11) ["listing_id"]=> int(28) ["image_url_link"]=> string(36) "vSZYiTTk1-bPk9MNGQ4RuU1Rih3adfgJ.jpg" ["updated_at"]=> string(19) "2018-11-09 12:48:35" ["created_at"]=> string(19) "2018-11-09 12:48:35" ["created_by"]=> int(2) ["active"]=> string(1) "Y" } ["_related":"yii\db\BaseActiveRecord":private

Все значения базы данныхзагружен как ожидалось.

1 Ответ

0 голосов
/ 15 ноября 2018

Ну, я не нахожу никаких веских причин для использования ArrayHelper::merge($image_path, $items); здесь, поскольку ваша переменная $image_path - это строка, а не массив, и ArrayHelper::merge() требует оба параметра как arrays, а не строка, если вы беспокоитесьо дублированных изображениях и хотите, чтобы в выходном массиве были только уникальные изображения, вы можете просто изменить код в вашем действии на следующий.

$items = [];
foreach ($images as $image) {
    $image_url_link = "1000x1000";
    $path = '@web/' . "my-uploads" . $image_url_link;
    $items[] = \yii\helpers\Html::img($path);
}
$items = array_unique($items);
...