Jump to content
Sign in to follow this  
DEDMEDVED

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

Recommended Posts

 
Есть такие две конструкции, которые повторяются в 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

Share this post


Link to post
Share on other sites


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

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

}

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.