Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Alexandre Di Salvo

[Resolvido] ExtJS não exibe conteúdo do Cake

Recommended Posts

Sem código fica dificil =/

Vou passar uns tutos aqui:

 

http://blog.cakephp-brasil.org/2008/09/11/trabalhando-com-json-no-cakephp-12/

http://www.pagebakers.nl/2007/06/05/using-json-in-cakephp-12/

 

Agora sobre combinar ExtJS + CakePHP provavelmente é possivel. Porém não vou entrar em detalhes por não conhecer muito ExtJS.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sem código fica dificil =/

Vou passar uns tutos aqui:

 

http://blog.cakephp-...-no-cakephp-12/

http://www.pagebaker...-in-cakephp-12/

 

Agora sobre combinar ExtJS + CakePHP provavelmente é possivel. Porém não vou entrar em detalhes por não conhecer muito ExtJS.

 

Então meu caro, obrigado pelos tutos, já os conhecia, os mesmo geram um arquivo .json e isso já estou fazendo numa boa :rolleyes:

 

O problema agora é fazer o ExtJs reconhecer o json recebido e montar uma grid ou uma tabela. Segue o código de exemplo que estou fazendo, bem simples.

 

Controller:

 

<?php
class UsersController extends AppController {

	var $name = 'Users';
	var $helpers = array('Html', 'Form', 'Javascript', 'Ajax');
	var $components = array( 'RequestHandler' );


	function index() {
		$this->User->recursive = 0;
		$this->set('users', $this->paginate());
	}
	
//	function index($json = false) {
//		$this->User->find('list');
//		$this->set('users', $this->paginate());
//		if ($json) {
//			$this->view = 'Json';
//			$this->set('json', 'users');
//		}
//	}


	function view($id = null) {
		if (!$id) {
			$this->Session->setFlash(__('Invalid User.', true));
			$this->redirect(array('action'=>'index'));
		}
		$this->set('user', $this->User->read(null, $id));
	}

	function add() {
		if (!empty($this->data)) {
			$this->User->create();
			if ($this->User->save($this->data)) {
				$this->Session->setFlash(__('The User has been saved', true));
				$this->redirect(array('action'=>'index'));
			} else {
				$this->Session->setFlash(__('The User could not be saved. Please, try again.', true));
			}
		}
	}

	function edit($id = null) {
		if (!$id && empty($this->data)) {
			$this->Session->setFlash(__('Invalid User', true));
			$this->redirect(array('action'=>'index'));
		}
		if (!empty($this->data)) {
			if ($this->User->save($this->data)) {
				$this->Session->setFlash(__('The User has been saved', true));
				$this->redirect(array('action'=>'index'));
			} else {
				$this->Session->setFlash(__('The User could not be saved. Please, try again.', true));
			}
		}
		if (empty($this->data)) {
			$this->data = $this->User->read(null, $id);
		}
	}

	function delete($id = null) {
		if (!$id) {
			$this->Session->setFlash(__('Invalid id for User', true));
			$this->redirect(array('action'=>'index'));
		}
		if ($this->User->del($id)) {
			$this->Session->setFlash(__('User deleted', true));
			$this->redirect(array('action'=>'index'));
		}
	} 
	
	function exibir(){

		$userArray = array();	//this will hold our data from the database.
 	$this->layout = 'Ajax'; //this tells the controller to use the Ajax layout instead of the default layout.
 	$userA = $this->User->findAll(null,'*','last_name ASC'); //gets all the User records and sorts them by last name.
		$userArray = Set::extract($userA, '{n}.User');
		$this->set('users','{"users":'.json_encode($userArray).'}');

	}

}
?>

 

E aqui minha view Exibir

 

<div id="grid-panel">

 <div id="grid-paging" style="border:1px solid #99bbe8;overflow:hidden; width: 665px; height: 00px;">

	<?php echo $users; ?>

	<?php echo '{"users":'.$javascript->Object($users).'}'; ?> 

	</div>

</div>

Teoricamente era pro ExtJs já carregar uma grid com os dados, visto que já carreguei seu .js no default.ctp

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você ja checou se o código gerado é oque espera?

Tente por dados "na mão", aí se não der provavelmente é problema no ExtJS. E será que find('list') - com alguns parametros - não cairía melhor que findAll ou find('all')?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você ja checou se o código gerado é oque espera?

Tente por dados "na mão", aí se não der provavelmente é problema no ExtJS. E será que find('list') - com alguns parametros - não cairía melhor que findAll ou find('all')?

 

É meu caro, fato é que mesmo sem os dados o Cake deveria exibir o layout do ExtJs, somente o formulário, mas nem isso tá rolando, muito estranho. Testei o código do Ext fora do ambiente Cake e funcionou perfeitamente, pelo menos a visualização do layout.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então se deu certo fora do cake, e no cake não, deve estar dando algum problema ao inserir os arquivos.

Verifique se está tudo certinho no webroot e poste o código donde você insere os arquivos.

 

OBS: Perceba que você está usando o layout de ajax, portanto não se esqueça de inserir nele ou na propria view (ou no "layout" pai)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então se deu certo fora do cake, e no cake não, deve estar dando algum problema ao inserir os arquivos.

Verifique se está tudo certinho no webroot e poste o código donde você insere os arquivos.

 

OBS: Perceba que você está usando o layout de ajax, portanto não se esqueça de inserir nele ou na propria view (ou no "layout" pai)

 

Não entendi a parte sobre o Ajax.

 

Aqui um trecho do default.ctp que insiro os .js do ExtJs

 

<head>
	<?php echo $html->charset(); ?>
	<title>
		<?php __('CakePHP: the rapid development php framework:'); ?>
		<?php echo $title_for_layout; ?>
	</title>
	<?php
	
		echo $html->meta('icon');
		echo $html->css('cake.generic');
		echo $html->css('js/ext/resources/css/ext-all');
	?>
	
	<?php
 	echo $javascript->link('ext/adapter/ext/ext-base.js');
 	echo $javascript->link('ext/ext-all-debug.js');
 	//echo $javascript->link('teste.js');
 		//echo $javascript->link('myScript.js');

 	//echo $content_for_layout; 

	?>

</head>

E aqui na view:

 

<div id="grid-panel">

 <div id="grid-paging" style=" border:1px solid #99bbe8; overflow:hidden; width: 665px; height: 500px; ">

 	<?php echo $javascript->link('teste.js'); ?>

	</div>

</div>

Já li, reli, criei outro projeto de exemplo, estudei e nada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tipo, você viu o código fonte? De uma olhada se ele está inserindos os JS e se tiver, pegue o caminho ao qual ele esta inserindo e cole no navegador e veja se ele encontra este arquivo.

Exemplo:

<script src="http://meusite.com/meuarquivo.js"></script>
Aí você pega o http://meusite.com/meuarquivo.js e cole no navegador para ver se existe.

 

OBS: pelo pouco que estudei sobre ExtJS tinha que inserir os arquivos em ordem, como não me lembro muito bem..... você fez isso? xD

 

E sobre a parte de ajax que você disse que não entendeu:

 

Você viu que está usando o layout de ajax na action exibir certo?

$this->layout = 'Ajax'

Então se você estiver acessando esta action diretamente não funcionará mesmo, foi isso que eu quis dizer ;D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tipo, você viu o código fonte? De uma olhada se ele está inserindos os JS e se tiver, pegue o caminho ao qual ele esta inserindo e cole no navegador e veja se ele encontra este arquivo.

Exemplo:

<script src="http://meusite.com/meuarquivo.js"></script>
Aí você pega o http://meusite.com/meuarquivo.js e cole no navegador para ver se existe.

 

OBS: pelo pouco que estudei sobre ExtJS tinha que inserir os arquivos em ordem, como não me lembro muito bem..... você fez isso? xD

 

E sobre a parte de ajax que você disse que não entendeu:

 

Você viu que está usando o layout de ajax na action exibir certo?

$this->layout = 'Ajax'

Então se você estiver acessando esta action diretamente não funcionará mesmo, foi isso que eu quis dizer ;D

 

Ok ok, quanto aos scripts eles estão corretos. Aparecem no código fonte e etc.

 

Já acessar a action diretamente e faço o seguinte... digito a url manualmente na barra de endereços e acesso. Só isso. :S

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente colocar diretamente na view:

echo $javascript->link('ext/adapter/ext/ext-base.js');
        echo $javascript->link('ext/ext-all-debug.js');
<div id="grid-panel">
(...)
Se não der.... cara... tem algo muito bugado aí xDD

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente colocar diretamente na view:

echo $javascript->link('ext/adapter/ext/ext-base.js');
 echo $javascript->link('ext/ext-all-debug.js');
<div id="grid-panel">
(...)
Se não der.... cara... tem algo muito bugado aí xDD

 

Opa, agora consegui uma parte.

 

Retirei o css padrão do cake, e deu um load na interface do ExtJs numa boa. :)

 

Agora o problema é quando vou gravar os dados. Ele pega os dados numa boa, estou verificando via Firebug, mas na hora de chamar a function dá um erro de Missing Controller.

 

Undefined variable: javascript

Já carreguei o helper e nada! oO

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas parece que ainda não está carregando o helper.

Para ter certeza crie um este arquivo: app/app_controller.php

Com o conteudo:

<?php
class AppController extends Controller {
    var $helpers = array('Javascript'); // coloque aqui todos os helpers que você quer utilizar
}
?>

E veja se o "Undefined variable" não desaparece. E sobre o Missing Controller, verifica se o controller que você está tentando acessar realmente existe.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas parece que ainda não está carregando o helper.

Para ter certeza crie um este arquivo: app/app_controller.php

Com o conteudo:

<?php
class AppController extends Controller {
 var $helpers = array('Javascript'); // coloque aqui todos os helpers que você quer utilizar
}
?>

E veja se o "Undefined variable" não desaparece. E sobre o Missing Controller, verifica se o controller que você está tentando acessar realmente existe.

 

Tudo resolvido cara ;)

Valeu pelo auxílio.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.