is_published Ajax

1 нояб. 2011 г., 09:09:34  1034


Полезный хак, можно использовать не только для изменения статуса публиции статьи, я например заюзал ее для активации пользователей, если кому не пришло письмо для активации акка.

Для работы с AJAX используем jQuery. Для этого добавляем в

/backend/config/view.yml следующее javascripts: [jq/jquery.pack.js] или любой имеющуюся у вас библиотеку jQuery.
Затем в /backend/templates/layout.php добавляем такой код

	<script>

jQuery(document).ready(function($){
$("body").after("< div id='result_div' >< /div >");
$("#result_div").html("< img style='padding: 20px' src='/images/loading.gif' align='absmiddle' />  обработка...");
$("#result_div").hide();
$("#result_div").css({
    "background-color": "#ffffcc",
    "opacity": "0.7",
    "width": "40%",
    "height": "auto",
    "font-family": "Arial Tahoma",
    "text-align": "center",
    "vertical-align": "middle",
    "border": "1px solid silver",
    "position": "absolute",
    "top": "40%",
    "left": "30%",
    "z-index": "9999"
});
});
< /script>

Изменяем _is_published.php

<center>
echo
link_to(image_tag(sfConfig::get('sf_admin_web_dir')."/images/".
    ($myObject->getIsPublished() ? 'ok.png' : 'cancel.png'),
    array('id' => 'switch_status_'.$myObject->getId())
  ),
  "my_module/switchStatus?id=".$myObject->getId(),
  array(
    'class'   => 'switch_status',
    'rel'     => 'switch_status_'.$myObject->getId(),
    'pic_dir' => sfConfig::get('sf_admin_web_dir')."/images/",
  )
);//link to
?>
</center > 

Добавлем файл my_module/templates/_list_footer.php 

<script>
$(document).ready(function() {
  $(".switch_status").each( function (){
    $(this).click( function (){
      var popupX = Math.round( ($(window).width() - $("#result_div").width()) / 2) ;
      var popupY = $(document).scrollTop() + Math.round($(window).height()/2) -
Math.round($("#result_div").height()/2); 
      $("#result_div").css({top: popupY+"px", left: popupX+"px"});
      var pic_dir = $(this).attr("pic_dir")
      var pic_id  = $(this).attr("rel")
      $("#result_div").slideDown("slow");
 
      $.ajax({
        type: "POST",
        url: $(this).attr('href'),
        data: "",
        success: function(msg){
          var pic_name = (msg == 1 ? "ok" : "cancel") + ".png"
          $("#"+pic_id).attr("src", pic_dir + "/" + pic_name)
          $("#result_div").slideUp("slow");
        }
      });//ajax
      return false;
    })//click
  })//each
});	</script>
	

Добавляем новый метод executeSwitchStatus в модуль my_module 

public function executeSwitchStatus($request){ $myObject = xxxPeer::retrieveByPk($this->getRequestParameter('id')); $currentStatus = $myObject->getIsPublished(); $newStatus = ($currentStatus == 1 ? 0 : 1); $myObject->setIsPublished($newStatus); $myObject->save(); $isAjax = $request->isXmlHttpRequest(); if ($isAjax){ return $this->renderText($newStatus); } else { //do something if not AJAX }//if }//change status

Выходит нечто такое =) 

Ajax+symfony
Ajax+symfony