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