El tutorial Jobeet

16.4. Administrando los afiliados

Como el administrador debe activar a cada afiliado, tenemos que crear en la aplicación backend un nuevo módulo llamado affiliate:

$ php symfony propel:generate-admin backend JobeetAffiliate --module=affiliate

Para que el administrador pueda acceder al nuevo módulo, añade un enlace en el menú principal que indique el número de afiliados que están pendientes de activar:

<!-- apps/backend/templates/layout.php -->
<li>
  <a href="<?php echo url_for('@jobeet_affiliate') ?>">
    Affiliates - <strong><?php echo JobeetAffiliatePeer::countToBeActivated() ?></strong>
  </a>
</li>
// lib/model/JobeetAffiliatePeer.php
class JobeetAffiliatePeer extends BaseJobeetAffiliatePeer
{
  static public function countToBeActivated()
  {
    $criteria = new Criteria();
    $criteria->add(self::IS_ACTIVE, 0);

    return self::doCount($criteria);
  }

  // ...

}

La única acción que necesitamos en el backend es la de activar o desactivar cuentas de afiliados, así que puedes modificar la sección config creada automáticamente por la tarea propel:generate-admin para simplificar un poco la interfaz y para añadir al listado un enlace que permita activar cuentas directamente:

# apps/backend/modules/affiliate/config/generator.yml
config:
  fields:
    is_active: { label: Active? }
  list:
    title:   Affiliate Management
    display: [is_active, url, email, token]
    sort:    [is_active]
    object_actions:
      activate:   ~
      deactivate: ~
    batch_actions:
      activate:   ~
      deactivate: ~
    actions: {}
  filter:
    display: [url, email, is_active]

Si quieres mejorar la productividad de los administradores, modifica los filtros por defecto para que muestren sólo los afiliados pendientes de activar:

// apps/backend/modules/affiliate/lib/affiliateGeneratorConfiguration.class.php
class affiliateGeneratorConfiguration extends BaseAffiliateGeneratorConfiguration
{
  public function getFilterDefaults()
  {
    return array('is_active' => '0');
  }
}

El único código que tienes que escribir es el correspondiente a las acciones activate y deactivate:

// apps/backend/modules/affiliate/actions/actions.class.php
class affiliateActions extends autoAffiliateActions
{
  public function executeListActivate()
  {
    $this->getRoute()->getObject()->activate();

    $this->redirect('@jobeet_affiliate');
  }

  public function executeListDeactivate()
  {
    $this->getRoute()->getObject()->deactivate();

    $this->redirect('@jobeet_affiliate');
  }

  public function executeBatchActivate(sfWebRequest $request)
  {
    $affiliates = JobeetAffiliatePeer::retrieveByPks($request->getParameter('ids'));

    foreach ($affiliates as $affiliate)
    {
      $affiliate->activate();
    }

    $this->redirect('@jobeet_affiliate');
  }

  public function executeBatchDeactivate(sfWebRequest $request)
  {
    $affiliates = JobeetAffiliatePeer::retrieveByPks($request->getParameter('ids'));

    foreach ($affiliates as $affiliate)
    {
      $affiliate->deactivate();
    }

    $this->redirect('@jobeet_affiliate');
  }
}
// lib/model/JobeetAffiliate.php
class JobeetAffiliate extends BaseJobeetAffiliate
{
  public function activate()
  {
    $this->setIsActive(true);

    return $this->save();
  }

  public function deactivate()
  {
    $this->setIsActive(false);

    return $this->save();
  }

  // ...
}
La parte de administración de los afiliados

Figura 16.3 La parte de administración de los afiliados