$this->set('title', 'Title Name'); not working in CakePHP 3.x - php

Basically in default.ctp I have this for my title:
<title>
<?= $this->fetch('title') ?>
</title>
And inside of the controller I have this line:
$this->set('title', 'Test-Title');
But it does nothing, it still displays controllers name(Jobs, controllers full name os JobsController.ctp)
But if I put this inside of my view file:
$this->assign('title', 'Test-Title');
It changes the title. So what is wrong with $this->set('title', $title) ?

fetch() returns the contents of a block not a variable. Using set() in your Controller is setting a variable that can be output in your View templates by echoing the variable:-
<?php echo $title; ?>
If you want to use fetch() you need to use it in combination with assign() in the View templates to define the block. For example in your View template use:-
<?php $this->assign('title', $title); ?>
And then in the layout template:-
<title><?php echo $this->fetch('title'); ?></title>
In CakePHP 3 the idea is to set the page title by assigning it in the View as it relates to the rendering of the page. This differs from how this was originally handled in CakePHP 2 where you'd define title_for_layout in your controller and then echo the $title_for_layout variable in the layout template (this was deprecated in favour of the CakePHP 3 approach in later versions of Cake 2).

You can just set() the variable in your controller:
// View or Controller
$this->set('title', 'Test-title');
Then use it as a standard variable is in your layout or view:
<!-- Layout or View -->
<title>
<?php echo $title; ?>
</title>
Details here: http://book.cakephp.org/3.0/en/views.html#setting-view-variables
Using assign() is different, which is why it works with fetch(). assign() is used with View Blocks: http://book.cakephp.org/3.0/en/views.html#using-view-blocks

In CakePHP 3 layout template, make sure to set the title as below.
<title>
<?= $this->fetch('title') ?>
</title>
Then in your view:
<?php $this->assign('title', 'Title Name'); ?>
This is the way CakePHP will use its built-in View classes for handling page title (view blocks) rendering scenarios.

Just for completion, I came across a situation where a malformed .js script with undefined variables referenced between <head></head> resulted in the <title></title> tags being posted to DOM (showed in page source) but Chrome, Firefox and (from memory) MSIE all failed to deliver the content of the title to the APP UI, again from memory - iOS mobile was unaffected.

If you want stick to your code, after setting "title" variable just simply write this:
<?= __('Main Project Name') ?>
<?php if( isset($title)) $this->assign('title', $title); ?>
<?= ' - ' . $this->fetch('title') ?>

I have done this, this way in default.ctp
<?php
$cakeDescription = __d('cake_dev', 'Your Title');
?>
<title>
<?php echo $cakeDescription ?>: <?php echo $title_for_layout; ?>
</title>
In my view file, I have done this.
<?php $this->assign('title', 'Your Title');?>

Related

How to add meta tag's values for seo using PHP?

I am using one header file for every page which will show the HTML head(which includes meta tags and other CSS links)
Here I have used everything as dynamic as if I like in the case of canonical tags I have used $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_HOST'] and all other links to CSS are also accessible even if it can be any file from any directory.
Now I want to create a one-time title meta tag & description tags like this will be my main file looks like
<!DOCTYPE html>
<html lang="en">
<head>
<title><?php echo $page_title; ?></title>
<meta name="description" content="<?php echo $page_content; ?>" />
//Other meta tags & linking to css & js files
</head>
<body>
// Content ........
</body>
</html>
Now here is the twist is that many people will say that just use
$page_title = "Here is the title of the specific page";
$page_content = "Here goes the long-form description describing the page of specific page";
Yes, this would have worked out if the pages were different and had the same place to put that all before including the header file.
But my index page looks like this let me explain it too. (Using Bulma as a framework)
<?php
require 'include/db_connect.php';
require 'include/header.php';
?>
<form name="submitform" method="POST">
<div class="columns is-multiline" id="wrapper">
<div class="column is-6-desktop is-12-tablet" id="main_content">
<div class="box">
<?php
if($country)
{
?>
<?php require 'inc/country.php'; ?>
<?php
}
else if($country && $state)
{
?>
<?php require 'inc/country_state.php' ?>
<?php
}
else if($country && $state && $district)
{
?>
<?php require 'inc/country_state_district.php'; ?>
<?php
}
else
{
?>
<?php require 'inc/other_than.php'; ?>
<?php
}
?>
</div>
</div>
</div>
</form>
<?php require 'footer.php'; ?>
</body>
</html>
The main point here is that I am using the dropdown button which gets auto-submitted using js that's not relevant here but from the top, I have just explained what is the structure of my code.
Now as you can see the if-else structure which includes other files that create dynamic pages but their code starts only from the body and not from the head directly so I am not able to add those title tags and descriptions.
Now how to add title & description tags uniquely to each of these pages.
Any solutions, please... Thanks in Advance
Like already written in the comments. You should define the vars ahead of require 'include/header.php'; or use an MVC structure.
If you still want to stay with the existing code ob_get_contents() might help you.
Use ob_start(); at the beginning to tell PHP to not print any output and instead write the output to a buffer.
You can then at a later point use ob_get_contents(); to fetch the output buffer and print it.
You have to search in the output buffer for an identifier like %page_title% then and replace it with the actual value before sending the output.
This may look like following:
echo str_replace(%page_title%, $page_title, ob_get_contents());
Still I'd rather suggest restructuring your code, as the solution with output buffer is slower, uses more memory and is poor to debug.

Real php form of blade templates

i have figured out some blade templates (laravel) like #section('title', getOption('app_name') . ' - Login')
#section('body') as its real php formis <?php $__env->startSection('title', getOption('app_name') . ' - login'); ?>
<?php $__env->startSection('content'); ?> . and these are correct ,,
But i wanna know the real php form of #extends(layouts.app) .
anybody got an Idea ?
All of your compiled blade views are stored in storage/framework/views/ if you want to dig around and try to understand how Laravel turns a blade template into php.
It looks like your views define the sections first, then pass them to the layout
as variables. Inside your view which #extends(layouts.app) you might see this at the end:
<?php echo $__env->make('layouts.app', \Illuminate\Support\Arr::except(get_defined_vars(), array('__data', '__path')))->render(); ?>
The sections were defined before that line and passed as variables. When you look inside the layout itself, you'll see things like this for including each of those sections:
<?php echo $__env->yieldContent('content'); ?>

How to set a title in Cell/Header directory in cakePHP ?

I am using CakePHP 3.0 and I am using inside the Cell/Header directory a display for the header.
<div id="header">
<div class="header-title">
<h2><?php echo (isset($pageTitle)) ? $pageTitle : 'Test'?></h2>
</div>
</div>
This code snippet runs perfectly and on every page.
I am trying to set the $pageTitle dynamically. This means that I am trying to set it for every page differently.
I have set inside the UsersController.php
$this->set('pageTitle', 'Nebojsa');
In index method.
But when I go to the url /users/index , this page title stays 'test'.
I have also tried to assign the value inside the Template/Users/index.ctp
<?= $this->assign('pageTitle', __('Users')); ?>
But it won't work.
What am I doing wrong ? Could you maybe point me in the right direction, where should I look ?
Between view templates and layouts you can use:
<?= $this->assign('pageTitle', __('Users')); ?>
And get the value back in any other template or layout using:
<?= $this->fetch('pageTitle') ?>
As far as setting the title from the controller your code is correct.
$this->set('pageTitle', 'Nebojsa');
<?php echo (isset($pageTitle)) ? $pageTitle : 'Test'?>

Laravel 4 - including a "partial" view within a view (without using Blade template)

In Laravel 3, I used to do this.
<?php render('partials.header'); ?>
This was done in "PHP" views, without using Laravel's Blade templates.
What's the equivalent of this in version 4?
I tried
<?php #include('partials.header'); ?>
This doesn't work.
If I do
#include('partials.header')
I have to save my file as ".blade.php"
How do I include a "subview" without using the blade template?
There are different ways to include a view within a view in Laravel 4. Your choice will depend on any one of the outcomes outlined below...
For Flexibility
You can compile (render) the partial views in the appropriate Controller, and pass these views to the Main View using the $data[''] array.
This may become tedious as the number of views increase, but hey, at least there's a lot of flexibility :)
See the code below for an example:
Controller
...
public function showMyView()
{
/* Header partial view */
$data['header'] = View::make('partials.header');
/* Flexible enough for any kind of partial views you require (e.g. a Header Menu partial view) */
$data['header_menu'] = View::make('partials.header_menu');
/* Footer partial view */
$data['footer'] = View::make('partials.footer');
return View::make('myView', $data);
}
...
View
You can include the partials above as follows (at any position in your View code):
<html>
<head></head>
<body>
<!-- include partial views -->
<?php echo ($header) ?>
<?php echo ($header_menu) ?>
<div id="main-content-area"></div>
<?php echo ($footer) ?>
</body>
</html>
Your partial views will now be added to your main View.
For Simplicity
There's actually a much easier way than using the method above: Simply include this in the html of the view...
View
<html>
<head></head>
<body>
<!-- include partial view: header -->
<?php echo View::make('partials.header') ?>
<div id="main-content-area">
</div>
<!-- include partial view: footer -->
<?php echo View::make('partials.footer') ?>
</body>
</html>
Make sure that the folder structure for the partials is [views/partials/header.php] in order to provide the correct file-path to the View::make() function of Laravel.
WARNING
If you try to pass the $data['page_title'] in a controller, the nested views wont receive the data.
To pass data to these nested views you need to do it like this:
<html>
<head></head>
<body>
<?php
/* Pass page title to header partial view */
$data ['page_title'] = "My awesome website";
echo View::make('partials.header', $data);
?>
<div id="main-content-area"></div>
<?php echo View::make('partials.footer') ?>
</body>
</html>
NOTE
The question clearly stated: "Without using Blade template", so I have made sure to give a solution that does not include any Blade templating code.
Good luck :)
You can nest your partials in views try this
View::make('folder.viewFile')->nest('anyname', 'folder.FileName');
Then access the nested view file from your template {{ $anyname }} this way you don't have to include files in your view and this should work for .php file also.
I am not sure how many people have been using Laravel 4 in this post, since this post, but if you are looking to include partials or separate your view types you can do it with #includes
for example, if you want a partials folder for your header, footer, sidebar etc
create a directory for the partials under
app/views/partials
Then create a partial
app/views/partials/navigation.blade.php
Then in your master template file add the line
#include('partials.navigation')
That is all it takes.
** Bonus you can also pass data to a partial or include nested partials within a partial
I know this is a bit of a late answer, but I figured since I didn't see this solution amongst the other answers it was ok.
If you want to include your header and footer on every page I would add them into the before and after filters. Just go to filters.php in your app folder
App::before(function($request)
{
echo View::make('partials.header');
});
App::after(function($request, $response)
{
echo View::make('partials.footer');
});
When doing it this way you don't need to add anything in the view files to include them.
You can use View's nest function
View::make('default.layout')->nest('header', 'default.header');
Use the third parameter to pass data to the template
View::make('default.layout')->nest('header', 'default.header', ['name' => 'John Doe', 'test' => 'It works!']);
on your views/default/header.blade.php
<div>hey {{ $name }}! {{ $test }}</div>
I am still pretty new to Laravel, but I think the below is pretty ideal ...
Route::get('/', function()
{
$data['title'] = 'sample';
return View::make('page', $data);
});
# /views/partials/header.php
# /views/partials/footer.php
View::composer('page', function($view)
{
$view->with('header', View::make('partials.header', $view->getData()));
$view->with('footer', View::make('partials.footer', $view->getData()));
});
See Laravel View Composers .. http://laravel.com/docs/responses#view-composers
/views/page.php
<?php echo $header; ?>
<div>CONTENT</div>
<?php echo $footer; ?>
From within a view, just echo the other view:
echo View::make('header'); //This will look for a view called header.php

how to layout inside other layout in Zend Framework

I want to do this:
master.phtml
<html>
<body>
<?php echo $layout;?>
</body>
</html>
layout.phtml
<div class="grid_3">
<?php echo $content;?>
</div>
view.phtml
<?php
$this->loadCustomLayout('layout.phtml');
?>
the content
then... the master are "master.phtml"... in layout goes the content of "layout.phtml"... and... inside the "content" goes the content of "view.phtml"
is possible do this ?
thanks.
You can use a partial to do that, instead of nesting Layouts...
Here is a feature request submitted to the Zend Issue Tracker for this functionality. There is a patch suggested and provided to Zend_Layout which provides this functionality, but it is not yet part of the Zend Framework. Go vote for it to be added!
http://framework.zend.com/issues/browse/ZF-8013
You could also try this approach:
http://www.developly.com/creating-3-step-layouts-with-zendlayout

Categories