We have moved our forum to GitHub Discussions. For questions about Phalcon v3/v4/v5 you can visit here and for Phalcon v6 here.

Undefined Variable

I am trying to get volt setup in phalcon. I used the dev tools to create the project. I tried to pass in a variable using both methods, the magic method and the setVar() method.

$posts = new Posts();
$posts->title = "asdf";
$this->view->posts = $posts; 
#and 
$this->view->setVar("posts", $posts);

Then in my index.volt file under ../views/posts/index.volt

<h1>Congratulations!</h1>
{% if ((posts is empty))  %}
<p>empty</p>
{% endif %}
<p>{{ posts.title }}<p>                 # <- THIS IS THE TROUBLED CODE
<p>You're now flying with Phalcon. Great things are about to happen!</p>

It displays: https://picpaste.com/pics/Screen_Shot_2014-10-16_at_4.49.07_PM-U1ZRXQMX.1413492690.png

What am I doing wrong? Any help is apreciated.

Thanks,

Stephen



3.1k

Ok, so the top part of your code is going on in the controller?

Lose the $this->view->setVar("posts", $posts); part! And also lose the brackets around ((posts is empty)). And change your syntax. Just use {% if not posts %}

GL!

edited Oct '14

Thanks, but I was showing both of the methods that I have tried to use. Currently there is $this->view->posts = $posts;.



3.1k

You're talking aboutt volt here. So losing one of those methods in your controller doesn't count here as far as this question is concerned.

If you edit your .volt-file: are you seeing the expected results? If not, then what do you see? Help us help you dude... thanks!

I attached the screenshot in the original post below the code. Thanks.

This is the Setting up the view component in services.php that theoretically allows me to use volt. (Correct?)

    $di->set('view', function () use ($config) {

    $view = new View();

    $view->setViewsDir($config->application->viewsDir);

    $view->registerEngines(array(
        '.volt' => function ($view, $di) use ($config) {

            $volt = new VoltEngine($view, $di);

            $volt->setOptions(array(
                'compiledPath' => $config->application->cacheDir,
                'compiledSeparator' => '_'
            ));

            return $volt;
        },
        '.phtml' => 'Phalcon\Mvc\View\Engine\Php'
    ));

    return $view;
    }, 
    true);


58.4k

Hey I think you should upload full source on github, maybe I will help you

Hey here's the link, thanks.



58.4k
edited Oct '14

Hey

I don't see you code in indexAction, you should look like


 public function indexAction()
  {
  $posts = Posts::find();
  $this->view->setVar('post', $posts);
  }

Then in view(index.volt):

{% for item in post %}
 {{item.title}}
{%endfor%

I am using mongo, but I am trying to get this to work without it. So that I know that it is not my mongo connection that is failing. That is why I created the $test Post. The current code:

   public function indexAction()
    {
        #$posts = Posts::find(array(array(), "limit" => 10));
        $test = new Posts();
        $test->title = "asdf";
        $this->view->setVar('post', $test);
    }

If I add my code to the indexAction() no html renders, instead I get these error boxes:

  • Undefined property: PostsController::$view in /Users/Stephen/Sites/blog_v2/blog/app/controllers/PostsController.php

  • Fatal error: Call to a member function setVar() on a non-object in /Users/Stephen/Sites/blog_v2/blog/app/controllers/PostsController.php on line 12.

The stacks are the same for both

####### Time Memory Function Location

1 0.0001 240104 {main}( ) ../index.php:0

2 0.0005 274112 handle ( ) ../index.php:27

3 0.0007 321120 PostsController->indexAction( ) ../index.php:0

Thanks for the help.



58.4k

Hey I dont know why this, but you can test simple, like this

   public function indexAction()
    {
        #$posts = Posts::find(array(array(), "limit" => 10));

        $this->view->setVar('post', 'This is test');
    }

this is working yet

I tried that, and adjusted the volt file to say {{ post }}. I still get the same errors as the previous post.



58.4k
Accepted
answer
edited Oct '14

well, i see problem of you that is controller Post

class PostsController extends \Phalcon\Mvc\Collection
{

Change to

class PostsController extends \Phalcon\Mvc\Controller
{

I test that ok, note that \Phalcon\Mvc\Collection used to Model not controller

That did it. I think I accidentally changed the PostsController extends MVC\Controller to MVC\Collection instead of changing the Model. I thought I was going insane. Thanks!