spabloramirez
3/3/2015 - 8:23 AM

symfony

JAVASCRIPT

$(document).on('click', '[data-util]', this.ajaxSetValoracion.bind(this));

ajaxSetValoracion: function (e) {
    e.preventDefault();
    var $elem = $(e.target);
    var data = {
        util: $elem.parent().data('util'),
        id: $elem.closest('.opiniones-item').attr('id')
    }
    $elem.closest('.tu-opinion').html('<div class="texto"><span class="icon-check"></span> Gracias por tu voto</div>');
    tools.getAjaxJson(URL_SET_OPINION_UTIL,data,function (result){
        if(result.status){
            var opiniones_valoradas = JSON.parse(tools.readCookie('opiniones_valoradas')) || {};//obtener cookie opiniones o crear objeto en vacio
            opiniones_valoradas[data.id]=data.util;//añadirle un valor
            tools.createCookie('opiniones_valoradas',JSON.stringify(opiniones_valoradas,30));//actualizar cookie
        }
    });
}

getAjaxJson: function (url,data,callback) {
    $.ajax({
        url: url,
        type: 'POST',
        dataType: 'json',
        data: data,
        contentType: 'application/x-www-form-urlencoded;charset=UTF-8'
    }).done(function (data) {
        callback(data);
    });
}

RUTAS
_ajax_setOpinionUtil:
    path: /setOpinionUtil
    methods: [POST]
    defaults:
        _controller: eZDemoBundle:Opiniones:setOpinionUtil
        
CONTROLADOR
public function setOpinionUtilAction(Request $request){
    $result = $this->get('opiniones')->setOpinionUtil(  $request->request->get('id'),$request->request->get('util'));
    $response = new Response( json_encode( array("status"=>(bool)$result) ) );
    // mark the response as either public or private
    $response->setPublic();
    $response->setPrivate();

    // set the private or shared max age
    $response->setMaxAge(3600);
    $response->setSharedMaxAge(3600);
    $response->headers->set('Content-Type', 'application/json');

    return $response;
}
    
MODELO
public function setOpinionUtil($id,$util){
    $sql = "UPDATE intm_results ";
    if($util == "si"){
        $sql .= "set val_rating_util_si = (val_rating_util_si + 1) ";
    }elseif($util == "no"){
        $sql .= "set val_rating_util_no = (val_rating_util_no + 1) ";
    }
    $sql .= "where val_result_id = $id ";
    $row_affected = $this->db->executeUpdate($sql);
    return $row_affected;
}
use Symfony\Component\HttpFoundation\Request;

public function updateAction(Request $request)
{
    // $_GET parameters
    $request->query->get('name');

    // $_POST parameters
    $request->request->get('name');
}
app/        (configuración)
    cache/
    config/  
    logs/
bin/        (archivos compilados)
src/        (bundles)
    ...
vendor/     (librerías de terceros.)
    ...
web/        (archivos que se pueden acceder públicamente.)
    app.php (controlador frontal)
    ...

//*instalacion*/
Instalar composer
cd c:\wamp\www
$composer create-project symfony/framework-standard-edition myProyect/ "2.3.*"

$cd myProyect/
$php app/check.php

añadir al php.ini (servidor web)
xdebug.max_nesting_level=250;

http://localhost/myProyect/web/app_dev.php 


/*CONSOLA------------------------------------------------------------------------------*/
//crear un bundle
php app/console generate:bundle --namespace=Acme/HelloBundle --format=yml
php app/console cache:clear --env=prod --no-debug
http://localhost/symfonyTutorial/web/app_dev.php/hello/test

//listar servicios
php app/console container:debug


/*PLANTILLAS------------------------------------------------------------------------------*/
//Extender de una plantilla GENERAL (::) no pertenece a ningún bundle y que por tanto, se encuentra en el directorio app/Resources/views
{% extends '::base.html.twig' %}
{% extends 'AcmeBlogBundle::layout.html.twig'%}//plantilla general del bundle(en la capeta views)

{{ ... }}//variable
{% ... %}//comentario

{% for item in navigation %}
    <li><a href="{{ item.href }}">{{ item.caption }}</a></li>
{% endfor %}

{{ title|upper }}//modificadores

//generar una url
<li><a href="{{ path( '_welcome' ) }}">Ir a la home</a></li>
<li><a href="{{ path( 'acme_blog_pagination',{page:5} ) }}">Ir al Blog</a></li>

//enlazar contenido
<img src="{{ asset('images/logo.png') }}" alt="Symfony!" /> 
<link href="{{ asset('css/blog.css') }}" rel="stylesheet" type="text/css" />

//cargar otra plantilla
 {{ include(
    'AcmeBlogBundle:blocks:myBlock.html.twig',
    {'contentBlock': 'contenido del bloque','variable2': 'valor2'}
) }}

 //cargar un controlador
 {{ render(controller('AcmeBlogBundle:Blog:getBlock', 
               {'contentBlock': 'cargado desde el controlador'}
)) }}

//cargar un controlador por ajax (necesarion tener hinclude.js)
{{ render_hinclude(controller('...'), {
    'default': 'AcmeDemoBundle:Default:content.html.twig'
}) }}

/*CONFIGURACION------------------------------------------------------------------------------*/
app/config/config.yml //configuracion global de los bundles

/*CONTROLADORES------------------------------------------------------------------------------*/
//Funcion crear y devolver un objeto Response
 public function indexAction($name,$defaultParam,$optionalParam="null")
{    	
    return $this->render('AcmeHelloBundle:Hello:index.html.twig', array('name' => $name,'defaultParam'=>$defaultParam));
}
//redirigir
return $this->redirect($this->generateUrl('homepage'));
//llamar a otro controlador
$response = $this->forward('AcmeHelloBundle:Hello:fancy', array(
    'name'  => $name,
    'color' => 'green'
));
return $response;

//guardar plantilla
$content = $this->renderView(
    'AcmeHelloBundle:Hello:index.html.twig',
    array('name' => $name)
); 
return new Response($content);
//renderizar plantilla
return $this->render(
    'AcmeHelloBundle:Hello:index.html.twig',
    array('name' => $name)
);
//cargar plantilla segun el controlador
return array('value'=>'valor') //busca una vista que se llame igual que el Action en una carpeta que se llame igual que el controlador
//acceder a servicios
$templating = $this->get('templating'); 
$router = $this->get('router'); 
$mailer = $this->get('mailer');

// crea una respuesta JSON con código de estado 200
$response = new Response(json_encode(array('name' => $name)));
$response->headers->set('Content-Type', 'application/json');






/*RUTAS------------------------------------------------------------------------------*/
//siempre se ejecuta routing.yml (independiente del modo de ejecucion)
app:
    resource: @AppBundle/Controller/
    type:     annotation
//ANOTACIONES
C:\xampp\htdocs\symfony01\src\AppBundle\Controller\DefaultController.php
 /**
     * @Route("/", name="homepage")
 */



bundle:controlador:acción
//Home
_welcome:
    path:      /
    defaults:  { _controller: AcmeDemoBundle:Main:homepage }

//con variables
blog_show:
    path:      /blog/{slug}
    defaults:  { _controller: AcmeBlogBundle:Blog:show }

//pasar parametro por defecto
blog:
    path:      /blog/{page}
    defaults:  { _controller: AcmeBlogBundle:Blog:index, page: 1 }
    requirements:
        page:  \d+ //debe ser un entero
//condiciones (_locale _format y _controller son variables especiales de entrutamiento)
article_show:
  path:     /articles/{_locale}/{year}/{title}.{_format}
  defaults: { _controller: AcmeDemoBundle:Article:show, _format: html }
  requirements:
      _locale:  en|fr  //opciones posible
      _locale: %acme_demo.locales% //leer variable global del config.yml
      _format:  html|rss 
      year:     \d+ //debe ser un entero
  methods:  [GET] //filtrar metrodo

//importar rutas
  acme_hello:
    resource: "@AcmeHelloBundle/Resources/config/routing.yml"
//prefijar rutas importadas
    prefix:   /admin/ //añade un patron delante de todas las rutas importado http:/..../admin/ruta

//listar rutas
php app/console router:debug
//ver contenido
php app/console router:debug article_show
//probar ruta
php app/console router:match /blog/my-latest-post

/*PETICIONES----------------------------------------------------------------------*/
//Los datos de la peticion se guardan en un objeto Request
use Symfony\Component\HttpFoundation\Request; 
public function indexAction(Request $request){
    // ¿es una petición Ajax?
    $request->isXmlHttpRequest();
 
    $request->getPreferredLanguage(array('en', 'fr'));
 
    // obtiene el valor de un parámetro $_GET
    $request->query->get('page');
 
    // obtiene el valor de un parámetro $_POST
    $request->request->get('page');
}

/*SESIONES--------------------------------------------------------------------------*/
use Symfony\Component\HttpFoundation\Request; 
public function indexAction(Request $request)
{
    $session = $request->getSession(); 
    // guarda un atributo para reutilizarlo durante una
    // petición posterior del usuario
    $session->set('foo', 'bar'); 
    // obtener el valor de un atributo de la sesión
    $foo = $session->get('foo'); 
    // utilizar un valor por defecto si el atributo no existe
    $filters = $session->get('filters', array());
}

/*Varios---------------------------------------------------------------------------*/
//crear una excepcion 404
throw $this->createNotFoundException('El producto solicitado no existe.');

/*URL*/
// /blog/2?category=Symfony (relativa)
$router->generate('blog', array('page' => 2, 'category' => 'Symfony'));//controlador
<a href="{{ path('blog_show', { 'slug': 'my-blog-post' }) }}">Read this blog post.</a>//vista
//http://www.example.com/blog/my-blog-post (absoluta)
$router->generate('blog_show', array('slug' => 'my-blog-post'), true);
<a href="{{ url('blog_show', { 'slug': 'my-blog-post' }) }}">Read this blog post.</a>



//FLUJO
C:\xampp\htdocs\symfony01\app\config\routing.yml //se carga siempre
//ORM
Entidad una clase que representa una tabla en BBDD