Изменение административной части

Иногда требуется сделать административный интерфейс более информативным. Например, отобразить дополнительную информацию в каком-то списке (новостей, товаров и т.д.), чтобы не заходить в каждый элемент в отдельности.

В данном примере рассмотрим возможность добавления отображения способа доставки в списке заказов.

За формирование списка заказов отвечает файл modules/shop/admin/shop.admin.order.php.

Перечень данных, которые нужно отображать в списке, находится в массиве $variables_list.

Добавим в него новый элемент delivery_id. В результате массив примет такой вид:

Пример:

public $variables_list = array (
    
'checkbox' => '',
    
'created' => array(
        
'name' => 'Дата и время',
        
'type' => 'datetime',
        
'sql' => true,
        
'no_important' => true,
    ),
    
'name' => array(
        
'name' => 'Заказ',
        
'variable' => 'id',
        
'text' => '№ %d'
    
),
    
'status_id' => array(
        
'name' => 'Статус',
        
'sql' => true,
    ),
    
'delivery_id' => array(
        
'name' => 'Доставка',
        
'sql' => true,
    ),
    
'summ' => array(
        
'name' => 'Сумма',
        
'sql' => true,
    ),
    
'user_id' => array(
        
'name' => 'Покупатель',
        
'sql' => true,
    ),
    
'actions' => array(
        
'trash' => true,
    ),
);

Добавим метод, который формирует выводимые данные для нового поля.

Пример:

public function list_variable_delivery_id($row, $var)
{
    
$delivery = DB::query_result("SELECT [name] FROM {shop_delivery} WHERE id=%d", $row['delivery_id']);
    return
'<div>'.$delivery.'</div>';
}

Рассмотрим метод подробнее.

Обязательно следует обратить внимание на именование метода. Он всегда начинается с list_variable_, а далее идет значение ключа элемента массива $variables_list. В нашем случае это delivery_id.

В метод передается массив $row, который содержит ряд параметров текущего заказа, в том числе нужный нам $row['delivery_id'].

$row['delivery_id'] — это ID способа доставки таблицы {shop_delivery}. Он позволяет нам выбрать имя способа доставки для конкретного заказа. Сохраняем имя в переменной $delivery.

Далее мы просто выводим его в общем списке.

Наш метод будет выполняться для каждого заказа из списка. При этом каждый раз будет выполняться SQL-запрос. Оптимизируем код так, чтобы в начале выполнялся один SQL-запрос с поиском всех используемых способов доставки, а затем эти данные просто будут использоваться.

Сначала запросим все используемые способов доставки и запишем эту информацию в переменную $this->cache["prepare"]["delivery"].

Пример:

// если данные еще не запрашивались
if(! isset($this->cache["prepare"]["delivery"]))
{
    
// собираем ID способов доставки из заказов, выведенных в списке
    
$delivery_ids = array();
    foreach(
$this->diafan->rows as $r)
    {
        if(
$r["delivery_id"] && ! in_array($r["delivery_id"], $delivery_ids))
        {
            
$delivery_ids[] = $r["delivery_id"];
        }
    }
    if(
$delivery_ids)
    {
        
// запрашиваем информацию о найденных способах доставки
        // результат записываем в виде массива с ключами,
        // где ключами будет поле id, а значениями поля name
        
$this->cache["prepare"]["delivery"] = DB::query_fetch_key_value(
            
"SELECT id, [name] FROM {shop_delivery} WHERE id IN (%s)",
            
implode(",", $delivery_ids),
            
"id", "name"
        
);
    }
}

Затем просто используем полученные данные.

Пример:

if($row["delivery_id"] && ! empty($this->cache["prepare"]["delivery"][$row["delivery_id"]]))
{
    echo
$this->cache["prepare"]["delivery"][$row["delivery_id"]];
}

Итоговый код:

Пример:

public function list_variable_delivery_id($row)
{
    if(! isset(
$this->cache["prepare"]["delivery"]))
    {
        
$delivery_ids = array();
        foreach(
$this->diafan->rows as $r)
        {
            if(
$r["delivery_id"] && ! in_array($r["delivery_id"], $delivery_ids))
            {
                
$delivery_ids[] = $r["delivery_id"];
            }
        }
        if(
$delivery_ids)
        {
            
$this->cache["prepare"]["delivery"] = DB::query_fetch_key_value(
                
"SELECT id, [name] FROM {shop_delivery} WHERE id IN (%s)",
                
implode(",", $delivery_ids),
                
"id", "name"
            
);
        }
    }
    
$text = '<div>';
    if(
$row["delivery_id"] && ! empty($this->cache["prepare"]["delivery"][$row["delivery_id"]]))
    {
        
$text .= $this->cache["prepare"]["delivery"][$row["delivery_id"]];
    }
    
$text .= '</div>';
    return
$text;
}

Данный пример универсален для всех модулей. При необходимости вы можете самостоятельно вывести дополнительные данные в любом из списков.

Ваши комментарии и дополнения

Ваш комментарий будет первым.

Зарегистрируйтесь или авторизируйтесь для того, чтобы оставить комментарий.