Добавьте столбец фильтрации в сетку администратора


Я добавил столбец в таблицу review_detail, т.е. с view_type по PhpMyAdmin, и присвоил значение по умолчанию 0 всем отзывам.

Я пытаюсь добавить тот же столбец для фильтрации в сетку All reviews, которую можно посетить из Catalog -> Reviews and Ratings -> Customer Reviews -> All Reviews.

Только для целей тестирования я изменяю файлы core/Mage в Mage/Adminhtml/Block/Review/Grid.php --- line ~ 130:

    $this->addColumn('view_type', array(
        'header'        => Mage::helper('review')->__('View type'),
        'align'         => 'left',
        'width'         => '100px',
        'filter_index'  => 'rdt.view_type',
        'index'         => 'view_type',
        'type'          => 'text',
        'truncate'      => 50,
        'escape'        => true,
    ));

Добавив приведенный выше код, я могу видеть свое недавно добавленное имя столбца фильтрации в сетке All reviews панели администратора, но я не могу отфильтруйте или просмотрите значения, присвоенные по умолчанию любому обзору.

enter image description here

Author: Mr_Green, 2014-03-20

2 answers

Значение вашего столбца не присоединяется автоматически к коллекции, указанной в таблице.
Коллекция, указанная в таблице, является экземпляром Mage_Review_Model_Resource_Review_Product_Collection.
Вам нужно изменить метод _joinFields в этом классе. (Для целей тестирования, конечно. Когда вы будете уверены, что это работает, сделайте это правильным способом Magento, переписав класс.).

По умолчанию поля соединяются следующим образом:

$this->getSelect()
        ->join(array('rt' => $reviewTable),
            'rt.entity_pk_value = e.entity_id',
            array('rt.review_id', 'review_created_at'=> 'rt.created_at', 'rt.entity_pk_value', 'rt.status_id'))
        ->join(array('rdt' => $reviewDetailTable),
            'rdt.review_id = rt.review_id',
            array('rdt.title','rdt.nickname', 'rdt.detail', 'rdt.customer_id', 'rdt.store_id'));

Если вы добавили свой столбец в таблицу review_detail, вам нужно добавить его во вторую join. Сделайте приведенный выше код таким:

$this->getSelect()
        ->join(array('rt' => $reviewTable),
            'rt.entity_pk_value = e.entity_id',
            array('rt.review_id', 'review_created_at'=> 'rt.created_at', 'rt.entity_pk_value', 'rt.status_id'))
        ->join(array('rdt' => $reviewDetailTable),
            'rdt.review_id = rt.review_id',
            array('rdt.title','rdt.nickname', 'rdt.detail', 'rdt.customer_id', 'rdt.store_id', 'rdt.view_type'));

Приведенный выше код позволит вам увидеть значения в вашем пользовательском столбце.

Для того, чтобы сортировка работала, вам необходимо изменить метод setOrder в том же классе Mage_Review_Model_Resource_Review_Product_Collection.

Измените это:

        case 'rt.review_id':
        case 'rt.created_at':
        case 'rt.status_id':
        case 'rdt.title':
        case 'rdt.nickname':
        case 'rdt.detail':
            $this->getSelect()->order($attribute . ' ' . $dir);
            break;

К этому:

        case 'rt.review_id':
        case 'rt.created_at':
        case 'rt.status_id':
        case 'rdt.title':
        case 'rdt.nickname':
        case 'rdt.detail':
        case 'rdt.view_type': //you need to add this 'case'
            $this->getSelect()->order($attribute . ' ' . $dir);
            break;

Для фильтрации измените addAttributeToFilter в том же классе. Измените это

        case 'rt.review_id':
        case 'rt.created_at':
        case 'rt.status_id':
        case 'rdt.title':
        case 'rdt.nickname':
        case 'rdt.detail':
            $conditionSql = $this->_getConditionSql($attribute, $condition);
            $this->getSelect()->where($conditionSql);
            break;

К этому:

        case 'rt.review_id':
        case 'rt.created_at':
        case 'rt.status_id':
        case 'rdt.title':
        case 'rdt.nickname':
        case 'rdt.detail':
        case 'rdt.view_type': //you need to add this 'case'
            $conditionSql = $this->_getConditionSql($attribute, $condition);
            $this->getSelect()->where($conditionSql);
            break;

Черт возьми... много работы для простой колонки. Я надеюсь, что это получит учтено в версии 2.0.

[ РЕДАКТИРОВАТЬ]

Чтобы добавить новый столбец в качестве столбца параметров, объявите его следующим образом:

$this->addColumn('view_type', array(
    'header'        => Mage::helper('review')->__('View type'),
    'align'         => 'left',
    'width'         => '100px',
    'filter_index'  => 'rdt.view_type',
    'index'         => 'view_type',
    'type'      => 'options',
    'options'   => array(
        0 => Mage::helper('review')->__('Show in home page'),
        1 => Mage::helper('review')->__('Show in product details page')
    ),
));
 6
Author: Marius, 2014-03-21 08:23:37

Чтобы удалить

Неустранимая ошибка: Вызов функции-члена getBackend() для не-объекта в C:\xampp\htdocs\efk\app\code\core\Mage\Eav\Model\Entity\Abstract.php в строке 816

Добавить

'filter_index'  => 'rdt.view_type'  // (your newly added column)

В addColumn

 0
Author: user46453, 2016-10-27 10:21:40