CakePHP 3.6: обновление значения элемента управления на основе выбора раскрывающегося элемента управления - PullRequest
0 голосов
/ 18 октября 2018

У меня есть следующие таблицы:

customers[id, name, surname, phone, text, balance, created]

service_types[id, title, price, length, is_subscription, created, payment]

customer_service_types[id, customer_id, service_type_id, price, created]

И отношения:

ServiceTypesTable.php:

$this->hasMany('CustomerServiceTypes', [
        'foreignKey' => 'service_type_id'
    ]);

CustomerServiceTypesTable.php:

$this->belongsTo('Customers', [
        'foreignKey' => 'customer_id',
        'joinType' => 'INNER'
    ]);
    $this->belongsTo('ServiceTypes', [
        'foreignKey' => 'service_type_id',
        'joinType' => 'INNER'
    ]);

В CustomerServiceTypes\add.ctp У меня есть раскрывающийся список с services и полем для цены:

echo $this->Form->control('customer_id', ['options' => $customers,'label' => 'Customer']);
echo $this->Form->control('service_type_id', ['options' => $serviceTypes, 'label' => 'Service']);
echo $this->Form->control('price', ['label' => 'Price']);

В CustomerServiceTypesController.php:

public function add($customerid = null)
    {
        $customerServiceType = $this->CustomerServiceTypes->newEntity();
        if ($this->request->is('post')) {
            $customerServiceType = $this->CustomerServiceTypes->patchEntity($customerServiceType, $this->request->getData());
            if ($this->CustomerServiceTypes->save($customerServiceType)) {

                //debug($this->request->getData("customer_id"),true);


                $this->Flash->success(__('Success'));

                return $this->redirect(['controller' => 'customers', 'action' => 'edit', $customerid]);
            }
            $this->Flash->error(__('Fail'));
        }
        $customers = $this->CustomerServiceTypes->Customers->find('list', ['limit' => 200])->where(['Customers.id =' => $customerid]);
        $serviceTypes = $this->CustomerServiceTypes->ServiceTypes->find('list', [
        'valueField' => function ($row) {
            return $row['title'] . ' (Suggested price: ' . $row['price'] . ')';
        }
    ], ['limit' => 200]);
        $this->set(compact('customerServiceType', 'customers', 'serviceTypes'));
    }

, который добавляет в поле значения services значение конкретной услуги:

Service_1 (рекомендуемая цена: 100)

Service_2 (Рекомендованная цена: 150)

.....

Но чего я хочу добиться, так это обновить поле price предложенной ценой, когда пользователь делает выбор ввыпадающее полеВозможно ли достичь этой серверной стороны?Без использования JavaScript?Потому что мои знания очень ограничены в JavaScript.Если нет, можете ли вы привести рабочий пример, основанный на моем вопросе?

1 Ответ

0 голосов
/ 19 октября 2018

Внести следующие изменения:

add.ctp

    <div ng-app=""  ng-init='servicePrices = <?php echo json_encode($servicePrices); ?>;' >

<?php

echo $this->Form->create();

echo $this->Form->control('customer_id', ['options' => $customers,'label' => 'Customer']);

echo $this->Form->control('service_type_id', [
'options' => $serviceTypes, 'label' => 'Service',
'ng-model'=>'service_type_id'
]);

 echo $this->Form->control('price', [
'label' => 'Price',
'ng-model'=>'servicePrices[service_type_id]'
]);

echo $this->Form->submit('submit');

?>

</div>

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.7.5/angular.min.js" ></script>

CustomerServiceTypesController.php

// add this
 $servicePrices = $this->CustomerServiceTypes
            ->ServiceTypes
            ->find()
            ->limit(200)
            ->combine('id','price');


    $this->set(compact('customerServiceType', 'customers', 'serviceTypes','servicePrices'));
...