アドミンでフィルターしたレコードを複製

アドミンでフィルターしたレコードを複製する方法。

Product というテーブルに対し、アドミンが作成されている状況において。

まずは、フィルターを設定する。
アドミンのフィルターを使うには、config/generator.yml にこのように記述する。

    list:
      filters: [id, text, price, misc, offered_from, offered_till]

list のインデントレベルは、model_class の項目と同じ。

次に複製用のアクションをアドミンからアクセスできるようする。
フィルターと同じように、設定を追加する。

    list:
      actions:
        duplicate: { action: duplicate }

これで、アドミンのリストのページに duplicate というボタンが表示される。
このボタンを押すと、executeDuplicate が呼ばれる。

actions.class.php の productActions に executeDuplicate を追加する。
そして、そのアクションの中で以下の処理を行なう。

    $this->filters = $this->getUser()->getAttributeHolder()->getAll('sf_admin/product/filters');
    $c = new Criteria();
    $this->addFiltersCriteria($c);
    $products = ProductPeer::doSelect($c);
    $con = Propel::getConnection(ProductPeer::DATABASE_NAME);
    $con->begin();
    foreach ($products as $src)
    {
      $dst = new Product();
      $dst->setText($src->getText());
      $dst->setPrice($src->getPrice());
      $dst->setMisc($src->getMisc());
      $dst->setOfferedFrom($src->getOfferedFrom());
      $dst->setOfferedTill($src->getOfferedTill());
      $dst->save($con);
    }
    $con->commit();


1行目でアドミン経由のフィルターを取得し、3行目で、クリテリアにそれを反映している。

$con は、大量処理するときの高速化のためのもの。
詳しくは、こちら

これで、フィルターされた項目だけをコピーすることができる。
当然、コピーに限らず、特定の項目だけを対象とした処理をしたい時にも使えるテクニック。

フィルターした項目群を削除する、とか、特定のユーザー群にメールを送る、とか・・・。
便利。

2012年11月

        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  

アーカイブ