1

Тема: Symfony 2.7 Controller

Привет всем, только изучаю симфони, пробую собрать свой сайт. Вознкла проблема как решить незнаю:
Сам контроллер:

class WorkController extends Controller
{
    public function indexAction()
    {   
        $em = $this->get('doctrine')->getEntityManager();
        $data = $em->getRepository('vladCompanyBundle:HomePage')->find(1);
        return $this->render('vladCompanyBundle:Work:index.html.twig', array('data' => $data));
    }
 
    public function quoteAction()
    {   
        $quote = $em->getRepository('vladCompanyBundle:Quotes')->find(1);
        return $this->render($quote);
    }
}

Twig:

<!-- Callout -->
    <aside class="callout">
        <div class="text-vertical-center">
            <h1>{{ quote.quote }}</h1>
        </div>
    </aside>

При загрузке страницы выдаёт: Variable "quote" does not exist in vladCompanyBundle:Work:quote.html.twig at line 4
Что не правильно, подскажите

2 Отредактировано daemon_master (2015-07-15 13:39:07)

Re: Symfony 2.7 Controller

class WorkController extends Controller
{
    public function indexAction()
    {   
        $em = $this->getDoctrine()->getManager();
        $data = $em->getRepository('vladCompanyBundle:HomePage')->find(1);
        return $this->render('vladCompanyBundle:Work:index.html.twig', array('data' => $data));
    }
 
    public function quoteAction()
    {   
        $em->getDoctrine()->getManager();
        $quote = $em->getRepository('vladCompanyBundle:Quotes')->find(1);
        return $this->render('vladCompanyBundle:Work:quote.html.twig',array(
            'quote' => $quote,
        ));
    }
}

и еще в indexAction-е в шаблон вы передаете переменную data, так и должно быть?

3

Re: Symfony 2.7 Controller

Да data я передаю, так и должно быть. Вот смотрите quote.html.twig я подключаю к index.html.twig, а в quote сначала должна выйти запись из базы-данных

Re: Symfony 2.7 Controller

а покажи index.html.twig

5

Re: Symfony 2.7 Controller

    {% include 'vladCompanyBundle:Work:quote.html.twig' %}

Вот такой строчкой в index.html.twig вставляется шаблон quote

6

Re: Symfony 2.7 Controller

В данный момент такая ситуация с кодом:

public function quoteAction()
    {   
        $em = $this->get('doctrine')->getEntityManager();
        $quote = $em->getRepository('vladCompanyBundle:Quotes')->find(1);
        return $this->render('vladCompanyBundle:Work:quote.html.twig', array('quote' => $quote));
    }

Twig

{{ render(controller('vladCompanyBundle:Work:quote', {'var' : quote})) }}
            <h1>{{ quote.quote }}</h1>

Выводит: Variable "quote" does not exist in vladCompanyBundle:Work:quote.html.twig

Так понимаю, выводит то что quote не является объектом

7 Отредактировано daemon_master (2015-07-16 00:20:31)

Re: Symfony 2.7 Controller

{{ render(controller('vladCompanyBundle:Work:quote', {'var' : quote})) }}

Так вы пытаетесь вызвать quoteAction из шаблона и передать в него аргументы. Ваш экшн ничего не принимает.

Лучше напиши, что хочется в итоге получить, а то сейчас это смотрится все очень странно.

8

Re: Symfony 2.7 Controller

У меня есть таблица в БД с цитатами, вывод цитат будет производиться на всех страницах, не только на главной. Чтоб на каждой странице не повторять один и тот же код:

<!-- Callout -->
    <aside class="callout">
        <div class="text-vertical-center">
            <h1>ТУТ ЦИТАТА!</h1>
        </div>
    </aside>

Я вывел цитату и html код в который она помещяется в отдельный twig шаблон quote.html.twig. Теперь я могу подключать этот шаблон на любой странице в любом месте с помощью include. Но цитаты должны браться из БД рандомным образом. Пока я просто пробовал вывести цитату из таблицы с id=1. Для этого в котроллере создал quoteAction(), чтоб он брал из БД цитату и чтоб из шаблона quote можно было вытащить из контроллера эту цитату. Но не получается.
А насчёт indexAction, его я использую чтоб вставить данные из БД таблицы homepage в шаблон index.html.twig - главная страница.

9

Re: Symfony 2.7 Controller

Решил проблему таким способом:

public function indexAction()
    {   
        $em = $this->get('doctrine')->getEntityManager();
        $data = $em->getRepository('vladCompanyBundle:HomePage')->find(1);
        $quote = $em->getRepository('vladCompanyBundle:Quotes')->find(1);
        return $this->render('vladCompanyBundle:Work:index.html.twig', array('data' => $data, 'quote' => $quote));
    }
<!-- Callout -->
    <aside class="callout">
        <div class="text-vertical-center">
            <h1>{{ quote.quote }}</h1>
        </div>
    </aside>

но ведь для других страниц придётся заново прописывать

10

Re: Symfony 2.7 Controller

$quote = $em->getRepository('vladCompanyBundle:Quotes')->find(1);

11

Re: Symfony 2.7 Controller

QuoteRepository.php

class QuoteRepository
{
    public function findMaxId()
    {
        return $this->createQueryBuilder('q')
           ->select('MAX(q.id)')
           ->getQuery()
           ->getSingleScalarResult()
        ;
    }
 
    public function findRandom()
    {
        $maxId = $this->findMaxId();
        $id = mt_rand(1, $maxId);
 
        return $this->createQueryBuilder('q')
          ->where('q.id >= :id')
          ->setParameter('id', $id)
          ->setMaxResults(1)
          ->getQuery()
          ->getOneOrNullResult()
       ;
    }
}

QuoteController.php

class QuoteController extends Controller
{
   public function randomAction()
   {
     $quote = $this->getDoctrine()
        ->getRepository(Quote::class)
        ->findRandom()
     ;
 
    return $this->render('vladCompanyBundle:Quote:random.html.twig', [
      'quote' => $quote,
    ]);
   }
}

random.html.twig

{% if quote is not null %}
    <aside class="callout">
        <div class="text-vertical-center">
            <h1>{{ quote.quote }}</h1>
        </div>
    </aside>
{% endif %}

index.html.twig

{{ render(controller('vladCompanyBundle:Quote:random')) }}

Должно быть примерно так, исходя из ваших потребностей. Писал код прямо в комментах, возможно где-то опечатался

12

Re: Symfony 2.7 Controller

->getRepository(Quote::class)

на этой строке след ошибка:
Parse Error: syntax error, unexpected 'class' (T_CLASS), expecting identifier (T_STRING) or variable (T_VARIABLE) or '{' or '$'

13

Re: Symfony 2.7 Controller

У вас PHP ниже версии 5.5, замени на строковый путь, как у тебя было

14

Re: Symfony 2.7 Controller

An exception has been thrown during the rendering of a template ("Undefined method 'findRandom'.
Не находит метод findRandom

15

Re: Symfony 2.7 Controller

Всё получилось, большое спасибо вам!