How to load views via Ajax with Zend Framework? - php

Is it possible to load views with ajax in the zend framework, that way the layout page doesn't get refreshed, just the main content div?

use Ajax context switching you can do it by adding this to your init function in your controller
public function init()
{
$ajaxContext = $this->_helper->getHelper('AjaxContext');
$ajaxContext->addActionContext('my', 'html') //my is your action
->initContext();
}
The html parameter is the type of Ajax request. it can also be JSON or XML
public function myAction() {
// get what you are sending to your view : data
$this->view->data = $data;
}
create a view my.ajax.phtml to which which myAction will attempt to render to it by default
and then include my.ajax.phtml in your view (your main content div)

With Zend 1.12 we used the Zend_Controller_Action_Helper_Json;
Controller:
use Zend_Controller_Action_Helper_Json;
class MyController extends Zend_Controller_Action {
public function init() {
Zend_Controller_Action_HelperBroker::addHelper(new Zend_Controller_Action_Helper_Json());
}
public function fooAction() {
$this->getResponse()->setHttpResponseCode(200);
$this->_helper->json(array('value' => 1));
}
}
View:
No view file
Output:
{"value":1}
Call:
http://example/my/foo

Related

is there a way to make template but not render it in plates php

Is there a way in plates php where I can make a template in a controller but render it using another controller. Say I have two controllers. HeaderController and a SearchController.
SearchController
class Search extends \system\core\BaseController
{
public function Index()
{
$data['text_search'] = 'Search..';
// This $this->template->render down below is what I don't want now
// okay asign the data but do not display the template yet
echo $this->template->render('common/search', $data);
}
}
The dummy SearchController should assign $data to the template search.tpl but not render/display the template.
This is where I will be calling the above controller
HeaderController
class HeaderController extends \system\core\BaseController
{
public function Index()
{
// Some codes
// Call / load the SearchController and asign it to $data['search']
$data['search'] = $this->load->controller('common/SearchController');
// and then pass all $data and render/display it.
echo $this->template->render('common/header', $data);
}
}
Is there a way of doing it?
The issue actually comes from the fact, that you are using echo within your class. If your "controllers" (well, they actually seem to be a combination of view and controller) were to return either the content or Response class instance, then you problem should disappear.

Calling a Controller Method in a View - Codeigniter [duplicate]

How to call codeigniter controller function from view? When i call the function in a controller, get a 404 page.
You can call controller function from view in the following way:
Controller:
public function read() {
$object['controller'] = $this;
$this->load->view('read', $object);
}
View:
// to call controller function from view, do
$controller->myOtherFunct();
Codeigniter is an MVC (Model - View - Controller) framework. It's really not a good idea to call a function from the view. The view should be used just for presentation, and all your logic should be happening before you get to the view in the controllers and models.
A good start for clarifying the best practice is to follow this tutorial:
https://codeigniter.com/user_guide/tutorial/index.html
It's simple, but it really lays out an excellent how-to.
I hope this helps!
You can call a controller function with AJAX on your view.
In this case, I'm using the jQuery library to make the call.
<script type="text/javascript">
$.ajax({
url: "<?=site_url("controller/function")?>",
type: "post", // To protect sensitive data
data: {
ajax:true,
variableX: "string",
variableY: 25
//and any other variables you want to pass via POST
},
success:function(response){
// Handle the response object
}
});
</script>
This way you can create portions of code (modules) and reload them the AJAX method in a HTML container.
I would like to answer this question as this comes all times up in searches --
You can call a controller method in view, but please note that this is not a good practice in any MVC including codeigniter.
Your controller may be like below class --
<?php
class VCI_Controller extends CI_Controller {
....
....
function abc($id){
return $id ;
}
}
?>
Now You can call this function in view files as below --
<?php
$CI =& get_instance();
$CI->abc($id) ;
?>
class MY_Controller extends CI_Controller {
public $CI = NULL;
public function __construct() {
parent::__construct();
$this->CI = & get_instance();
}
public function yourMethod() {
}
}
// in view just call
$this->CI->yourMethod();
Try this one.
Add this code in Your View file
$CI = & get_instance();
$result = $CI->FindFurnishName($pera);
Add code in Your controller File
public function FindFurnishName($furnish_filter)
{
$FindFurnishName = $this->index_modal->FindFurnishName($furnish_filter);
$FindFurnishName_val = '';
foreach($FindFurnishName as $AllRea)
{
$FindFurnishName_val .= ",".$AllRea->name;
}
return ltrim($FindFurnishName_val,',');
}
where
FindFurnishName is name of function which is define in Your Controller.
$pera is a option ( as your need).
One idea i can give is,
Call that function in controller itself and return value to view file. Like,
class Business extends CI_Controller {
public function index() {
$data['css'] = 'profile';
$data['cur_url'] = $this->getCurrURL(); // the function called and store val
$this->load->view("home_view",$data);
}
function getCurrURL() {
$currURL='http://'.$_SERVER['HTTP_HOST'].'/'.ltrim($_SERVER['REQUEST_URI'],'/').'';
return $currURL;
}
}
in view(home_view.php) use that variable. Like,
echo $cur_url;
views cannot call controller functions.
I know this is bad..
But I have been in hard situation where it is impossible to put this back to controller or model.
My solution is to call a function on model.
It can be do inside a view.
But you have to make sure the model has been loaded to your controller first.
Say your model main_model, you can call function on the model like this on your view :
$this->main_model->your_function();
Hope this help. :)
We can also pass controller function as variable in the view page.
class My_controller extends CI_Controller {
public function index() {
$data['val']=3;
$data['square']=function($val){
return $val*$val;
};
$this->load->view('my-view',$data);
}
}
In the view page
<p>Square of <?=$val?>
<?php
echo $square($val);
?>
</p>
The output is 9
it is quite simple just have the function correctly written in the controller class and use a tag to specify the controller class and method name, or any other neccessary parameter..
<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Iris extends CI_Controller {
function __construct(){
parent::__construct();
$this->load->model('script');
$this->load->model('alert');
}public function pledge_ph(){
$this->script->phpledge();
}
}
?>
This is the controller class Iris.php
and the model class with the function pointed to from the controller class.
<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Script extends CI_Model {
public function __construct() {
parent::__construct();
// Your own constructor code
}public function ghpledge(){
$gh_id = uniqid(rand(1,11));
$date=date("y-m-d");
$gh_member = $_SESSION['member_id'];
$amount= 10000;
$data = array(
'gh_id'=> $gh_id,
'gh_member'=> $gh_member,
'amount'=> $amount,
'date'=> $date
);
$this->db->insert('iris_gh',$data);
}
}
?>
On the view instead of a button just use the anchor link with the controller name and method name.
<html>
<head></head>
<body>
PLEDGE PH
</body>
</html>
I had this same issue , but after a couple of research I fond it out it's quite simple to do,
Locate this URL in your Codeigniter project: application/helpers/util_helper.php
add this below code
//you can define any kind of function but I have queried database in my case
//check if the function exist
if (!function_exists('yourfunctionname')) {
function yourfunctionname($param (if neccesary)) {
//get the instance
$ci = & get_instance();
// write your query with the instance class
$data = $ci->db->select('*');
$data = $ci->db->from('table');
$data = $ci->db->where('something', 'something');
//you can return anythting
$data = $ci->db->get()->num_rows();
if ($data > 0) {
return $data;
} else {
return 0;
}
}
}
I know this question is old but it is still a relevant question. From my experience there are situations that warrant calling a function from view in your Codeigniter 4 app, I'll just advise that you keep it clean and minimal. Below is how I have called controller function from view:
In your controller file add this code
public function index()
{
$data = [];
$model = new UsersModel();
$data['users'] = $model->findAll();
// $this refers to the controller to be called from view
$data['callfromview'] = $this;
return view('users', $data)
}
In your view, call the controller like this:
<?php $something = $callfromview->fetch_data($id);?>
Finally in the controller, create the fetch_data function
public function fetch_data($id)
{
$image = new ImageModel();
return $image->find($id);
}
the END!
if you need to call a controller from a view,
maybe to load a partial view,
you thinking as modular programming,
and you should implement HMVC structure in lieu of plane MVC.
CodeIgniter didnt implement HMVC natively,
but you can use this useful library in order to implement HMVC.
https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc
after setup
remember:that all your controllers should extends from MX_Controller in order to using this feature.
Go to the top of your View code and do it like this :
<?php
$this->load->model('MyModelName');
$MyFunctionReturnValue = $this->MyModelName->MyFunctionName($param));
?>
<div class="row">
Your HTML CODE
</div>

Phalcon view controller is not controlling the view

I'm programming an admin web ui for a online system, I managed to mount a url to the view using,
$app->get(
"/main/index",
function () use ($app){
//no echo here
$app["view"]->render(
"main","index"
);
}
);
And my Main controller is like,
<?php
class MainController extends ControllerBase
{
public function initialize()
{
$this->tag->setTitle('Home Page');
$this->view->setTemplateAfter('nav');
}
public function indexAction()
{
}
}
My view structure is like,
views
--layouts
----index.volt
----nav.volt
--main
----index.volt
--index.volt
My problem is no matter how I change the MainController code, it doesn't affect anything on the rendered view main,index. So I wish to know what's wrong here?
The first parameter of render is for your view template, the second is for your view parameters.
$app->get(
"/main/index",
function () use ($app) {
$app["view"]->render(
"main/index"
);
}
);
Just change "main","index" to "main/index" and your view should render.

Can Zend Framework 1.x disable layouts and rendering on an entire module?

I have a module called api that I would like to flatly disable all rendering and layout and only return JSON. I know I can disable layouts per action in a controller like so:
$this->_helper->_layout->disableLayout();
$this->_helper->viewRenderer->setNoRender(TRUE);
But how can I do it on the entire api module?
Solution:
Put this in it's own controller and have all the other controllers extend this:
public function preDispatch() {
$this->_helper->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender(true);
}
class My_Controller_Action extends Zend_Controller_Action
{
public function init()
{
$this->_helper->_layout->disableLayout();
$this->_helper->viewRenderer->setNoRender(TRUE);
}
}
class Api_IndexController extends My_Controller_Action
{
public function viewAction()
{
// data to return
$data = array();
$this->_helper->json($data);
}
}
Create plugin and add preDispatch() method like this:
public function preDispatch(Zend_Controller_Request_Abstract $request)
if ($request->getModuleName() === 'messages') {
Zend_Layout::getMvcInstance()->disableLayout();
Zend_Controller_Action_HelperBroker::getExistingHelper('viewRenderer')->setNeverRender(true);
}
From now on module 'messages' will have Layout and view disabled.
Maybe you can create a parent controller with your code, that all your module controller will extend.

how to call a function inside a controller in opencart

i have a controller that have with in let's say thingy/stuff directory
<?php public function index() { /*thingy stuff */ }
public function anotherfunction() {/*other thingy stuff*/} ?>
i see tthe url like index.php?route=thingy/stuff&var=dd
what i want is to call an $.post to this function inside that controller
so it uses another template file thingy.tpl and return html to use
what the URL should like ??
i searched for hours ans it sounds like there is no development documentation for open-cart out there
let's say you have a controller called "stuff" under the thingy folder and a function called "my function" within that class, that looks like this:
class ControllerThingyStuff extends Controller {
public function index() {
// Some code
}
public function myfunction() {
// Your code
}
}
if you want to directly communicate with this function using the URL you can add the function name to the end of the route parameter "route=thingy/stuff/myfunction& ..." and load the thingy.tpl inside the function and return it after rendering:
// some code
$this->template = 'template/product/thingy.tpl';
...
$this->response->setOutput($this->render());
if are using the open cart 1.5 and you want to use jQuery AJAX with JSON then you'll need to import the JSON library before rendering:
$this->template = 'thingy/stuff/thingy.tpl';
$json['output'] = $this->render();
$this->load->library('json');
$this->response->setOutput(Json::encode($json));
take a look at the checkout page to get some ideas, the default open cart 1.5 template uses the same technique to load the templates for each section.
It's added to the route if it's not index, which it is by default, for example
<?php
class ControllerThingyStuff extends Controller {
public function index() {
// This is called with route=thingy/stuff or thingy/stuff/index
}
public function something() {
// This is called with route=thingy/stuff/something
}
}

Categories