Jump to content

Recommended Posts

1. добавляем в api/Orders.php в ф-ю get_orders ПОСЛЕ
$id_filter = '';

код

$date_from = '';
$date_to = '';
$order_by = '';

2. добавить в api/Orders.php в ф-ю get_orders фильтры (примерно 60я строка)

/***************************/
if($filter['order_by']==1)
	$order_by  = $this->db->placehold('ORDER BY id ASC');
else
	$order_by  = $this->db->placehold('ORDER BY id DESC');

if(isset($filter['date_from']))
	$date_from = $this->db->placehold('AND DATE(o.date) >= ?', $filter['date_from']);
if(isset($filter['date_to']))
	$date_to = $this->db->placehold('AND DATE(o.date) <= ?', $filter['date_to']);		
/***************************/

3. заменяем в api/Orders.php в ф-и get_orders следующий участок кода (примерно строка 88)

$id_filter $status_filter $user_filter $keyword_filter $label_filter $modified_since_filter GROUP BY o.id ORDER BY status, id DESC $sql_limit", "%Y-%m-%d");

на код

$id_filter $date_from $date_to $status_filter $user_filter $keyword_filter $label_filter $modified_since_filter GROUP BY o.id $order_by $sql_limit", "%Y-%m-%d");
4. в simpla/IndexAdmin.php ПОСЛЕ
'OrdersAdmin'         => 'orders',

добавляем

'ExportXLAdmin'	      => 'orders',

5. в simpla/design/html/orders.tpl ПОСЛЕ

<a class="add" href="{url module=OrderAdmin}">Добавить заказ</a>

добавляем ссылку на экспорт

<a href="{url module=ExportXLAdmin}" style="float: right; margin-right: 44px;" title="Выгрузить все заказы"><img src="./design/images/export_excel.png"></a>

6. закидываем из архива в /simpla все из папки simpla

 

 

Скрины:

https://yadi.sk/i/GU8lrd2RqaWyb

https://yadi.sk/i/8yap0FhjqaWzG

https://yadi.sk/i/rYot5oU1qaWzp

https://yadi.sk/i/EcAAuKm6qaX3x

Edited by mishanya
Link to post
Share on other sites
  • Replies 55
  • Created
  • Last Reply

Top Posters In This Topic

Разработка весьма симпатичная. Спасибо!

 

Некоторые замечания:

1. Если при попытке экспорта не найдено ни одного заказа согласно фильтру, то сбрасываются все значения полей формы  к значениям по умолчанию - это неудобно.

2. В  колонке ПОКУПКИ показываются сведений только об одном товаре вместо полного списка.

3. Непонятно, зачем использован формат XLS - разработка усложнена, а никаких преимуществ формата XLS в итоге не видно. Разве что планируются дальнейшие усовершенствования...

Link to post
Share on other sites

 3. Непонятно, зачем использован формат XLS - разработка усложнена, а никаких преимуществ формата XLS в итоге не видно. Разве что планируются дальнейшие усовершенствования...

 

не вижу усложнений. только ваши домыслы.

 

 

1. Если при попытке экспорта не найдено ни одного заказа согласно фильтру, то сбрасываются все значения полей формы  к значениям по умолчанию - это неудобно.

2. В  колонке ПОКУПКИ показываются сведений только об одном товаре вместо полного списка.

по п2 уже исправил, вечером перегружу архив. по п1 возможно и так.

Link to post
Share on other sites

3. Ваше решение требует загрузки на сервер 3M скриптов PHPExcel.  Это мощнейший инструмент для работы с форматом XLS из PHP. Из него ВЫ используете практически почти что одну функцию setCellValueByColumnAndRow.  А ради чего? В стандарте Simpla при импорте  используется fputcsv - просто-препросто.

Впрочем,  это все дело вкуса. Как по мне  - так неоправданное усложнение.

Link to post
Share on other sites

1. Не исправлено.

Пытаюсь экспортировать не все заказы, а только Выполненные. Экспорт не прошел, так как заказов не найдено. А после сообщения об ошибке в поле Статус заказов значение Выполненные оказалось сброшено.

Link to post
Share on other sites

1. Не исправлено.

Пытаюсь экспортировать не все заказы, а только Выполненные. Экспорт не прошел, так как заказов не найдено. А после сообщения об ошибке в поле Статус заказов значение Выполненные оказалось сброшено.

 

если бы вы прочитали правильно мое предыдущее сообщение, то увидели бы, что ПОЛЯ сохраняются а не фильтр. фильтр по-прежнему сбрасывается. для меня так удобнее. если нет ничего по даному фильру почему бы его не сбросить. если кому-то будет нужно отдельно, передачу статуса заказа можно добавить.

Link to post
Share on other sites

если бы вы прочитали правильно мое предыдущее сообщение, то увидели бы, что ПОЛЯ сохраняются а не фильтр. фильтр по-прежнему сбрасывается. для меня так удобнее. если нет ничего по даному фильру почему бы его не сбросить. если кому-то будет нужно отдельно, передачу статуса заказа можно добавить.

 

1. Если Вам так удобнее, дело ваше. Но обычно при передаче формы на сервер все значения этой формы сохраняются независимо от того, относятся ли поля формы к полям таблицы, к фильтрации записей таблицы или еще чему другому. Делается не случайно, если чуть поразмыслить, легко понять, почему это удобно. Если надо сбросить значения полей, для этого ставят специальную кнопку - это можно увидеть и на форуме в различных разработках фильтров по свойствам.

 

4. Если вдруг один из заказов, подлежащих экспорту, окажется без покупок, то файл сгененированный файл XLS будет совсем неправильным, а при открытии в Excel даст ошибку.

Link to post
Share on other sites

 4. Если вдруг один из заказов, подлежащих экспорту, окажется без покупок, то файл сгененированный файл XLS будет совсем неправильным, а при открытии в Excel даст ошибку.

 

у меня все хорошо генерирует и в пустых закзах https://yadi.sk/i/OzaEGaYnqcxRc

Edited by mishanya
Link to post
Share on other sites

4. Должно, зависит от настройки показа ошибок.

У меня прямо в тексте сгенерированного XLS-файла в начале есть строка:

Warning:  Invalid argument supplied for foreach() in simpla\ExportXLAdmin.php on line 106

И само содержимое файла - в виде HTML.

Link to post
Share on other sites

4. Должно, зависит от настройки показа ошибок.

У меня прямо в тексте сгенерированного XLS-файла в начале есть строка:

Warning:  Invalid argument supplied for foreach() in simpla\ExportXLAdmin.php on line 106

И само содержимое файла - в виде HTML.

 

да, исправил 

Link to post
Share on other sites

А для чего вот этот фрагмент в ExportXLAdmin.php:

if($status<4)
$filter['status'] = $status;

Он запрещает выгружать заказы со статусом больше 4, но кроме базовых "все заказы, новый, принят, выполнен, удален", обычно существуют и дополнительные статусы. 

Link to post
Share on other sites

А для чего вот этот фрагмент в ExportXLAdmin.php:

if($status<4)
$filter['status'] = $status;

Он запрещает выгружать заказы со статусом больше 4, но кроме базовых "все заказы, новый, принят, выполнен, удален", обычно существуют и дополнительные статусы. 

 

обычно существуют где? это дополнение делалось для чистой симпла. если есть дополнительные статусы нужно еще и добавлять их в селект в форме. всеровно без этого не будет работать.

Link to post
Share on other sites

обычно существуют где? это дополнение делалось для чистой симпла. если есть дополнительные статусы нужно еще и добавлять их в селект в форме. всеровно без этого не будет работать.

Не нападайте на меня, я просто пытаюсь разобраться. "Обычно существуют" в любом магазине на Симпле, адаптированном для реальной работы. У себя я все подогнал под рабочий макет, правда есть сложности с "все заказы" и "выполненные" - но это, скорее всего, какие-то косяки со статусами у меня в базе. Про форму - это очевидно, даже для меня, так что я и писать не стал.

Edited by baarseek
Link to post
Share on other sites

Не нападайте на меня, я просто пытаюсь разобраться. "Обычно существуют" в любом магазине на Симпле, адаптированном для реальной работы. У себя я все подогнал под рабочий макет, правда есть сложности с "все заказы" и "выполненные" - но это, скорее всего, какие-то косяки со статусами у меня в базе.

 

я не нападаю, спрашиваю), можете убрать условие, но нужно добавить будет в tpl файл ваши статусы. сложности в чем с всеми заказами и выполненными?

Link to post
Share on other sites

я не нападаю, спрашиваю), можете убрать условие, но нужно добавить будет в tpl файл ваши статусы. сложности в чем с всеми заказами и выполненными?

Прошу прощения, что-то я очень мнительный сегодня ;) Да, я уже так и сделал.

Однако, проблема, похоже, в том, что их очень много. При попытке экспорта сыплются варнинги:

Warning: The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay [SELECT o.id, o.delivery_id, o.delivery_price, o.separate_delivery, o.payment_method_id, o.paid, o.payment_date, o.closed, o.discount, o.coupon_code, o.coupon_discount, o.date, o.user_id, o.name, o.address, o.phone, o.email, o.comment, o.status, o.url, o.total_price, o.note, o.track FROM s_orders AS o LEFT JOIN s_orders_labels AS ol ON o.id=ol.order_id WHERE 1 AND o.status = 5 GROUP BY o.id ORDER BY id DESC LIMIT 0, 8774 ] in htdocs/api/Database.php on line 105

Warning: The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay in htdocs/api/Database.php on line 150

Warning: Invalid argument supplied for foreach() in htdocs/api/Orders.php on line 105
Link to post
Share on other sites

 

Прошу прощения, что-то я очень мнительный сегодня ;) Да, я уже так и сделал.

Однако, проблема, похоже, в том, что их очень много. При попытке экспорта сыплются варнинги:

Warning: The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay [SELECT o.id, o.delivery_id, o.delivery_price, o.separate_delivery, o.payment_method_id, o.paid, o.payment_date, o.closed, o.discount, o.coupon_code, o.coupon_discount, o.date, o.user_id, o.name, o.address, o.phone, o.email, o.comment, o.status, o.url, o.total_price, o.note, o.track FROM s_orders AS o LEFT JOIN s_orders_labels AS ol ON o.id=ol.order_id WHERE 1 AND o.status = 5 GROUP BY o.id ORDER BY id DESC LIMIT 0, 8774 ] in htdocs/api/Database.php on line 105

Warning: The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay in htdocs/api/Database.php on line 150

Warning: Invalid argument supplied for foreach() in htdocs/api/Orders.php on line 105

 

на сл. неделе обновлю решение, по принципу как работает експорт товаров, там они в несколько проходов пишутся

Link to post
Share on other sites

на сл. неделе обновлю решение, по принципу как работает експорт товаров, там они в несколько проходов пишутся

 

Было бы очень интересно посмотреть.

У меня как-то возникал подобный вопрос, и я с ним справиться не сумел. PHPExcel, кажется, не умеет создавать файл частями и должен сформировать все данные в оперативной памяти. И тут возникает вопрос достаточности ресурсов сервера.

А вот если отказаться от PHPExcel  и создавать файл в .csv, то проблемы отпадают...

Link to post
Share on other sites
  • 2 weeks later...

Появилась еще одна проблема, кажется, прямое следствие этой доработки:

Warning: The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay [SELECT o.id, o.delivery_id, o.delivery_price, o.separate_delivery, o.payment_method_id, o.paid, o.payment_date, o.closed, o.discount, o.coupon_code, o.coupon_discount, o.date, o.user_id, o.name, o.address, o.phone, o.email, o.comment, o.status, o.url, o.total_price, o.note, o.track FROM s_orders AS o LEFT JOIN s_orders_labels AS ol ON o.id=ol.order_id WHERE 1 AND o.status = 5 GROUP BY o.id ORDER BY id DESC LIMIT 8840, 40 ] in /htdocs/api/Database.php on line 105

Warning: The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay in /htdocs/api/Database.php on line 150

Warning: Invalid argument supplied for foreach() in /htdocs/api/Orders.php on line 105

Появляется в тех случаях, когда я на вкладке "выполненные" пытаюсь перейти на последнюю страницу и в тех случаях, когда я пользуюсь поиском на вкладке заказы.

Link to post
Share on other sites

Появилась еще одна проблема, кажется, прямое следствие этой доработки:

Warning: The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay [SELECT o.id, o.delivery_id, o.delivery_price, o.separate_delivery, o.payment_method_id, o.paid, o.payment_date, o.closed, o.discount, o.coupon_code, o.coupon_discount, o.date, o.user_id, o.name, o.address, o.phone, o.email, o.comment, o.status, o.url, o.total_price, o.note, o.track FROM s_orders AS o LEFT JOIN s_orders_labels AS ol ON o.id=ol.order_id WHERE 1 AND o.status = 5 GROUP BY o.id ORDER BY id DESC LIMIT 8840, 40 ] in /htdocs/api/Database.php on line 105

Warning: The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay in /htdocs/api/Database.php on line 150

Warning: Invalid argument supplied for foreach() in /htdocs/api/Orders.php on line 105

Появляется в тех случаях, когда я на вкладке "выполненные" пытаюсь перейти на последнюю страницу и в тех случаях, когда я пользуюсь поиском на вкладке заказы.

 

кажется или точно? попробуйте удалить ее и посмореть. вообще модуль никак не должен влиять на выборку заказов на странице заказов. сколько всего у вас их? у вас LIMIT 0, 8774 тоесть оно пытается все заказы выбрать? помотрите что передается в лимит и какая страница передается

Link to post
Share on other sites

Проверил. Точно, дело в доработке. Если меняю код в api/orders.php на старый - все окей. Всего заказов 9500 тысяч, примерно.

$id_filter $status_filter $user_filter $keyword_filter $label_filter $modified_from_filter GROUP BY o.id ORDER BY status, id DESC $sql_limit", "%Y-%m-%d");
Link to post
Share on other sites

Кажется, доработка просто усугубляет проблему с количеством заказов. Вкладка "все заказы" теперь открывается, однако очень медленно, а переход на последнюю страницу на вкладке "все заказы" - не работает. Похоже, что это уже новая проблема, сейчас создам отдельную тему.

Link to post
Share on other sites

Благодаря помощи в соседней теме удалось убрать ошибки, но ситуация следующая: с стандартным запросом из симплы 

$id_filter $status_filter $user_filter $keyword_filter $label_filter $modified_from_filter GROUP BY o.id ORDER BY status, id DESC $sql_limit", "%Y-%m-%d");

в эксель выгружаются не все заказы, зато по вкладкам заказов переходит очень шустро, и по страницам внутри вкладок тоже (даже там, где их больше тысячи). С модифицированным запросом из доработки 

$id_filter $date_from $date_to $status_filter $user_filter $keyword_filter $label_filter $modified_from_filter ORDER BY status, id DESC $sql_limit", "%Y-%m-%d");

выгружаются все заказы, но вкладка "все заказы" и "выполненные" открывается очень долго (иногда падая в internal server error), и переход на последнюю страницу в них - занимает еще больше времени.

Edited by baarseek
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
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.

Loading...
×
×
  • Create New...