Ejecutando automáticamente una acción no relacionada en la aplicación CakePHP -- php campo con model-view-controller campo con cakephp-2.0 camp Relacionados El problema

Automatically running an unrelated action in cakePHP application


0
vote

problema

Español

Estoy trabajando en una pequeña solicitud para proporcionar cotizaciones para productos personalizados. Es mi primera aplicación CakePHP.

Muchos de los campos para los productos se calculan automáticamente cuando se agrega o guarda un producto. Los cálculos utilizan el valor almacenado en la tabla 'Tarifas' para realizar las operaciones. Estos 'tarifas' también pueden ser actualizadas por el administrador y tienen su propio modelo, vista y controlador. Sin embargo, cuando las tarifas se actualizan, necesito que todos los productos existentes se vuelvan a calcular como si el usuario hubiera estado en / productos / editar y hacer clic en Guardar.

Realmente no sé cómo activar esto cuando las tarifas se guardan en la base de datos

Aquí está mi función de edición de Controller:

  public function edit($id = null) {     $this->Product->id = $id;     if (!$this->Product->exists()) {         throw new NotFoundException(__('Invalid product'));     }     if ($this->request->is('post') || $this->request->is('put')) {         $this->loadModel('Rate', '1');          $Od = $this->request->data['Product']['material_od'] / 2;         $materialMass = $this->Rate->field('steel_mass') * $this->request->data['Product']['material_length'] * (pi() * $Od * $Od );         $this->Product->saveField('material_mass', $materialMass);          $materialCost = $materialMass * $this->Product->Material->field('cost', array('Material.id' => $this->request->data['Product']['material_id']));         $this->Product->saveField('material_cost', $materialCost);          $materialMarkupRate = $this->Rate->field('material_markup') + 1;         $wasteMarkupRate = $this->Rate->field('waste_markup') + 1;          $materialMarkupCost = $materialCost * $materialMarkupRate * $wasteMarkupRate;         $this->Product->saveField('material_markup_cost', $materialMarkupCost);          $setupCost = $this->request->data['Product']['number_tools'] * $this->Rate->field('tool_time') * $this->Rate->field('setup_rate');         $this->Product->saveField('setup_cost', $setupCost);          $cuttingCost = $this->request->data['Product']['cutting_time'] * $this->Rate->field('cutting_rate');         $this->Product->saveField('cutting_cost', $cuttingCost);          $machiningCost = $this->request->data['Product']['machining_time'] * $this->Rate->field('machining_rate');         $this->Product->saveField('machining_cost', $machiningCost);          $polishingCost = $this->request->data['Product']['polishing_time'] * $this->Rate->field('polishing_rate');         $this->Product->saveField('polishing_cost', $polishingCost);          if ($this->Product->save($this->request->data)) {             $this->Session->setFlash(__('The product has been saved'));             $this->redirect(array('action' => 'index'));         } else {             $this->Session->setFlash(__('The product could not be saved. Please, try again.'));         }     } else {         $this->request->data = $this->Product->read(null, $id);     }     $materials = $this->Product->Material->find('list');     $this->set(compact('materials')); }   

y mi función de edición de controlescontroller:

  public function edit($id = null) {     $this->Rate->id = $id;     if (!$this->Rate->exists()) {         throw new NotFoundException(__('Invalid rate'));     }     if ($this->request->is('post') || $this->request->is('put')) {         if ($this->Rate->save($this->request->data)) {             $this->Session->setFlash(__('The settings have been saved.  Please update your products.'));             $this->redirect(array('controller' => 'products', 'action' => 'index'));         } else {             $this->Session->setFlash(__('The rate could not be saved. Please, try again.'));         }     } else {         $this->request->data = $this->Rate->read(null, $id);     } }   

¿Cómo puedo activar el primero de la segunda?

Soy bastante nuevo para esto, así que todas las sugerencias de consejos y la crítica es muy bienvenida!

muchas gracias, Ralph

Original en ingles

I am working on a small application to provide quotes for custom products. It's my first cakePHP application.

Many of the fields for the products are calculated automatically when a product is added or saved. The calculations use valuse stored in the 'Rates' table to perform the operations. These 'Rates' can also be updated by the admin and have thier own model, view and controller. However, when the Rates are updated I need all of the existing products to be re-calculated as if the user had been to /products/edit and clicked save.

I really don't know how to trigger this when the rates are saved to the database

here is my ProductsController edit function:

public function edit($id = null) {     $this->Product->id = $id;     if (!$this->Product->exists()) {         throw new NotFoundException(__('Invalid product'));     }     if ($this->request->is('post') || $this->request->is('put')) {         $this->loadModel('Rate', '1');          $Od = $this->request->data['Product']['material_od'] / 2;         $materialMass = $this->Rate->field('steel_mass') * $this->request->data['Product']['material_length'] * (pi() * $Od * $Od );         $this->Product->saveField('material_mass', $materialMass);          $materialCost = $materialMass * $this->Product->Material->field('cost', array('Material.id' => $this->request->data['Product']['material_id']));         $this->Product->saveField('material_cost', $materialCost);          $materialMarkupRate = $this->Rate->field('material_markup') + 1;         $wasteMarkupRate = $this->Rate->field('waste_markup') + 1;          $materialMarkupCost = $materialCost * $materialMarkupRate * $wasteMarkupRate;         $this->Product->saveField('material_markup_cost', $materialMarkupCost);          $setupCost = $this->request->data['Product']['number_tools'] * $this->Rate->field('tool_time') * $this->Rate->field('setup_rate');         $this->Product->saveField('setup_cost', $setupCost);          $cuttingCost = $this->request->data['Product']['cutting_time'] * $this->Rate->field('cutting_rate');         $this->Product->saveField('cutting_cost', $cuttingCost);          $machiningCost = $this->request->data['Product']['machining_time'] * $this->Rate->field('machining_rate');         $this->Product->saveField('machining_cost', $machiningCost);          $polishingCost = $this->request->data['Product']['polishing_time'] * $this->Rate->field('polishing_rate');         $this->Product->saveField('polishing_cost', $polishingCost);          if ($this->Product->save($this->request->data)) {             $this->Session->setFlash(__('The product has been saved'));             $this->redirect(array('action' => 'index'));         } else {             $this->Session->setFlash(__('The product could not be saved. Please, try again.'));         }     } else {         $this->request->data = $this->Product->read(null, $id);     }     $materials = $this->Product->Material->find('list');     $this->set(compact('materials')); } 

and my RatesController edit function:

public function edit($id = null) {     $this->Rate->id = $id;     if (!$this->Rate->exists()) {         throw new NotFoundException(__('Invalid rate'));     }     if ($this->request->is('post') || $this->request->is('put')) {         if ($this->Rate->save($this->request->data)) {             $this->Session->setFlash(__('The settings have been saved.  Please update your products.'));             $this->redirect(array('controller' => 'products', 'action' => 'index'));         } else {             $this->Session->setFlash(__('The rate could not be saved. Please, try again.'));         }     } else {         $this->request->data = $this->Rate->read(null, $id);     } } 

How can i trigger the first one from the second one?

I'm fairly new to this so all tips suggestions and criticism is very welcome!

Many Thanks, Ralph

        

Lista de respuestas

0
 
vote
vote
La mejor respuesta
 

Hay un par de problemas que lo ayudarán a no solo aclarar lo que está tratando de hacer, sino que lo hace de una manera más eficiente. Actualmente, cada vez que llame $this->Product->saveField Está presionando su base de datos. Si esta es una pequeña aplicación utilizada por algunas personas, no importará mucho. Sin embargo, debe meterse en el hábito de escribir un buen código limpio. ¡Tus nombres de variables son geniales! Fácil de entender. Primero sugeriría calcular todos los valores y luego golpear la base de datos como esta:

  ...     $this->loadModel('Rate', '1');     $materialMarkupRate = $this->Rate->field('material_markup') + 1;     $wasteMarkupRate = $this->Rate->field('waste_markup') + 1;      $Od = $this->request->data['Product']['material_od'] / 2;     // make sure you have a hidden id form in the view, otherwise you will need to set it here     $this->request->data['Product']['material_mass'] = $this->Rate->field('steel_mass') * $this->request->data['Product']['material_length'] * (pi() * $Od * $Od );     $this->request->data['Product']['material_cost'] = $materialMass * $this->Product->Material->field('cost', array('Material.id' => $this->request->data['Product']['material_id']));     $this->request->data['Product']['material_markup_cost'] = $materialCost * $materialMarkupRate * $wasteMarkupRate;     $this->request->data['Product']['setup_cost'] = $this->request->data['Product']['number_tools'] * $this->Rate->field('tool_time') * $this->Rate->field('setup_rate');     $this->request->data['Product']['cutting_cost'] = $this->request->data['Product']['cutting_time'] * $this->Rate->field('cutting_rate');     $this->request->data['Product']['machining_cost'] = $this->request->data['Product']['machining_time'] * $this->Rate->field('machining_rate');     $this->request->data['Product']['polishing_cost'] = $this->request->data['Product']['polishing_time'] * $this->Rate->field('polishing_rate');      if ($this->Product->save($this->request->data)) { ...   

Segundo, si necesita llamar a este método de otras ubicaciones, es decir, es una señal que necesita para moverla. Debido a que esto son datos, deberías moverlo al modelo.

Sin embargo, si está diciendo que cada vez que cambian las tarifas, cada producto en la base de datos debe actualizarse, esto todavía va a ser un problema. Tal vez no ahora, pero más tarde por la carretera. Piense en tener registros de 100 mm. Cambia una cosa en las tarifas y usted está agitando en la base de datos durante mucho tiempo. Eso es muchos recursos.

Mi consejo es el cambio de esto y muévalo a la devolución de llamada ONFIND en el producto. La forma en que funcionará es cada vez que tire de un registro, ejecutará las matemáticas en los valores antes de que se devuelvan a la vista. Normalmente es mejor no almacenar valores calculados en la base de datos. Hay ciertas circunstancias en las que querrás, pero en este caso parece que puedes calcularlos sobre la marcha. Esto también evitará la necesidad de recalcular cada producto cada vez que cambie la tasa. También realizará un código más limpio.

 

There are a couple of issues that will help you not only clear up what you are trying to do, but do it in a more efficient way. Currently, every time you call $this->Product->saveField you are hitting your database. If this is a small app used by few people, it won't matter much. However, you should get into the habit of writing good clean code. Your variable names are great! Easy to understand. I would first suggest calculating all of the values and then hitting the database like this:

...     $this->loadModel('Rate', '1');     $materialMarkupRate = $this->Rate->field('material_markup') + 1;     $wasteMarkupRate = $this->Rate->field('waste_markup') + 1;      $Od = $this->request->data['Product']['material_od'] / 2;     // make sure you have a hidden id form in the view, otherwise you will need to set it here     $this->request->data['Product']['material_mass'] = $this->Rate->field('steel_mass') * $this->request->data['Product']['material_length'] * (pi() * $Od * $Od );     $this->request->data['Product']['material_cost'] = $materialMass * $this->Product->Material->field('cost', array('Material.id' => $this->request->data['Product']['material_id']));     $this->request->data['Product']['material_markup_cost'] = $materialCost * $materialMarkupRate * $wasteMarkupRate;     $this->request->data['Product']['setup_cost'] = $this->request->data['Product']['number_tools'] * $this->Rate->field('tool_time') * $this->Rate->field('setup_rate');     $this->request->data['Product']['cutting_cost'] = $this->request->data['Product']['cutting_time'] * $this->Rate->field('cutting_rate');     $this->request->data['Product']['machining_cost'] = $this->request->data['Product']['machining_time'] * $this->Rate->field('machining_rate');     $this->request->data['Product']['polishing_cost'] = $this->request->data['Product']['polishing_time'] * $this->Rate->field('polishing_rate');      if ($this->Product->save($this->request->data)) { ... 

Second, if you need to call this method from other locations, that is a sign that you need to move it. Because this is data, you should move it to the Model.

However, if you are saying that everytime the rates change, EVERY product in the database needs to be updated, this is still going to be a problem. Maybe not now, but later down the road. Think about having a 100MM records. You change one thing on the rates and you are churning on the database for a LONG time. That's a lot of resources.

My advice is the change this and move it to the onFind callback in the ProductModel. The way it will work is every time you pull a record, it will run the math on the values before they are returned to the view. It is normally best NOT to store calculated values in the database. There are certain circumstances where you will want to, but in this case it seems you can calculate them on the fly. This will also prevent the need to recalculate every product every time the rate changes. It will also make for cleaner code.

 
 
     
     

Relacionados problema

1  Pantalla CakePHP Otro modelo asociado con la clave externa  ( Cakephp display other model associated with foreign key ) 
Tengo el artículo de los modelos y el actor con una relación habtm (FINANCIA DE TRABAJO) . Ahora, agregué el Modelo de roles , que sostiene el actorid, ...

1  HABTM Encuentra con CakePHP 2.0  ( Habtm find with cakephp 2 0 ) 
Estoy tratando de hacer una búsqueda, usando la paginación para publicaciones que tienen una etiqueta o etiquetas específicas (por ejemplo, si un usuario fue ...

2  Instale CAKEPHP 2 consola en Ubuntu  ( Install cakephp 2 console on ubuntu ) 
He instalado amplificador en mi Ubuntu. Amo a CakePHP y quiero usarlo. ¿Cómo puedo usar la consola de hornear en Ubuntu? note : apt-get install cakephp-...

1  Caminos relativos para JavaScript en CakePHP2  ( Relative paths for javascript on cakephp2 ) 
Me preguntaba si hay alguna forma de hacer algo similar a lo que HtmlHelper hace en las vistas de pastel: en lugar de tener que escribir la URL manualmente,...

1  @ Fuente-cara en un CakePhp WebApp (no funcionando a través de varios tipos de navegadores)  ( Font face in a cakephp webapp not working across various browser types ) 
@ font-face parece que la cita sencilla para configurar en mi CSS, y sin embargo, no se está utilizando mi fuente definida. Esto se encuentra en un CAPEPHP 2....

3  Enviando datos a través de AJAX en CakePHP  ( Sending data via ajax in cakephp ) 
Soy nuevo en CakePHP y tratando de enviar datos desde AJAX a My Controller Action. Tengo un modelo emergente en el que hay un cuadro de entrada. Quiero agarr...

0  Realizando una operación de búsqueda simple en CakePHP  ( Performing a simple find operation in cakephp ) 
Usando CakePHP, necesito recuperar una lista básica de registros. Sin uniones o formato especial de resultados de CakePHP, solo una matriz básica de registros...

0  CAKEPHP - AUTH - $ CRENTE_USER - NO ID, FIRST_NAME, Last_Name, etc  ( Cakephp auth current user no id first name last name etc ) 
cuando inicie sesión con: $this->Auth->login($this->request->data) y ahora, cuando digo: $this->set('current_user', $this->Auth->user()); en My ...

0  Aviso (8): modificación indirecta de la propiedad sobrecargada  ( Notice 8 indirect modification of overloaded property ) 
Después de actualizar mi CakePHP de 1.3 a 2.1. Tengo este error Aviso (8): modificación indirecta de la propiedad sobrecargada ThreadsController::$data n...

0  Declaración de búsqueda compleja, no sé cómo escribir valores múltiples para una condición  ( Complex find statement dont know how to write multiple values for one conditio ) 
Estoy tratando de construir una llamada de búsqueda pagada a mi modelo de unidad. Necesito la condición de ser que busca la unidad. Type of Condo y Rural, Cas...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos