Witam,
W napisanym przeze mnie CMS chciałbym utworzyć pole, gdzie bedzie można przesłać obrazek. Chcialbym, aby pole było obowiązkowe, ale zeby podczas aktualizacji użytkownik nie musiał ponownie przesyłać pliku, chyba, ze sam go podmieni. W związku z tym mam taki model:
<?php
namespace app\modules\admin\models;
use Yii;
/**
* This is the model class for table "partners".
*
* @property integer $id
* @property string $name
* @property integer $logo
* @property string $website
*
* @property Files $logo0
*/
class Partners extends \yii\db\ActiveRecord
{
public $logoFile;
/**
* @inheritdoc
*/
public static function tableName()
{
return 'partners';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['name', 'logo', 'website'], 'required'],
[['logo'], 'integer'],
[['name', 'website'], 'string', 'max' => 255],
['logoFile', 'image', 'extensions' => 'png, jpg',
'minWidth' => 159, 'maxWidth' => 159,
'minHeight' => 51, 'maxHeight' => 51,
],
['logoFile', 'required', 'when' => function ($model) {
return !$model->logo;
}, 'whenClient' => "function (attribute, value) {
return $('#logoFile').val() == '';
}"],
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => Yii::t('app', 'ID'),
'name' => Yii::t('app', 'Nazwa'),
'logo' => Yii::t('app', 'Logo'),
'website' => Yii::t('app', 'Strona WWW'),
'logoFile' => Yii::t('app', 'Logo'),
];
}
public function load($data, $formName = null) {
if(parent::load($data, $formName)) {
$imageData = Files::uploadFile($this, 'logoFile');
if($imageData)
{
$this->logo = $imageData;
}
return true;
}
}
public function afterDelete()
{
$this->logo0->delete();
return parent::afterDelete();
}
/**
* @return \yii\db\ActiveQuery
*/
public function getLogo0()
{
return $this->hasOne(Files::className(), ['id' => 'logo']);
}
}
Model Files przechowuje wszystkie moje pliki w ramach calego CMS. W formularzu korzystam z rozszerzenia Kartik-Input (http://demos.krajee.com/widget-details/fileinput). Oto kawalek mojego formularza
<div class="form-group">
<?= $form->field($model, 'logoFile')->widget(FileInput::classname(), [
'options' => [
'accept' => 'image/*',
'multiple'=> false,
],
'pluginOptions' => [
'showPreview' => true,
'showCaption' => true,
'showRemove' => false,
'showUpload' => false,
'minImageHeight' => 51,
'maxImageHeight' => 51,
'minImageWidth' => 159,
'maxImageWidth' => 159,
'initialPreview'=> (!$model->isNewRecord) ? [
Html::img($model->logo0->path, ['class'=>'file-preview-image', 'alt'=> $model->name, 'title'=> $model->name]),
] : '',
],
'class' => 'form-control',
]) ?>
</div>
Teraz moje pytanie- utworzyłem conditional validator, ale mam wrażenie, ze nie działa tak jakbym chciał. W momencie kiedy użytkownik zlikwiduje podgląd w polu input chciałbym aby pole stało się obowiązkowe, a w przeciwnym wypadku, aby możliwa była aktualizacja bez konieczności dodawania obrazu. Mam nadzieje, ze opisałem problem w miarę czytelnie. Proszę o porady w jaki sposób najlepiej rozwiązać ten problem.
Pozdrawiam,
blanker