Изменение административной части
Иногда требуется сделать административный интерфейс более информативным. Например, отобразить дополнительную информацию в каком-то списке (новостей, товаров и т.д.), чтобы не заходить в каждый элемент в отдельности.
В данном примере рассмотрим возможность добавления отображения способа доставки в списке заказов.
За формирование списка заказов отвечает файл 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;
}
Данный пример универсален для всех модулей. При необходимости вы можете самостоятельно вывести дополнительные данные в любом из списков.
Зарегистрируйтесь или авторизируйтесь для того, чтобы оставить комментарий.
Ваш комментарий будет первым.