Форум русской поддержки Joomla!® CMS
09.12.2016, 07:56:11 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

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

 (Прочитано 262 раз)
0 Пользователей и 1 Гость смотрят эту тему.
borro
Живу я здесь
******

Репутация: +21/-0
Offline Offline

Пол: Мужской
Сообщений: 1161


желаю вам счастья


« : 22.09.2016, 12:32:58 »

Здравствуйте.

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

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

Репутация: +123/-0
Offline Offline

Пол: Мужской
Сообщений: 1210



« Ответ #1 : 22.09.2016, 12:37:45 »

нужна
Записан
Septdir
Живу я здесь
******

Репутация: +36/-3
Offline Offline

Пол: Мужской
Сообщений: 841


Skype: septdir


« Ответ #2 : 22.09.2016, 12:40:17 »

Ну о том и где должно находиться можно долго рассуждать, ведь концепция mvc весьма гибкая штука, но работа с базой однозначно в модель. А вот что до этого делать, в частности где подготавливтаь данные к запросу и где формировать ответ, вопрос более сложный.
Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

Пол: Мужской
Сообщений: 6460



« Ответ #3 : 22.09.2016, 13:27:19 »

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

Репутация: +21/-0
Offline Offline

Пол: Мужской
Сообщений: 1161


желаю вам счастья


« Ответ #4 : 22.09.2016, 13:48:48 »

нужна
Спасибо.

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

Репутация: +123/-0
Offline Offline

Пол: Мужской
Сообщений: 1210



« Ответ #5 : 22.09.2016, 13:53:35 »

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

Репутация: +710/-0
Offline Offline

Пол: Мужской
Сообщений: 7538


Разраблю понемногу


« Ответ #6 : 22.09.2016, 15:29:58 »

В стандартном компоненте баннеров есть экспорт в CSV.

Вот как в модели формируется контент
https://github.com/joomla/joomla-cms/blob/staging/administrator/components/com_banners/models/tracks.php#L469

Вот что отдаётся клиенту
https://github.com/joomla/joomla-cms/blob/staging/administrator/components/com_banners/views/tracks/view.raw.php

Ну и контроллер
https://github.com/joomla/joomla-cms/blob/staging/administrator/components/com_banners/controllers/tracks.raw.php
« Последнее редактирование: 22.09.2016, 15:35:13 от b2z » Записан
borro
Живу я здесь
******

Репутация: +21/-0
Offline Offline

Пол: Мужской
Сообщений: 1161


желаю вам счастья


« Ответ #7 : 23.09.2016, 12:47:23 »

Здравствуйте! Спасибо. Пробую...
Содержимое модели, файл 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, 12:51:21 от borro » Записан
b2z
Support Team
*****

Репутация: +710/-0
Offline Offline

Пол: Мужской
Сообщений: 7538


Разраблю понемногу


« Ответ #8 : 23.09.2016, 13:03:10 »

Поменяйте JModelAdmin на JModelList - Вы же список выгружаете. Если хотите оставить JModelAdmin, то надо реализовать метод getForm().

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

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3591


« Ответ #9 : 23.09.2016, 13:03:50 »

Я не понимаю суть этих ошибок. Как разрешить ситуацию?
Добавьте в ваш класс пустую функцию getForm().
Записан
borro
Живу я здесь
******

Репутация: +21/-0
Offline Offline

Пол: Мужской
Сообщений: 1161


желаю вам счастья


« Ответ #10 : 23.09.2016, 14:36:42 »

Новая версия админской части компонента:
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, 14:47:21 от borro » Записан
Septdir
Живу я здесь
******

Репутация: +36/-3
Offline Offline

Пол: Мужской
Сообщений: 841


Skype: septdir


« Ответ #11 : 23.09.2016, 16:10:48 »

Почему не найдена модель?
Честно не разу не юзал главный контролер (ибо обычно если делаю компонент под сайт, то там сразу много задач) Ну в доп контролерах функция получения модели прописывается отдельно
Код
	function getModel($name = 'NAME', $prefix = 'PRFIX', $config = array('ignore_request' => true)) {
return parent::getModel($name, $prefix, $config);
}
 
Ну или можно в самой функции подключить модель.
Код
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 опишите вообще полностью задачу компонента, может вообще зря мучиетесь
Записан
borro
Живу я здесь
******

Репутация: +21/-0
Offline Offline

Пол: Мужской
Сообщений: 1161


желаю вам счастья


« Ответ #12 : 23.09.2016, 16:47:00 »

Код
	function getModel($name = 'NAME', $prefix = 'PRFIX', $config = array('ignore_request' => true)) {
return parent::getModel($name, $prefix, $config);
}
 
Код выше прописывается в подконтроллерах? Не мой вариант?

Ну или можно в самой функции подключить модель.
Код
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, 18:52:32 от borro » Записан
b2z
Support Team
*****

Репутация: +710/-0
Offline Offline

Пол: Мужской
Сообщений: 7538


Разраблю понемногу


« Ответ #13 : 23.09.2016, 17:08:35 »

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

Я же говорю, поменяйте JModelAdmin на JModelList
Код
class VmpicelistModelDownload extends JModelList

Переделайте getForm на getData().

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

В представлении
Код
$this->data = $this->get('Data');
Записан
Septdir
Живу я здесь
******

Репутация: +36/-3
Offline Offline

Пол: Мужской
Сообщений: 841


Skype: septdir


« Ответ #14 : 23.09.2016, 19:19:53 »

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

И вообще я к чему просил про задачу полностью. Ибо тот же CSVI PRO неплохо делал экспорт, правда юзал его давно и не уверен что если в формате и кодировке экселя, но ведь проще пресохранить файл, чем писать компонент с 0
« Последнее редактирование: 23.09.2016, 20:26:33 от Septdir » Записан
borro
Живу я здесь
******

Репутация: +21/-0
Offline Offline

Пол: Мужской
Сообщений: 1161


желаю вам счастья


« Ответ #15 : 26.09.2016, 19:03:26 »

Здравствуйте! Спасибо. Сделал, как Вы сказали. Теперь выводится Предупреждение:
Цитировать
Модель класса 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, 19:13:30 от borro » Записан
borro
Живу я здесь
******

Репутация: +21/-0
Offline Offline

Пол: Мужской
Сообщений: 1161


желаю вам счастья


« Ответ #16 : 26.09.2016, 19:15:06 »

Мне нужно, чтобы в эксель и картинки были плюс формат вывода нестандартный. Да и CSVI довольно большой, легче я думаю и полезнее для меня будет с нуля создавать
« Последнее редактирование: 27.09.2016, 10:25:25 от borro » Записан
SmokerMan
Профи
********

Репутация: +694/-25
Offline Offline

Пол: Мужской
Сообщений: 5225



« Ответ #17 : 26.09.2016, 19:35:51 »

Здравствуйте! Спасибо. Сделал, как Вы сказали. Теперь выводится Предупреждение:а 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
Живу я здесь
******

Репутация: +36/-3
Offline Offline

Пол: Мужской
Сообщений: 841


Skype: septdir


« Ответ #18 : 26.09.2016, 20:13:52 »

Мне нужно будет чтобы в эксель и картинки были плюс формат вывода нестандартный. Да и CSVI довольно большой, легче я думаю и полезнее для меня будет с нуля создавать
Полезнее, разве что ради развития. А так ну это ваше время решать вам
Записан
borro
Живу я здесь
******

Репутация: +21/-0
Offline Offline

Пол: Мужской
Сообщений: 1161


желаю вам счастья


« Ответ #19 : 27.09.2016, 10:45:51 »

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

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #20 : 27.09.2016, 11:39:49 »

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

Репутация: +21/-0
Offline Offline

Пол: Мужской
Сообщений: 1161


желаю вам счастья


« Ответ #21 : 27.09.2016, 18:12:19 »

Спасибо. Были ошибки в именовании модели  Smiley
« Последнее редактирование: 28.09.2016, 16:37:48 от borro » Записан
borro
Живу я здесь
******

Репутация: +21/-0
Offline Offline

Пол: Мужской
Сообщений: 1161


желаю вам счастья


« Ответ #22 : 07.10.2016, 12:47:04 »

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

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

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

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

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


* Untitled-1.jpg (82.33 Кб, 1923x903 - просмотрено 1 раз.)
* com_vmpricelist.zip (897.47 Кб - загружено 1 раз.)
« Последнее редактирование: 07.10.2016, 16:36:55 от borro » Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet