Restringir los objetos disponibles en el generador de administración de Symfony para todas las acciones

Se puede cambiar la consulta que se usa para la acción de lista en una configuración de generador de administración usando el table_method opción. Por ejemplo,

# apps/backend/modules/job/config/generator.yml
config:
  list:
    table_method: retrieveBackendJobList

Pero quiero restringir todas las acciones en el generador de administración. En particular, quiero restringir todos los objetos mostrados, editados, eliminados, etc., a objetos que tienen un atributo particular que puede depender del día de la semana actual o de la hora del día.

No quiero anular la clase de modelo porque para otras aplicaciones quiero que la restricción sea diferente (o quizás ninguna restricción).

¿Dónde (es decir, qué archivo (s)) y cómo puedo realizar este cambio?

preguntado el 10 de mayo de 11 a las 13:05

2 Respuestas

Probablemente a través de las funciones table_method y generator.yml para agregar y eliminar botones de acción, ya se ha encargado de personalizar la acción de índice (es decir, lista).

Para las otras acciones, es posible que desee crear métodos adicionales en los modelos para estas consultas personalizadas. Pero el lugar para anular el comportamiento predeterminado es el archivo actions.class.php del módulo.

Entonces, en su ejemplo, editaría el archivo apps / backend / modules / job / actions / actions.class.php y escribiría un código personalizado para cada acción que necesite modificar.

Entonces, por ejemplo, podría cambiar el comportamiento de eliminación de esta manera:

# apps/backend/modules/job/actions/actions.class.php
require_once dirname(__FILE__).'/../lib/jobGeneratorConfiguration.class.php';
require_once dirname(__FILE__).'/../lib/jobGeneratorHelper.class.php';

class jobActions extends autoJobActions
{ 
  /**
   * Override standard delete action.
   * @param sfWebRequest $request A request object
   */
  public function executeDelete(sfWebRequest $request) {
    if ($some_custom_condition) {
      $job = Doctrine_Core::getTable('job')->find($request->getParameter('id'));
      $job->delete();
      $this->getUser()->setFlash('notice', 'Record deleted.');
      return sfView::SUCCESS;
    } else {
      $this->getUser()->setFlash('error', 'You do not have permission to do that.');
      return sfView::ERROR;
    }
  }
}

contestado el 10 de mayo de 11 a las 22:05

Utilice el enrutamiento para eso. Esto asegurará que todas las acciones tengan un método para la consulta de objetos.

job:
  class: sfDoctrineRouteCollection
  options:
    model: Job
    module: job
    with_wildcard_routes: true
    model_methods:
      object: getActiveJob

class JobTable extends Doctrine_Table
{
  public function getActiveObject($params)
  {
    $q = $this->createQuery('j')
      ->where('j.id = ?', $params['id'])
      ->addWhere('j.is_active = ?', true)
    ;

    return $q->fetchOne();
  }
}

En sus acciones personalizadas, use $ this-> getRouting () -> getObject () para hacer uso de este método.

contestado el 11 de mayo de 11 a las 02:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.