Возможно ли иметь изображения, CSS и скрипты в модуле Zend Framework? - PullRequest
1 голос
/ 17 марта 2010

В моих модулях Zend Framework у меня есть представления, которые требуют определенного JavaScript, CSS и изображений.

Можно ли включить их в модуль так, чтобы мне не приходилось копировать их в каждом проекте, в котором используется модуль? (потому что папка public / не является частью модуля, но специфична для каждого приложения)

Если нет, как я могу это сделать?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 17 марта 2010

Самый простой способ - поместить активы в каталог public и использовать baseUrl() помощник.

Однако лучший способ - переместить все сценарии в каталог /public. Тогда вы будете менять скины. Конечно, вам придется добавить дополнительные правила к .htaccess защите .phtml

Для этого вам необходимо настроить стандартную структуру приложения в соответствии с вашими потребностями.
Для дальнейшего объяснения см. мой ответ в этом посте .

0 голосов
/ 17 марта 2010

"Указания по установке", которые включают в себя ссылку / alaising "public_html / mymodule /" на подкаталог в папке вашего модуля - это самое простое, что он получает.

Я написал контроллер / действие / маршрут, который обслуживает скрипты / CSS / изображения в прошлом. Это было не очень сложно, но это было своего рода болью - правильно обращаться с кэшированием. Я не говорю, что это отличный способ сделать это, я имею в виду, вы действительно не должны тратить все время на настройку Zend Framework и отправку действия, чтобы дать кому-то статический файл JavaScript. Однако вы могли бы сделать это И и сказать им, чтобы они тоже связывали каталог.

Если вы решите использовать его, вот аннотация, которую я написал, которая может содержать некоторый статический контент:

<?php

class MW_Script_Controller_Abstract extends Zend_Controller_Action
{
  protected $_basepath;

  public function publicAction()
  {
    // not initialized
    if (!$this->_basepath) throw new Exception("base path not set");


    if (!($filename = $this->_request->getParam("filename")))
      $filename = $this->_request->getParam(1);

    if (!$filename) throw new Exception("Unknown Filename");

    $fn = realpath($this->_basepath."/".$filename);

    if (!$fn || !is_file($fn)) throw new MW_Controller_404Exception("File not found");

    // determine extension to determine mime-type
    preg_match("#\.([^.]+)$#", $filename, $matches);
    if (!empty($matches[1]) switch (strtolower($matches[1]))
    {
      case "js": 
        $this->getResponse()->setHeader('Content-Type', 'text/javascript'); 
        ini_set('html_errors', 0);
        break;
      case "css": 
        $this->getResponse()->setHeader('Content-Type', 'text/css'); 
        ini_set('html_errors', 0);
        break;
      case "html":
        $this->getResponse()->setHeader('Content-Type', 'text/html');
        break;
      default:
        $this->getResponse()->setHeader('Content-Type', 'text/plain'); 
        ini_set('html_errors', 0);
        break;
    }

    // Disable Layout
    $this->_helper->viewRenderer->setNoRender(true);     
    $this->_helper->layout->disableLayout();

    $mtime = filemtime($fn);

    if ($modsince = $this->getRequest()->getServer('HTTP_IF_MODIFIED_SINCE'))
    {
      $modsince = new Zend_Date($modsince);
      $modsince = $modsince->getTimestamp();

      if ($mtime <= $modsince) {
        $this->getResponse()->setHttpResponseCode(304); 
        return;
      }
    }

    $this->getResponse()->setHeader('Last-Modified', gmdate("D, d M Y H:i:s",$mtime). " GMT");
    readfile($fn);
    // All Done
  }
}

И Путь:

<?php
class MW_Script_Route extends Zend_Controller_Router_Route_Abstract
{
  /**
   * The Root Path for this "MW_Script_Controller" area
   *
   * @var string a root "path" for this route
   **/
  protected $_rootpath;

  /**
   * Holds user submitted default values for route's variables. Name and value pairs.
   * @var array
   */
  protected $_defaults = array();

  /**
   * Instantiates route based on passed Zend_Config structure
   *
   * @param Zend_Config $config Configuration object
   */
  public static function getInstance(Zend_Config $config)
  {
      $defs = ($config->defaults instanceof Zend_Config) ? $config->defaults->toArray() : array();
      return new self($config->route, $defs);
  }
  /**
   * Stores the basepath for later matching, also stores defaults.  If no "module" is passed in to 
   * the $defaults array,  the "basepath" will be used as a module name, "index" will be used as a 
   * controller, and "public" will be used as a action.
   *
   * @param string $route Map used to match with later submitted URL path
   * @param array $defaults Defaults for map variables with keys as variable names
   * @param array $reqs Regular expression requirements for variables (keys as variable names)
   */
  public function __construct($route, $defaults = array())
  {

      $route = trim($route, '/');
      $this->_defaults = (array) $defaults;
      if (!isset($this->_defaults["module"])) $this->_defaults["module"] = $route;
      if (!isset($this->_defaults["controller"])) $this->_defaults["controller"] = "index";
      if (!isset($this->_defaults["action"])) $this->_defaults["action"] = "public";

      $this->_rootpath = $route;

  }

  public function match($request)
  {
    $path = trim($request->getPathInfo(), '/');
    if (substr($path, 0, strlen($this->_rootpath)) == $this->_rootpath)
    {
      $values = $this->_defaults;
      $values["filename"] = substr($path,strlen($this->_rootpath)+1);
      return $values;
    }
  }

  public function assemble($data = array(), $reset = false, $encode = false)
  {
    if (isset($data["filename"])) $filename = $data["filename"];
    if (isset($data["1"])) $filename = $data["1"];
    return $this->_rootpath . "/" .$filename;
  }

} // END class MW_Script_Controller_Route extends Zend_Controller_Router_Route_Abstract
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...