is it possible to make something like this?
// file.php
$string = require('otherfile.php');
echo $string;
// otherfile.php
<!DOCTYPE html>
<html>
<head><title>Test</title></head>
<body>
<?php require 'body.php';?>
</body>
</html>
// body.php
<p>Lorem ipsum something</p>
And get this output?
<!DOCTYPE html>
<html>
<head><title>Test</title></head>
<body>
<p>Lorem ipsum something</p>
</body>
</html>
I know that code won't work, but I hope you understand what I mean.
file.php
ob_start();
include 'otherfile.php';
$string = ob_get_clean();
$string = file_get_contents('otherfile.php',TRUE);
echo $string
Use of the TRUE argument for file_get_contents() means it will search using the include path, like a normal include or require
Another cool thing to know, but SmokeyPHP's answer might be better:
<?php
$var = require 'myfile.php';
myfile.php:
<?php
return 'mystring';
Yes, you can use a return statement in a file, and requires and includes will return the returned value, but you would have to modify the file to say something more like
<?php
return '<p>Lorem ipsum something</p>';
?>
check example #5 under include documentation
http://www.php.net/manual/en/function.include.php
I need a solution for Joomla and dompdf and I found this solution
ob_start();
require_once JPATH_COMPONENT . DIRECTORY_SEPARATOR . 'file.php';
$html = ob_get_clean();
only with require_once can use all functions from Joomla at the loaded script.
The file.php is a .html file renamed to .php and where added php code.
Related
Is there a way to automatically include content before and after the actual output of a file?
Why? For example to use this to include everything up to the main content (dynamcally generated HTML, head, opening tags...) and after the file runs, automatically close everything up again.
I know of the ob_start approach, but I'm not sure if dynamically generated content is easy to include that way:
<?php
function bootstrap_page($content) {
return "text before" . $content . "text after";
}
ob_start(bootstrap_page);
?>
But then, ob cannot be used to capture the output of an include within the callback, AFAIK. So that makes it hard to easily pre- and append something dynamically generated. I could use long strings in the callback function to get a static version working - but is there a way to do this more seamlessly?
In other words I'm basically trying to include a php file before and one after any (other) file I need and that - if possible reduced to a function call at the start of a given file.
The functionality I'm looking for would transform this:
<?php
bootstrap_this();
?>
<p>Lorem ipsum</p>
before.php:
<!DOCTYPE html>
<html>
<?php include('head.php'); ?>
<body>
<?php if(somecondition) { ?>
<h1>Hello, World!</h1>
<?php } ?>
after.php:
</body>
</html>
Into something like this:
<?php
include 'before.php';
?>
<p>Lorem ipsum</p>
<?php
include 'after.php';
?>
And in the end into:
<!DOCTYPE html>
<html>
<?php include('head.php'); ?>
<body>
<?php if(somecondition) { ?>
<h1>Hello, World!</h1>
<?php } ?>
<p>Lorem ipsum</p>
</body>
</html>
Isn't that what output buffering is for?
<?php
// Start Buffer
ob_start();
// Include before
include 'before.php';
?>
<p>Lorem ipsum</p>
<?php
// Include after
include 'after.php';
// Get buffered output
$page = ob_get_clean();
echo $page;
?>
But then, ob cannot be used to capture the output of an include within the callback, AFAIK
AFAYK ? Would it be hard to test? As long as the include is after ob_start() and the code does not explicitly call ob_flush() before you choose to do so, then it will capture the output.
I'm basically trying to include a php file before and one after any (other) file I need
That implies some set sort of controlling script which calls the pre-oinclude, the main content and the post-include.
That would be OK if HTML (not true, I'll come back to that) did not have a defined root which should be explicitly declared. And you have the issue HTTP also has a structure which you risk subverting here - headers come before content. But leaving those aside for now, HTML requires a nested structure. All tags should be closed. Opening and closing tags in different files is messy and bad practice.
There are a whole lot technologies which provide the end result you appear to be looking for - ESI, templating and front-controller patterns all provide this in a much more structured way.
I'm not sure I see the usage of this or if I understood this correct, but if I understood it correctly you're looking for something like this:
<?php
function dynamice_include($before, $content, $after) {
$dynamic_content = '';
$dynamic_content .= include $before . '.php';
$dynamic_content .= $content;
$dynamic_content .= include $after . '.php';
return $dynamic_content;
}
Usage:
$content = dynamice_include('before', 'Hello I am really cool','after');
echo $content;
In before.php and after.php a return would be required, e.g.
before.php
<?php
return "wow before";
after.php
<?php
return "wow after";
and the result would be:
wow beforeHello I am really coolwow after
UPDATE:
It seems it more something like this you're looking for. output-buffers are the only way AFAIK to achieve this.
This code is not optimized at all... (I just show the concept here)
<?php
function dynamice_include($before, $content, $after) {
$dynamic_content = '';
ob_start();
include $before . '.php';
$dynamic_content .= ob_get_contents();
ob_end_clean();
ob_start();
include $content . '.php';
$dynamic_content .= ob_get_contents();
ob_end_clean();
ob_start();
include $after . '.php';
$dynamic_content .= ob_get_contents();
ob_end_clean();
return $dynamic_content;
}
$content = dynamice_include('before', 'dytest','after');
echo $content;
As other stated though - it's a lot of platforms, frameworks, template engines out there that could solve this issue. You will have do ob_start() and ob_clean within the current files content for this to work.
UPDATE2:
In this case I fetch current files output buffer as content.
<?php
function dynamice_include($before, $content, $after) {
$dynamic_content = '';
ob_start();
include $before . '.php';
$dynamic_content .= ob_get_contents();
ob_end_clean();
$dynamic_content .= $content;
ob_start();
include $after . '.php';
$dynamic_content .= ob_get_contents();
ob_end_clean();
return $dynamic_content;
}
ob_start();
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
feelings
</body>
</html>
<?php
$content = ob_get_contents();
ob_end_clean();
$content = dynamice_include('before', $content, 'after');
echo $content;
?>
Thanks to the help of #bestprogrammerintheworld, I came up with this:
function use_template($before = 'pre', $after = 'post') {
ob_start();
include $before . '.php';
$pre = ob_get_contents();
ob_end_clean();
ob_start();
include $after . '.php';
$post = ob_get_contents();
ob_end_clean();
$bootstrap_page = function ($content) use ($pre, $post) {
return $pre . $content . $post;
};
ob_start($bootstrap_page);
}
If this function is called a the beginning of a php file, the outputs of before.php and after.php get stored and bound to the callback. Then, after all the main output is read, everything is pieced together. No code at the end of the file required.
Since ob cannot be run within the callback, bootstrap_page, it must be run beforehand to capture the other files first.
So I would like to print name of the current page in the title tag of the head.
I include my head in every page like this:
include 'includes/head.php';
This is my head:
<head>
<?php $page = basename(__FILE__, '.php'); ?>
<title><?php echo ucfirst($page); ?><title>
</head>
I thought this would work, but now it just shows "Head" on every page.
I know I can make it work by just putting the $page variable on every page but I would like to prevent this.
So is there any way to print the name of the current page through the included head.php file without adding anything to every page?
Thanks
EDIT
This is how I fixed it:
$page = pathinfo($_SERVER['SCRIPT_NAME'],PATHINFO_FILENAME);
If you were to create a file head.php with the following content
<?php
$xpage = pathinfo( $_SERVER['SCRIPT_NAME'],PATHINFO_BASENAME );
$ypage = pathinfo( $_SERVER['SCRIPT_NAME'],PATHINFO_FILENAME );
echo "
<!--
with extension
{$xpage}
without extension
{$ypage}
-->";
?>
and include in your regular php pages using include '/path/to/head.php' you should get the desired result ~ you will see two options - with or without file extension.
To add this to the document title simply echo whichever option is preferrable
<title><?php echo $ypage;?></title>
Try this enclosing the $page variable in php tags:
<head>
<?php $page = basename(__FILE__, '.php'); ?>
<title><?php echo ucfirst($page); ?><title>
</head>
You have several problems, first one is curly bracket in front of the echo, the second one is that end title tag is missing forward slash and probably last one is that page variable is not inside php tags...
So your code should look like:
<?php $page = basename(__FILE__, '.php'); ?>
<title><?php echo ucfirst($page); ?></title>
You could use a function like this:
head.php
<?php
function head($page) {
echo "<head>";
echo "<title>".ucfirst($page)."<title>";
echo "</head>"
}
index.php
<?php
include 'includes/head.php';
$page = basename(__FILE__, '.php');
head(page);
I need to display html source code form other php file.
I have two file
code.php
index.php (I hope I can convert the code.php to html source code.)
code.php:
<!DOCTYPE html> <html> <body> <?php $color = "red"; echo $color; ?> </body> </html>
index.php (I hope I can convert the code.php to html source code.)
$php_to_html = file_get_contents("code.php");
$html_encoded = htmlentities($php_to_html);
echo $html_encoded;
but when i run the index.php file, the result is
<!DOCTYPE html> <html> <body> <?php $color = "red"; echo $color; ?> </body> </html>
but I hope I can see the result is
<!DOCTYPE html> <html> <body> red </body> </html>
any idea how can i do this ,thanks!!!
You want to execute the PHP, so include it and capture the output:
ob_start();
include("code.php");
$php_to_html = ob_get_clean();
$html_encoded = htmlentities($php_to_html);
echo $html_encoded;
If you want the HTML to be rendered as HTML then don't use htmlentities().
Optionally (not the best way) but you can execute it by retrieving from the URL:
$php_to_html = file_get_contents("http://www.example.com/code.php");
$html_encoded = htmlentities($php_to_html);
echo $html_encoded;
Buffer output and include it:
ob_start();
include_once('code.php');
$html = ob_get_clean();
By using output buffering, any output is not sent to the browser, but instead kept in memory. This allows you to run the code, and get the output as a variable. ob_get_clean() flushes the buffer (in this case into our $html variable), and then stops buffering, allowing you to continue as normal. :-)
I currently have a php file that I'm using as a template but I need it to read in data from another php file that I'm using for the page content. I'm doing it this way to save on code and time, however it doesn't appear to be working. I have done a test with shorter amounts of code but it still isn't working. they are both .php files.
Code -
<html>
<head>
<title></title>
</head>
<body>
<?php
$temp = 'test-2.php';
$file = fopen($temp, 'r');
$cont = fread($file, filesize($temp));
print $cont;
fclose($file);
?>
</body>
test-2.php
<?php
echo 'hello world';
?>
just use <?php include('test-2.php'); ?> surely that'll do what you want?
I have already search about this question,I want to remove line break from the html,but there a some split php line in the html file,for example:
<html>
<head>
<title><?='abc'?></title>
</head>
<?php
if($_SESSION['test'] == 'yes'){
echo 'hello';
}
?>
123456
43567
<?='13245tryt57u68'?>
</body>
</html>
how can I remove line break from this php file?
You could use ob_start();
<?php ob_start();
//Start page output
?>
<html>
<head>
<title><?='abc';?></title>
</head>
<body>
<?php
if(isset($_SESSION['test']) && $_SESSION['test'] == 'yes'){
echo 'hello';
}
?>
123456
43567
<?='13245tryt57u68';?>
</body>
</html>
<?php
//End page output and assign the contents to a variable
$buffer = ob_get_contents();
ob_end_clean();
//Replace the new line with null
echo str_replace("\n",null,$buffer);
?>
Result:
<html><head><title>abc</title></head><body>1234564356713245tryt57u68</body></html>
If you want it in your IDE:
Use replace function, and replace \n by no character
If you want it for the client:
You have to configure your htaccess to remove the lines breaks/indenting when sending the file to the client, ie by using the mod_pagespeed extension:
http://www.the-art-of-web.com/system/mod-pagespeed-settings/ and the collapse_whitespace option