308 Zeilen
		
	
	
		
			Kein EOL
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			308 Zeilen
		
	
	
		
			Kein EOL
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * Zend Framework
 | 
						|
 *
 | 
						|
 * LICENSE
 | 
						|
 *
 | 
						|
 * This source file is subject to the new BSD license that is bundled
 | 
						|
 * with this package in the file LICENSE.txt.
 | 
						|
 * It is also available through the world-wide-web at this URL:
 | 
						|
 * http://framework.zend.com/license/new-bsd
 | 
						|
 * If you did not receive a copy of the license and are unable to
 | 
						|
 * obtain it through the world-wide-web, please send an email
 | 
						|
 * to license@zend.com so we can send you a copy immediately.
 | 
						|
 *
 | 
						|
 * @category    ZendX
 | 
						|
 * @package     ZendX_JQuery
 | 
						|
 * @subpackage  View
 | 
						|
 * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
 | 
						|
 * @license     http://framework.zend.com/license/new-bsd     New BSD License
 | 
						|
 * @version     $Id$
 | 
						|
 */
 | 
						|
 | 
						|
/**
 | 
						|
 * @see Zend_View_Helper_HtmlElement
 | 
						|
 */
 | 
						|
include_once "Zend/View/Helper/HtmlElement.php";
 | 
						|
 | 
						|
/**
 | 
						|
 * jQuery Accordion Pane, goes with Accordion Container
 | 
						|
 *
 | 
						|
 * @uses 	   Zend_Json
 | 
						|
 * @package    ZendX_JQuery
 | 
						|
 * @subpackage View
 | 
						|
 * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
 | 
						|
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 | 
						|
 */
 | 
						|
class ZendX_JQuery_View_Helper_AjaxLink extends Zend_View_Helper_HtmlElement
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * Static because multiple instances accross views of AjaxLink could reset the counter and a
 | 
						|
     * subcontainer because of this single private class variable seems too much overhead.
 | 
						|
     *
 | 
						|
     * @staticvar Integer
 | 
						|
     */
 | 
						|
    private static $currentLinkCallbackId = 1;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Create an anchor that enables ajax-based requests and handling of the response.
 | 
						|
     *
 | 
						|
     * This helper creates links that make XmlHttpRequests to the server. It allows to
 | 
						|
     * inject the response into the DOM. Fancy effects going with the links can be enabled
 | 
						|
     * via simple callback shortnames. The functionality is mostly controlled by the $options
 | 
						|
     * array:
 | 
						|
     *
 | 
						|
     * $options
 | 
						|
     *  Key				Behaviour
 | 
						|
     *  =================================================================================
 | 
						|
     *  'update'        Update a container with the content fetched from $url
 | 
						|
     *  'method'        Explicit Requesting method mimicing the jQuery functionality: GET, POST
 | 
						|
     *  'inline'        True or false, wheater to inline the javascript in onClick=""
 | 
						|
     * 					atttribute or append it to jQuery onLoad Stack.
 | 
						|
     *  'complete'      String specifies javascript called after successful request or a
 | 
						|
     * 					shortname of a jQuery effect that should be applied to the 'update' element.
 | 
						|
     *  'beforeSend'	String specifies javascript called before the request is sent, or a
 | 
						|
     * 					shortname of a jQuery effect that should be applied to the link clicked.
 | 
						|
     *  'noscript'		True/false, include a noscript variant that directly requests
 | 
						|
     * 					the given $url (make sure to check $request->isXmlHttpRequest())
 | 
						|
     *  'dataType'		What type of data is the response returning? text, html, json?
 | 
						|
     *  'title'			HTML Attribute title of the Anchor
 | 
						|
     *  'class'			HTML Attribute class of the Anchor
 | 
						|
     *  'id'			HTML Attribute id of the Anchor
 | 
						|
     *  'attribs'		Array of Key-Value pairs with HTML Attribute names and their content.
 | 
						|
     *
 | 
						|
     * BeforeSend Callback:
 | 
						|
     * Can include shortcuts as a string assignment to fire of effects before sending of request.
 | 
						|
     * Possible shortcuts are 'fadeOut', 'fadeOutSlow', 'hide', 'hideSlow', 'slideUp', 'flash',
 | 
						|
     * @example $options = array('beforeSend' => 'hideSlow', 'complete' => 'show');
 | 
						|
     *
 | 
						|
     * @link   http://docs.jquery.com/Ajax
 | 
						|
     * @param  String $label Urls Title
 | 
						|
     * @param  String $url Link to Point to
 | 
						|
     * @param  Array $options
 | 
						|
     * @param  Array $params Key Value Pairs of GET/POST Parameters
 | 
						|
     * @return String
 | 
						|
     */
 | 
						|
    public function ajaxLink($label, $url, $options=null, $params=null)
 | 
						|
    {
 | 
						|
        $jquery = $this->view->jQuery();
 | 
						|
        $jquery->enable();
 | 
						|
 | 
						|
        $jqHandler = (ZendX_JQuery_View_Helper_JQuery::getNoConflictMode()==true)?'$j':'$';
 | 
						|
 | 
						|
        $attribs = array();
 | 
						|
        if(isset($options['attribs']) && is_array($options['attribs'])) {
 | 
						|
            $attribs = $options['attribs'];
 | 
						|
        }
 | 
						|
 | 
						|
        //
 | 
						|
        // The next following 4 conditions check for html attributes that the link might need
 | 
						|
        //
 | 
						|
        if(empty($options['noscript']) || $options['noscript'] == false) {
 | 
						|
            $attribs['href'] = "#";
 | 
						|
        } else {
 | 
						|
            $attribs['href'] = $url;
 | 
						|
        }
 | 
						|
 | 
						|
        if(!empty($options['title'])) {
 | 
						|
            $attribs['title'] = $options['title'];
 | 
						|
        }
 | 
						|
 | 
						|
        // class value is an array because the jQuery CSS selector
 | 
						|
        // click event needs its own classname later on
 | 
						|
        if(!isset($attribs['class'])) {
 | 
						|
            $attribs['class'] = array();
 | 
						|
        } elseif(is_string($attribs['class'])) {
 | 
						|
            $attribs['class'] = explode(" ", $attribs['class']);
 | 
						|
        }
 | 
						|
        if(!empty($options['class'])) {
 | 
						|
            $attribs['class'][] = $options['class'];
 | 
						|
        }
 | 
						|
 | 
						|
        if(!empty($options['id'])) {
 | 
						|
            $attribs['id'] = $options['id'];
 | 
						|
        }
 | 
						|
 | 
						|
        //
 | 
						|
        // Execute Javascript inline?
 | 
						|
        //
 | 
						|
        $inline = false;
 | 
						|
        if(!empty($options['inline']) && $options['inline'] == true) {
 | 
						|
            $inline = true;
 | 
						|
        }
 | 
						|
 | 
						|
        //
 | 
						|
        // Detect the callbacks:
 | 
						|
        // Just those two callbacks, beforeSend and complete can be defined for the $.get and $.post options.
 | 
						|
        // Pick all the defined callbacks and put them on their respective stacks.
 | 
						|
        //
 | 
						|
        $callbacks = array('beforeSend' => null, 'complete' => null);
 | 
						|
        if(isset($options['beforeSend'])) {
 | 
						|
            $callbacks['beforeSend'] = $options['beforeSend'];
 | 
						|
        }
 | 
						|
        if(isset($options['complete'])) {
 | 
						|
            $callbacks['complete'] = $options['complete'];
 | 
						|
        }
 | 
						|
 | 
						|
        $updateContainer = false;
 | 
						|
        if(!empty($options['update']) && is_string($options['update'])) {
 | 
						|
            $updateContainer = $options['update'];
 | 
						|
 | 
						|
            // Additionally check if there is a callback complete that is a shortcut to be executed
 | 
						|
            // on the specified update container
 | 
						|
            if(!empty($callbacks['complete'])) {
 | 
						|
                switch(strtolower($callbacks['complete'])) {
 | 
						|
                    case 'show':
 | 
						|
                        $callbacks['complete'] = sprintf("%s('%s').show();", $jqHandler, $updateContainer);
 | 
						|
                        break;
 | 
						|
                    case 'showslow':
 | 
						|
                        $callbacks['complete'] = sprintf("%s('%s').show('slow');", $jqHandler, $updateContainer);
 | 
						|
                        break;
 | 
						|
                    case 'shownormal':
 | 
						|
                        $callbacks['complete'] = sprintf("%s('%s').show('normal');", $jqHandler, $updateContainer);
 | 
						|
                        break;
 | 
						|
                    case 'showfast':
 | 
						|
                        $callbacks['complete'] = sprintf("%s('%s').show('fast');", $jqHandler, $updateContainer);
 | 
						|
                        break;
 | 
						|
                    case 'fadein':
 | 
						|
                        $callbacks['complete'] = sprintf("%s('%s').fadeIn('normal');", $jqHandler, $updateContainer);
 | 
						|
                        break;
 | 
						|
                    case 'fadeinslow':
 | 
						|
                        $callbacks['complete'] = sprintf("%s('%s').fadeIn('slow');", $jqHandler, $updateContainer);
 | 
						|
                        break;
 | 
						|
                    case 'fadeinfast':
 | 
						|
                        $callbacks['complete'] = sprintf("%s('%s').fadeIn('fast');", $jqHandler, $updateContainer);
 | 
						|
                        break;
 | 
						|
                    case 'slidedown':
 | 
						|
                        $callbacks['complete'] = sprintf("%s('%s').slideDown('normal');", $jqHandler, $updateContainer);
 | 
						|
                        break;
 | 
						|
                    case 'slidedownslow':
 | 
						|
                        $callbacks['complete'] = sprintf("%s('%s').slideDown('slow');", $jqHandler, $updateContainer);
 | 
						|
                        break;
 | 
						|
                    case 'slidedownfast':
 | 
						|
                        $callbacks['complete'] = sprintf("%s('%s').slideDown('fast');", $jqHandler, $updateContainer);
 | 
						|
                        break;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        if(empty($options['dataType'])) {
 | 
						|
            $options['dataType'] = "html";
 | 
						|
        }
 | 
						|
 | 
						|
        $requestHandler = $this->_determineRequestHandler($options, (count($params)>0)?true:false);
 | 
						|
 | 
						|
        $callbackCompleteJs = array();
 | 
						|
        if($updateContainer != false) {
 | 
						|
            if($options['dataType'] == "text") {
 | 
						|
                $callbackCompleteJs[] = sprintf("%s('%s').text(data);", $jqHandler, $updateContainer);
 | 
						|
            } else {
 | 
						|
                $callbackCompleteJs[] = sprintf("%s('%s').html(data);", $jqHandler, $updateContainer);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        if($callbacks['complete'] != null) {
 | 
						|
            $callbackCompleteJs[] = $callbacks['complete'];
 | 
						|
        }
 | 
						|
 | 
						|
        if(isset($params) && count($params) > 0) {
 | 
						|
            $params = ZendX_JQuery::encodeJson($params);
 | 
						|
        } else {
 | 
						|
            $params = '{}';
 | 
						|
        }
 | 
						|
 | 
						|
        $js = array();
 | 
						|
        if($callbacks['beforeSend'] != null) {
 | 
						|
            switch(strtolower($callbacks['beforeSend'])) {
 | 
						|
                case 'fadeout':
 | 
						|
                    $js[] = sprintf("%s(this).fadeOut();", $jqHandler);
 | 
						|
                    break;
 | 
						|
                case 'fadeoutslow':
 | 
						|
                    $js[] = sprintf("%s(this).fadeOut('slow');", $jqHandler);
 | 
						|
                    break;
 | 
						|
                case 'fadeoutfast':
 | 
						|
                    $js[] = sprintf("%s(this).fadeOut('fast');", $jqHandler);
 | 
						|
                    break;
 | 
						|
                case 'hide':
 | 
						|
                    $js[] = sprintf("%s(this).hide();", $jqHandler);
 | 
						|
                    break;
 | 
						|
                case 'hideslow':
 | 
						|
                    $js[] = sprintf("%s(this).hide('slow');", $jqHandler);
 | 
						|
                    break;
 | 
						|
                case 'hidefast':
 | 
						|
                    $js[] = sprintf("%s(this).hide('fast');", $jqHandler);
 | 
						|
                    break;
 | 
						|
                case 'slideup':
 | 
						|
                    $js[] = sprintf("%s(this).slideUp(1000);", $jqHandler);
 | 
						|
                    break;
 | 
						|
                default:
 | 
						|
                    $js[] = $callbacks['beforeSend'];
 | 
						|
                    break;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        switch($requestHandler) {
 | 
						|
            case 'GET':
 | 
						|
                $js[] = sprintf("%s.get('%s', %s, function(data, textStatus) { %s }, '%s');return false;",
 | 
						|
                    $jqHandler, $url, $params, implode(" ", $callbackCompleteJs), $options['dataType']);
 | 
						|
                break;
 | 
						|
            case 'POST':
 | 
						|
                $js[] = sprintf("%s.post('%s', %s, function(data, textStatus) { %s }, '%s');return false;",
 | 
						|
                    $jqHandler, $url, $params, implode(" ", $callbackCompleteJs), $options['dataType']);
 | 
						|
                break;
 | 
						|
        }
 | 
						|
 | 
						|
        $js = implode($js);
 | 
						|
 | 
						|
        if($inline == true) {
 | 
						|
            $attribs['onclick'] = $js;
 | 
						|
        } else {
 | 
						|
            if(!isset($attribs['id'])) {
 | 
						|
                $clickClass = sprintf("ajaxLink%d", ZendX_JQuery_View_Helper_AjaxLink::$currentLinkCallbackId);
 | 
						|
                ZendX_JQuery_View_Helper_AjaxLink::$currentLinkCallbackId++;
 | 
						|
 | 
						|
                $attribs['class'][] = $clickClass;
 | 
						|
                $onLoad = sprintf("%s('a.%s').click(function() { %s });", $jqHandler, $clickClass, $js);
 | 
						|
            } else {
 | 
						|
                $onLoad = sprintf("%s('a#%s').click(function() { %s });", $jqHandler, $attribs['id'], $js);
 | 
						|
            }
 | 
						|
 | 
						|
            $jquery->addOnLoad($onLoad);
 | 
						|
        }
 | 
						|
 | 
						|
        if(count($attribs['class']) > 0) {
 | 
						|
            $attribs['class'] = implode(" ", $attribs['class']);
 | 
						|
        } else {
 | 
						|
            unset($attribs['class']);
 | 
						|
        }
 | 
						|
 | 
						|
        $html = '<a'
 | 
						|
            . $this->_htmlAttribs($attribs)
 | 
						|
            . '>'
 | 
						|
            . $label
 | 
						|
            . '</a>';
 | 
						|
        return $html;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Determine which request method (GET or POST) should be used.
 | 
						|
     *
 | 
						|
     * Normally the request method is determined implicitly by the rule,
 | 
						|
     * if addiotional params are sent, POST, if not GET. You can overwrite
 | 
						|
     * this behaviiour by implicitly setting $options['method'] = "POST|GET";
 | 
						|
     *
 | 
						|
     * @param  Array   $options
 | 
						|
     * @param  Boolean $hasParams
 | 
						|
     * @return String
 | 
						|
     */
 | 
						|
    protected function _determineRequestHandler($options, $hasParams)
 | 
						|
    {
 | 
						|
        if(isset($options['method']) && in_array(strtoupper($options['method']), array('GET', 'POST'))) {
 | 
						|
            return strtoupper($options['method']);
 | 
						|
        }
 | 
						|
        $requestHandler = "GET";
 | 
						|
        if($hasParams == true) {
 | 
						|
            $requestHandler = "POST";
 | 
						|
        }
 | 
						|
        return $requestHandler;
 | 
						|
    }
 | 
						|
} |