prestashop 1.4 코드 해석: 약수 3천 바가지

3980 단어
코드가 3천이 넘지 않지만prestashop 1.4에서 가장 중요한 바가지는 바로 Front Controller이다.php.

해석


먼저 prestashop 1.4의 파일 불러오는 방식을 보십시오. 만약 new에 클래스가 있다면, 코드는 먼저 controller에서 같은 이름의 클래스 파일을 찾을 것입니다. 이것은 이전 버전과 차이가 많지 않습니다.찾을 수 없으면 오버라이드라는 사용자가 사용자 정의 클래스의 폴더를 찾을 수 있습니다. 찾을 수 없으면 exec로 요청한 클래스 파일을 새로 만들고classes 아래의 클래스 + 코어 클래스를 불러옵니다.그러니까 진정한 Front Controller.php,classes 아래에서 찾아야 하며, 클래스의 이름도 Front Controller Core입니다.
그 전에 가장 중요한 게 init였다면.php, prestashop 1.4의 FrontController.php, init의 모든 작업을 인수하고 이전 헤드를 대체합니다.php,index.php와 footer.php의 모든 작업은 페이지 나누기와 상품 정렬까지 포함됩니다.요컨대 FrontController.php는zend 프레임워크의dispatch와 약간 비슷해서 모든 작업을 시작하는 신호입니다.
public function run()
	{
		$this->init();
		$this->preProcess();
		$this->setMedia();
		$this->displayHeader();
		$this->process();
		$this->displayContent();
		$this->displayFooter();
	}
if ($this->ssl AND !(isset($_SERVER['HTTPS']) AND strtolower($_SERVER['HTTPS']) == 'on') AND Configuration::get('PS_SSL_ENABLED'))
		{
			header('HTTP/1.1 301 Moved Permanently');
			header('Location: '.Tools::getShopDomainSsl(true).$_SERVER['REQUEST_URI']);
			exit();
		}

function init의 자동 301, 이것이prestashop 1.4에 추가된 기능입니다. 제가 쓴 모듈maindomin은 폐기된 셈입니다.
$page_name = (preg_match('/^[0-9]/', $page_name)) ? 'page_'.$page_name : $page_name;

function init의 $pagename 변수는 서로 다른 페이지의 다른 템플릿에 대한 판단을 쉽게 실현할 수 있습니다.예전 버전에서는 제가 직접 헤드에 있었다는 걸 알아야 돼요.tpl에서 판단했어.
Tools::addCSS(_THEME_CSS_DIR_.'global.css', 'all');
Tools::addJS(array(_PS_JS_DIR_.'tools.js', _PS_JS_DIR_.'jquery/jquery-1.4.4.min.js', _PS_JS_DIR_.'jquery/jquery.easing.1.3.js'));

function setMedia에서 이러한 장점은 css와 js를 통일적으로 관리하면prestashop의'CCC'를 할 수 있다는 것이다.Combine,Compress and Cachefunction productSort와pagination은 이전의sort와pagination 업무를 인계받았다.다른 것은 큰 변화가 없고, 주요 기능은 과거의 init를 복제한 것이다.php.심지어 변수의 이름은 전역 변수이지 대상에 전역 클래스가 있어야 하는 것이 아니다.

맞춤형 구성


오버라이드/classes 폴더 아래에서 하나를 발견할 수 있습니다FrontController.php, 이것은 사실 맞춤형 Front Controller입니다.php의 예, ""삭제하고 페이지를 방문하면 debug 정보를 볼 수 있습니다.주의해야 할 것은 같은 폴더 아래에 mysql와module2 파일이 있는데, 만약 Front Controller만 바뀌었다면.php, 오류 보고로 인해 실행할 수 없는 문제를 초래할 수 있습니다.필요한FrontController.php의 148 줄
error_reporting(E_ALL | E_STRICT);

... 로 바꾸다
error_reporting(7);

이 7의 뜻은 모르는 것이 있으면 수첩을 보고 공부할 수 있다.FrontController 사용자정의하기php, 또는 override/classes 폴더 아래에 새 파일을Front Controller로 명명합니다.php, 그리고 클래스 extends FrontController Core를 쓰면 됩니다. 방법은 코어의 방법을 덮어쓸 수 있습니다.하나의 예:
class FrontController extends FrontControllerCore{
	function setMedia()
	{
		parent::setMedia();
		Tools::addCSS(_THEME_CSS_DIR_.'addition.css');
	} 	public function displayFooter()
	{
		global $cookie, $smarty;
		if (!self::$initialized)
			$this->init(); 		self::$smarty->assign(array(
			'HOOK_RIGHT_COLUMN' => (($smarty->get_template_vars('page_name') == 'category') ? '' : Module::hookExec('rightColumn', array('cart' => self::$cart))),
			'HOOK_FOOTER' => Module::hookExec('footer'),
			'content_only' => (int)(Tools::getValue('content_only'))));
		self::$smarty->display(_PS_THEME_DIR_.'footer.tpl');
		//live edit
		if ($cookie->live_edit AND $ad = Tools::getValue('ad'))
		{
			self::$smarty->assign(array('ad' => $ad, 'live_edit' => true));
			self::$smarty->display(_PS_ALL_THEMES_DIR_.'live_edit.tpl');
		}
		else
			Tools::displayError();
	}}

이 예에서는 setMedia와 displayFooter 방법을 다시 썼습니다.setMedia를 다시 쓸 때, 원본 FrontController의 이 방법을 실행했고, css에 새 css를 불러왔습니다.display Footer를 다시 쓸 때 원본 코드를 복사합니다. 유일한 변경 사항은 페이지name이category라면 오른쪽의column을 출력하지 않는다는 판단을 추가하는 것입니다.category list의 공간을 더 넓히기 위해서다.

좋은 웹페이지 즐겨찾기