Вопросы по разработке компонента для выгрузки данных в формате excel документа

  • 22 Ответов
  • 435 Просмотров

0 Пользователей и 1 Гость просматривают эту тему.

*

Оффлайн borro

  • ******
  • 1269
  • [+]21 / [-]0
  • желаю вам счастья
    • Просмотр профиля
    • Сайты, дизайн
Здравствуйте.

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

Скажите, нужна ли такому компоненту модель или все процессы обращения к базе данных за данными лучше прописать в задаче главного контроллера? Никаких форм отображать не надо, просто добыча данных из БД, небольшая компоновка и генерация эксель документа для скачивания.


*

Оффлайн Septdir

  • *******
  • 2083
  • [+]106 / [-]0
  • JoomlaZen
    • Просмотр профиля
    • Игорь «Septdir» Бердичевский
Ну о том и где должно находиться можно долго рассуждать, ведь концепция mvc весьма гибкая штука, но работа с базой однозначно в модель. А вот что до этого делать, в частности где подготавливтаь данные к запросу и где формировать ответ, вопрос более сложный.
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
________
Мои Контакты: Сайт | skype:septdir | Telegram | VK | Facebook | Twiter | Все контакты

*

Оффлайн AlekVolsk

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

*

Оффлайн borro

  • ******
  • 1269
  • [+]21 / [-]0
  • желаю вам счастья
    • Просмотр профиля
    • Сайты, дизайн
нужна
Спасибо.

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

*

Оффлайн Виталик

У вас есть на заметке пример простейшего компонента, который выполняет поставленную задачу? По документации мне не понятно, что должно быть в файле модели, и что в контроллере в данном случае
JoomShopping, посмотрите в админке например контроллер JshoppingControllerProductFields


*

Оффлайн borro

  • ******
  • 1269
  • [+]21 / [-]0
  • желаю вам счастья
    • Просмотр профиля
    • Сайты, дизайн
Здравствуйте! Спасибо. Пробую...
Содержимое модели, файл download.php:
Спойлер
[свернуть]
Содержимое главного контроллера, файл controller.php:
Спойлер
[свернуть]
При попытке открыть страницу компонента в админке выдается:
Цитировать
Fatal error: Class VmpicelistModelDownload contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (JModelForm::getForm) in C:\xampp_new\htdocs\asu160404.ru\www\administrator\components\com_vmpricelist\models\download.php on line 4
Если поставить единственному методу модели abstract, то выдается:
Цитировать
Fatal error: Abstract function VmpicelistModelDownload::getData() cannot contain body in C:\xampp_new\htdocs\asu160404.ru\www\administrator\components\com_vmpricelist\models\download.php on line 12
Я не понимаю суть этих ошибок. Как разрешить ситуацию?

« Последнее редактирование: 23.09.2016, 13:51:21 от borro »

*

Оффлайн b2z

  • *****
  • 7449
  • [+]739 / [-]0
  • Разраблю понемногу
    • Просмотр профиля
    • NorrNext - расширения для Joomla! и Pagekit
Поменяйте JModelAdmin на JModelList - Вы же список выгружаете. Если хотите оставить JModelAdmin, то надо реализовать метод getForm().

А VmConfig::$defaultLang откуда берётся? Что-то не вижу, где вы определили класс VmConfig.

*

Оффлайн robert

Я не понимаю суть этих ошибок. Как разрешить ситуацию?
Добавьте в ваш класс пустую функцию getForm().
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

*

Оффлайн borro

  • ******
  • 1269
  • [+]21 / [-]0
  • желаю вам счастья
    • Просмотр профиля
    • Сайты, дизайн
Новая версия админской части компонента:
1. точка входа в админскую часть компонента - главный файл administrator/components/com_vmpricelist/vmpricelist.php:
Спойлер
[свернуть]

2. главный контроллер - файл administrator/components/com_vmpricelist/controller.php:
Спойлер
[свернуть]

3. Вид
3.а. файл administrator/components/com_vmpricelist/views/download/view.html.php:
Спойлер
[свернуть]

3.б. файл макета administrator/components/com_vmpricelist/views/download/tmpl/default.php
Спойлер
[свернуть]

4. Файл модели, файл administrator/components/com_vmpricelist/models/download.php:
Спойлер
[свернуть]

Вопросы:
1. туда ли я поместил запрос к БД, в функцию getForm?
2. при открытии страницы вида download в админке по адресу /administrator/index.php?option=com_vmpricelist&task=download выводится сообщение:
Цитировать
Предупреждение
Модель класса vmpricelistModelDownload не найдена в файле
и var_dump($this->data) выдает null
Почему не найдена модель?
« Последнее редактирование: 23.09.2016, 15:47:21 от borro »

*

Оффлайн Septdir

  • *******
  • 2083
  • [+]106 / [-]0
  • JoomlaZen
    • Просмотр профиля
    • Игорь «Septdir» Бердичевский
Почему не найдена модель?
Честно не разу не юзал главный контролер (ибо обычно если делаю компонент под сайт, то там сразу много задач) Ну в доп контролерах функция получения модели прописывается отдельно
Код: (php) [Выделить]
function getModel($name = 'NAME', $prefix = 'PRFIX', $config = array('ignore_request' => true)) {
return parent::getModel($name, $prefix, $config);
}
Ну или можно в самой функции подключить модель.
Код: (php) [Выделить]
JModelLegacy::addIncludePath(JPATH_SITE.DIRECTORY_SEPARATOR.'components'.DIRECTORY_SEPARATOR.'com_name'.DIRECTORY_SEPARATOR.'models');
$model = JModelLegacy::getInstance('model', 'prefix');
$model->function(params);
getForm - это функция получения формы, а не для итемов
P.S опишите вообще полностью задачу компонента, может вообще зря мучиетесь
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
________
Мои Контакты: Сайт | skype:septdir | Telegram | VK | Facebook | Twiter | Все контакты

*

Оффлайн borro

  • ******
  • 1269
  • [+]21 / [-]0
  • желаю вам счастья
    • Просмотр профиля
    • Сайты, дизайн
Код: (php) [Выделить]
function getModel($name = 'NAME', $prefix = 'PRFIX', $config = array('ignore_request' => true)) {
return parent::getModel($name, $prefix, $config);
}
Код выше прописывается в подконтроллерах? Не мой вариант?

Ну или можно в самой функции подключить модель.
Код: (php) [Выделить]
JModelLegacy::addIncludePath(JPATH_SITE.DIRECTORY_SEPARATOR.'components'.DIRECTORY_SEPARATOR.'com_name'.DIRECTORY_SEPARATOR.'models');
$model = JModelLegacy::getInstance('model', 'prefix');
$model->function(params);
Уточните, в какой функции подключить модель вышеприведённым способом

P.S опишите вообще полностью задачу компонента, может вообще зря мучиетесь
Компонент должен по клику на кнопке в админке формировать и предлагать к загрузке эксель документ, данные в который стягиваются из нескольких таблиц БД
« Последнее редактирование: 23.09.2016, 19:52:32 от borro »

*

Оффлайн b2z

  • *****
  • 7449
  • [+]739 / [-]0
  • Разраблю понемногу
    • Просмотр профиля
    • NorrNext - расширения для Joomla! и Pagekit
Цитировать
Компонент должен по клику на кнопке в админке формировать и предлагать к загрузке эксель документ, данные в который стягиваются из несколько таблиц БД
Ну тогда вам форма вообще не нужна.

Я же говорю, поменяйте JModelAdmin на JModelList
Код: (php) [Выделить]
class VmpicelistModelDownload extends JModelList
Переделайте getForm на getData().

В контроллере
Код: (php) [Выделить]
public function getModel($name = 'Download', $prefix = 'Vmpicelist', $config = array('ignore_request' => true))
{
    return parent::getModel($name, $prefix, $config);
}

В представлении
Код: (php-brief) [Выделить]
$this->data = $this->get('Data');

*

Оффлайн Septdir

  • *******
  • 2083
  • [+]106 / [-]0
  • JoomlaZen
    • Просмотр профиля
    • Игорь «Septdir» Бердичевский
Уточните, в какой функции подключить модель вышеприведённым способом
В любой, это вообще стандартный выозв модели, хоть в контролере, хоть в хелпере, хоть в моделе (если к примеру надо взять модель из другого компонента), да хоть в шаблоне.

И вообще я к чему просил про задачу полностью. Ибо тот же CSVI PRO неплохо делал экспорт, правда юзал его давно и не уверен что если в формате и кодировке экселя, но ведь проще пресохранить файл, чем писать компонент с 0
« Последнее редактирование: 23.09.2016, 21:26:33 от Septdir »
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
________
Мои Контакты: Сайт | skype:septdir | Telegram | VK | Facebook | Twiter | Все контакты

*

Оффлайн borro

  • ******
  • 1269
  • [+]21 / [-]0
  • желаю вам счастья
    • Просмотр профиля
    • Сайты, дизайн
Здравствуйте! Спасибо. Сделал, как Вы сказали. Теперь выводится Предупреждение:
Цитировать
Модель класса VmpicelistDownload не найдена в файле
а var_dump в виде выводит null

Пакет файлов:
1. главный файл administrator/components/com_vmpricelist/vmpricelist.php:
Спойлер
[свернуть]

2. главный контроллер - файл administrator/components/com_vmpricelist/controller.php:
Спойлер
[свернуть]

3. Вид
3.а. файл administrator/components/com_vmpricelist/views/download/view.html.php:
Спойлер
[свернуть]

3.б. файл макета administrator/components/com_vmpricelist/views/download/tmpl/default.php
Спойлер
[свернуть]

4. Файл модели, файл administrator/components/com_vmpricelist/models/download.php:
Спойлер
[свернуть]

Может нужен XML файл какой-то?
« Последнее редактирование: 26.09.2016, 20:13:30 от borro »

*

Оффлайн borro

  • ******
  • 1269
  • [+]21 / [-]0
  • желаю вам счастья
    • Просмотр профиля
    • Сайты, дизайн
Мне нужно, чтобы в эксель и картинки были плюс формат вывода нестандартный. Да и CSVI довольно большой, легче я думаю и полезнее для меня будет с нуля создавать
« Последнее редактирование: 27.09.2016, 11:25:25 от borro »

*

Оффлайн SmokerMan

Здравствуйте! Спасибо. Сделал, как Вы сказали. Теперь выводится Предупреждение:а var_dump в виде выводит null
сказали не то что сделали)
нужно либо
создать отдельный контроллер, наприер /controllers/download.php и ссылатья на его task
<input type="hidden" name="task" value="download.метод контроллера"/>либо если делать через основной, то это делать так
<input type="hidden" name="task" value="download"/>в контроллере создать метод download и в нем уже подключать нужную модель
$model = JModelLegacy::getInstance('model', 'prefix');

*

Оффлайн Septdir

  • *******
  • 2083
  • [+]106 / [-]0
  • JoomlaZen
    • Просмотр профиля
    • Игорь «Septdir» Бердичевский
Мне нужно будет чтобы в эксель и картинки были плюс формат вывода нестандартный. Да и CSVI довольно большой, легче я думаю и полезнее для меня будет с нуля создавать
Полезнее, разве что ради развития. А так ну это ваше время решать вам
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
________
Мои Контакты: Сайт | skype:septdir | Telegram | VK | Facebook | Twiter | Все контакты

*

Оффлайн borro

  • ******
  • 1269
  • [+]21 / [-]0
  • желаю вам счастья
    • Просмотр профиля
    • Сайты, дизайн
либо если делать через основной, то это делать так
<input type="hidden" name="task" value="download"/>в контроллере создать метод download и в нем уже подключать нужную модель
$model = JModelLegacy::getInstance('model', 'prefix');
Доброе утро! Благодарю.
Если пойти через один основной контроллер, то какая(ие) должна быть функция внутри класса модели? Как она должна называться?

*

Оффлайн Aleks.Denezh

Доброе утро! Благодарю.
Если пойти через один основной контроллер, то какая(ие) должна быть функция внутри класса модели? Как она должна называться?
Как назовете..
Например в контроллере:
Код: (php) [Выделить]
public function download(){
$excel = $this->getModel('Download','VmpicelistModel')->getExcel();
...
}
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

Оффлайн borro

  • ******
  • 1269
  • [+]21 / [-]0
  • желаю вам счастья
    • Просмотр профиля
    • Сайты, дизайн
Спасибо. Были ошибки в именовании модели  ^-^
« Последнее редактирование: 28.09.2016, 17:37:48 от borro »

*

Оффлайн borro

  • ******
  • 1269
  • [+]21 / [-]0
  • желаю вам счастья
    • Просмотр профиля
    • Сайты, дизайн
Здравствуйте.
Всех благодарю. Компонент разработан. Возникла непонятка. Когда устанавливаю его на боевом сайте и пытаюсь открыть из админки, то отображается ошибка:
Цитировать
Не удается получить доступ к сайту

Веб-страница по адресу сайт/administrator/index.php?option=com_vmpricelist&view=download, возможно, временно недоступна или постоянно перемещена по новому адресу.
ERR_INVALID_RESPONSE
При этом компонент нормально устанавливается и работает на локальном сервере. Выставлял уровень отображения ошибок на "Максимум", но до них не доходит, просто отображается белый экран с указанной ошибкой по середине.

Что это может быть?

Прикладываю установочный архив и принтскрин окна с отображением данных закладки Network панели разработчиков

P.S. Помню, что когда-то вылетало системное всплывающее окно в Хроме о том, разрешить или запретить скачивание файлов с сайта. Я вроде нажал разрешить. Также я нажал на кнопку i слева от адреса сайта в адресной строке, чтобы увидеть настройки сайта и там параметр "Автоматическая загрузка" установлен в значение "Разрешено Вами"
« Последнее редактирование: 07.10.2016, 17:36:55 от borro »