Difference between $this->Html->url and $this->Html->link in Cakephp - php

As of my knowledge these both are used for creating links :
What is the main difference between $this->Html->url and $this->Html->link in Cakephp?
Is there any performance issues occurs for using these?
What if i want to open link in new tab using "$this->Html->url"
What i tried :
<?php echo $this->Html->url($item['News']['link'],array('target'=>'_blank', 'escape' => false)); ?>
but its not working. open link in same tab.
Thanks in advance.

Well, according to CakePHP Documentation, the HTML->url takes two arguments, the 2nd one is a boolean while the first is a routing array. Try this:
<?php echo
$this->Html->url(
array(
'href' => $item['News']['link'],
'target' => '_blank',
'escape' => false
),
false // Second argument, true means prepend the path of my site before the link while false means don't prepend
); ?>
References:
http://book.cakephp.org/2.0/en/core-libraries/helpers/html.html#HtmlHelper::url
http://book.cakephp.org/2.0/en/appendices/glossary.html#term-routing-array

This is what the $this->Html->link() method is for. It takes an array of options as parameters to do this.

Related

WordPress shortcode only accepts default attributes

Im currently trying to code my own shortcode to use the YouTube API on my WordPress website. My Code works also but only with the default attributes of the shortcode. The appended attributes via shortcode self are ignored by my code.
Can anyone help me? I googled a lot but I didnt found anything like this. I think I made everything like the codex way but maybe you know more.
Here is my code:
function api_youtube_integration($atts, $content = null) {
$a = shortcode_atts(array(
'class' => '',
'videoCount' => 5,
'bottomBar' => true
), $atts);
ob_start();
?>
<div data-video="<?php echo esc_html($a['videoCount']); ?>">Test</div>
<?php
return ob_get_clean();
}
add_shortcode('youtubeAPI', 'api_youtube_integration');
My shortcode: [youtubeAPI videoCount=12]
The code only returns 5 as videCount but not the 12...
Best Regards Lukas
So apparently attributes passed to shortcode_atts() are always converted to lowercase. Official docs:
Attribute names are always converted to lowercase before they are passed into the handler function. Values are untouched. [myshortcode FOO="BAR"] produces $atts = array( 'foo' => 'BAR' ).
So you'll either need to make sure all options are lowercase, or use underscores to separate words.

How to createabsoluteurl passing two parameters in yii2

I am newbie in Yii2. Please help me to achieve this. I want to know how to create absoluteurl in yii2. I have tried the code given below but I want something different.
echo Yii::$app->urlManager->createAbsoluteUrl(['site/confirm', 'id' => $user->id,'code' => $user->token,'&']);
output is http://car-rental.demoinja.com/site/confirm/69?code=275a9253dfc81efa47be4fdf1fc6a927&1=%26
But I want the url like this
http://car-rental.demoinja.com/site/confirm/?id=69&code=275a9253dfc81efa47be4fdf1fc6a927
No need to add '&' in createAbsoluteUrl function; so you need to use following function.
<?php echo Yii::$app->urlManager->createAbsoluteUrl(['site/confirm', 'id' => $user->id,'code' => $user->token]); ?>

How to use: sonata_type_model_list

I'm trying to run this code:
if(!$this->isChild()) {
$formMapper->add('post', 'sonata_type_model', array(), array('edit' => 'list'));
From this tutorial: http://sonata-project.org/bundles/doctrine-orm-admin/2-1/doc/tutorial/creating_your_first_admin_class/defining_admin_class.html
I'm aware that you have to use sonata_type_model_list as of 2.1
sonata_type_model_list : this type replaces the option edit = list provided as a 4th argument on the sonata_type_model
The problem is that I have absolutely no idea how to do that. I have found ZERO examples anywhere after a whole day of google searches. All I want to do is replace the edit=>list with sonata_type_model_list.
Can you please tell me how to do that in the code above?
This is how I used it in my code. However it's not working in all browsers. When I select the taget entity the form value in the parent view doesn't get updated (FireFox and IE).
$formMapper->
...
->add('image', 'sonata_type_model_list',
array(
'compound' => true,
'by_reference' => true
)
)
...
I also find it very hard to find some tutorials/examples on how to use this type. Best thing you can do is to go through their source code. Which is awful time consuming.
One way I found out how to configure these form types is to provide a wrong argument.
e.g. 'my_compound' => true,
This will result in an error telling you that 'my_compound' isn't a valid parameter and also will show you a list of valid parameters.
Hope this helps!

In CakePHP, Why using HTML->link instead of manually writing an anchor text?

Isn't it much slower concerning development time ?
What are the advantages of of HTML->link ?
Thanks !
It's just a question of whether you want to generate your own URLs and hard-code them, or if you want Cake to do the work for you. For simple urls leading to the homepage of your site using cake may seem slower, but it's actually useful for dynamic urls, for example:
Say you're printing a table of items and you have a link for each item that deletes that item. You can easily create this using:
<?php
echo $this->Html->link(
'Delete',
array('controller' => 'recipes', 'action' => 'delete', $id),
array(),
"Are you sure you wish to delete this recipe?"
);
Notice how using an array specifying the controller and action as a URL allows you to be agnostic of any custom routes. This can have its advantages.
The corresponding way to do it without the HTML helper would be:
Delete
It can also be really useful for constructing URL query strings automatically. For example, you can do this in array format:
<?php
echo $this->Html->link('View image', array(
'controller' => 'images',
'action' => 'view',
1,
'?' => array('height' => 400, 'width' => 500))
);
That then outputs this line of HTML:
View image
It could be a pain to generate that URL manually.
In summary, while it may seem awkward for simple links, the HTML helper definitely has its uses. For further uses, consult the cakePHP book on the HTML helper's link function.

How to get complete current url for Cakephp

How do you echo out current URL in Cake's view?
You can do either
From a view file:
<?php echo $this->request->here() ?>">
Which will give you the absolute url from the hostname i.e. /controller/action/params
Or
<?php echo Router::url(null, true) ?>
which should give you the full url with the hostname.
I prefer this, because if I don't mention "request" word, my IDE gives warning.
<?php echo $this->request->here; ?>
API Document:
class-CakeRequest
Edit:
To clarify all options
Current URL: http://example.com/en/controller/action/?query=12
// Router::url(null, true)
http://example.com/en/controller/action/
// Router::url(null, false)
/en/controller/action/
// $this->request->here
/en/controller/action/
// $this->request->here()
/en/controller/action/?query=12
// $this->request->here(false)
/en/controller/action/?query=12
// $this->request->url
en/controller/action
// $_SERVER["REQUEST_URI"]
/en/controller/action/?query=12
// strtok($_SERVER["REQUEST_URI"],'?');
/en/controller/action/
<?php echo $_SERVER[ 'REQUEST_URI' ]; ?>
EDIT: or,
<?php echo $this->Html->url( null, true ); ?>
The following "Cake way" is useful because you can grab the full current URL and modify parts of it without manually having to parse out the $_SERVER[ 'REQUEST_URI' ] string and then manually concatenating it back into a valid url for output.
Full current url:
Router::reverse($this->request, true)
Easily modifying specific parts of current url:
1) make a copy of Cake's request object:
$request_copy = $this->request
2) Then modify $request_copy->params and/or $request_copy->query arrays
3) Finally: $new_url = Router::reverse($request_copy, true).
Cakephp 3.5:
echo $this->Url->build($this->getRequest()->getRequestTarget());
Calling $this->request->here() is deprecated since 3.4, and will be removed in 4.0.0. You should use getRequestTarget() instead.
$this->request is also deprecated, $this->getRequest() should be used.
I know this post is a little dated, and CakePHP versions have flourished since. In the current (2.1.x) version of CakePHP and even in 1.3.x if I am not mistaken, one can get the current controller/view url like this:
$this->params['url'];
While this method does NOT return the parameters, it is handy if you want to append parameters to a link when building new URL's. For example, we have the current URL:
projects/edit/6
And we want to append a custom parameter action called c_action with a value of remove_image, one could make use of $this->params['url]; and merge it with an array of custom parameter key => value pairs:
echo $this->Html->link('remove image', array_merge($this->params['url'], array('c_action' => 'remove_image'));
Using the above method we are able to append our custom parameters to the link and not cause a long chain on parameters to build up on the URL, because $this->params['url] only ever returns the controll action URL.
In the above example we'd need to manually add the ID of 6 back into the URL, so perahaps the final link build would be like this:
echo $this->Html->link('remove image', array_merge($this->params['url'], array($id,'c_action' => 'remove_image'));
Where $is is a the ID of the project and you would have assigned it to the variable $id at controller level. The new URL will then be:
projects/edit/6/c_action:remove_image
Sorry if this is in the slightest unrelated, but I ran across this question when searching for a method to achieve the above and thought others may benefit from it.
Getting the current URL is fairly straight forward in your view file
echo Router::url($this->here, true);
This will return the full url http://www.example.com/subpath/subpath
If you just want the relative path, use the following
echo $this->here;
OR
Ideally Router::url(“”, true) should return an absolute URL of the current view, but it always returns the relative URL. So the hack to get the absolute URL is
$absolute_url = FULL_BASE_URL + Router::url(“”, false);
To get FULL_BASE_URL check here
for CakePHP 3:
$this->Url->build(null, true) // full URL with hostname
$this->Url->build(null) // /controller/action/params
Getting current URL for CakePHP 3.x ?
In your layout :
<?php
$here = $this->request->here();
$canonical = $this->Url->build($here, true);
?>
You will get the full URL of the current page including query string parameters.
e.g. http://website.example/controller/action?param=value
You can use it in a meta tag canonical if you need to do some SEO.
<link rel="canonical" href="<?= $canonical; ?>">
In the request object you have everything you need.
To understand it:
debug($this->request->url);
and in your case
$here = $this->request->url;
To get the full URL without parameters:
echo $this->Html->url('/', true);
will return http(s)://(www.)your-domain.com
The simplest way I found is it that includes host/path/query and
works in Controllers (Cakephp 3.4):
Cake\View\Helper\UrlHelper::build($this->request->getRequestTarget());
which returns something like this (we use it as login callback url) :
http://192.168.0.57/archive?melkId=12
After a few research, I got this as perfect Full URL for CakePHP 3.*
$this->request->getUri();
the Full URL will be something like this
http://example.com/books/edit/12
More info you can read here: https://pritomkumar.blogspot.com/2017/04/how-to-get-complete-current-url-for.html
The Cake way for 1.3 is to use Router::reverse:
Link to documentation
$url = Router::reverse($this->params)
echo $url;
yields
/Full/Path/From/Root/MyController/MyAction/passed1/named_param:bob/?param1=true&param2=27
Cakephp 3.x anywhere:
Router::reverse(Router::getRequest(),true)
for CakePHP 3.x You can use UrlHelper:
$this->Url->build(null, true) // output http://somedomain.com/app-name/controller/action/params
$this->Url->build() // output /controller/action/params
Or you can use PaginatorHelper (in case you want to use it in javascript or ...):
$this->Paginator->generateUrl() // returns a full pagination URL without hostname
$this->Paginator->generateUrl([],null,true) // returns a full pagination URL with hostname
for cakephp3+:
$url = $this->request->scheme().'://'.$this->request->domain().$this->request->here(false);
will get eg:
http://bgq.dev/home/index?t44=333
In View:
Blank URL: <?php echo $this->Html->Url('/') ?>
Blank Full Url: <?php echo $this->Html->Url('/', true) ?>
Current URL: <?php echo $this->Html->Url($this->here) ?>
Current Full URL: <?php echo $this->Html->Url($this->here, true) ?>
In Controller
Blank URL: <?php echo Router::url('/') ?>
Blank Full Url: <?php echo Router::url('/', true) ?>
Current URL: <?php echo Router::url($this->request->here()) ?>
Current Full URL: <?php echo Router::url($this->request->here(), true) ?>
I use $this->here for the path, to get the whole URL you'll have to do as Juhana said and use the $_SERVER variables. There's no need to use a Cake function for this.
All previously proposed approaches didn't satisfy my requirements for getting a complete URL (complete as in qualified) e.g. to be used in an email send from controller action. I need the scheme and hostname as well then, and thus stumbled over the following approach:
<?php echo Router::url( array( $id ), true ) ?>
Due to providing router array current controller and action is kept, however id isn't and thus has to be provided here again. Second argument true is actually requesting to prepend hostname etc. for getting full URL.
Using Router::url() is available in every situation and thus can be used in view files as well.
Yes, is easy FULL URL in Controler Work in CakePHP 1.3 >
<?php echo Router::url( array('controller'=>$this->params['controller'],'action'=>$this->params['action']), true );
Saludos
Use Html helper
<?php echo $this->Html->url($this->here, true); ?>
It'll produce the full url which'll started from http or https
In CakePHP 3 $this->here will be deprecated. The actual way is using this method:
Router::url($this->request->getRequestTarget())
For CakePHP 4.*
echo $this->Html->link(
'Dashboard',
['controller' => 'Dashboards', 'action' => 'index', '_full' => true]
);
If you want to return the base path, you can check that the Router class is using Configure::read ('App.fullBaseUrl'). So if you are a fan of hexagonal architecture, you can create a Cake implementation for creating URLs that will only use Configure from all CakePHP framework.

Categories