test



cakePHP 2.0 + Smarty 3.1.4 php

cakePHP 2.0은 1.x와 디렉토리 구조 및 사용법에서 많이 차이가 난다.
cakePHP 1.x에서 Smarty 연동법은 있으나 cakePHP 2.0에서는 없어서 혼자 삽집을 하고 나서 까먹을까봐 정리해본다.

1. Smarty의 lib를 /vendors/smarty 폴더에 복사
- /app/Vendor에 복사를 하든 /vendors에 복사를 하든 둘 다 정상적으로 동작을 하니 둘 중 편한곳에 설치해도 무방하다.

2. /app/View에 smarty.php 파일 만들기
- View 클래스를 확장하여 다음과 같이 작성한다. Smarty 3.0 에서는 plugin을 알아서 인식하므로 제외를 하고 주석한 부분은 입맛에 맞게 설정한다.

Class SmartyView extends View{

    function __construct (&$controller) {
        parent::__construct($controller);

        if (is_object($controller)) {
            $count = count($this->__passedVars);
            for ($j = 0; $j < $count; $j++) {
                $var = $this->__passedVars[$j];
                $this->{$var} = $controller->{$var};
            }
        }

        if(!App::import('Vendor', 'Smarty', array('file' => 'smarty'.DS.'Smarty.class.php')))
            die('error Loading Smarty Class');
        $this->Smarty = new Smarty();

        $this->ext= '.tpl';

        //$this->Smarty->compile_dir = TMP.'smarty'.DS.'compile'.DS;
        //$this->Smarty->cache_dir = TMP.'smarty'.DS.'cache'.DS;
        //$this->Smarty->caching=true;

        $this->Helpers = new HelperCollection($this);

    }

    protected function _render($___viewFn, $___dataForView = array()) {

        if (empty($___dataForView)) {
            $___dataForView = $this->viewVars;
        }

        extract($___dataForView, EXTR_SKIP);

        foreach($___dataForView as $data => $value) {
            if(!is_object($data)) {
                $this->Smarty->assign($data, $value);
            }
        }
        $this->Smarty->display($___viewFn);
    }

}

3. /lib/Cake/Controller/AppController.php 파일 수정
- 되도록이면 /lib/ 하위 파일들을 수정하는 것은 꺼림칙하나 Smarty를 전역으로 사용하기 위해선 수정이 필요하다.
하나의 파일에만 사용할려면 해당 Controller에서 선언을 하면 된다.

class AppController extends Controller {
    var $viewClass = 'Smarty';
}

4. default.ctp
- cakePHP는 default.ctp 에서 코드를 실행시키는 구조이다. default.ctp의 위치는 /lib/Cake/View/Layouts/default.ctp이다
사용을 할려면 이 파일을 수정하든지, 사용하지 않으면 3의 파일에 var $autoLayout = false;를 지정하면 된다.

5. template 파일 위치 변경하기
- 위의 대로 하면 template위치는 /app/View/에 위치를 할 것이다. 그러나 대부분 template파일은 따로 지정되어 있거나,
혹은 스킨기능(근래는 css로 조절을 하지만 따로 가지고 있는 경우도 있다)을 위해 skin01, skin02 이런식으로 지정할 필요성이 생긴다.

2번의 클래스에서 _getViewFileName() 함수를 오버라이딩하자.

$paths는 사용가능한 path를 불러온다. 찍어보면
/app/View/, /app/views, /lib/Cake/View에서 찾는다. 여기에 우리가 사용할 템플릿 위치를 하나 더 추가하면 된다.
아님 좀 더 고급스럽고 멋지게 만드셔도 된다.


    function _getViewFileName($action)
    {
        $action = Inflector::underscore($action);
        $paths = $this->_paths();
        $paths[] = $_SERVER["DOCUMENT_ROOT"]."/template/skin01/";

         if (!is_null($this->webservices)) {
             $type = strtolower($this->webservices) . DS;
         } else {
            $type = null;
         }

          if (empty($action)) {
           $action = $this->action;
          }

          $position = strpos($action, '..');

          if ($position === false) {
          } else {
           $action = explode('/', $action);
           $i = array_search('..', $action);
           unset($action[$i - 1]);
           unset($action[$i]);
           $action='..' . DS . implode(DS, $action);
          }

          foreach($paths as $path) {
           if (file_exists($path . $this->viewPath . DS . $this->subDir . $type . $action . $this->ext)) {
            $viewFileName = $path . $this->viewPath . DS . $this->subDir . $type . $action . $this->ext;
            return $viewFileName;
           }
          }

          // added for .ctp viewPath fallback
          foreach($paths as $path) {
           if (file_exists($path . $this->viewPath . DS . $type . $action . '.ctp')) {
            $viewFileName = $path . $this->viewPath . DS . $type . $action . '.ctp';
            return $viewFileName;
           }
          }

          return $viewFileName;
    }
// 줄이 이상해 졌다...ㅜㅜ 줄 띄우기에 민감한데..

6. 좀 더 보완해야 될 문제
- Smarty 오류 메세지 처리
   tpl 파일에 에러가 있으면 에러메세지를 출력하는데 해석되지 않는 php 코드를 쏟아낸다. 이 부분은 좀 더 봐야 될 것 같다.


스티브 잡스는 IT의 대부가 아니다. 이슈

- IT의 진정한 선구자이자 대부 데니스 매캘리스테어 리치(Dennis MacAlistair Ritchie) (1941년 9월 9일 ~ 2011년 10월 12일)
의 죽음을 진정으로 애도합니다.
- 스티브 잡스의 죽음을 애도합니다. -

스티브 잡스가 사망했을때 모든 언론사들의 타이틀엔 'IT의 대부'가 들어가 있었다.
애플이라는 기업을 일구어냈고 혁신적인 제품들을 만들어서 많은 사람들이 그렇게 알고 있을 것이다.
하지만 스티브 잡스는 IT를 이용한 경영의 천재였지 IT의 대부, 선구주자는 아니었다.
스티브 잡스가 애플에서 쫒겨나 세운 회사 NeXT Computer에서 운영체제를 개발했고 이 운영체제가 다시 잡스가 애플에 들어갔을때 아이팟, 아이폰등의 OS로 사용되면서 지금까지 이어져왔다. 엄밀히 따지면 잡스는 운영체제를 개발하라고 지시하고 최종 유저로서 점검한 경영자이다.

스티브 잡스는 경영의 천재였다.
사용자들의 요구 파악, 사용자 편의성 증대에 있어서는 탁월하였다.
또한 이렇게 파악된 사항들을 돈으로 연결짓는데 있어서도 탁월하였다.
그는 하드웨어를 팔면 더 이상의 수익모델이 없는 이전 시장과 달리 하드웨어에 탑재된 소프트웨어를 통한 수익모델을 새롭게 창출하여 한번 판매된 하드웨어에서 지속적인 수익을 남겼다. 또한 그 소프트웨어의 컨텐츠를 애플 자체적으로 생산하는 것이 아니라 사용자를 참가시키므로 애플의 입장에서는 판매할 컨텐츠 제작에 그리 큰 비용을 사용하지 않고 가만히 앉아서 돈을 버는 시장을 형성하였다.

이것이 애플에서 ios를 꾸준히 업데이트 해주는 이유이다. 꾸준히 ios를 업데이트 해줘야 아이튠즈를 사용할 수 있고 아이튠즈에서 수익이 발생할 수 있기 때문이다. 애플을 좋아하는 사람들의 이유가 꾸준한 업데이트라고 하는데 그건 사용자를 위한 업데이트가 아니라 애플을 위한 업데이트이다.

가히 천재적이다. 새로운 시장을 형성한 것이다.

이런 맥락에서 경영의 선구자이지 IT의 선구자, 대부라는 타이틀은 아니다.
마치 빌게이츠가 퍼스널 컴퓨터의 선구자로 불리는 맥락과 같은 이유가 아닐까.

오늘 c, unix의 창시자인 데니스 리치가 죽었다는 소식을 접했다. (어제 돌아가셨다. ㅜㅜ).
데니스 리치야 말로 IT의 선구자이며, 대부가 아닐까란 생각이 든다.
하지만 포털사이트에 뉴스 하나 없었다.

개인적으로 잡스의 사망소식보다 리치의 사망소식이 더 안타깝고 훨씬 더 부각되어져야 된다.
그가 c, unix( 그 외의 언어 )를 개발함으로 많은 유용한 것들이 지금까지 개발되었고, 또 앞으로도 개발되어 질 것이며, 그것이 가능했기에 많은 사람들이 먹고 살 수 있었다. 잡스도 여기의 영향을 벗어나지 않았다.

개발자로써 세상 많은 이들에게 이익을 줬지만 ( 애플의 ios도 unix가 있었기 때문에 가능했다 ) 순수한 개발자 보다 이것을 이용하여 돈을 많이 번 경영자가 이슈가 되는 사회가 씁쓸하다.



프레임 사용페이지에서 Refresh 할때 첫페이지로 가지 않게 만들기. php

php 는 동적페이지라서 항상 완전 Refresh 된다.
프레임을 나누는 페이지 상단에 아래 소스를 넣어주면 해결된다.

<?php
$LastModified = gmdate("D d M Y H:i:s", filemtime($HTTP_SERVER_VARS[SCRIPT_FILENAME]));
header("Last-Modified: $LastModified GMT");
header("ETag: $LastModified");
?>



PHP Design Patterns Reference and Examples php


웹에서 사용하는 메신저 -meebo.com Web

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<TITLE>Meebo.com</TITLE>
<HTA:APPLICATION ID="meebo"
APPLICATIONNAME="meebo"
BORDER="normal"
BORDERSTYLE="none"
CAPTION="none"
MAXIMIZEBUTTON="no"
MINIMIZEBUTTON="yes"
SHOWINTASKBAR="no"
SINGLEINSTANCE="no"
SYSMENU="yes"
VERSION="1.0"
WINDOWSTATE="normal"
/>
<SCRIPT>
window.resizeTo(680, 500);
</SCRIPT>
<STYLE>
body {margin: 0; padding: 0}
</STYLE>
</HEAD>
<BODY SCROLL="yes">
<IFRAME SRC="http://www.meebo.com"
  APPLICATION="no" WIDTH="100%" HEIGHT="100%" frameborder="0"></IFRAME>
</BODY>
</HTML>

Ajax 를 사용하여 웹에서 유명한 메신저는 모두 사용이 가능하다. MSN, ICQ, AIM, 등등...

NateOn이 빨리 세계적으로 유명해 져야 될텐데....

1 2 3 4 5 6