Fórum OpenCart Brasil

Por um e-commerce livre, confiável e profissional

Suporte geral sobre problemas técnicos para OpenCart v2.x.
#82523
Boa tarde,

Estou tentando levar um valor de uma option da minha view até o model e retornar com os valores.

Consegui enviar o valor da view para o controller, mas o json de retorno está dando o seguinte erro:
VM3050:1 Uncaught SyntaxError: Unexpected token < in JSON at position 0
at JSON.parse (<anonymous>)
at Function.n.parseJSON (jquery-2.1.1.min.js?j2v=2.11:4)
at Function.e.parseJSON (jquery-migrate-1.2.1.min.js?j2v=2.11:2)
at Object.success (index.php?route=account/customerpartner/addproduct:1705)
at j (jquery-2.1.1.min.js?j2v=2.11:2)
at Object.fireWith [as resolveWith] (jquery-2.1.1.min.js?j2v=2.11:2)
at x (jquery-2.1.1.min.js?j2v=2.11:4)
at XMLHttpRequest.<anonymous> (jquery-2.1.1.min.js?j2v=2.11:4)
n.parseJSON @ jquery-2.1.1.min.js?j2v=2.11:4
e.parseJSON @ jquery-migrate-1.2.1.min.js?j2v=2.11:2
success @ index.php?route=account/customerpartner/addproduct:1705
j @ jquery-2.1.1.min.js?j2v=2.11:2
fireWith @ jquery-2.1.1.min.js?j2v=2.11:2
x @ jquery-2.1.1.min.js?j2v=2.11:4
(anonymous) @ jquery-2.1.1.min.js?j2v=2.11:4
load (async)
send @ jquery-2.1.1.min.js?j2v=2.11:4
ajax @ jquery-2.1.1.min.js?j2v=2.11:4
(anonymous) @ index.php?route=account/customerpartner/addproduct:1697
dispatch @ jquery-2.1.1.min.js?j2v=2.11:3
r.handle @ jquery-2.1.1.min.js?j2v=2.11:3

Seguem os códigos que fiz.

Controller
Código: Selecionar todos
public function getProductCategID() {
			
		$id = $this->request->post['id_product_category'];
		 
		$data['product_subcategories1'] = array();
		
		$subcategory1_info = $this->model_account_customerpartner->getSubcategory1($id); 
		
			foreach ($subcategory1_info as $subcategory1) {

				if ($subcategory1) {
					$data['product_subcategories1'][] = array(
						'level'  => $subcategory1['level'],
						'name' => $subcategory1['name'],
						'parent_id' => $subcategory1['parent_id'],
						'category_id' => $subcategory1['category_id']
					);
				
					$this->response->addHeader('Content-Type: application/json');
					$this->response->setOutput(json_encode($data['product_subcategories1']));
				
				}
			}
	}
View
Código: Selecionar todos
<script>

$('#product-category').on('change',function(){ 
    var value = $(this).val();
    alert(value);
	
	$.ajax({
            url: "index.php?route=account/customerpartner/addproduct/getProductCategID/",
            type: "post",
            data: { 'id_product_category':value },
            datatype: "json",
			cache: false,
            success: function (data) {
                alert('success');
                var price = jQuery.parseJSON(data);
				console.log(price);
            },
			
			error: function(){
				alert('failure');
			}
        });
		
		});
</script>
Obs: a função do controller que criei está fora da função "index". Não sei se isso é problema, mas vale a pena avisar

Se puder me ajudar a resolver o erro, agradeço!
#82525
Olá @João Vitor Dias.

Legal, vi que você está buscando realizar as modificações no padrão MVC com POO. ;)

Então vamos lá!

Na view a única observação é referente a URL dentro do $.ajax que está com uma barra / no final, sendo que essa barra não é necessária.

Para saber onde está ocorrendo o problema, aconselho que primeiro você realize uma depuração dentro da função getProductCategID do seu controller, para isso você pode utilizar a função de log nativa do OpenCart abaixo:
$this->log->write();

Sendo que essa função nativa pode ser utilizada dentro de arquivos controller e model, mas não no view.

Tudo que for registrado através da função acima, você poderá visualizar o resultado através da página de log de erros do OpenCart, então dentro da sua função getProductCategID, após a linha de código abaixo:
$id = $this->request->post['id_product_category'];

Você pode adicionar a linha abaixo:
$this->log->write($id);

Assim você poderá verificar se realmente está recebendo o ID esperado. :)

Outro detalhe importante é que você está invocando um model sem instanciá-lo, ou seja, você está utilizando o model abaixo:
$subcategory1_info = $this->model_account_customerpartner->getSubcategory1($id);

Sem antes instanciá-lo:
$this->load->model('account/customerpartner');

Por último você está invocando a saída em JSON dentro do loop foreach, quando ela deveria está após o loop, ou seja, o código com as correções seria:
Código: Selecionar todos
public function getProductCategID() {
	$id = $this->request->post['id_product_category'];
	$this->log->write($id);

	$data['product_subcategories1'] = array();

	$this->load->model('account/customerpartner');
	$subcategory1_info = $this->model_account_customerpartner->getSubcategory1($id); 

	foreach ($subcategory1_info as $subcategory1) {
		if ($subcategory1) {
			$data['product_subcategories1'][] = array(
				'level'  => $subcategory1['level'],
				'name' => $subcategory1['name'],
				'parent_id' => $subcategory1['parent_id'],
				'category_id' => $subcategory1['category_id']
			);
		}
	}

	$this->response->addHeader('Content-Type: application/json');
	$this->response->setOutput(json_encode($data['product_subcategories1']));
}

Espero ter ajudado. :D

Gente preciso de ajuda urgente. Na migraç&a[…]

Caro @reds , muito obrigado pela resposta.

PHP 8+ incompatibilidade

Toda tradução para a versão 3[…]

Ola @alex3257 Se você precisa apenas ver […]