Witam,
próbowałem uruchomić widget github.com/kartik-v/yii2-widget-fileinput
wg
przy próbie dodania pliku (kliknięciu Upload) otrzymuję komunikat:
Trying to get property of non-object
W trybie debugera zaznaczoną mam linię:
$model->filename = $image->name;
cały kontroler wygląda tak:
<?php
namespace backend\controllers;
use Yii;
use app\models\Person;
use yii\web\UploadedFile;
use yii\web\Controller;
class PersonController extends Controller
{
public function actionCreate()
{
$model = new Person;
if ($model->load(Yii::$app->request->post())) {
// get the uploaded file instance. for multiple file uploads
// the following data will return an array
$image = UploadedFile::getInstance($model, 'image');
// store the source file name
$model->filename = $image->name;
$ext = end((explode(".", $image->name)));
// generate a unique file name
$model->avatar = Yii::$app->security->generateRandomString().".{$ext}";
// the path to save file, you can set an uploadPath
// in Yii::$app->params (as used in example below)
$path = Yii::$app->params['uploads'] . $model->avatar;
if($model->save()){
$image->saveAs($path);
return $this->redirect(['view', 'id'=>$model->_id]);
} else {
// error in saving model
}
}
return $this->render('create', [
'model'=>$model,
]);
}
}
?>
Wzorując się na powyższym opisie autora widgetu utworzyłem w bazie tabelę "person".
Model:
<?php
namespace app\models;
use yii\db\ActiveRecord;
/**
* Class Person
* @package common\models
* @package common\models
* @property int $id unique person identifier
* @property string $name person / user name
* @property array $avatar generated filename on server
* @property string $filename source filename from client
*/
class Person extends ActiveRecord
{
/**
* @var mixed image the attribute for rendering the file input
* widget for upload on the form
*/
public $image;
public function rules()
{
return [
[['image'], 'safe'],
[['image'], 'file', 'extensions'=>'jpg, gif, png'],
];
}
}
?>
I widok formularza:
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use kartik\file\FileInput;
$form = ActiveForm::begin([
'options'=>['enctype'=>'multipart/form-data'] // important
]);
echo $form->field($model, 'id')->textInput();
//echo $form->field($model, 'filename');
echo $form->field($model, 'filename')->widget(FileInput::classname(), [
'options' => ['accept' => 'image/*'],
]);
// your fileinput widget for single file upload
$form->field($model, 'image')->widget(FileInput::classname(), [
'options'=>['accept'=>'image/*'],
'pluginOptions'=>['allowedFileExtensions'=>['jpg','gif','png']
]]);
/**
* uncomment for multiple file upload
*
echo $form->field($model, 'image[]')->widget(FileInput::classname(), [
'options'=>['accept'=>'image/*', 'multiple'=>true],
'pluginOptions'=>['allowedFileExtensions'=>['jpg','gif','png']
]);
*
*/
echo Html::submitButton($model->isNewRecord ? 'Upload' : 'Update', [
'class'=>$model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']
);
ActiveForm::end();
?>
W swoim przykładzie używam advanced application template, pozmieniałem niektóre fragmenty kodu z przykładu, aby pasowały do tej wersji aplikacji (mam nadzieję, że tutaj nie popełniłem błędu). Nie wiem gdzie powinienem utworzyć katalog uploads/ aby można było dodawać z niego pliki do linków CKEditor i oczywiście żeby były dostępne dla części frontend.