为管理生成器添加WHERE子句


add clause WHERE for admin generator

我用Admin生成器生成了这个:

abstract class autoNewsActions extends sfActions
{
  public function preExecute()
  {
    $this->configuration = new newsGeneratorConfiguration();
    if (!$this->getUser()->hasCredential($this->configuration->getCredentials($this->getActionName())))
    {
      $this->forward(sfConfig::get('sf_secure_module'), sfConfig::get('sf_secure_action'));
    }
    $this->dispatcher->notify(new sfEvent($this, 'admin.pre_execute', array('configuration' => $this->configuration)));
    $this->helper = new newsGeneratorHelper();
    parent::preExecute();
  }
  public function executeIndex(sfWebRequest $request)
  {
    // sorting
    if ($request->getParameter('sort') && $this->isValidSortColumn($request->getParameter('sort')))
    {
      $this->setSort(array($request->getParameter('sort'), $request->getParameter('sort_type')));
    }
    // pager
    if ($request->getParameter('page'))
    {
      $this->setPage($request->getParameter('page'));
    }
    $this->pager = $this->getPager();
    $this->sort = $this->getSort();
  }
  public function executeFilter(sfWebRequest $request)
  {
    $this->setPage(1);
    if ($request->hasParameter('_reset'))
    {
      $this->setFilters($this->configuration->getFilterDefaults());
      $this->redirect('@news');
    }
    $this->filters = $this->configuration->getFilterForm($this->getFilters());
    $this->filters->bind($request->getParameter($this->filters->getName()));
    if ($this->filters->isValid())
    {
      $this->setFilters($this->filters->getValues());
      $this->redirect('@news');
    }
    $this->pager = $this->getPager();
    $this->sort = $this->getSort();
    $this->setTemplate('index');
  }
  public function executeNew(sfWebRequest $request)
  {
    $this->form = $this->configuration->getForm();
    $this->news = $this->form->getObject();
  }
  public function executeCreate(sfWebRequest $request)
  {
    $this->form = $this->configuration->getForm();
    $this->news = $this->form->getObject();
    $this->processForm($request, $this->form);
    $this->setTemplate('new');
  }
  public function executeEdit(sfWebRequest $request)
  {
    $this->news = $this->getRoute()->getObject();
    $this->form = $this->configuration->getForm($this->news);
  }
  public function executeUpdate(sfWebRequest $request)
  {
    $this->news = $this->getRoute()->getObject();
    $this->form = $this->configuration->getForm($this->news);
    $this->processForm($request, $this->form);
    $this->setTemplate('edit');
  }
  public function executeDelete(sfWebRequest $request)
  {
    $request->checkCSRFProtection();
    $this->dispatcher->notify(new sfEvent($this, 'admin.delete_object', array('object' => $this->getRoute()->getObject())));
    if ($this->getRoute()->getObject()->delete())
    {
      $this->getUser()->setFlash('notice', 'The item was deleted successfully.');
    }
    $this->redirect('@news');
  }

  protected function processForm(sfWebRequest $request, sfForm $form)
  {
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
    if ($form->isValid())
    {
      $notice = $form->getObject()->isNew() ? 'The item was created successfully.' : 'The item was updated successfully.';
      try {
        $news = $form->save();
      } catch (Doctrine_Validator_Exception $e) {
        $errorStack = $form->getObject()->getErrorStack();
        $message = get_class($form->getObject()) . ' has ' . count($errorStack) . " field" . (count($errorStack) > 1 ?  's' : null) . " with validation errors: ";
        foreach ($errorStack as $field => $errors) {
            $message .= "$field (" . implode(", ", $errors) . "), ";
        }
        $message = trim($message, ', ');
        $this->getUser()->setFlash('error', $message);
        return sfView::SUCCESS;
      }
      $this->dispatcher->notify(new sfEvent($this, 'admin.save_object', array('object' => $news)));
      if ($request->hasParameter('_save_and_add'))
      {
        $this->getUser()->setFlash('notice', $notice.' You can add another one below.');
        $this->redirect('@news_new');
      }
      else
      {
        $this->getUser()->setFlash('notice', $notice);
        $this->redirect(array('sf_route' => 'news_edit', 'sf_subject' => $news));
      }
    }
    else
    {
      $this->getUser()->setFlash('error', 'The item has not been saved due to some errors.', false);
    }
  }
  protected function getFilters()
  {
    return $this->getUser()->getAttribute('news.filters', $this->configuration->getFilterDefaults(), 'admin_module');
  }
  protected function setFilters(array $filters)
  {
    return $this->getUser()->setAttribute('news.filters', $filters, 'admin_module');
  }
  protected function getPager()
  {
    $pager = $this->configuration->getPager('News');
    $pager->setQuery($this->buildQuery());
    $pager->setPage($this->getPage());
    $pager->init();
    return $pager;
  }
  protected function setPage($page)
  {
    $this->getUser()->setAttribute('news.page', $page, 'admin_module');
  }
  protected function getPage()
  {
    return $this->getUser()->getAttribute('news.page', 1, 'admin_module');
  }
  protected function buildQuery()
  {
    $tableMethod = $this->configuration->getTableMethod();
    if (null === $this->filters)
    {
      $this->filters = $this->configuration->getFilterForm($this->getFilters());
    }
    $this->filters->setTableMethod($tableMethod);
    $query = $this->filters->buildQuery($this->getFilters());
    $this->addSortQuery($query);
    $event = $this->dispatcher->filter(new sfEvent($this, 'admin.build_query'), $query);
    $query = $event->getReturnValue();
    return $query;
  }
  protected function addSortQuery($query)
  {
    if (array(null, null) == ($sort = $this->getSort()))
    {
      return;
    }
    if (!in_array(strtolower($sort[1]), array('asc', 'desc')))
    {
      $sort[1] = 'asc';
    }
    $query->addOrderBy($sort[0] . ' ' . $sort[1]);
  }
  protected function getSort()
  {
    if (null !== $sort = $this->getUser()->getAttribute('news.sort', null, 'admin_module'))
    {
      return $sort;
    }
    $this->setSort($this->configuration->getDefaultSort());
    return $this->getUser()->getAttribute('news.sort', null, 'admin_module');
  }
  protected function setSort(array $sort)
  {
    if (null !== $sort[0] && null === $sort[1])
    {
      $sort[1] = 'asc';
    }
    $this->getUser()->setAttribute('news.sort', $sort, 'admin_module');
  }
  protected function isValidSortColumn($column)
  {
    return Doctrine_Core::getTable('News')->hasColumn($column);
  }
}

我如何为这个子句添加WHERE id> 10为索引中的列表?也许在generator。yml中?

使用table_method生成器。yml选项。

在generator.yml:

config:
  list:
    table_method: buildQueryForAdminIndex

In NewsTable:

public function buildQueryForAdminIndex(Doctrine_Query $q)
{
  $q->addWhere($q->getRootAlias() . '.id > ?', 10);
  return $q;
}

我应该注意硬编码id是一种糟糕的形式。它应该是抽象的,以便清楚为什么值是10。