开发者

Zend Framework fancybox confirmation dialog with ajax and posted values

开发者 https://www.devze.com 2023-01-08 21:21 出处:网络
I created a confirmation page for deleting an item. This works perfectly. Now I want to appear the confirmation page in fancybox, s开发者_高级运维till passing all the variables and delete the data or

I created a confirmation page for deleting an item. This works perfectly.

Now I want to appear the confirmation page in fancybox, s开发者_高级运维till passing all the variables and delete the data or close the dialog.

It's important that the process still works as it does now (delete->confirmationpage->redirect/deletion) so that users with javascript disabled can perform these actions without a problem.

Now have I been reading about zend framework,ajax, json and more, but the more I read, the less I understand.

So in a nutshell, my question:

I want to pass a variable to the fancybox and if 'yes' perform the delete action or on 'no' close the dialog. This within the zend framework and jquery.

Any advice or tips are greatly appreciated!


You need to use content switching in your ajax which will then render your action appropriately, for example:

function confirmDeleteAction() {
  if($this->_request->isXmlHttpRequest()) {
    //This is ajax so we want to disable the layout
    $this->_helper->layout->disableLayout();
    //Think about whether you want to use a different view here using: viewRenderer('yourview')
  }
  //The normal code can go here
}

function deleteAction() {
  //You probably don't want to show anything here, just do the delete logic and redirect therefore you don't need to worry where it's coming from
}

And in your fancybox, have a view that has a form and two buttons, the form should point to your delete action with the id of whatever your deleting as a get param. Set some javascript up that says something like (and this is mootools code, but you can convert it easily):

$('confirmButton').addEvent('click', function(e) {
   e.preventDefault();
   this.getParent('form').submit();
}
$('cancelButton').addEvent('click', function(e) {
   e.preventDefault();
   $('fancyBox').destroy(); //I'm not sure it has an id of fancyBox, never used it
}


Came across the question today and figured I could give it a fresh look. For Zend Framework the solution is really simple:

This is how the action looks:

public function deleteAction()
    {
        $this->_helper->layout()->disableLayout();

        $this->view->news = $this->newsService->GetNews($this->_getParam('id'));

        if($this->getRequest()->isPost())
        {
            if($this->getRequest()->getPost('delete') == 'Yes')
            {
                $this->newsService->DeleteNews($this->_getParam('id'), $this->view->user->username, $this->view->translate('deleted: ').'<strong>'.$this->view->pages[0]['title'].'</strong>');
                $this->_helper->flashMessenger(array('message' => $this->view->translate('The page is deleted'), 'status' => 'success'));
                $this->_helper->redirectToIndex();
            }
            elseif($this->getRequest()->getPost('delete') == 'No')
            {
                $this->_helper->flashMessenger(array('message' => $this->view->translate('The page is <u>not</u> deleted'), 'status' => 'notice'));
                $this->_helper->redirectToIndex();
            }
        }
    }

The delete.phtml

<div>
<h2><?php echo $this->translate('Delete news'); ?></h2>
<?php
foreach($this->news as $news)
{
?>
<p>
    <?php echo $this->translate('You are now deleting <strong>\'').$news['title'].$this->translate('\'</strong>. Are you sure about this?'); ?>
</p>
<p>
    <?php echo $this->translate('<strong>Note! </strong>This action is inreversable, even for us!'); ?>
</p>
<form action="<?php echo $this->baseUrl(false).'/news/index/delete/'.$news['id']; ?>" method="post">
<?php
}
?>
    <input class="submit deleteYes" type="submit" name="delete" value="<?php echo $this->translate('Yes'); ?>" />
    <input class="submit deleteNo" type="submit" name="delete" value="<?php echo $this->translate('No'); ?>" />
</form>

And this is how the link to delete a file looks (within a foreach loop with my database results)

<a class="deleteConfirmation" href="<?php echo $this->baseUrl(false).'/news/index/delete/'.$news->id; ?>">delete</a>

This works like you would expect; when you click on delete the user goes to the delete confirmation page and redirects the user back to the index after the form is submitted. But I wanted the confirmation in a dialog (in my case I use fancybox). To achieve this, add the following jquery to your index:

$('.deleteConfirmation').fancybox({
            // Normal fancybox parameters
            ajax : {
                type    : "POST"
            }
        });
0

精彩评论

暂无评论...
验证码 换一张
取 消