Перейти к содержанию
DEDMEDVED

оптимизация кода для фильтров в getform

Рекомендуемые сообщения

 
Есть такие две конструкции, которые повторяются в getform() в admin\controller\sale\order.php
 
1-ая для разных значений post -> в data (пример от customer_id:
if (isset($this->request->post['customer_id'])) {
$this->data['customer_id'] = $this->request->post['customer_id'];
} elseif (!empty($order_info)) {
$this->data['customer_id'] = $order_info['customer_id'];
} else {
$this->data['customer_id'] = '';
}

2-ая для разных значений get -> url (пример для filter_order_id:

if (isset($this->request->get['filter_order_id'])) {
$url .= '&filter_order_id=' . $this->request->get['filter_order_id'];
}

1-ую конструкцию я вынес в функцию (тут много доп. фильтров, которые я сам дописывал).

Я заменяю в шаблонном куске кода имя фильтра функцией str_replace, а затем выполняю получившийся код функцией eval. Кстати надо переписать это все под foreach и перебирать массив фильтров.

public function FltrToUrl() {
		$url = '';
		$UrlOn = "\$url.=(isset(\$this->request->get['n_m']) ? '&n_m=' . \$this->request->get['n_m'] : '');";
		eval(str_replace('n_m', 'filter_order_id', $UrlOn));
		eval(str_replace('n_m', 'filter_customer', $UrlOn));
		eval(str_replace('n_m', 'filter_order_status_id', $UrlOn));
		eval(str_replace('n_m', 'filter_order_statuses', $UrlOn));
		eval(str_replace('n_m', 'filter_total', $UrlOn));
		eval(str_replace('n_m', 'filter_total_start', $UrlOn));
		eval(str_replace('n_m', 'filter_total_end', $UrlOn));
		eval(str_replace('n_m', 'comment_true', $UrlOn));
		eval(str_replace('n_m', 'filter_comment_true', $UrlOn));
		eval(str_replace('n_m', 'filter_comment_true_start', $UrlOn));
		eval(str_replace('n_m', 'filter_comment_true_end', $UrlOn));
		eval(str_replace('n_m', 'date_spis', $UrlOn));
		eval(str_replace('n_m', 'date_spis_start', $UrlOn));
		eval(str_replace('n_m', 'date_spis_end', $UrlOn));
		eval(str_replace('n_m', 'filter_gotov', $UrlOn));
		eval(str_replace('n_m', 'filter_patruled', $UrlOn));
		eval(str_replace('n_m', 'filter_date_added', $UrlOn));
		eval(str_replace('n_m', 'filter_date_added_start', $UrlOn));
		eval(str_replace('n_m', 'filter_date_added_end', $UrlOn));
		eval(str_replace('n_m', 'filter_shipping_code', $UrlOn));
		eval(str_replace('n_m', 'filter_pay_upd', $UrlOn));
		eval(str_replace('n_m', 'filter_stock', $UrlOn));
		eval(str_replace('n_m', 'filter_date_modified', $UrlOn));
		eval(str_replace('n_m', 'filter_date_modified_start', $UrlOn));
		eval(str_replace('n_m', 'filter_date_modified_end', $UrlOn));
		eval(str_replace('n_m', 'filter_act', $UrlOn));
		eval(str_replace('n_m', 'sort', $UrlOn));
		eval(str_replace('n_m', 'order', $UrlOn));
		eval(str_replace('n_m', 'page', $UrlOn));
		return $url;
	}

Соответственно, теперь в getform() и  getlist(), например, я пишу просто $url = $this->FltrToUrl();

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

 

Хотелось бы что-то подобное для 1-ой конструкции, а лучше что-то более правильное. И еще я не знаю, как это все вынести в отдельную функцию (так как не знаю, как оперировать переменными типа $this->data['customer_id'] в другой функции - может все просто?). Пока я сделал вот так, что тоже упростило редактуру кода и уменьшило количество строк:

$PostToData = "if (isset(\$this->request->post['n9m'])) {\$this->data['n9m']=\$this->request->post['n9m'];} elseif (!empty(\$order_info)) {\$this->data['n9m'] = \$order_info['n9m'];} else {\$this->data['zz'] = 'zz';}";
//ниже stock - это имя фильтра-переменной, а 1 - это значение по умолчанию, если не задано. в большинстве случаев это будет пустое значение, но так не везде
eval(str_replace(Array('n9m', 'zz'), Array('stock', '1'), $PostToData));
//и далее по аналогии строки перечисляют все фильтры, но приходится этот код держать внутри getform(), а хотелось бы отдельную функцию
eval(str_replace(Array('n9m', 'zz'), Array('customer_id', ''), $PostToData));

Спасибо за ответы!

 
работаю на ocstore 1.5.3

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты


foreach(array('filter_order_id', 'filter_customer', ...) as $filer) {

$url.=(isset($this->request->get[$filter]) ? '&' . $filter . '=\'' . $this->request->get[$filter] .'\'' : '');

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, это гораздо круче! Спасибо!

А как быть с другой конструкцией?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.