Поиск по этому блогу

вторник, 26 июля 2011 г.

SilverStripe: ModelAdmin delete bug.

Недавно при работе над админкой при помощи ModelAdmin заметил чудный баг - при удалении обьекта с формы редактирования выпадает ошибка :

500 Warning: "array_fill(): Number of elements must be positive" at line 743 of ...\cms\code\ModelAdmin.php


Оказалось что после удаления обьекта идет редирект по адресу SearchForm?action=search

Сама ошибка появляется в следуйще строке метода getResultsTable
$tf->setFieldFormatting(array_combine(array_keys($summaryFields), array_fill(0,count($summaryFields), $url)));
Но поскольку данные в форму не посылались, то ResultAssembly пуст и метод getResultColumns возвращает нам в переменную $summaryFields пустой массив изза чего все и валится.

Собственно полечил все очень просто :
class MyAdmin extends ModelAdmin
{
    public static $managed_models = array(
        'MyModel1',
        'MyModel2',
        'MyModel3'
    );

    public static $collection_controller_class = "MyAdmin_CollectionController";
    static $url_segment = 'my_admin_tool'; // will be linked as /admin/my_admin_tool
    static $menu_title = 'My Admin Tool';
    static $menu_priority = 8; // for sorting in cms menu
    
}

class MyAdmin_CollectionController extends ModelAdmin_CollectionController
{
    
    function getResultColumns($searchCriteria, $selectedOnly = true) {
        $model = singleton($this->modelClass);

        $summaryFields = $this->columnsAvailable();
        
        if($selectedOnly && $searchCriteria['ResultAssembly']) {// Fix for CMS
            $resultAssembly = $searchCriteria['ResultAssembly'];
            
            if(!is_array($resultAssembly)) {
                $explodedAssembly = split(' *, *', $resultAssembly);
                $resultAssembly = array();
                foreach($explodedAssembly as $item) $resultAssembly[$item] = true;
            }
            return array_intersect_key($summaryFields, $resultAssembly);
        } else {
            return $summaryFields;
        }
    }
}

Хоть мне и пришлось переписать метод getResultColumns, но зато удалось избежать изменения исходного кода SilverStripe.

Комментариев нет:

Отправить комментарий