I am developing an application using CakePHP 2.6 and having issues with passing a string containing url characters as a parameter through to a controller method.
In my view I have a chunk of code which echoes out a series of table rows containing data and passes through the page id, unit id and the id of the link which can sometimes contain a url.
<?php foreach($linklist as $l) { ?>
<tr id="Link_<?php echo $l['ID']; ?>">
<td><?php echo $l['Title']; ?></td>
<td class="buttontd"><?php echo $this->Form->postlink('Delete', array('action' => 'deletelink', $this->request->params['pass'][0], $results[0]['PageUnitTypeID'], $l['ID']), array('class' => 'button delete')); ?></td>
</tr>
<?php } ?>
When the postlink button passes the information over to the 'deletelink' action in the controller the url looks like this:
http://mydomainname.com/webpages/deletelink/239/7/urlhttp%3A%2F%2Fwww.google.co.uk%2F
Which shows that the url has been passed as the string but then in the action when I try to just var_dump() the third parameter it returns a string of www.google.co.uk and nothing more which is preventing me from doing a substr() call on the parameter to check if the first 3 characters are equal to url or not.
I have tried to wrap the parameter in the postlink call inside serialize() and urlencode() but neither has had the desired effect of returning the full string as
urlhttp%3A%2F%2Fwww.google.co.uk%2F
Does anyone know of a successful way to pass through a parameter like this without losing important characters?
Update 1: Deletelink action
public function deletelink($pid = null, $uid = null, $lid = null) {
$this->autoRender = false;
if (!is_null($pid) && is_numeric($pid) && !is_null($uid) && is_numeric($uid)) {
if (!is_null($lid)) {
if (substr($lid, 0, 3) == 'url') {
echo substr($lid, 0, 3);
} else {
echo substr($lid, 0, 3);
}
} else {
$this->Session->setFlash('It is unknown which link you wish to delete from the webpage', 'flash_message_bar', array('class' => 'error'));
return $this->redirect(array('action' => 'edit', $pid));
}
} else {
$this->Session->setFlash('It is unknown which on which webpage you wish to delete a link', 'flash_message_bar', array('class' => 'error'));
return $this->redirect(array('action' => 'index'));
}
}
CakePHP (or mod_rewrite I would say) is getting confused with the way your URL is formed.
Your safest option is to base64_encode the url parameter in the view, which will result in call similar to:
http://mydomainname.com/webpages/deletelink/239/7/dXJsaHR0cDovL3d3dy5nb29nbGUuY28udWsv
and base64_decode it later in the action, which will transform
dXJsaHR0cDovL3d3dy5nb29nbGUuY28udWsv
into
urlhttp://www.google.co.uk/
Related
I've got 3 separate files.
Forms (a basic wordpress page built within Wordpress). The data here shows up fine and works as expected.
<div class="select-wrapper">
<select class="paybill" name="provider-name" id="provider-name" onchange="formFilter(this.value)">
<option value="" disabled selected hidden>- Choose a Provider -</option>
<?php foreach( $providerslist as $providerlist ) {
$theprovidernname = get_the_title($providerlist);
$providerlocations = get_field('provider_locations', $providerlist);
$pcount = count($providerlocations);
for($i = 0; $i < $pcount; $i++){
$location_name = get_field_object('location_name', $providerlocations[$i]);
if(!empty($location_name)){
break;
}
}
if(empty($location_name)){
$location_name = array(value=>"TEXT");
}?>
<option value="<?php echo $location_name['value']?>"><?php echo $theprovidernname; ?></option>
<?php } ?>
</select>
</div>
A filtering Javascript file. The purpose of this file is to get the data from the select field and pass it using AJAX to the 3rd PHP file.
function formFilter(str){
//clears previous results
document.getElementById("form-results").innerHTML = "";
var value = str.value;
console.log(value);
if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
var xmlhttp = new XMLHttpRequest();
} else {// code for IE6, IE5
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
document.getElementById("form-results").innerHTML = xmlhttp.responseText;
}
}
xmlhttp.open("GET",".../framework-forms-results.php?location="+value,true);
xmlhttp.send();
}
A custom PHP file living in the Child Theme folder of the site. What I'm trying to do is call a custom post type called 'location' and then work through the data. On other pages I'm able to get this exact code to work just fine but here it will not work at all. This is the entirety of this Page at the moment. If I remove the get_posts code and just echo some text, it will return the text so I know the issue is with the get_posts call. I just can't figure out why. If I try to load this page alone without going through the select options, it still returns a 500 error.
//Create Array of All Locations
$locations = get_posts(array(
'posts_per_page' => -1,
'post_type' => 'location',
));
print "<pre>";
print_r($locations);
print "</pre>";
Any thoughts as to why the get_posts call won't work on this custom page but will work if it's used via shortcodes on pages built within wordpress?
I've tried debugging, logging errors and reviewing the logs. I've tried to require the blog header to bring in other necessary files but nothing.
If you are calling this URL directly, which is not how WordPress ajax is intended to work, you can still get this code to run by adding this PHP code:
$parse_uri = explode( 'wp-content', $_SERVER['SCRIPT_FILENAME'] );
require_once( $parse_uri[0] . 'wp-load.php' ); to the top of the file.
Link: https://codex.wordpress.org/AJAX_in_Plugins (I know this says Ajax in plugins but this is also what you would do if developing a custom theme to keep your code WordPress-y).
I have to develop software for shop. i have list of product having their price and barcode digits. I want to show each and every items in product list html page along with barcode to take a print of barcode on stickers.
I googled about the zend barcode rendering and i tested also and found result ok with one barcode but here is my mai problem arise that i want to generate multiple barcode in foreach loop on my view->page.
I am very new to codeigniter please help.
My Controller 'Barcode.php'.
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Barcode extends CI_Controller {
public function __construct(){
parent::__construct();
if($this->session->userdata('successful_logged_in')){
//load library
$this->load->library('zend');
//load in folder Zend
$this->zend->load('Zend/Barcode');
$this->load->model('common_model');
}
else{
redirect('login','refresh');
}
}
public function index(){
//Generate 13 digit random number to render barcode
$temp = rand(1111111111111,9999999999999);
$this->set_barcode($temp);
$table='item_master';
$order_by='name ASC';
$data['item_list']=$this->common_model->select_active_records($table,$order_by);
$this->load->view('home/header');
$this->load->view($this->router->fetch_class().'/records',$data);
$this->load->view('home/footer');
}
public function set_barcode($code){
//generate barcode
Zend_Barcode::render('code128', 'image', array('text'=>$code), array());
}
In my View 'records.php'.
<tbody>';
$i=1;
if($item_list==false){
echo '<tr class="text-danger"><td colspan="3"><strong<i class="fa fa-info-circle" style="font-size:12pt;"></i> - No record found</td></tr>';
}
else{
foreach ($item_list as $row){
echo '<tr>';
echo '<td>'.$i++.'</td>';
echo '<td>'.$row->name.'</td>';
echo '<td>'.$row->price.'</td>';
echo '<td>'.$row->barcode.'</td>';
echo '</tr>';
}
}
echo'
</tbody>
But this shows me only one barcode on entire html body page which was generated by random number
I Want the final result something like this
Expected Result
// Create a folder in your root directory like : root/barcode
public function set_barcode($code){
//generate barcode
$file = Zend_Barcode::render('code128', 'image', array('text'=>$code), array());
$code = time().'1222';
imagepng($file,"barcode/{$code}.png");
$data['barcode'] = $code.'.png';
$this->load->view('dashboard/products',$data);
}
// Add view page like this
<img src="<?php echo base_url().'barcode/'.$barcode; ?>" alt="">
I heard building Data in View is not very good, but anyway, i am wondering why its not working:
View
<?php $form = ActiveForm::begin();
$alleSpieler = \common\models\Spieler::find()->all();
if ($alleSpieler) {
unset($types);
foreach ($alleSpieler as $value) {
$types[$value->id] = $value->email . ' ' . $value->vorname . ' ' . $value->nachname;
}
}
echo $form->field($model, 'spielerId')->dropDownList($types, 'prompt'=>'Spieler manuell hinzufügen']);
ActiveForm::end();
?>
<?= AnmeldungDurchfuehrung2::widget(['durchfuehrungId' => $model->id, 'spielerId' => $model->spielerId]) ?>
Model
public $spielerId;
But spielerId ist not set in my Case. If i, for example, set 'spielerId' => 1120 in the widget call, it is working. But if i want the value from the dropdownlist, the action is saying that spielerId is missing. I am newbie and perhaps i forgot something? Thank you!
You must add $spielerId; in validation array in your model, som like this:
public function rules()
{
return [
[['spielerId'], 'integer'], //type of atribute value
[['spielerId'], 'required'], //if need
/*... other atributes ...*/
];
}
for more detail check the documentation.
okay now i know what i need:
echo $form->field($model, 'spielerId')->dropDownList($types,['prompt'=>'Waehlen Sie einen Spieler']);
echo Html::submitButton('Auswählen', ['class' => 'btn btn-primary']);
This is my Dropdown.
I need something like:
<?php if(!empty($_GET['spielerId'])) {
echo AnmeldungDurchfuehrung2::widget(['durchfuehrungId' => $model->id, 'spielerId' => $_GET['subject']]); }?>
In a ZF2 project I am developing, I would like to create a shell around the echo $this->content; statement in layout.phtml that would allow conditional formatting of the main content area. Specifically, I want to put the content into a column that is 75% wide and include some “ornamental” elements in a column that is 25% wide for most of the pages. However, I want to change to a single column for pages that need more space. My project is a CMS in which each page has an attribute that can tell either the view or the controller whether the page should be normal or wide. I have considered a number of methods for achieving what I’m after.
My “conditional formatting in the layout view” might look like this:
// module/Application/view/layout/layout.phtml:
//...
if ($templateNormal) {
echo "<div class='col-md-9'>";
} else {
echo "<div class='col-md-12'>";
}
echo $this->content;
if ($templateNormal) {
echo "</div>";
echo "<div class='col-md-3'>";
//... ornamentation
echo "</div>";
} else {
echo "</div>";
}
//...
While the above-method could work, for pure MVC I don’t think there is supposed to be any decision-making going on in the layout view.
My “conditional formatting in partial views” could look like this:
// module/Application/view/layout/layout.phtml:
//...
echo $this->partial('partial/open-shell.phtml');
echo $this->content;
echo $this->partial('partial/close-shell.phtml');
//...
// module/Application/view/partial/open-shell.phtml:
if ($templateNormal) {
echo "<div class='col-md-9'>";
} else {
echo "<div class='col-md-12'>";
}
// module/Application/view/partial/close-shell.phtml:
if ($templateNormal) {
echo "</div>";
echo "<div class='col-md-3'>";
//... ornamentation
echo "</div>";
} else {
echo "</div>";
}
Here the decision-making is taken out of the layout view, but it is simply put into other views so it's still in the view package and still not pure MVC.
In my “conditional formatting in the controller” solution, a pair of html script strings are developed in a controller function, and then passed on to the view. It might look like this:
// module/Application/view/layout/layout.phtml:
//...
echo $this->open-shell-script';
echo $this->content;
echo $this->close-shell-script';
//...
// some controller function:
//...
if ($templateNormal) {
$open-shell-script = "<div class='col-md-9'>";
$close-shell-script = "</div>";
$close-shell-script = "<div class='col-md-3'>";
$close-shell-script .= //... ornamentation
$close-shell-script .= "</div>";
} else {
$open-shell-script = "<div class='col-md-12'>";
$close-shell-script = "</div>";
}
//...
In this method, the decision-making is done in the controller where I assume it should be, but it seems odd to be writing html there.
Any comments or suggestions?
create two layout and in init() method of Module.php decide which layout should use .
public function init(ModuleManager $moduleManager) {
$sharedEvents = $moduleManager->getEventManager()->getSharedManager();
$sharedEvents->attach(__NAMESPACE__, 'dispatch', function($e) {
// This event will only be fired when an ActionController under the MyModule namespace is dispatched.
$controller = $e->getTarget();
$controller->layout(" your chose layout ");
}
}
There are many ways to accomplish this. This is one method and the logic lives in the controller:
controller
public function yourSampleAction()
{
// assign variables as usual to this view model
$viewModel = new ViewModel(array(
//vars
);
// this will be the "wrapper" and can be single, double column or anything else.
$wrapperViewModel = new ViewModel();
$wrapperViewModel->addChild($viewModel, 'innerContent');
// use this line when you want one column
$wrapperViewModel->setTemplate('path/to/your/single-column-wrapper.phtml');
// when this line you want two columns
$wrapperViewModel->setTemplate('path/to/your/two-column-wrapper.phtml');
return $wrapperViewModel;
}
two-column-wrapper.phtml
<div class='col-md-9'>
<?php echo $innerConntent; ?>
</div>
<div class='col-md-3'>
<!--- something else in here? -->
</div>
single-column-wrapper.phtml
<div class='col-md-12'>
<?php echo $innerConntent; ?>
</div>
Instead of setting different templates, you can adjust the Bootstrap Twitter classes by making the necessary classes dependent on a layout variable. You can use the logic in your controllers action to pass variables directly to the layout (not the view) like so:
$this->layout()->setVariables
(
array
(
'layoutVar1' => 75,
'someColClass' => ($someSwitch ? 'col-md-9':'col-md-12' ),
'layoutVar1' => 75,
)
);
and then just access these variables in the Layout as you would variables sent to the View. You don't have to even prepend them with "layout", they won't clash.
the code i put in the mytheme template.php
function mytheme_theme(){
return array(
'mytheme_example' => 'example',
'argument' => array('myvar' => null),
);
}
the code i put in the node.tpl.php
<?php
$html = "";
$myvar = "hello,world";
$html .= theme('mytheme_example', myvar);
return $html;
?>
the code i put into the example.tpl.php
<div>
here is the <b><?php print myvar; ?></b>being created.
</div>
i have cleared the cache,but on the node article's page, there is no any output about hello world.
ps:which files i can use the hook_theme, template.php, module file. are there any files i can use this hook?
It looks like you have declared your hook_theme correctly in template.php so I do not think this is the issue.
I did spot a syntax issue with your node.tpl.php, should it not be:
<?php
$vars = array('myvar' => 'hello, world');
$html = theme('mytheme_example', $vars);
return $html;
?>
Note the associate array, with the 'myvar' (the variable declared in hook_theme), is being passed in as the key.
Another point, it is standard practice to name the template file the same as the hook name, so I would suggest calling the template mytheme-example.tpl.php.
See drupal.org for more information
I don't know if you have solved that issue yet.
I would try to declare my theme this way:
function mytheme_theme(){
return array(
'mytheme_example' => array(
'arguments' => array('arguments'=>array()),
'template' => 'example',
),
}
That's how I usually do and it works fine on me.