Экспорт в Excel и PDF в PHP, вызывая избыточность кода - PullRequest
4 голосов
/ 27 января 2012

Мне нужно создать экспорт в Excel и экспортировать в pdf для некоторых моих запросов mysql и предоставить его пользователю.

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

Итак, в этом случае происходит избыточность кода, так как мне нужно создать три файла кода php:

Один, чтобы пользователь мог просматривать результаты запроса непосредственно на моем сайте , и

Другой, позволяющий пользователю экспортировать те же результаты запроса в Excel , и,

последний, который позволяет пользователю экспортировать те же результаты запроса в PDF

Все три файла имеют один и тот же код, только различие заключается в способе отправки данных в Excel или в PDF.

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

Ответы [ 6 ]

3 голосов
/ 27 января 2012

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

1) иметь одну функцию, которая выбирает ваши данные из базы данных (это будет ваша модель)

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

3) есть другая функция, которая специализируется на показ ваших данных (так что у вас будет представление для PDF,один для XLS и другой для сети)

также следуйте этому совету из комментария

3 голосов
/ 27 января 2012

"Есть ли какой-нибудь способ, с помощью которого я мог бы иметь только один файл и использовать его для всех целей, для просмотра, для экспорта в pdf и для экспорта в Excel тоже." Я думаю, что ответ - ДА.

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

<select name="viewoption" id="viewoption">
<option value="view">Page view</option>
<option value="xls">Export in Excel</option>
<option value="pdf">Export in PDF</option>
</select>

, а затем на странице действий вам просто нужно проверить значение $_POST['viewoption'] и поставить , если условие согласно требованиям.

Это может быть полезно для вас. Дайте мне знать в случае любого запроса.

Спасибо.

2 голосов
/ 27 января 2012

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

1.Используйте параметры

Объедините ваши файлы в один и используйте GET-параметры в вашем URL, например file.php?output=pfd.В вашем скрипте вы можете прочитать этот параметр из $_GET['output'] и решить, какой формат экспорта генерировать (if ... else, switch).

2.Использование Включает

Наличие только одного большого файла будет очень запутанным.Таким образом, вы также можете сохранить ваши три php-файла и создать четвертый файл get_data.inc.php, в котором у вас есть весь дублирующий код, извлекающий данные.Теперь вы можете загрузить и запустить этот файл в каждом из ваших трех php через include get_data.inc.php.

3.Используйте функции

Аутсорсинг кода во включаемый файл, что также может сбивать с толку, поскольку вы понятия не имеете, что будет делать включение и каковы зависимости.Так что лучше заключить функциональность в функцию.Здесь вы можете четко определить, что вставлять в функцию (db connection?) И что вы получите (массив данных?).Создайте новый файл get_data.func.php и определите function get_data($db_connection), выполнив всю работу и вернув данные, готовые к выводу.Затем в каждый файл включите файл через require_once get_data.func.php и произнесите $Data = get_data($db_connection);.

4.Использовать наследование классов

Вы можете использовать концепцию наследования классов.Вы можете определить абстрактный класс, который включает в себя функциональность для извлечения ваших данных из базы данных, и вы можете определить абстрактную функцию abstract public function output();.Затем вы можете создавать дочерние классы, расширяющие ваш класс, которые реализуют функцию output() особым образом.

5.Использование MVC Framework

Вы можете использовать установленную среду для реализации шаблона «Model View Controller» (MVC).Здесь вы очень аккуратно поделите различные слои вашего приложения (данные из БД, подготовьте данные для вывода, представьте данные).

Отказ от ответственности: это всего лишь некоторые советы для обучения, чтобы лучше организоватьваши проекты.Если у вас мало опыта, я не рекомендую напрямую начинать с большой среды MVC.Просто пройди путь просветления сверху вниз;)

2 голосов
/ 27 января 2012

Здесь нет избыточности, так как вы еще ничего не написали.Избыточность в идеях.С правильной абстракцией вы можете написать код, который DRY .Например, у вас может быть выделение типа Chandersh, приведенное выше:

<select name="viewoption" id="viewoption">
<option value="view">Page view</option>
<option value="xls">Export in Excel</option>
<option value="pdf">Export in PDF</option>
</select>

Затем вы должны написать некоторый код - если хотите, контроллер - который слушает запросы.Поскольку вы записываете те же данные, но в другом формате, вы можете сделать что-то вроде этого:

  1. получить данные (из модели, если хотите)
  2. решить какую функцию / код / ​​представление следует запустить с помощью запроса
  3. вызвать вашу функцию / code / view, которая генерирует правильный формат с использованием вашего предыдущего решения
  4. сделано

Я думаю, что не имеет значения , используете ли вы MVC или нет, но фактическую работу, которую ваши компоненты делают вместе.

Просто примечание: наличие нескольких файлов не означает дублирование кода.Файлы - это просто контейнеры.Возьмите Java, например.В java каждый класс помещается в отдельный файл.

2 голосов
/ 27 января 2012

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

Вы должны использовать конструкцию Model View Controller (MVC). У вас должен быть один класс, который обрабатывает все sql (исключительно данные и гарантирует, что данные точно созданы, сохранены, возвращены), другой файл, который принимает / выполняет запросы к данным и указывает, какое представление отображать, и, наконец, только 2 или 3 шаблона введите файлы (представления), которые просто форматируют и отображают данные, созданные в вашем контроллере.

Наличие большего количества файлов / классов лучше и делает ваш код более модульным, что устраняет избыточность кода. Упаковка всего в один файл увеличивает избыточность кода.

2 голосов
/ 27 января 2012

Поместите весь код в один файл.Используйте $_GET['format'], чтобы решить, нужно ли вам форматировать PDF или Excel, по умолчанию это опция веб-страницы, например,

<?php

if($_GET['format'] == "pdf")
{
     // export as PDF
}
elseif($_GET['format'] == "excel")
{
     // export as excel
}

Использовать гиперссылки на ту же страницу, что и:

http://www.site.com/page.php?format=pdf
http://www.site.com/page.php?format=excel
http://www.site.com/page.php //webpage
...