Автор Тема: Фильтр по полям на странице что в админ панели  (Прочитано 781 раз)

16 Июнь 2017, 12:08:49
  • Новичок
  • *
  • Сообщений: 16
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля

Привет, Создал новую страницу в админ панели, новый controller , потом на нее вывел инфу из бд. По умолчанию вверху додался фильтр по даным которые я вивел
(скрин прикрепляю), только вот он не работает (HTTP ERROR 500). Хочу спросить, как онг реализован, какие функции в controller отвечают за коректность работы, та же беда с выводом количества записей на странице. Спасибо!
Когда мой контроллер виводит даные с другой таблицы то фильтр работает: (скопировал кол с другого контроллера)
/**
* @property Organization $object
*/
  //Language::getIsoById($this->context->employee->id_lang))
class AdminRequestsNoSentControllerCore extends AdminController
{
public function __construct()
    {
         $this->bootstrap = true;
        $this->className = 'RequestsInProgress';
        $this->lang = false;
        $this->context = Context::getContext();
        $this->addRowAction('view');
        $this->table = 'request_list';


       
        $this->fields_list = array(
            'id_request_list' => array(
                            'title' => $this->l('Request ID'),
                            'align' => 'center',
                            'class' => 'fixed-width-xs'),
            /*'user_id' => array(
                            'title' => $this->l('User')
                            ),*/

            'customer' => array(
                            'title' => $this->l('Customer'),
                            'havingFilter' => true,
            ),

            'date' => array(
                            'title' => $this->l('Date'),
                            'type' => 'datetime'
                            ),
            'part_count' => array(
                            'title' => $this->l('Parts count'),
                            'orderby' => false,
                            'filter' => false,
                            'search' => false
                            )
        );

        parent::__construct();
    }
   
   
}
а если я вывожу с которой мне нужно то нет: <?php
/**
* @property Organization $object
*/
  //Language::getIsoById($this->context->employee->id_lang))
class AdminRequestsNoSentControllerCore extends AdminController
{
    public function 
__construct()
    {
        
$this->bootstrap true;
        
$this->className 'AdminRequestsNoSent';
        
$this->lang false;
        
$this->context Context::getContext();
        
$this->table 'requests_parts';
        
$this->addRowAction('send');
        
$this->_select .= 'c.`company`, c.`lastname` ';
        
$this->_where ' AND (a.active = 0) ';//AND (a.`user_id` = c.`id_customer`)
        
$this->_join .= 'LEFT JOIN `'._DB_PREFIX_.'customer` c ON (c.`id_customer` = a.`user_id`)';
        
$this->_orderBy 'date_add';
        
$this->_orderWay 'DESC';
        
        
        
$this->fields_list = array(
        
'company' => array(
                        
'title' => $this->l('Organization'), 
                        
'align' => 'center'),
        
'lastname' => array(
                        
'title' => $this->l('Customer'), 
                        
'align' => 'center'),
        
'name' => array(
                        
'title' => $this->l('brand'), 
                        
'align' => 'center'),
        
'part_number' => array(
                        
'title' => $this->l('part_number'), 
                        
'align' => 'center'),
        
'comment' => array(
                        
'title' => $this->l('comment'), 
                        
'align' => 'center',
                        
'filter' => false,),
        
'date_add' => array(
                        
'title' => $this->l('date_add'), 
                        
'align' => 'center'),
        
/*'user_id' => array(
                        'title' => $this->l('User')
                        ),*/

        
);
  

        
//$brand = Db::getInstance ()->getValue('SELECT `id_customer` FROM `' . _DB_PREFIX_ . 'user_facebook` WHERE `id_facebook` = "90"');

    
if(isset($_GET['id_carrier']))
    {
        
//Db::getInstance()->Execute("UPDATE `"._DB_PREFIX_."requests_parts` SET `active`=1 where `id_requests_parts`='".(int)$_GET['id_carrier']."'");
        
AdminRequestsNoSentController::sendEmail((int)$_GET['id_carrier']);
    }
    
        
parent::__construct();
    }
}
не могу понять, что отвечает за фильтр вывода данных, и что нужно дописать что б он работал
16 Июнь 2017, 12:23:23
Ответ #1
  • Партнер
  • Ветеран
  • ****
  • Сообщений: 22816
  • Репутация: +17143/-1
  • Разработка веб-сайтов и веб-программирование
    • Просмотр профиля
$this->fields_list['Название'] = array(
        'title' => $this->l('Название'),
        'filter_key' => 'префикс!название'
);
Интернет-магазин под ключ.
Какой выбрать движок для интернет магазина ?
Какой движок лучше ?
Magento или Prestashop ?
Решение всех Ваших вопросов в создании Интернет-магазина.
16 Июнь 2017, 13:48:33
Ответ #2
  • Новичок
  • *
  • Сообщений: 16
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
$this->fields_list['Название'] = array(
        'title' => $this->l('Название'),
        'filter_key' => 'префикс!название'
);
не помогло(
добавил к полю lastname
$this->fields_list = array(
'company' => array(
'title' => $this->l('Organization'),
'align' => 'center'),
'lastname' => array(
'title' => $this->l('Customer'),
'align' => 'center',
        'filter_key' => 'c!lastname'),
'name' => array(
'title' => $this->l('brand'),
'align' => 'center'),
'part_number' => array(
'title' => $this->l('part_number'),
'align' => 'center'),
'comment' => array(
'title' => $this->l('comment'),
'align' => 'center',
'filter' => false,
'search' => false),
'date_add' => array(
'title' => $this->l('date_add'),
'align' => 'center',
'filter' => false,
'search' => false),
/*'user_id' => array(
'title' => $this->l('User')
),*/
 
        );
заметил что на другой страницы когда работаеш с фильтром силка: index.php?controller=AdminRequestsInProgress&token=ff808e10580491bf8bcccd1ee72f73f4&submitFilterrequest_list=1#request_list
а у меня просто: index.php?controller=AdminRequestsNoSent&token=6cc0ba02abead81bbd8f5fc0d0f6adae#requests_parts
отстутствует параметр submitFilterrequest_list
16 Июнь 2017, 13:59:35
Ответ #3
  • Ветеран
  • *****
  • Сообщений: 33325
  • Репутация: +26771/-0
    • Просмотр профиля
'filter' => true,для поля по которому хотите сортировать.
16 Июнь 2017, 14:16:32
Ответ #4
  • Новичок
  • *
  • Сообщений: 16
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
'filter' => true,для поля по которому хотите сортировать.
не помогло((((
вот целый файл:
<?php
/**
 * @property Organization $object
 */
  //Language::getIsoById($this->context->employee->id_lang))
class AdminRequestsNoSentControllerCore extends AdminController
{
    public function 
__construct()
    {
        
$this->bootstrap true;
        
$this->className 'AdminRequestsNoSent';
        
$this->lang false;
$this->context Context::getContext();
$this->table 'requests_parts';
$this->addRowAction('send');
$this->_select .= 'c.`company`, c.`lastname` ';
$this->_where ' AND (a.active = 0) ';//AND (a.`user_id` = c.`id_customer`)
$this->_join .= 'LEFT JOIN `'._DB_PREFIX_.'customer` c ON (c.`id_customer` = a.`user_id`)';
$this->_orderBy 'date_add';
        
$this->_orderWay 'DESC';
$this->_use_found_rows true;


$this->fields_list = array(
'company' => array(
'title' => $this->l('Organization'), 
'align' => 'center'),
'lastname' => array(
'title' => $this->l('Customer'), 
'align' => 'center',
'filter_key' => 'c!lastname',
'filter' => true), 
'name' => array(
'title' => $this->l('brand'), 
'align' => 'center'),
'part_number' => array(
'title' => $this->l('part_number'), 
'align' => 'center'),
'comment' => array(
'title' => $this->l('comment'), 
'align' => 'center',
'filter' => false,
'search' => false),
'date_add' => array(
'title' => $this->l('date_add'), 
'align' => 'center',
'filter' => false,
'search' => false),
/*'user_id' => array(
'title' => $this->l('User')
),*/
 
        
);
  

//$brand = Db::getInstance ()->getValue('SELECT `id_customer` FROM `' . _DB_PREFIX_ . 'user_facebook` WHERE `id_facebook` = "90"');

if(isset($_GET['id_carrier']))
{
//Db::getInstance()->Execute("UPDATE `"._DB_PREFIX_."requests_parts` SET `active`=1 where `id_requests_parts`='".(int)$_GET['id_carrier']."'");
AdminRequestsNoSentController::sendEmail((int)$_GET['id_carrier']);
}

        
parent::__construct();
    }

public function displaySendLink($token null$id)
{
            
$tpl $this->createTemplate('helpers/list/list_action_edit.tpl'); // це щаблон іншої кнопки, але вона нам також підходить
            
if (!array_key_exists('Send'self::$cache_lang)) {
                
self::$cache_lang['Send'] = $this->l('Send email''Helper');
            }

            
$tpl->assign(array(
                
'href' => $this->context->link->getAdminLink('AdminRequestsNoSent').'&id_carrier='.(int)$id,
                
'action' => self::$cache_lang['Send'],
                
'id' => $id
            
));

            return 
$tpl->fetch();

}
static function sendEmail($id_requests_parts)
{
$id Db::getInstance ()->getValue('SELECT `user_id` FROM `' _DB_PREFIX_ 'requests_parts` WHERE `id_requests_parts` = "'.$id_requests_parts.'"');
        
$customer = new Customer($id);
//var_dump($customer);
if($customer->id_lang == 1) {
$id_lang "ru";
$brand "Бренд";
$part_number "Номер запчасти";
$quantity "Количество";
$text "Напомним, в Вашем аккаунте остались добавленные запчасти цену на которые Вы еще не спросили, чтобы узнать цену зайдите у ваш аккаунт и отправьте запрос.";

}elseif ($customer->id_lang == 2){
$id_lang "uk";
$brand "Марка";
$part_number "Номер запчастини";
$quantity "Кількість";
$text "Нагадаємо, у Вашому акаунті залишилися додані запчастини ціну на які Ви ще не запитали, щоб дізнатися ціну зайдіть у ваш аккаунт і надішліть запит.";

}else{
$id_lang "en";
$brand "Brand";
$part_number "Part number";
$quantity "Quantity";
$text "Напомним, в Вашем аккаунте остались добавленные запчасти цену на которые Вы еще не спросили, чтобы узнать цену зайдите у ваш аккаунт и отправьте запрос.";
}
$subject 'Напоминание об неотправленных запросах';
$message "<!DOCTYPE html PUBLIC '-//W3C//DTD HTML 4.01//EN' 'http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd'>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0' />
<style> @media only screen and (max-width: 300px){ 
body {
width:218px !important;
margin:auto !important;
}
.table {width:195px !important;margin:auto !important;}
.logo, .titleblock, .linkbelow, .box, .footer, .space_footer{width:auto !important;display: block !important;}
span.title{font-size:20px !important;line-height: 23px !important}
span.subtitle{font-size: 14px !important;line-height: 18px !important;padding-top:10px !important;display:block !important;}
td.box p{font-size: 12px !important;font-weight: bold !important;}
.table-recap table, .table-recap thead, .table-recap tbody, .table-recap th, .table-recap td, .table-recap tr { 
display: block !important; 
}
.table-recap{width: 200px!important;}
.table-recap tr td, .conf_body td{text-align:center !important;}
.address{display: block !important;margin-bottom: 10px !important;}
.space_address{display: none !important;}
}
@media only screen and (min-width: 301px) and (max-width: 500px) { 
body {width:308px!important;margin:auto!important;}
.table {width:285px!important;margin:auto!important;}
.logo, .titleblock, .linkbelow, .box, .footer, .space_footer{width:auto!important;display: block!important;}
.table-recap table, .table-recap thead, .table-recap tbody, .table-recap th, .table-recap td, .table-recap tr { 
display: block !important; 
}
.table-recap{width: 295px !important;}
.table-recap tr td, .conf_body td{text-align:center !important;}

}
@media only screen and (min-width: 501px) and (max-width: 768px) {
body {width:478px!important;margin:auto!important;}
.table {width:450px!important;margin:auto!important;}
.logo, .titleblock, .linkbelow, .box, .footer, .space_footer{width:auto!important;display: block!important;}
}
@media only screen and (max-device-width: 480px) { 
body {width:308px!important;margin:auto!important;}
.table {width:285px;margin:auto!important;}
.logo, .titleblock, .linkbelow, .box, .footer, .space_footer{width:auto!important;display: block!important;}

.table-recap{width: 295px!important;}
.table-recap tr td, .conf_body td{text-align:center!important;}
.address{display: block !important;margin-bottom: 10px !important;}
.space_address{display: none !important;}
}

TABLE#parts {
width: 300px; /* Ширина таблицы */
background: #fffff0; /* Цвет фона нечетных строк */
border: 1px solid #a52a2a; /* Рамка вокруг таблицы */
border-collapse: collapse; /* Убираем двойные линии между ячейками */
   }
   #parts TD, #parts TH {
padding: 3px; /* Поля вокруг содержимого ячейки */
   }
   #parts TD {
text-align: center; /* Выравнивание по центру */
border-bottom: 1px solid #a52a2a; /* Линия внизу ячейки */
   }
   #parts TH {
background: #a52a2a; /* Цвет фона */
color: white; /* Цвет текста */
   }
   #parts TR.even {
background: #fff8dc; /* Цвет фона четных строк */
   }
   #parts .la {
text-align: left; /* Выравнивание по левому краю */
   }
   
</style>

</head>
<body style='-webkit-text-size-adjust:none;background-color:#fff;width:650px;font-family:Open-sans, sans-serif;color:#555454;font-size:13px;line-height:18px;margin:auto'>
<table class='table table-mail' style='width:100%;margin-top:10px;-moz-box-shadow:0 0 5px #afafaf;-webkit-box-shadow:0 0 5px #afafaf;-o-box-shadow:0 0 5px #afafaf;box-shadow:0 0 5px #afafaf;filter:progid:DXImageTransform.Microsoft.Shadow(color=#afafaf,Direction=134,Strength=5)'>
<tr>
<td class='space' style='width:20px;padding:7px 0'>&nbsp;</td>
<td align='center' style='padding:7px 0'>
<table class='table' bgcolor='#ffffff' style='width:100%'>
<tr>
<td align='center' class='logo' style='border-bottom:4px solid #333333;padding:7px 0'>
<a title='Mikro-F' href='' style='color:#337ff1'>
<img src='' alt='Mikro-F' />
</a>
</td>
</tr>

<tr>
<td class='space_footer' style='padding:0!important'>&nbsp;</td>
</tr>
<tr>
<td class='linkbelow' style='padding:7px 0'>
<span>
$text
</span><table id='parts' style='width: 100%; margin-top: 25px;'><tr style='background-color: ;'><th>
$brand</th><th>$part_number</th><th>$quantity</th></tr>
"
;
$sql 'SELECT `name`, `part_number`, `quntity` FROM `' _DB_PREFIX_ 'requests_parts` WHERE `user_id` = '.$id;
//echo $id.'<br>';
//echo $sql.'<br>';
if ($results Db::getInstance()->ExecuteS($sql))
{
foreach ($results as $row)
{
$message .= "<tr><td>".htmlentities($row['name'])."</td><td>".htmlentities($row['part_number'])."</td><td>".htmlentities($row['quntity'])."</td></tr>\r\n";
}
}
//var_dump($results);
$message .= "</table></td>
</tr>

<tr>
<td class='space_footer' style='padding:0!important'>&nbsp;</td>
</tr>
<tr>
<td class='footer' style='border-top:4px solid #333333;padding:7px 0'>
<span><a href='' style='color:#337ff1'>Mikro-F</a></span>
</td>
</tr>
</table>
</td>
<td class='space' style='width:20px;padding:7px 0'>&nbsp;</td>
</tr>
</table>
</body>
</html>"
;

 
$headers  "Content-type: text/html; charset=utf-8 \r\n"
//mail($customer->email, $subject, $message, $headers);
}

}

может функции не хватает или что то другое...
16 Июнь 2017, 14:38:08
Ответ #5
  • Партнер
  • Ветеран
  • ****
  • Сообщений: 22816
  • Репутация: +17143/-1
  • Разработка веб-сайтов и веб-программирование
    • Просмотр профиля
'filter' => true,для поля по которому хотите сортировать.
или
$this->fields_list['Название'] = array(
        'title' => $this->l('Название'),
        'filter_key' => 'префикс!название'
);

Но не все в кучу собирать.
Интернет-магазин под ключ.
Какой выбрать движок для интернет магазина ?
Какой движок лучше ?
Magento или Prestashop ?
Решение всех Ваших вопросов в создании Интернет-магазина.
16 Июнь 2017, 14:45:39
Ответ #6
  • Новичок
  • *
  • Сообщений: 16
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
'filter' => true,для поля по которому хотите сортировать.
или
$this->fields_list['Название'] = array(
        'title' => $this->l('Название'),
        'filter_key' => 'префикс!название'
);

Но не все в кучу собирать.
и ето нет(
public function __construct()
    {
        $this->bootstrap = true;
        $this->className = 'AdminRequestsNoSent';
        $this->lang = false;
$this->context = Context::getContext();
$this->table = 'requests_parts';
$this->addRowAction('send');
$this->_select .= 'c.`company`, c.`lastname` ';
$this->_where = ' AND (a.active = 0) ';//AND (a.`user_id` = c.`id_customer`)
$this->_join .= 'LEFT JOIN `'._DB_PREFIX_.'customer` c ON (c.`id_customer` = a.`user_id`)';
$this->_orderBy = 'date_add';
        $this->_orderWay = 'DESC';
$this->_use_found_rows = true;



 
$this->fields_list['lastname'] = array(
        'title' => $this->l('lastname'),
        'filter_key' => 'c!lastname'
);
//$brand = Db::getInstance ()->getValue('SELECT `id_customer` FROM `' . _DB_PREFIX_ . 'user_facebook` WHERE `id_facebook` = "90"');

if(isset($_GET['id_carrier']))
{
//Db::getInstance()->Execute("UPDATE `"._DB_PREFIX_."requests_parts` SET `active`=1 where `id_requests_parts`='".(int)$_GET['id_carrier']."'");
AdminRequestsNoSentController::sendEmail((int)$_GET['id_carrier']);
}

        parent::__construct();
    }
16 Июнь 2017, 14:48:09
Ответ #7
  • Ветеран
  • *****
  • Сообщений: 1614
  • Репутация: +32/-1
  • Сообщество PrestaShop
    • Просмотр профиля
16 Июнь 2017, 14:52:45
Ответ #8
  • Новичок
  • *
  • Сообщений: 16
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
А у вас в sql запросе есть ORDER BY ?
по умолчанию когда не использую фильтр есть:
"SELECT SQL_CALC_FOUND_ROWS a.* , c.`company`, c.`lastname` FROM `mf_requests_parts` a LEFT JOIN `mf_customer` c ON (c.`id_customer` = a.`user_id`) WHERE 1 AND (a.active = 0) ORDER BY `date_add` DESC LIMIT 0, 50"
когда использую то хз, ошибка страницы выскакивает
16 Июнь 2017, 15:04:21
Ответ #9
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 86688
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Чтобы можно было сортировать по полю в списке товаров, нужно добавить параметр
'orderby' => true,в переменную
$this->fields_list['моя переменная']
16 Июнь 2017, 15:05:06
Ответ #10
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 86688
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
$this->fields_list['Название'] = array(
        'title' => $this->l('Название'),
        'filter_key' => 'префикс!название'
);
Так для фильтрации данных, а не для сортировки.
16 Июнь 2017, 15:06:24
Ответ #11
  • Новичок
  • *
  • Сообщений: 16
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Чтобы можно было сортировать по полю в списке товаров, нужно добавить параметр
'orderby' => true,в переменную
$this->fields_list['моя переменная']
мне не нужно сортировать, мне нужно фильтровать.
16 Июнь 2017, 15:10:26
Ответ #12
  • Партнер
  • Ветеран
  • ****
  • Сообщений: 22816
  • Репутация: +17143/-1
  • Разработка веб-сайтов и веб-программирование
    • Просмотр профиля
$this->fields_list['Название'] = array(
        'title' => $this->l('Название'),
        'filter_key' => 'префикс!название'
);
Так для фильтрации данных, а не для сортировки.
Так вопрос и был про фильтр
Вот пример
Цитировать
$this->fields_list = array(
  'country' => array(                              // First column.
    'title' => $this->l('Country'),                // Column name.
    'width' => 100,                                // Column width. At least one field should be set to 'auto' in order to grow with window size.
    ['align'] => {'left', 'center', 'right'},      // Content position inside the column (default 'left', optional).
    ['type'] => {'select', 'bool', 'date',         // Column format (optional).
      'datetime', 'decimal', 'float', 'percent',
      'editable', 'price'},
    ['list'] => $this->countries_array,            // For type == select only. Content for the select drop down filter list (optional).
    ['filter_key'] => 'cl\!id_country'),           // Define a custom filter key to be used by the filter SQL request
                                                   // (optional, default uses the array key name, ie. 'country').
    ['orderby'] => {true, false},                  // If true, list will be alphabetically ordered using this column values (optional, default false).
    ['search'] => {true, false},                   // If true, this column will have a search field (optional, default true).
Интернет-магазин под ключ.
Какой выбрать движок для интернет магазина ?
Какой движок лучше ?
Magento или Prestashop ?
Решение всех Ваших вопросов в создании Интернет-магазина.
16 Июнь 2017, 15:12:38
Ответ #13
  • Партнер
  • Ветеран
  • ****
  • Сообщений: 22816
  • Репутация: +17143/-1
  • Разработка веб-сайтов и веб-программирование
    • Просмотр профиля
Включите показ ошибок в prestashop и профилирование. Будет видно какое значение фильра в запросе. Может у вас в табл. нет такого поля.
Интернет-магазин под ключ.
Какой выбрать движок для интернет магазина ?
Какой движок лучше ?
Magento или Prestashop ?
Решение всех Ваших вопросов в создании Интернет-магазина.
16 Июнь 2017, 15:19:23
Ответ #14
  • Новичок
  • *
  • Сообщений: 16
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
$this->fields_list['Название'] = array(
        'title' => $this->l('Название'),
        'filter_key' => 'префикс!название'
);
Так для фильтрации данных, а не для сортировки.
Так вопрос и был про фильтр
Вот пример
Цитировать
$this->fields_list = array(
  'country' => array(                              // First column.
    'title' => $this->l('Country'),                // Column name.
    'width' => 100,                                // Column width. At least one field should be set to 'auto' in order to grow with window size.
    ['align'] => {'left', 'center', 'right'},      // Content position inside the column (default 'left', optional).
    ['type'] => {'select', 'bool', 'date',         // Column format (optional).
      'datetime', 'decimal', 'float', 'percent',
      'editable', 'price'},
    ['list'] => $this->countries_array,            // For type == select only. Content for the select drop down filter list (optional).
    ['filter_key'] => 'cl\!id_country'),           // Define a custom filter key to be used by the filter SQL request
                                                   // (optional, default uses the array key name, ie. 'country').
    ['orderby'] => {true, false},                  // If true, list will be alphabetically ordered using this column values (optional, default false).
    ['search'] => {true, false},                   // If true, this column will have a search field (optional, default true).
так я делал:
$this->fields_list['Название'] = array(
        'title' => $this->l('Название'),
        'filter_key' => 'префикс!название'
);
нечего не зменилось... как была ошибка так и осталась при использовании фильтра.
Цитировать
Включите показ ошибок в prestashop и профилирование. Будет видно какое значение фильра в запросе. Может у вас в табл. нет такого поля.
как включить?)