【问题标题】:Restrict objects available in symfony admin generator for all actions限制 symfony 管理生成器中所有操作的可用对象
【发布时间】:2011-05-10 13:45:54
【问题描述】:

可以使用table_method 选项更改用于管理员生成器配置中的列表操作的查询。例如,

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

但我想限制管理生成器中的所有操作。特别是,我想将所有显示、编辑、删除等对象限制为具有特定属性的对象,该属性可能取决于一周中的当前日期或一天中的时间。

我不想覆盖模型类,因为对于其他应用程序,我希望限制不同(或者可能根本没有限制)。

在哪里(即,哪些文件)以及如何进行此更改?

【问题讨论】:

    标签: symfony1 admin-generator


    【解决方案1】:

    可能通过 table_method 和 generator.yml 功能来添加和删除您已经负责自定义索引(即列表)操作的操作按钮。

    对于其他操作,您可能希望在模型中为这些自定义查询创建其他方法。但是覆盖默认行为的地方是在模块的 actions.class.php 文件中。

    因此,在您的示例中,您将编辑 apps/backend/modules/job/actions/actions.class.php 文件并为您需要更改的每个操作编写自定义代码。

    例如,您可以像这样更改删除行为:

    # 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;
        }
      }
    }
    

    【讨论】:

      【解决方案2】:

      为此使用路由。这将确保所有操作都有一个对象查询方法。

      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();
        }
      }
      

      在您的自定义操作中使用 $this->getRouting()->getObject() 来使用此方法。

      【讨论】:

        猜你喜欢
        • 2011-05-26
        • 1970-01-01
        • 1970-01-01
        • 2010-12-30
        • 2011-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多