Silverstripe批量保存所有数据对象

时间:2013-04-03 22:06:53

标签: silverstripe

我已经将URLSegments添加到DataObjects(产品),因此我可以将ProductName显示为URL ....代码工作正常:

public function onBeforeWrite(){
    if($this->Name){
        $this->URLSegment = SiteTree::GenerateURLSegment($this->Name);
        if($object = DataObject::get_one($this->ClassName, "URLSegment='".$this->URLSegment."' AND ID !=".$this->ID)){
            $this->URLSegment = $this->URLSegment.'-'.$this->ID;
        }
    } else {
        $this->URLSegment = SiteTree::GenerateURLSegment($this->ClassName.'-'.$this->ID);
    }
    parent::onBeforeWrite();
}

但是,我有超过1000种产品...有没有办法为代码中的所有产品数据对象生成批量保存(即作为一次性),所以我不必通过CMS手动保存每个? ?

2 个答案:

答案 0 :(得分:1)

只需使用索引函数创建一个控制器,并使用或多或少相同的代码。

<?php

class UpdateProducts extends Controller {
    public function index() {

        $products = DataObject::get('Products');

        foreach ($products as $product) {

            if (!$product->URLSegment) {
                $product->write();
            }
        }
    }
}

然后,您可以在http://example.com/UpdateProducts

的浏览器中调用该功能一次

这不是超级高效,所以它真的只是一次性的。如果脚本超时,您可以再次运行它,因为那里的if语句意味着只会更新没有URLSegment的产品。

答案 1 :(得分:0)

我开始实施drzax解决方案,然后找到了这个,它将其作为一项任务实现。创建此任务是为了将URLSegments添加到产品中,因此完全符合我的需求......

http://www.balbuss.com/creating-tasks/