php - Twig with MVC - how to get variable after run action file

889

I'm building my PHP project with MVC and Twig and I'm having problem with return one variable string after form validation on action 'input'. Here is my controller file:

// index.php file - here is the begin

require_once './vendor/autoload.php';
//require_once "autoloader.php";
require_once "class/blogcore.php";
require_once "class/pagination.php";
require_once "class/post.php";
require_once "class/validation.php";

$conf = parse_ini_file("config.ini");
$lang = parse_ini_file($conf['LANG_PATH']);
$db = new PDO('mysql:host='.$conf['DB_HOST'].';dbname='.$conf['DB_NAME'].';charset='.$conf['DB_CHARSET'], $conf['DB_USER'], $conf['DB_PASS']);

/*
** This is the controller file
*/

$action = !empty($_GET['action']) ? $_GET['action'] : 'Index';
require_once 'actions/' . $action . '.php';

$action = new $action($db, $lang);
$data = $action->generate();
$template = $action->getTemplate();

if ($template) {
    $loader = new Twig_Loader_Filesystem('templates');
    $twig = new Twig_Environment($loader);
    echo $twig->render($template, $data);   
}

Here is myindex.php file which is displaying the index page:

// '/class/index.php' file with class called 'Index'

class Index {
    private $lang;
    private $db;

    public function __construct($db, $lang) {
        $this->lang = $lang;
        $this->db = $db;
    }

    public function generate() {

        // new Core object 
        $core = new BlogCore($this->db);

        /*
        ** pagination
        */
        $numRows = $core->getNumRows();
        $pagination = new Pagination($_GET['p']);
        $pagination->setNumRows($numRows);
        $pagination->setLimit(3); // set 3 posts on one page
        $limit = $pagination->sqlPagination();
        $offset = $pagination->sqlPaginationOffset($limit);

        /*
        ** select detalis form database
        */
        $posts = $core->select($limit, $offset);

        return [
                "posts"         => $posts,
                "pagination"    => $pagination,
                "lang"          => $this->lang
                ];
    }

    public function getTemplate() {
        return "default.tpl";
    }
}

And here is theinsert.php file which is used on actioninsert (just when I want do input new data from form to my db). Here I'm checking with regular expression that data filled in fields are correctly. And if not, here I want to return to template my variable which will be displaying notification for user.

// '/class/insert.php' file with 'Insert' class

class Insert {
    private $lang;
    private $db;
    private $postText;
    private $fileName;
    private $myFile;
    private $phoneValidate;
    private $urlValidate;

    public function __construct($db, $lang) {
        $this->lang = $lang;
        $this->db = $db;
    }

    public function generate() {

        $postText   = $_POST["postText"];
        $myFile     = $_FILES["myFile"];
        $fileName   = $myFile["name"];
        $phoneNum   = $_POST['phoneNumber'];
        $url        = $_POST['url'];

        $validate   = new Validation;

        $phoneValidate = "test";
        // phoneValidate for form validation
        if (!$validate->phoneNum(isset($phoneNum))) {
            $phoneValidate = "error";
        } else {
            $phoneValidate = "ok";
        }

        // new Core object
        $core = new BlogCore($this->db);

        // do insert in SQL
        if (!empty($postText)) {
            $core->insert($postText, $fileName);
            $core->saveFile($myFile);
        }

        header("Location: /codeme/06_blog_v5_mvc/index.php");
    }

    public function getTemplate() {
        return null;
    }
}

So the question is: how can I modify this file to get my index file (like I'm doing this actually withheader() function and get additional value of variable called$phoneValidate? If You need, this project is shared on my BitBucket account: https://bitbucket.org/Pirum/simple-blog/src

11

Answer

Solution:

Okay, the one of possible method how to get it is prepare url with 'GET' params inheader() function.

So, modified classInsert is like below (only a matter lines I've attached):

$validate   = new Validation;

// phoneValidate for form validation
if (!$validate->phoneNum($phoneNum)) {
    $headerUrlParam .= $validate->returnUrlParam($headerUrlParam) . "validatePhoneNum=error";
}

// url forf validation
if (!$validate->url($url)) {
    $headerUrlParam .= $validate->returnUrlParam($headerUrlParam) . "validateUrl=error";
}

header("Location: /codeme/06_blog_v5_mvc/index.php" . $headerUrlParam);
}

The methodreturnUrlParam() in$validate object is used just for prepare the right sign '?' or '&' because when url ends onindex.php we need to use the '?' sign and if there is already some 'GET' values, we need to use the '&' sign.

When user will fill thephoneNum field properly and theurl field not correctly I want to return in URL only this one wrong value.

Sample#1: when url is wrong and phoneNum is correct:index.php?validateUrl=error Sample#2: when url and phoneNum is wrong:index.php?validatePhoneNum=error&validateUrl=error

People are also looking for solutions to the problem: php - Radio group button status over multiple dynamically created rows

Source

Didn't find the answer?

Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.

Ask a Question

Write quick answer

Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.

Similar questions

Find the answer in similar questions on our website.