<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use App\Entity\Configuration;
use CURLFile;
use App\Services\PrestaShopWebservice;
use App\Services\PrestaShopWebserviceException;
class ImageController extends AbstractController
{
public function export(Request $request)
{
// if ($request->isXmlHttpRequest()) {
$config = $this->getDoctrine()->getRepository(Configuration::class)->findAll()[0];
try {
$ws = new PrestaShopWebservice($config->getToApiUrl(), $config->getToApiKey());
$opt = array(
'resource' => 'products',
'display' => 'full'
);
$productos = $ws->get($opt);
if ($productos) {
$ftp_server = "ksixmobile.com";
$ftp_user = "ksix_user_ftp";
$ftp_pass = "s_N2noQuS2";
$path_ftp = "/web/img/web/";
// establecer conexión FTP o finalizarla
$conexionFtp = ftp_connect($ftp_server) or die("No se pudo conectar a $ftp_server");
$resutadoLogin = ftp_login($conexionFtp, $ftp_user, $ftp_pass) or die("no logueado");
$modopasivo = ftp_pasv($conexionFtp, true);
$ficheros = ftp_nlist($conexionFtp, $path_ftp);
$ficheros = array_diff($ficheros, array(".", ".."));
// // ORDENO $FICHEROS POR ORDEN ALFABETICO
sort($ficheros);
$estructura = '<h2>Carpeta contenedora de Fotos: ' . $path_ftp . '<br/>Listado de archivos</h2>';
$estructura .= '<ul>';
// array bidimensional $FICHEROS_CORTADOS donde voy a guardar referencia y número
$ficheros_cortados = array();
for ($i = 0; $i < count($ficheros); $i++) {
if (strpos($ficheros[$i], "_") !== false) {
$cortado = explode('_', $ficheros[$i]);
$sku = $cortado[0];
if (count($cortado) == 3) {
$letra = $cortado[1];
$cortadoextension = explode('.', $cortado[2]);
$numerofoto = $cortadoextension[0];
$extension = $cortadoextension[1];
} else {
$letra = '';
$cortadoextension = explode('.', $cortado[1]);
$numerofoto = $cortadoextension[0];
$extension = $cortadoextension[1];
}
} else {
$letra = '';
$numerofoto = '';
$cortadoextension = explode('.', $ficheros[$i]);
$sku = $cortadoextension[0];
$extension = $cortadoextension[1];
}
$ficheros_cortados[$i][0] = $sku; // cogemos la referencia
$ficheros_cortados[$i][1] = $letra; // cogemos la letra intermedia
$ficheros_cortados[$i][2] = $numerofoto; // cogemos el número de la foto
$ficheros_cortados[$i][3] = $extension; // cogemos la extensión
}
// Por cada producto extraido del Prestashop
// compruebo si hay fotos en el FTP para eliminarlas en PRESTASHOP
// y almaceno las referencias en un array para luego saber cuales ha encontrado
$array_productos = array();
foreach ($productos->products->product as $producto) {
// Busco la referencia del producto en el array de fichero del FTP
echo $producto->id . ': ';
$buscar = $producto->reference;
$resultado_busqueda_fichero = array_filter($ficheros_cortados, function ($item) use ($buscar) {
return strcasecmp($buscar, $item[0]) == 0;
});
print_r($resultado_busqueda_fichero);
// Si no encuentro la referencia no hacemos nada
if (empty($resultado_busqueda_fichero)) {
//echo '';
} else {
// guardo la referencia del producto encontrado para poder recorrer en la subida
// solo aquellos que ha encontrado y reducir el tiempo de ejecución
array_push($array_productos, $producto->reference);
// Elimino las fotos que hay en PRESTASHOP
$cadena = 'images/products/' . $producto->id;
$url = $config->getToApiUrl() . 'api/' . $cadena . '?ws_key=' . $config->getToApiKey();
$ch = @curl_init($url);
@curl_setopt($ch, CURLOPT_HEADER, TRUE);
@curl_setopt($ch, CURLOPT_NOBODY, TRUE);
@curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);
@curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$status = array();
preg_match('/HTTP\/.* ([0-9]+) .*/', @curl_exec($ch), $status);
if ($status[1] == 200) {
// Existe la url de las imagenes del producto y procedo a eliminar
$opt2 = array(
'resource' => $cadena,
'display' => 'full'
);
$imagenes_del_producto = $ws->get($opt2);
$imagen_del_producto = $imagenes_del_producto->children()->children();
$numero_imagenes = count($imagen_del_producto);
foreach ($imagen_del_producto as $key => $imagenes) {
$cadena2 = 'images/products/' . $producto->id . '/' . $imagenes['id'];
$url2 = $config->getToApiUrl() . 'api/' . $cadena2 . '?ws_key=' . $config->getToApiKey();
$ch = @curl_init($url2);
@curl_setopt($ch, CURLOPT_HEADER, TRUE);
@curl_setopt($ch, CURLOPT_NOBODY, TRUE);
@curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);
@curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$status = array();
preg_match('/HTTP\/.* ([0-9]+) .*/', @curl_exec($ch), $status);
if ($status[1] == 200) {
$resultado = $this->eliminar_fotos($ws, $producto->id, $imagenes['id']);
} else {
echo 'parece que no encuentra: ' . $url2 . '<br/>';
}
}
} else {
echo ' no existe la url, porque no tiene fotos en prestashop<br/>';
}
}
}
echo var_dump($array_productos);
// Almaceno las fotos que hay en el FTP haciendo un filtrado en el webservice por Referencia
$referencia_anterior = '';
$longitud = count($ficheros_cortados);
$contador_general = 1;
for ($i = 0; $i < $longitud; $i++) {
if ($referencia_anterior <> $ficheros_cortados[$i][0]) {
$referencia_anterior = $ficheros_cortados[$i][0];
$buscar = $ficheros_cortados[$i][0];
$resultado_busqueda_fichero = array_filter($array_productos, function ($item) use ($buscar) {
return strcasecmp($buscar, $item[0]) == 0;
});
if (empty($resultado_busqueda_fichero)) {
$paso = 0;
} else {
$opt2 = array(
'resource' => 'products',
'display' => 'full',
'filter[reference]' => $ficheros_cortados[$i][0]
);
$productos_filtrados = $ws->get($opt2);
$producto_filtrado = $productos_filtrados->products->product;
$numero_productos = count($producto_filtrado);
if ($numero_productos > 0) {
//$respuesta_tpl .= '<br><strong>' . $producto_filtrado->reference . '</strong><br/>';
$paso = 1;
//$respuesta_tpl .= 'Existe el producto en prestashop<br/>';
} else {
$paso = 0;
echo $contador_general . ': <strong>' . $ficheros_cortados[$i][0] . '</strong>: ';
echo 'NO EXISTE el producto en prestashop. No se sube la foto.<br/>';
$contador_general++;
}
}
}
if ($paso == 1) {
$fichero_montado = $ficheros_cortados[$i][0];
if (strlen($ficheros_cortados[$i][1]) > 0) {
$fichero_montado .= '_' . $ficheros_cortados[$i][1];
}
if (strlen($ficheros_cortados[$i][2]) > 0) {
$fichero_montado .= '_' . $ficheros_cortados[$i][2];
}
$fichero_montado .= '.' . $ficheros_cortados[$i][3];
/*MODIFICO ESTA LINEA*/
$resultado = $this->subir_fotos($config->getToApiUrl(), $config->getToApiKey(), $producto_filtrado->id, $fichero_montado, $path_ftp);
echo $contador_general . ': <strong>' . $fichero_montado . '</strong> ' . $resultado . '.<br/>';
// se borrar las fotos del ftp
$urlfichero = $path_ftp . $fichero_montado;
/*
if (ftp_delete($conexionFtp, $urlfichero)) {
echo $urlfichero . ' se ha eliminado satisfactoriamente<br/>';
} else {
echo 'No se pudo eliminar ' . $urlfichero;
}*/
// ---------------
$contador_general++;
}
}
}
} catch (PrestaShopWebserviceException $e) {
$logFile = fopen("log.txt", 'a') or die("Error creando archivo");
fwrite($logFile, "\n" . date("d/m/Y H:i:s") . $e->getMessage()) or die("Error escribiendo en el archivo");
fclose($logFile);
}
// return new JsonResponse(true);
return $this->redirectToRoute('app_index');
// } else {
// return $this->redirectToRoute('app_index');
// }
}
/**
ELIMINACION DE FOTOS
Recibe el webService, el ID del producto, el ID de la foto a eliminar
**/
public function eliminar_fotos($ws, $producto, $foto)
{
$ruta_producto = 'images/products/' . $producto;
$xml = $ws->delete(array('resource' => $ruta_producto, 'id' => $foto));
return $ruta_producto . '/' . $foto;
}
/**
SUBIDA DE FOTOS
**/
public function subir_fotos($url, $key_api, $id_producto, $foto, $path_ftp)
{
echo "
<script>
console.log('Url: " . $url . "' );
console.log('Key api: " . $key_api . "' );
console.log('Id producto: " . $id_producto . "' );
console.log('Foto: " . $foto . "' );
console.log('Path FTP: " . $path_ftp . "' );
</script>
";
echo '<br /><br />';
$urlImage = $url . 'api/images/products/' . $id_producto;
// ubicación de la foto en el ftp
$image_path = 'https://ksixmobile.com/img/web/' . $foto;
$image_mime = 'image/jpg';
// $imageCurl = curl_init($image_path);
// curl_setopt($imageCurl, CURLOPT_RETURNTRANSFER, 1);
// $data = curl_exec($imageCurl);
$args['image'] = new CURLFile($image_path, $image_mime);
// $args['image'] = $data;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $urlImage);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_USERPWD, $key_api . ':');
curl_setopt($ch, CURLOPT_POSTFIELDS, array('image' => '@'.$image_path));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//curl_setopt($ch, CURLOPT_POSTFIELDS, $args);
//curl_setopt($ch, CURLOPT_HEADER, 1);
//curl_setopt($ch, CURLINFO_HEADER_OUT, 1);
$result = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if (200 == $httpCode) {
$respuesta = '<br/>Ha subido la foto correctamente. ' . $image_path . '<br/>';
} else {
echo 'ERROR DE CURL<br>';
var_dump(curl_error($ch));
echo 'ERROR DE PETICION<br>';
var_dump($result);
$respuesta = '<br/>Error en la inserción de la foto. ' . $image_path . ' | ' . $urlImage . '<br/>';
}
return $respuesta;
}
}