Comando SQL e OnSave Olá, bom dia, estou tentando gravar informações (arquivos em Blob) no banco de dados, porém não consegui fazer a conversão e aproveitar o OnSave do próprio Adianti, por isso estava usando comando SQL, porém mesmo colocando o a execução do SQL no fim do OnSave, o Adianti continua salvando por cima da gravação do SQL. O comando SQL está sendo executado, porém a informação do Adianti ...
MJ
Comando SQL e OnSave  
Olá, bom dia, estou tentando gravar informações (arquivos em Blob) no banco de dados, porém não consegui fazer a conversão e aproveitar o OnSave do próprio Adianti, por isso estava usando comando SQL, porém mesmo colocando o a execução do SQL no fim do OnSave, o Adianti continua salvando por cima da gravação do SQL. O comando SQL está sendo executado, porém a informação do Adianti sobrepõe os dados em blob, mesmo o comando SQL estando sendo executado depois do "store" do OnSave. Obrigado!

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (9)


NR

Poste o código
MJ

 
  1. <?php
  2. /**
  3. * QuestoesForm Master/Detail
  4. * @author <your name here>
  5. */
  6. class QuestoesAlternativasForm extends TPage
  7. {
  8. protected $form; // form
  9. protected $detail_list;
  10. /**
  11. * Page constructor
  12. */
  13. public function __construct()
  14. {
  15. parent::__construct();
  16. // creates the form
  17. $this->form = new BootstrapFormBuilder('form_Questoes');
  18. $this->form->setFormTitle('Questões');
  19. // master fields
  20. $questao = new TText('questao');
  21. $disciplinas_idDisciplinas = new TDBCombo('disciplinas_idDisciplinas', 'conexao', 'disciplinas', 'idDisciplinas', 'nome');
  22. $tags = new TEntry('tags');
  23. $video_midia = new TFile('video_midia');
  24. $audio_midia = new TFile('audio_midia');
  25. $imagem_midia = new TFile('imagem_midia');
  26. $Dificuldade_idDificuldade = new TDBCombo('Dificuldade_idDificuldade', 'conexao', 'Dificuldade', 'idDificuldade', 'dificuldade');
  27. $Tipodequestao_idTipodequestao = new TDBCombo('Tipodequestao_idTipodequestao', 'conexao', 'Tipodequestao', 'idTipodequestao', 'nometipo');
  28. $imagem_midia->enableFileHandling();
  29. $audio_midia->enableFileHandling();
  30. $video_midia->enableFileHandling();
  31. $imagem_midia->setAllowedExtensions( [ 'png', 'jpg', 'jpeg' ]);
  32. $audio_midia->setAllowedExtensions( [ 'mp3', 'wma' ]);
  33. $video_midia->setAllowedExtensions( [ 'avi', 'mkv', 'mp4' ]);
  34. // detail fields
  35. $detail_idAlternativas = new THidden('detail_idAlternativas');
  36. $detail_alternativas = new TText('detail_alternativas', 'conexao', 'Alternativas', 'idAlternativas', 'alternativas');
  37. $detail_correta = new TRadioGroup('detail_correta', 'conexao', 'Alternativas', 'idAlternativas', 'correta');
  38. $detail_audio_midia = new TFile('detail_audio', 'conexao', 'Alternativas', 'idAlternativas', 'audio_midia');
  39. $detail_video_midia = new TFile('detail_video', 'conexao', 'Alternativas', 'idAlternativas', 'video_midia');
  40. $detail_imagem_midia = new TFile('detail_imagem', 'conexao', 'Alternativas', 'idAlternativas', 'imagem_midia');
  41. if (!empty($idQuestoes))
  42. {
  43. $idQuestoes->setEditable(FALSE);
  44. }
  45. // master fields
  46. $this->form->addFields( [new TLabel('Questão')], [$questao] );
  47. $this->form->addFields( [new TLabel('Tags')], [$tags] );
  48. $this->form->addFields( [new TLabel('Disciplina')], [$disciplinas_idDisciplinas] );
  49. $this->form->addFields( [new TLabel('Imagem')], [$imagem_midia] );
  50. $this->form->addFields( [new TLabel('Áudio')], [$audio_midia] );
  51. $this->form->addFields( [new TLabel('Vídeo')], [$video_midia] );
  52. $this->form->addFields( [new TLabel('Dificuldade')], [$Dificuldade_idDificuldade] );
  53. $this->form->addFields( [new TLabel('Tipo de Questão')], [$Tipodequestao_idTipodequestao] );
  54. // detail fields
  55. $this->form->addContent( ['<h4>Alternativas</h4><hr>'] );
  56. $this->form->addFields( [$detail_idAlternativas] );
  57. $this->form->addFields( [new TLabel('Alternativa')], [$detail_alternativas] );
  58. $this->form->addFields( [new TLabel('Áudio')], [$detail_audio_midia] );
  59. $this->form->addFields( [new TLabel('Vídeo')], [$detail_video_midia] );
  60. $this->form->addFields( [new TLabel('Imagem')], [$detail_imagem_midia] );
  61. $this->form->addFields( [new TLabel('Correta')], [$detail_correta] );
  62. $add = TButton::create('add', [$this, 'onSaveDetail'], 'Register', 'fa:save');
  63. $this->form->addFields( [], [$add] )->style = 'background: whitesmoke; padding: 5px; margin: 1px;';
  64. $detail_correta->addItems ( ['0' => 'Não', '1' => 'Sim'] );
  65. $detail_correta->setLayout('horizontal');
  66. $detail_audio_midia->enableFileHandling();
  67. $detail_video_midia->enableFileHandling();
  68. $detail_imagem_midia->enableFileHandling();
  69. $detail_audio_midia->setAllowedExtensions( [ 'mp3', 'wma' ]);
  70. $detail_video_midia->setAllowedExtensions( [ 'avi', 'mkv', 'mp4' ]);
  71. $detail_imagem_midia->setAllowedExtensions( [ 'png', 'jpg', 'jpeg' ]);
  72. $this->detail_list = new BootstrapDatagridWrapper(new TQuickGrid);
  73. $this->detail_list->style = "min-width: 700px; width:100%;margin-bottom: 10px";
  74. $this->detail_list->setId('Questoes_list');
  75. // items
  76. $this->detail_list->addQuickColumn('Alternativas', 'alternativas', 'center', 100);
  77. $this->detail_list->addQuickColumn('Correta', 'correta', 'center', 100);
  78. // detail actions
  79. $this->detail_list->addQuickAction( 'Edit', new TDataGridAction([$this, 'onEditDetail']), 'idAlternativas', 'fa:edit blue');
  80. $this->detail_list->addQuickAction( 'Delete', new TDataGridAction([$this, 'onDeleteDetail']), 'idAlternativas', 'fa:trash red');
  81. $this->detail_list->createModel();
  82. $panel = new TPanelGroup;
  83. $panel->add($this->detail_list);
  84. $panel->getBody()->style = 'overflow-x:auto';
  85. $this->form->addContent( [$panel] );
  86. $btn = $this->form->addAction( _t('Save'), new TAction([$this, 'onSave']), 'fa:save');
  87. $btn->class = 'btn btn-sm btn-primary';
  88. $this->form->addAction(_t('Cancel'),new TAction(array('QuestoesList','onReload')),'fa:times-circle-o red');
  89. // create the page container
  90. $container = new TVBox;
  91. $container->style = 'width: 90%';
  92. // $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  93. $container->add($this->form);
  94. parent::add($container);
  95. }
  96. /**
  97. * Clear form
  98. * @param $param URL parameters
  99. */
  100. public function onClear($param)
  101. {
  102. $this->form->clear(TRUE);
  103. TSession::setValue(__CLASS__.'_items', array());
  104. $this->onReload( $param );
  105. }
  106. /**
  107. * Save an item from form to session list
  108. * @param $param URL parameters
  109. */
  110. public function onSaveDetail( $param )
  111. {
  112. try
  113. {
  114. TTransaction::open('conexao');
  115. $data = $this->form->getData();
  116. /** validation sample
  117. if (empty($data->fieldX))
  118. {
  119. throw new Exception('The field fieldX is required');
  120. }
  121. **/
  122. $items = TSession::getValue(__CLASS__.'_items');
  123. $key = empty($data->detail_idAlternativas) ? 'X'.mt_rand(1000000000, 1999999999) : $data->detail_idAlternativas;
  124. $items[ $key ] = array();
  125. $items[ $key ]['idAlternativas'] = $key;
  126. $items[ $key ]['alternativas'] = $data->detail_alternativas;
  127. $items[ $key ]['audio_midia'] = $data->detail_audio_midia;
  128. $items[ $key ]['video_midia'] = $data->detail_video_midia;
  129. $items[ $key ]['imagem_midia'] = $data->detail_imagem_midia;
  130. $items[ $key ]['correta'] = $data->detail_correta;
  131. TSession::setValue(__CLASS__.'_items', $items);
  132. // clear detail form fields
  133. $data->detail_idAlternativas = '';
  134. $data->detail_alternativas = '';
  135. $data->detail_audio_midia = '';
  136. $data->detail_video_midia = '';
  137. $data->detail_imagem_midia = '';
  138. $data->detail_correta = '';
  139. TTransaction::close();
  140. $this->form->setData($data);
  141. $this->onReload( $param ); // reload the items
  142. }
  143. catch (Exception $e)
  144. {
  145. $this->form->setData( $this->form->getData());
  146. new TMessage('error', $e->getMessage());
  147. }
  148. }
  149. /**
  150. * Load an item from session list to detail form
  151. * @param $param URL parameters
  152. */
  153. public static function onEditDetail( $param )
  154. {
  155. // read session items
  156. $items = TSession::getValue(__CLASS__.'_items');
  157. // get the session item
  158. $item = $items[ $param['key'] ];
  159. $data = new stdClass;
  160. $data->detail_idAlternativas = $item['idAlternativas'];
  161. $data->detail_alternativas = $item['alternativas'];
  162. $data->detail_audio_midia = $item['audio_midia'];
  163. $data->detail_video_midia = $item['video_midia'];
  164. $data->detail_imagem_midia = $item['imagem_midia'];
  165. $data->detail_correta = $item['correta'];
  166. // fill detail fields
  167. TForm::sendData( 'form_Questoes', $data );
  168. }
  169. /**
  170. * Delete an item from session list
  171. * @param $param URL parameters
  172. */
  173. public static function onDeleteDetail( $param )
  174. {
  175. // reset items
  176. $data = new stdClass;
  177. $data->detail_alternativas = '';
  178. $data->detail_audio_midia = '';
  179. $data->detail_video_midia = '';
  180. $data->detail_imagem_midia = '';
  181. $data->detail_correta = '';
  182. // clear form data
  183. TForm::sendData('form_Questoes', $data );
  184. // read session items
  185. $items = TSession::getValue(__CLASS__.'_items');
  186. // get detail id
  187. $detail_id = $param['key'];
  188. // delete the item from session
  189. unset($items[ $detail_id ] );
  190. // rewrite session items
  191. TSession::setValue(__CLASS__.'_items', $items);
  192. // delete item from screen
  193. TScript::create("ttable_remove_row_by_id('Questoes_list', '{$detail_id}')");
  194. }
  195. /**
  196. * Load the items list from session
  197. * @param $param URL parameters
  198. */
  199. public function onReload($param)
  200. {
  201. // read session items
  202. $items = TSession::getValue(__CLASS__.'_items');
  203. $this->detail_list->clear(); // clear detail list
  204. if ($items)
  205. {
  206. foreach ($items as $list_item)
  207. {
  208. $item = (object) $list_item;
  209. $row = $this->detail_list->addItem( $item );
  210. $row->id = $list_item['idAlternativas'];
  211. }
  212. }
  213. $this->loaded = TRUE;
  214. }
  215. /**
  216. * Load Master/Detail data from database to form/session
  217. */
  218. public function onEdit($param)
  219. {
  220. try
  221. {
  222. TTransaction::open('conexao');
  223. if (isset($param['key']))
  224. {
  225. $key = $param['key'];
  226. $object = new Questoes($key);
  227. $items = Alternativas::where('Questoes_idQuestoes', '=', $key)->load();
  228. $session_items = array();
  229. foreach( $items as $item )
  230. {
  231. $item_key = $item->idAlternativas;
  232. $session_items[$item_key] = $item->toArray();
  233. $session_items[$item_key]['idAlternativas'] = $item->idAlternativas;
  234. $session_items[$item_key]['alternativas'] = $item->alternativas;
  235. $session_items[$item_key]['video_midia'] = $item->video_midia;
  236. $session_items[$item_key]['audio_midia'] = $item->audio_midia;
  237. $session_items[$item_key]['imagem_midia'] = $item->imagem_midia;
  238. $session_items[$item_key]['correta'] = $item->correta;
  239. }
  240. TSession::setValue(__CLASS__.'_items', $session_items);
  241. $this->form->setData($object); // fill the form with the active record data
  242. $this->onReload( $param ); // reload items list
  243. TTransaction::close(); // close transaction
  244. }
  245. else
  246. {
  247. $this->form->clear(TRUE);
  248. TSession::setValue(__CLASS__.'_items', null);
  249. $this->onReload( $param );
  250. }
  251. }
  252. catch (Exception $e) // in case of exception
  253. {
  254. new TMessage('error', $e->getMessage());
  255. TTransaction::rollback();
  256. }
  257. }
  258. /**
  259. * Save the Master/Detail data from form/session to database
  260. */
  261. public function onSave()
  262. {
  263. try
  264. {
  265. // open a transaction with database
  266. TTransaction::open('conexao');
  267. $data = $this->form->getData();
  268. $master = new Questoes;
  269. $master->fromArray( (array) $data);
  270. $this->form->validate(); // form validation
  271. $data_questao = date_create;
  272. var_dump($data->imagem_midia);
  273. $inicio= strpos($data->imagem_midia, "%2F") + 3;
  274. $final = strpos($data->imagem_midia, ".jpg") + 4;
  275. echo "**".$inicio."*".$final;
  276. $nomearq = substr($data->imagem_midia, $inicio, $final - $inicio);
  277. if($data->imagem_midia != NULL) {
  278. echo "teste";
  279. $nomeFinalImagem = "tmp/".$nomearq;
  280. echo $nomeFinalImagem;
  281. if (move_uploaded_file($data->imagem_midia, $nomeFinalImagem)) {
  282. $tamanhoImg = filesize($nomeFinalImagem);
  283. $mysqlImg = addslashes(fread(fopen($nomeFinalImagem, "r"), $tamanhoImg));
  284. $mysqlVid = $mysqlImg;
  285. $mysqlAud = $mysqlImg;
  286. }
  287. }
  288. if($data->video_midia != NULL) {
  289. $nomeFinalVideo = $idquestao.'.mp4';
  290. if (move_uploaded_file($data->video_midia['tmp_name'], $nomeFinalVideo)) {
  291. $tamanhoVid = filesize($nomeFinalVideo);
  292. $mysqlVid = addslashes(fread(fopen($nomeFinalVideo, "r"), $tamanhoVid));
  293. }
  294. }
  295. if($data->audio_midia != NULL) {
  296. $nomeFinalAudio = $idquestao.'.mp3';
  297. if (move_uploaded_file($data->audio_midia['tmp_name'], $nomeFinalAudio)) {
  298. $tamanhoAud = filesize($nomeFinalAudio);
  299. $mysqlAud = addslashes(fread(fopen($nomeFinalAudio, "r"), $tamanhoAud));
  300. }
  301. }
  302. //$link = TTransaction::get(); // obtém a conexão
  303. //$erro = mysqli_query($link, "INSERT INTO questoes (video_midia, audio_midia, imagem_midia)
  304. // VALUES ('$mysqlVid', '$mysqlAud','$mysqlImg')")
  305. //or die(mysqli_error( $link ));
  306. //$conn = TTransaction::get(); // obtém a conexão
  307. //$sth = $conn->prepare("INSERT INTO questoes (video_midia, audio_midia, imagem_midia) VALUES ('?', '?','?')");
  308. //$sth->execute(array($mysqlVid, $mysqlAud, $mysqlImg)); // passa os
  309. $master->store(); // save master object
  310. // delete details
  311. $old_items = Alternativas::where('Questoes_idQuestoes', '=', $master->idQuestoes)->load();
  312. $keep_items = array();
  313. // get session items
  314. $items = TSession::getValue(__CLASS__.'_items');
  315. if( $items )
  316. {
  317. foreach( $items as $item )
  318. {
  319. if (substr($item['idAlternativas'],0,1) == 'X' ) // new record
  320. {
  321. $detail = new Alternativas;
  322. }
  323. else
  324. {
  325. $detail = Alternativas::find($item['idAlternativas']);
  326. }
  327. $detail->alternativas = $item['alternativas'];
  328. $detail->video_midia = $item['video_midia'];
  329. $detail->audio_midia = $item['audio_midia'];
  330. $detail->imagem_midia = $item['imagem_midia'];
  331. $detail->correta = $item['correta'];
  332. $detail->Questoes_idQuestoes = $master->idQuestoes;
  333. if($detail_imagem_midia != NULL) {
  334. echo "teste";
  335. $nomeFinalImagem = $idquestao.'a'.'.jpg';
  336. if (move_uploaded_file($detail_imagem_midia['tmp_name'], $nomeFinalImagem)) {
  337. echo "teste";
  338. $tamanhoImg = filesize($nomeFinalImagem);
  339. $mysqlImgAlternativa = addslashes(fread(fopen($nomeFinalImagem, "r"), $tamanhoImg));
  340. }
  341. }
  342. if($detail_video_midia != NULL) {
  343. $nomeFinalVideo = $idquestao.'a'.'.mp4';
  344. if (move_uploaded_file($detail_video_midia['tmp_name'], $nomeFinalVideo)) {
  345. $tamanhoVid = filesize($nomeFinalVideo);
  346. $mysqlVidAlternativa = addslashes(fread(fopen($nomeFinalVideo, "r"), $tamanhoVid));
  347. }
  348. }
  349. if($detail_audio_midia != NULL) {
  350. $nomeFinalAudio = $idquestao.'a'.'.mp3';
  351. if (move_uploaded_file($detail_audio_midia['tmp_name'], $nomeFinalAudio)) {
  352. $tamanhoAud = filesize($nomeFinalAudio);
  353. $mysqlAudAlternativa = addslashes(fread(fopen($nomeFinalAudio, "r"), $tamanhoAud));
  354. }
  355. }
  356. $detail->store();
  357. $keep_items[] = $detail->idAlternativas;
  358. }
  359. }
  360. if ($old_items)
  361. {
  362. foreach ($old_items as $old_item)
  363. {
  364. if (!in_array( $old_item->idAlternativas, $keep_items))
  365. {
  366. $old_item->delete();
  367. }
  368. }
  369. }
  370. $conn = TTransaction::get(); // obtém a conexão
  371. TTransaction::close(); // close the transaction
  372. // reload form and session items
  373. $this->onEdit(array('key'=>$master->idQuestoes));
  374. $sth = $conn->prepare("UPDATE questoes SET video_midia = '?', audio_midia = '?', imagem_midia = '?' WHERE idQuestoes = '?'");
  375. $sqlretorno = $sth->execute(array('1', '2', '3', $master->idQuestoes));
  376. print_r($master->idQuestoes);
  377. print_r($sqlretorno);
  378. $pos_action = new TAction(["QuestoesList", 'onReload']);
  379. new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'), $pos_action);
  380. }
  381. catch (Exception $e) // in case of exception
  382. {
  383. new TMessage('error', $e->getMessage());
  384. $this->form->setData( $this->form->getData() ); // keep form data
  385. TTransaction::rollback();
  386. }
  387. }
  388. /**
  389. * Show the page
  390. */
  391. public function show()
  392. {
  393. // check if the datagrid is already loaded
  394. if (!$this->loaded AND (!isset($_GET['method']) OR $_GET['method'] !== 'onReload') )
  395. {
  396. $this->onReload( func_get_arg(0) );
  397. }
  398. parent::show();
  399. }
  400. }
  401. </your>
MJ

A parte mencionada está no OnSave. Obrigado!
NR

Você está executando o update após fechar a transação. Feche a transação somente após executar todos os comandos sql.
MJ

Oi Nataniel, eu fiz isso no desespero, porém já havia testado dentro da transação, e mesmo assim o Adianti grava por cima do Update (o update chega a executar). Tem alguma outra ideia de como resolver? Eu tinha pensado, tem como eu criar o TFile sem vincular ele com um campo do banco/classe? Assim o Adianti nao faria a gravação automática por cima do valor do update. Obrigado!
NR

Retire as aspas que cercam os parâmetros(interrogações):
 
  1. <?php
  2. $sth = $conn->prepare("UPDATE questoes SET video_midia = ?, audio_midia = ?, imagem_midia = ? WHERE idQuestoes = ?");
  3. ?>
MJ

Olá Nataniel, retirei as aspas, como já havia feito em outros testes, porém o problema persiste, já tentei abrir uma conexão só pra realizar este update e mesmo assim o Adianti salva por cima, vinculei os TFile com outro campo, e continua salvando um Blob de 1 byte que eu não sei de onde vem, mesmo os valores que estou inserido no Update sejam: {1, 2, 3}. Já não sei mais o que fazer cara.
MJ

Nataniel, meio que consegui fazer o Update enviar os dados para o banco, ainda não nos campos certos mas consegui, porém ele estava indo sem ser em Base64, coloquei um encoder, está funcionando, mas quando vou converter em imagem novamente, ela está corrompida.
NR

Você realmente precisa trabalhar com blob? Não pode deixar os arquivos no servidor e gravar o caminho no banco de dados?
Se realmente precisa, pra facilitar sugiro criar o campo como longtext no banco de dados e codificar com base64. Segue exemplo simples:
 
  1. <?php
  2. // gravar
  3. $item = new Model();
  4. $item->arquivo = base64_encode(file_get_contents($filename));
  5. //exibir
  6. $obj = new Model($id);
  7. $img = new TElement('img');
  8. $img->src = 'data:image/png;base64,' . $obj->arquivo;
  9. ?>