Yii2 Настройка свойства только для чтения - PullRequest
0 голосов
/ 02 июля 2018

Добрый день всем

Когда я пытаюсь создать клиента,
я получаю сообщение об ошибке: Установка свойства только для чтения: app \ models \ form \ ClientForm :: Clientclient

Как я могу исправить эту ошибку?

Это мой ClientClient (модель)

class ClientClient extends \yii\db\ActiveRecord
{
/**
 * {@inheritdoc}
 */
public static function tableName()
{
    return 'client_client';
}
public $clientclients;
/**
 * {@inheritdoc}
 */
public function rules()
{
    return [
        [['age', 'client_id'], 'integer'],
        [['first_name', 'patronymic', 'last_name', 'clientclients'], 'string', 'max' => 255],
    ];
}

/**
 * {@inheritdoc}
 */
public function attributeLabels()
{
    return [
        'id' => 'ID',
        'first_name' => 'First Name',
        'patronymic' => 'Patronymic',
        'last_name' => 'Last Name',
        'age' => 'Age',
        'client_id' => 'Client Id',


    ];
}

/**
 * @return \yii\db\ActiveQuery
 */
public function getClient_id()
{
    return $this->hasOne(ClientPhone::class, ['client_id' => 'id']);
}

public function getPhone()
{
    return $this->hasOne(ClientPhone::class, ['phone_digital' => 'id']);
}
}

Это моя ClientForm (модель):

class ClientForm extends model
{
private $_client;
private $_phone;


public function rules()
{
    return [
        [['ClientClient'], 'required'],
        [['ClientPhone'], 'safe'],
    ];
}

public function afterValidate()
{
    $error = false;
    if (!$this->ClientClient->validate()) {
         $error = true;
    }
    if (!$this->ClientPhone->validate()) {
        $error = true;
    }
    if ($error) {
        $this->addError(null); // add an empty error to prevent saving
    }
    parent::afterValidate();
}
public function save()
{
    if (!$this->validate()) {
        return false;
    }
    $transaction = Yii::$app->db->beginTransaction();
    if (!$this->ClientClient->save()) {
        $transaction->rollBack();
        return false;
    }
    $this->ClientPhone->client_id = $this->ClientClient->id;
    if (!$this->phone->save(false)) {
        $transaction->rollBack();
        return false;
    }
    $transaction->commit();
    return true;
}

public function getClientclient()
{
    return $this->_client;
}

public function setClient($client)
{
    if ($client instanceof Client) {
        $this->_client = $client;
    } else if (is_array($client)) {
        $this->_client->setAttributes($client);
    }
}

public function getphone()
{
    if ($this->_phone === null) {
        if ($this->client->isNewRecord) {
            $this->_phone = new Phone();
            $this->_phone->loadDefaultValues();
        } else {
            $this->_phone = $this->client->phone;
        }
    }
    return $this->_phone;
}



public function setPhone($phone)
{
    if (is_array($phone)) {
        $this->phone->setAttributes($phone);
    } elseif ($phone instanceof Phone) {
        $this->_phone = $phone;
    }
}

public function errorSummary($form)
{
    $errorLists = [];
    foreach ($this->getAllModels() as $id => $model) {
        $errorList = $form->errorSummary($model, [
            'header' => '<p>Please fix the following errors for <b>' . $id . '</b></p>',
        ]);
        $errorList = str_replace('<li></li>', '', $errorList); // remove the empty error
        $errorLists[] = $errorList;
    }
    return implode('', $errorLists);
}

private function getAllModels()
{
    return [
        'Client' => $this->client,
        'Phone' => $this->phone,
    ];
}

}

_form

<div class="clientclient-form">

<?php $form = ActiveForm::begin(); ?>

<?= $form->field($clientForm->Clientclient, 'first_name')->textInput(['maxlength' => true]) ?>

<?= $form->field($clientForm->Clientclient, 'patronymic')->textInput(['maxlength' => true]) ?>

<?= $form->field($clientForm->clientphone, 'last_name')->textInput(['maxlength' => true]) ?>

<?= $form->field($clientForm->clientphone, 'phone_digital')->widget( MaskedInput::class, ['mask' => '9999999999'])?>

<?= $form->field($clientForm->Clientclient, 'age')->textInput() ?>

<div class="form-group">
    <?= Html::submitButton('Save', ['class' => 'btn btn-success']) ?>
</div>

<?php ActiveForm::end(); ?>

</div>

и контроллер

public function actionCreate()
{
    $clientForm = new ClientForm();
    $clientForm->Clientclient = new ClientClient();
    $clientForm->setAttributes(Yii::$app->request->post());
    if (Yii::$app->request->post() && $clientForm->save()) {
        Yii::$app->getSession()->setFlash('success', 'Clientclient has been created.');
        return $this->redirect(['update', 'id' => $clientForm->Clientclient->id]);
    } elseif (!Yii::$app->request->isPost) {
        $clientForm->load(Yii::$app->request->get());
    }
    return $this->render('create', ['clientForm' => $clientForm]);
}

public function actionUpdate($id)
{
    $clientForm = new ClientForm();
    $clientForm->ClientClients = $this->findModel($id);
    $clientForm->setAttributes(Yii::$app->request->post());
    if (Yii::$app->request->post() && $clientForm->save()) {
        Yii::$app->getSession()->setFlash('success', 'clientClient has been created.');
        return $this->redirect(['update', 'id' => $clientForm->ClientClient->id]);
    } elseif (!Yii::$app->request->isPost) {
        $clientForm->load(Yii::$app->request->get());
    }
    return $this->render('create', ['clientForm' => $clientForm]);
}

Почему Clientclient :: tags только для чтения? И как правильно установить модельные отношения?

1 Ответ

0 голосов
/ 02 июля 2018

Я получаю сообщение об ошибке: Установка свойства только для чтения: приложение \ модели \ формы \ ClientForm :: клиентуБизнес

Вы используете методы класса Yii getter и setter вместо открытых свойств, но в вашем классе ClientForm определен только метод getter . Вам также необходимо добавить метод Setter :

public function setClientclient($value)
{
    $this->_client = $value;
}

Подробнее см. Свойства концепции в официальной документации .

...