음력 양력 계산

기타 2015. 5. 20. 10:31

년월일을 입력하고, 양력 혹은 음력을 선택하시고 변환을 누르시면 음양력변환이 됩니다. 윤달이신 경우에는 체크버튼을 선택하시고 변환을 하면 됩니다.

변경하고자 하는 날짜의 음력, 양력 날짜를 입력하세요
예) 20021001
윤달
음력과 양력의 상호변환가능한 날짜는 1841~2043 년까지 203년간입니다.

'기타' 카테고리의 다른 글

Google Cloud Bigtable 공개  (0) 2015.05.20
Posted by dewnine
,

Google Cloud Bigtable 공개

Google은 Cloud Bigtable을 공개했다. 이것은 Search, Gmail, Maps, youTube와 같은 서비스에 10년이상 사용되고 있는 Google자신의 데이터 베이스입니다. 다른 프로덕트와 같이 Gigtable이 오픈소스화 된 것은 아니지만 새로운 클라우드 서비스는 오픈소스의 인터페이스, Apache HBase1.0.1 API를 통해서 엑세스 가능합니다.

Cloud Bigtable에는 다음과 같은 특징이 있습니다.

  • 수백 petabytes 까지 스케일 가능
  • 고가용성
  • 리플리케이션 기능
  • 전송중 또는 휴지중의 데이터 암호화
  • Fully managed
  • Hadoop 에코시스템과의 통합
  • 금융, IoT, 시계열 및 마케팅 데이터에 적합

Google은 다음과 같은 차트를 공개해서 Bigtable은 [한 자리 밀리 초 수준의 지연과 관리되지 않은 NoSQL의 2배 이상의 비용]은 탁월한 성능 이라고 주장하고 있지만 독립적인 벤치마크 검증은 아직 이루어지고 있지 않다.

Unmatched Price-Performance at Low Latency

Hbase API의 사용에는 몇가지 제약사항이 있으며 자세한 내용은 https://cloud.google.com/bigtable/docs/hbase-differences 를 참조하세요. Cloud Bigtable은 현재 베타버전이라고 합니다.

Cloud Bigtable의 원본 Post를 참조하세요.

'기타' 카테고리의 다른 글

음력 양력 계산  (0) 2015.05.20
Posted by dewnine
,

PHP : ini_set() 함수

PHP 2015. 5. 19. 19:55

PHP - ini_set();

php의 설정하기 위한 함수입니다.
php의 설정 확인은 웹페이지의 경우 는 xxx.php 파일 에서는 <?php phpinfo(); ?>를 작정하여 브라우저에서 확인이 가능하며, 커맨트라인에서는 php -i 을 실행하면 현재 php의 설정 내용을 확인 할 수 있습니다.

설정을 변경하기 위해서는 위의 설정 확인에서 표시되는 Loaded Configuration File 의 php.ini를 수정하여 변경이 가능합니다.

이것은 공통 설정이며 호스팅업체에서 제공하는 서비스이용시나 일시적, 혹은 동적으로 변경하기 위해서는 ini_set(); 함수를 이용합니다.

string ini_set ( string $varname , string $newvalue )
$varname

설정 변수의 이름

$newvalue

설정을 변경할 새로운 값

예제

error의 표시 여부를 조절할 경우

ini_set('display_errors', 1);

이 함수가 호출 되었을 경우만 설정이 변경되어 적용됩니다. 이함수가 호출된 페이지를 포함할 경우만 일시적으로 변경이 적용되며 함수가 호출 되지 않았을 경우에는 php.ini 파일의 설정이 적용됩니다.

'PHP' 카테고리의 다른 글

CakePHP- View - Helper  (0) 2015.05.14
CakePHP - View - Json 과 XML 뷰  (0) 2015.05.13
CakePHP - 뷰 - 테마  (0) 2015.05.13
CakePHP - View  (0) 2015.05.12
[CakePHP] Controller - Components  (0) 2015.05.08
Posted by dewnine
,

OS X의 디폴트 커맨드라인의 프롬프트는 아래와 같습니다.

computerName:CurrentDiretory User$

디폴트 프롬프트도 그리 나쁘지는 않습니다만 좀더 많은, 요긴한 정보를 표시하도록 변경 할 수 있습니다.

설정 방법

PS1의 환경 변수를 변경하여 원하는 형태로 프롬프트를 변경 할 수 있습니다.

export PS1=" "

프롬프트에서 설정 가능한 옵션은 아래와 같습니다.

  • \d – 현재 날짜
  • \t – 현재 시간
  • \h – Host name
  • \# – Command number
  • \u – 로그인 사용자 이름
  • \W – 현재 작업 디렉토리 (예: Desktop/)
  • \w – 현재 작업 디렉토리의 전체 경로 (예: /Users/Admin/Desktop/)

설정 예제

export PS1="\h@\u:\w$"

MyPC@hongildong:~$와 같은 형태로 프롬프트가 표시됩니다.
매번 터미널에서 위 커멘트를 실행해도 되지만 터미널 프로그램이 실행될때 자동으로 설정되기를 원할 경우는 쉘 환경 변수를 설정합니다.

프롬프트에 컬러 적용

컬러를 적용할 부분 앞에 아래의 컬러 코드를 넣으면 프롬프트 부분에 컬러가 적용되어 표시됩니다.

# Regular Colors
\[\033[0;30m\] # Black
\[\033[0;31m\] # Red
\[\033[0;32m\] # Green
\[\033[0;33m\] # Yellow
\[\033[0;34m\] # Blue
\[\033[0;35m\] # Purple
\[\033[0;36m\] # Cyan
\[\033[0;37m\] # White

# High Intensty
\[\033[0;90m\] # Black
\[\033[0;91m\] # Red
\[\033[0;92m\] # Green
\[\033[0;93m\] # Yellow
\[\033[0;94m\] # Blue
\[\033[0;95m\] # Purple
\[\033[0;96m\] # Cyan
\[\033[0;97m\] # White

# Background
\[\033[40m\] # Black
\[\033[41m\] # Red
\[\033[42m\] # Green
\[\033[43m\] # Yellow
\[\033[44m\] # Blue
\[\033[45m\] # Purple
\[\033[46m\] # Cyan
\[\033[47m\] # White

# High Intensty backgrounds
\[\033[0;100m\] # Black
\[\033[0;101m\] # Red
\[\033[0;102m\] # Green
\[\033[0;103m\] # Yellow
\[\033[0;104m\] # Blue
\[\033[10;95m\] # Purple
\[\033[0;106m\] # Cyan
\[\033[0;107m\] # White
컬러가 적용된 예
export PS1="\[\033[1;34m\]\!\[\033[0m\] \[\033[1;35m\]\u\[\033[0m\]:\[\033[1;35m\]\W\[\033[0m\]$ "

자동 설정 방법

다음의 .bashrc, .bash_profile, .profile 사용자의 bash sehll 환경 설정 파일중에 하나를 수정하여 변경할 수 있습니다.

Posted by dewnine
,

CakePHP- View - Helper

PHP 2015. 5. 14. 15:48

헬퍼

헬퍼는 프리젠 테이션 레이어를위한 구성 요소와 같은 클래스입니다. 많은 뷰나 엘리먼트, 레이아웃에서 공유되는 표시 로직을 포함하고 있습니다. 이 장에서는 헬퍼를 만드는 방법과 CakePHP의 핵심 헬퍼에있는 기본적인 작업의 개요를 설명합니다.

CakePHP는 뷰의 생성에 도움이되는 몇 가지 특징적인 헬퍼가 있습니다. 그들은 올바른 형식의 마크업(양식 포함), 텍스트, 시간, 숫자 모양에 도움이 되거나, Ajax 기능을 한층 빠르게 하기도합니다. CakePHP 헬퍼에 대한 자세한 정보는 코어 라이브러리의 헬퍼를 참조.

헬퍼 설정 및 사용

CakePHP에서 헬퍼를 사용하려면 컨트롤러에 인식시킬 필요가 있습니다. 각 컨트롤러는 $helpers 속성을 가지고 있으며, 그 속성은 뷰에서 사용할 수있는 헬퍼 목록을 유지하고 있습니다. 뷰에서 헬퍼를 사용하려면 헬퍼의 이름을 컨트롤러의 $helpers 배열에 추가하십시오. :

  class BakeriesController extends AppController {
     public $helpers = array ( 'Form', 'Html', 'Js', 'Time');
 }

플러그인에서 헬퍼를 추가하려면 CakePHP의 다양한 장소에서 사용되고있는 DebugKit.Toolbar의 표기법과 같은 플러그인 기법을 사용합니다. :

  class BakeriesController extends AppController {
     public $helpers = array ( 'Blog.Comment');
 }

어떤 액션 동안만 헬퍼를 추가 할 수 있습니다. 즉, 어떤 헬퍼의 이용을 특정 컨트롤러 액션에 한정하여 동일한 컨트롤러의 다른 액션에서는 사용할 수 없도록 할 수 있습니다. 이것은 컨트롤러가 정리 된 상태를 유지하는 데 도움이 될뿐만 아니라 또한 헬퍼를 사용하지 않는 다른 액션의 처리 비용을 절약 할 수 있습니다. :

  class BakeriesController extends AppController {
     public function bake () {
         $this->helpers[] = 'Time';
     }
     public function mix () {
         // 여기에 Time 헬퍼는로드되지 않기 때문에 사용할 수 없습니다
     }
 }

만약 모든 컨트롤러에서 헬퍼를 활성화 할 필요가있는 경우 헬퍼 이름을 /app/Controller/AppController.php (없는 경우 작성하십시오)의 $helpers 배열에 추가하십시오. 기본 Html 헬퍼와 Form 헬퍼도 잊지 말고 읽어주세요. :

  class AppController extends Controller {
     public $helpers = array('Form', 'Html', 'Js', 'Time');
 }

헬퍼는 옵션을 전달할 수 있습니다. 이 옵션은 속성 값을 설정하거나 헬퍼의 동작을 바꾸기 위하여 사용할 수 있습니다. :

  class AwesomeHelper extends AppHelper {
     public function __construct(View $view, $settings = array()) {
         parent::__construct ($view $settings);
         debug ($settings);
     }
 }

 class AwesomeController extends AppController {
     public $helpers = array('Awesome'=> array ( 'option1'=> 'value1'));
 }

모든 헬퍼 공통적으로 사용할 수있는 설정에 className 옵션이 있습니다. 이 옵션을 설정하면 뷰에 별칭의 헬퍼를 만들 수 있습니다. 이 기능은 $this->Html 및 기타 공통 헬퍼 참조를 자체 구현으로 대체 할 때 유용합니다. :

  // app/Controller/PostsController.php
 class PostsController extends AppController {
     public $helpers = array (
         'Html'=> array (
             'className'=> 'MyHtml'
         )
     );
 }

 // app/View/Helper/MyHtmlHelper.php
 App::uses ( 'HtmlHelper', 'View/Helper');
 class MyHtmlHelper extends HtmlHelper {
     // 코어 HtmlHelper를 무시하도록 코드를 추가하십시오
 }

위의 예에서는 뷰에서 MyHtmlHelper가 $this->Html 별칭이 되어있습니다.

별칭이 붙은 헬퍼는 어디에서 사용되고 있었다고 해도 그 인스턴스를 대체합니다. 그것에는 다른 헬퍼 내부도 포함되어 있습니다.

 

Html이나 Session의 별칭을 붙인 헬퍼는 코어 PagesController에서 사용하면 잘 움직이지 않을 것입니다. 따라서 lib/Cake/Controller/PagesController.phpapp/Controller/폴더에 복사하는 것이 좋습니다.

헬퍼를 설정하여 선언적으로 헬퍼를 설정할 수 있게되었고 또한 컨트롤러 액션 밖으로 설정 로직을 둘 수 있습니다. 만약 클래스 선언의 일부에 포함 할 수없는 설정 항목이있는 경우 컨트롤러 beforeRender 콜백에서 그들을 설정할 수 있습니다. :

  class PostsController extends AppController {
     public function beforeRender () {
         parent::beforeRender ();
         $this->helpers['CustomStuff'] = $this ->_getCustomStuffSettings ();
     }
 }

헬퍼를 사용

컨트롤러에서 어떤 헬퍼가 사용하고 싶은지를 한번 설정하고 나면 각 헬퍼 뷰에서 공용 속성처럼 처리 할 수있습니다. 예를 들어 HtmlHelper 를 사용하고 있다고합니다. 이 경우 다음과 같이 헬퍼에 액세스 할 수 있습니다. :

  echo $this->Html->css('styles');

위의 예에서는 HtmlHelper의 css 메서드를 호출합니다. 로드 된 헬퍼이면 $this ->{$helperName}의 형식으로 액세스 할 수 있습니다. 뷰 내에서 동적으로 헬퍼를 로드 할 필요를 느낄때가 올지도 모릅다. 그때는 뷰의 HelperCollection를 사용하여 이렇게 할 수 있습니다. :

  $mediaHelper = $this->Helpers->load('Media', $mediaSettings);

HelperCollection는 컬렉션 이며, CakePHP의 다른 부분에서도 사용되고있는 컬렉션 API를 지원하고 있습니다.

콜백 메소드

헬퍼 뷰의 렌더링 공정을 늘리는 것 같은 몇 가지 콜백을 특징으로하고 있습니다. 더 많은 정보를 원한다면, 헬퍼 API 와 컬렉션 문서를 참조하십시오.

헬퍼를 만들기

만약 코어 헬퍼 (또는 GitHub와 Bakery에있는 헬퍼)에서 원하는 것을 할 수 없다고해도 헬퍼를 만드는 것은 간단하기 때문에 괜찮습니다.

여기에서 응용 프로그램의 다양한 장소에서 필요로하는 CSS 스타일 링크를 출력하는 헬퍼를 만들고 싶었다고하자. CakePHP의 기존 헬퍼 구조 논리를 맞추기 위해서는/app/View/Helper에 새로운 클래스를 작성해야합니다. 앞으로 만들 헬퍼 LinkHelper라고 부르기로하자. 실제 PHP 클래스 파일이 될 것입니다. :

 /* /app/View/Helper/LinkHelper.php * /
 App::uses('AppHelper', 'View/Helper');

 class LinkHelper extends AppHelper {
     public function makeEdit ($title, $url) {
         // 특별히 성형된 링크를 만들기위한 로직은 여기 ...
     }
 }

헬퍼 AppHelper 또는 Helper 를 상속하거나 헬퍼 API 에 정의 된 모든 콜백을 구현해야합니다.

다른 헬퍼를로드

다른 헬퍼에 이미 존재하는 기능을 사용하고 싶을지도 모릅니다. 이 경우 $helpers 배열에 사용하고 싶은 헬퍼를 명시하여 제공합니다. 형식은 컨트롤러에서 지정하는 것과 같이하십시오. :

 /* /app/View/Helper/LinkHelper.php (다른 헬퍼를 사용하는) * /
 App::uses ( 'AppHelper', 'View/Helper');

 class LinkHelper extends AppHelper {
     public $helpers = array ( 'Html');

     public function makeEdit ($title, $url) {
         // 성형 된 데이터를 출력하기 위해
         // HTML 헬퍼를 사용 :

         $link = $this->Html->link($title, $url, array ('class'=> 'edit'));

         return '<div class = "editOuter">' . $link . '</ div>';
     }
 }

자작한 헬퍼 사용

일단 헬퍼를 만들어 /app/View/Helper/ 에 배치하면 컨트롤러에서 $helpers 라는 특별한 변수를 사용하는 것으로 그 헬퍼를 로드 할 수 있습니다. :

  class PostsController extends AppController {
     public $helpers = array('Link');
 }

일단 컨트롤러가 이 새로운 클래스를 인식하면 헬퍼의 이름을 따서 명명 된 개체에 액세스하는 것으로, 보기 중에서이 헬퍼를 사용할 수있게합니다. :

 <! - 새로운 헬퍼를 사용하여 링크 만들기 ->
 <? php echo $this->Link->makeEdit ( 'Change this Recipe', '/ recipes/edit/5');?>

모든 헬퍼를위한 기능을 만들기

모든 헬퍼는 특별한 클래스 AppHelper를(모델이 AppModel을 상속 컨트롤러가 AppController를 상속하는 것과 같이) 상속합니다. 모든 헬퍼에서 사용할 수있는 기능을 만들려면 /app/View/Helper/AppHelper.php를 작성하십시오. :

 App::uses ( 'Helper', 'View');

 class AppHelper extends Helper {
     public function customMethod () {
     }
 }

헬퍼 API

class Helper

헬퍼의 base class입니다. 일부 유틸리티 메소드와 다른 헬퍼의로드 기능을 제공합니다.

Helper::webroot($file)

파일 이름을 애플리케이션의 webroot에서 해결합니다. 테마가 활성화되어 현재 테마의 webroot에 파일이 존재하는 경우, 테마 파일의 경로가 반환됩니다.

Helper::url($url, $full = false)

HTML이 이스케이프 된 URL을 생성하고 Router::url()에게 위임합니다.

Helper::value($options = array(), $field = null, $key = ‘value’)

주어진 input 이름에 해당하는 값을 가져옵니다.

Helper::domId($options = null, $id = ‘id’)

현재 선택되어있는 필드에 해당하는 카멜 케이스의 id 값을 생성합니다. AppHelper에서 이 메소드를 덮어 써서 CakePHP가 ID 속성을 생성하는 방법을 변경할 수 있습니다.

콜백

Helper::beforeRenderFile($viewFile)

각 뷰 파일이 렌더링되기 전에 호출됩니다. 여기에는 요소 뷰 상위 뷰 레이아웃을 포함합니다.

Helper::afterRenderFile($viewFile $content)

각 뷰 파일이 렌더링 된 후에 호출됩니다. 여기에는 엘리먼트, 뷰, 상위 뷰, 레이아웃을 포함합니다. 콜백은 렌더링 된 콘텐츠가 브라우저에 어떻게 렌더링되는지를 바꾸기 위하여 $content를 변경하여 반환 할 수 있습니다.

Helper::beforeRender($viewFile)

beforeRender 메서드는 컨트롤러 beforeRender 메소드의 호출후에 호출됩니다. 그렇지만 컨트롤러가 뷰와 레이아웃을 그리기 전 입니다. 렌더링되는 파일을 인수로 사용합니다.

Helper::afterRender($viewFile)

뷰가 렌더링 된 후에 호출됩니다. 그러나 레이아웃 그리기 시작 전.

Helper::beforeLayout ($layoutFile)

레이아웃 렌더링 시작 전에 호출됩니다. 레이아웃 파일 이름을 인수로 사용합니다.

Helper::afterLayout ($layoutFile)
레이아웃의 렌어링 완료후에 불려집니다. 레이아웃 파일 이름을 인수로 사용합니다.

코어 헬퍼

캐시 헬퍼

뷰 콘텐츠를 캐시하는 핵심 의해 사용됩니다.

FormHelper

HTML 양식과 자동 생성되는 양식 요소를 만듭니다. 또한 검증 문제를 처리합니다.

HtmlHelper

정형식의 마크 업을 만들기위한 편리한 메소드입니다. 이미지, 링크, 헤더 태그 등.

JsHelper

다양한 Javascript 라이브러리와 호환되는 Javascript를 작성하는 데 사용됩니다.

NumberHelper

숫자 및 통화를 성형합니다.

Paginator

모델 데이터의 페이지 전환 및 정렬.

RSS

RSS 피드 및 XML 데이터를 출력하는 편리한 메소드입니다.

세션 헬퍼

보기에서 세션 값을 읽어 들여 액세스합니다.

TextHelper

스마트 링크, 하이라이트, 워드 스마트 잘리지.

Time 헬퍼

근방 검출 (내년 여부?)와 근사한 문자열 성형 (Today, 10:30 am)과 시간대 변환을합니다.

'PHP' 카테고리의 다른 글

PHP : ini_set() 함수  (0) 2015.05.19
CakePHP - View - Json 과 XML 뷰  (0) 2015.05.13
CakePHP - 뷰 - 테마  (0) 2015.05.13
CakePHP - View  (0) 2015.05.12
[CakePHP] Controller - Components  (0) 2015.05.08
Posted by dewnine
,

JSON과 XML 뷰

CakePHP2.1는 새로운 두 뷰 클래스가 있습니다. XmlViewJsonView를 사용하면 XML 및 JSON 응답을 쉽게 만들 수 있으며, RequestHandlerComponent 과 결합 할 수 있습니다.

RequestHandlerComponent를 사용하여 xmljson 확장 지원을 사용하여 자동으로 새로운 뷰 클래스에 영향을 미칠 수 있습니다. XmlViewJsonView는 페이지의 나머지 부분에서 데이터 뷰를 참조해주세요.

데이터 뷰를 생성하려면 두 가지 방법이 있습니다. 첫째는 _serialize 키를 사용하는 것입니다. 두 번째는 보통의 뷰 파일을 만드는 방법입니다.

데이터 뷰를 활성화

데이터 뷰 클래스를 사용하기 전에 약간의 설정이 필요합니다. :

  1. Router::parseExtensions()를 사용하여 json과 xml 확장자를 활성화 해주세요. 이 설정에 따라 라우터가 여러 확장자를 핸들링 할 수 있게됩니다.
  2. RequestHandlerComponent를 컨트롤러의 컴포넌트 리스트에 추가하세요. 이 설정으로 콘텐츠 유형에 따라 자동으로 뷰 클래스가 바뀌게됩니다.

Router::parseExtensions('json');를 라우터 파일에 추가하면 .json 확장자의 요청을 받았을 때와 application/json 헤더를받은 때에는 CakePHP가 자동으로 뷰 클래스 전환하게됩니다 .

직렬화 키와 함께 데이터 뷰를 사용

_serialize 키는 데이터 뷰를 사용하고있을 때 다른 뷰 변수가 직렬화 될 것인지 아닌지를 나타내는 특별한 뷰 변수입니다. 데이터가 json/xml로 변환되기 전에 사용자 정의 포맷터가 필요하지 않은 경우 컨트롤러 액션을위한 뷰 파일의 정의를 생략 할 수 있습니다.

만약 응답을 생성하기 전에 뷰 변수의 조작과 성형이 필요한 경우 뷰 파일을 사용해야합니다. 그 때 _serialize 값은 문자열 또는 직렬화 된 뷰 변수의 배열입니다. :

  class PostsController extends AppController {
     public function index () {
         $this->set('posts', $this->paginate ());
         $this->set('_serialize', array('posts'));
     }
 }

연결된 뷰 변수의 배열로 _serialize을 정의 할 수도 있습니다. :

  class PostsController extends AppController {
     public function index () {
         // some code that created $posts and $comments
         $this->set(compact('posts', 'comments'));
         $this->set('_serialize', array('posts', 'comments'));
     }
 }

배열로서 _serialize를 정의하면 XmlView 을 사용하는 경우에 최상위 요소로 <response>가 자동으로 추가되는 장점이 있습니다. 만약 _serialize 문자열을 설정하여 XmlView를 사용하는 경우 뷰 변수가 단일의 최상위 요소로 되어 있는지 확인하십시오. 단일 최상위 요소가 없다면 Xml의 생성은 실패 할 것이다.

뷰 파일과 함께 데이터 뷰를 사용

최종 출력을 생성하기 전에 뷰의 내용에 어떤 조작이 필요한 경우에는 뷰 파일을 사용해야합니다. 예를 들어, 자동 생성 된 HTML을 포함한 필드가 posts에 있었다고하면 아마도 JSON 응답에서는 제외하고 싶을 것입니다. 이러한 상황에서 뷰 파일은 유용합니다. :

 // 컨트롤러 코드
 class PostsController extends AppController {
     public function index () {
         $this->set(compact('posts', 'comments'));
     }
 }

 // 뷰 코드 - app/View/Posts/json/index.ctp
 foreach($posts as & $post) {
     unset($post['Post']['generated_html']);
 }
 echo json_encode(compact('posts', 'comments'));

좀더 복잡한 작업을 할 수 있으며, 또한 성형을 위해 헬퍼를 사용할 수 있습니다.

데이터 뷰 클래스는 레이아웃을 지원하지 않습니다. 뷰 파일이 연재 된 내용을 출력하는 것을 가정합니다.

class XmlView

Xml 뷰 데이터를 생성하기위한 클래스입니다. XmlView의 사용법은 위의 설명을 참조하십시오.

class JsonView

Json 뷰 데이터를 생성하기위한 클래스입니다. JsonView의 사용법은 위의 설명을 참조하십시오.

'PHP' 카테고리의 다른 글

PHP : ini_set() 함수  (0) 2015.05.19
CakePHP- View - Helper  (0) 2015.05.14
CakePHP - 뷰 - 테마  (0) 2015.05.13
CakePHP - View  (0) 2015.05.12
[CakePHP] Controller - Components  (0) 2015.05.08
Posted by dewnine
,

CakePHP - 뷰 - 테마

PHP 2015. 5. 13. 18:22

테마

테마는 페이지의 모양을 쉽고 빠르게 전환 할 수있게된다는 장점이 있습니다.

테마를 사용하기 위해서는 컨트롤러에서 테마 이름을 지정하십시오.

  class ExampleController extends AppController {
     public $theme = 'Example';
 }

버전 2.1에서 변경 : 버전 2.1 이전에서는 $ this-> viewClass = ‘Theme’라는 설정이 필요했습니다. 2.1이 설정은 필요없고, 일반 View 클래스가 테마를 지원합니다.

또한 테마의 설정이나 변경은 액션 또는 beforeFilter과 beforeRender 등의 콜백 함수 내에서 할 수 있습니다.

  $this -> theme = 'AnotherExample';

테마보기 파일은 /app/View/Themed/ 폴더에 배치해야합니다. Themed 폴더에 테마 이름의 폴더를 작성하십시오. 위의 예에서 말하는 테마는 /app/View/Themed/AnotherExample에 배치하는 형태입니다. 이것은 중용합니다만, CakePHP는 CamelCase 테마 이름을 기대하고 있다는 것을 기억하십시오. 또한 /app/View/Themed/Example/ 아래 /app/View/ 와 똑같은 구조로 하십시오.

예를 들어, Posts 컨트롤러의 edit 액션을위한 뷰 파일은 /app/View/Themed/Example/Posts/edit.ctp입니다. 또한 레이아웃 파일은 /app/View/Themed/Example/Layouts/ 배치됩니다.

뷰 파일을 테마로 찾지 못하면 CakePHP는 /app/View/ 폴더를 찾습니다. 따라서 마스터 뷰 파일을 작성하여 테마 폴더에 덮어 쓰기가 필요한 파일 만 배치하면 잘됩니다.

테마 어셋

테마는 뷰 파일처럼 정적 어셋을 포함 할 수 있습니다. 테마는 webroot 디렉토리에있는 어셋을 얼마든지 필요한만큼 가져올 수 있습니다. 그 결과, 테마 패키징과 배포는 간단하게되어 있습니다. 개발에도 테마 자산에 대한 요청은 Dispatcher에 의해 처리됩니다. 프로덕션 환경에서의 성능을 개선하기 위해 테마의 어셋을 애플리케이션의 webroot 디렉토리에 복사하거나 심볼릭 링크를 붙이는 것이 좋습니다. 자세한 내용은 다음을 참조하십시오.

새로운 테마의 webroot를 사용하려면 app/View/Themed/<themeName>/webroot<path_to_file>과 같은 디렉토리를 테마에 작성하십시오. 디스패쳐 뷰 패스로 부터 올바른 테마 어셋을 검색을 핸들링합니다.

CakePHP의 모든 내장 헬퍼는 테마에 대응하여 자동으로 올바른 경로가 생성됩니다. 뷰 파일처럼 테마 폴더에 파일이없는 경우 기본 webroot 폴더가 기본이 됩니다.

  // 'purple_cupcake'라는 이름의 테마일 경우
 $this -> Html -> css ('main.css');

 // 경로 생성은 다음과 같다
/theme/purple_cupcake/css/main.css

 // 링크
 app/View/Themed/PurpleCupcake/webroot/css/main.css

플러그인과 테마 어셋의 성능을 개선하기

PHP를 통해 어셋을 제공하면 PHP를 통하지 않고 어셋을 제공 한 경우보다 확실히 느리다고 알려져 있습니다. 코어 팀은 최대한 빠른 플러그인과 테마의 자산을 제공하고자 꾸준히 노력하고 있습니다만, 더 고성능이 요구되는 상황이 있을지도 모릅니다. 그런 상황에서 심볼릭 링크를 걸거나 플러그인과 테마의 어셋을 CakePHP에 의해 사용되고있는 app/webroot 경로와 일치하는 디렉터리로 복사하는 것을 추천합니다.

  • app/Plugin/DebugKit/webroot/js/my_file.jsapp/webroot/debug_kit/js/my_file.js가 됩니다.
  • app/View/Themed/Navy/webroot/css/navy.cssapp/webroot/theme/Navy/css/navy.css가 됩니다.

'PHP' 카테고리의 다른 글

CakePHP- View - Helper  (0) 2015.05.14
CakePHP - View - Json 과 XML 뷰  (0) 2015.05.13
CakePHP - View  (0) 2015.05.12
[CakePHP] Controller - Components  (0) 2015.05.08
[CakePHP] Controller - PageController  (0) 2015.05.08
Posted by dewnine
,

Mac 일반 터미널에서 Docker 사용하기기

Mac에서 boot2docker.app를 실행하게 되면 Mac의 기본 터미널이 실행되고 쉘의 환경변수가 설정이 되면서 Docker 커멘드의 실행이 가능하게 됩니다.

그런데 Mac의 기본 터미널이 약간(?) 불편한지라 보통 기본 터미널 대신에 iTerm을 많이들 사용하리라 생각합니다.
iTerm과 같은 터미널 상에서

boot2docker가 설치되어 있다는 전제하에 일반 터미널에서 boot2docker.app를 실행하지 않고 사용하는 방법은 쉘환경을 설정해 주시면 됩니다.

쉘 환경을 설정해주는 방법은 아래의 명령어 한줄로 간단하게 가능합니다.
boot2docker가 설치되어 있고 VM이 기동되었다면 아래의 명령어로 해당 터미널에서 docker를 활성화 시켜주면 됩니다.
단, 사용하고자 하는 터미널 창마다 실행 해 줄 필요가 있습니다.

$(boot2docker shellinit)

$()도 모두 입력해야 됩니다.

boot2docker의 VM이 기동되지 않고 docker ps를 실행한 경우

dev@test:~$ docker ps
FATA[0000] Get http:///var/run/docker.sock/v1.18/containers/json: dial unix /var/run/docker.sock: no such file or directory. Are you trying to connect to a TLS-enabled daemon without TLS?

boot2docker의 VM이 기동되지 않고 $(boot2docker shellinit)를 실행한 경우

dev@test:~$ $(boot2docker shellinit)
error in run: VM "boot2docker-vm" is not running. (Did you run `boot2docker up`?)

먼저 boot2docker의 vm을 기동합니다.

dev@test:~$ boot2docker up
Waiting for VM and Docker daemon to start...
...............ooo
Started.
Writing /Users/dev/.boot2docker/certs/boot2docker-vm/ca.pem
Writing /Users/dev/.boot2docker/certs/boot2docker-vm/cert.pem
Writing /Users/dev/.boot2docker/certs/boot2docker-vm/key.pem

To connect the Docker client to the Docker daemon, please set:
    export DOCKER_HOST=tcp://192.168.59.103:2376
    export DOCKER_CERT_PATH=/Users/dev/.boot2docker/certs/boot2docker-vm
    export DOCKER_TLS_VERIFY=1

VM이 기동 되었다면 쉘 환견을 설정해줍니다.

dev@test:~$ $(boot2docker shellinit)
Writing /Users/dev/.boot2docker/certs/boot2docker-vm/ca.pem
Writing /Users/dev/.boot2docker/certs/boot2docker-vm/cert.pem
Writing /Users/dev/.boot2docker/certs/boot2docker-vm/key.pem
dev@test:~$

docker 프로세서를 확인해서 문제없이 실행 되는 것을 확인합니다.

dev@test:~$ docker ps -a
CONTAINER ID        IMAGE                COMMAND                CREATED             STATUS                       PORTS               NAMES
f323b6bf5a13        centos6-php:latest   "/bin/sh -c '/etc/in   2 weeks ago         Exited (143) 4 minutes ago                       php
314ee136f2aa        mysql:latest         "/entrypoint.sh mysq   2 weeks ago         Exited (0) 17 seconds ago    3306/tcp            dev-mysql
dev@test:~$

'Docker' 카테고리의 다른 글

Docker Machine  (0) 2015.07.21
맥 OSX에서 boot2docker의 Docker 컨테이너와의 공유 폴더(볼륨) 사용  (0) 2015.07.20
도커 Docker 설치 하기 - CentOS-6.6  (0) 2015.06.02
Docker  (0) 2015.05.13
Posted by dewnine
,

Docker

Docker 2015. 5. 13. 11:41

https://www.docker.com/

컨테이너

Your basic isolated Docker process. 컨테이너와 가상 머신 간의 관계는 쓰레드와 프로세스 간의 관계와 비슷하다. 아니면 스테로이드 주사를 맞은 chroot라고도 생각할 수 있다.

몇 가지 오해가 있다면:

  • 컨테이너는 일시적으로 작동하지 않는다. docker run은 당신이 얼핏 예상하는 그런 식으로 작동하지 않는다.
  • 컨테이너에서 오직 하나의 명령어나 커맨드만 실행시킨다는 것은 잘못된 생각이다. supervisordrunit를 사용할 수 있다..

라이프 사이클

컨테이너를 실행하고 컨테이너에 접속하고자 할 때는 docker start 명령어를 실행하고 docker attach 명령어를 실행한다.

일시적인 컨테이너를 생성하고자 할 때는 docker run -rm 명렁어를 사용해 컨테이너를 생성할 수 있다. 이 컨테이너는 멈춰지면 삭제된다.

이미지 안을 뒤질 필요가 있을 때는 docker run -t -i <myshell> 명령어로 tty를 열 수 있다.

호스트의 디렉토리와 Docker 컨테이너 디렉토리를 맵핑하고자 할 때는 docker run -v $HOSTDIR:$DOCKERDIR 명령어를 사용할 수 있다(also see Volumes section).

컨테이너를 host process manager와 통합하고자 할 때는 Dockre 데몬을-r=false 옵션으로 실행시키고 docker start -a 명령어를 실행하면 된다.

컨테이너의 포트를 호스트 쪽으로 열어 주고자 할 때는 exposing ports을 참조하면 된다.

관련된 정보를 출력해주는 명령어

  • docker ps 명령어는 실행중인 컨테이너 목록을 보여준다.
  • docker inspect ip 주소를 포함한 특정 컨테이너에 대한 모든 정보를 보여준다.
  • docker logs 컨테이너로부터 로그를 가져온다.
  • docker events 컨테이너로부터 이벤트를 가져온다.
  • docker port 컨테이너의 특정 포트가 어디로 연결되어있는지 보여준다.
  • docker top 컨테이너에서 실행중인 프로세스를 보여준다.
  • docker diff 컨테이너 파일 시스템에서 변경된 파일들을 보여준다.

docker ps -a 실행중인 컨테이너와 멈춰있는 컨테이너를 모두 보여준다.

Import / Export

  • docker cp 컨테이너 내의 파일을 호스트로 복사한다.
  • docker export 컨테이너 파일 시스템을 tarball로 출력한다.

Docker 이미지

이미지는 그저 Docker 컨테이너의 템플릿이다.

라이프 사이클

  • docker images 모든 이미지 목록을 보여준다.
  • docker import tarball 파일로부터 이미지를 생성한다.
  • docker build Dockerfile을 통해 이미지를 생성한다.
  • docker commit 컨테이너에서 이미지를 생성한다.
  • docker rmi 이미지를 삭제한다.
  • docker insert URL에서 이미지로 파일을 집어넣는다. * docker load 표준 입력으로 tar 파일에서 (이미지와 태그를 포함한) 이미지를 불러온다.(0.7부터 사용가능).
  • docker save 모든 부모 레이어와 태그, 버전 정보를 tar 형식으로 표준출력을 통해 @@@ (0.7부터 사용가능).

docker importdocker commit 파일 시스템만 셋업하고 Dockefile과 같은 CMD, ENTRYPOINT, EXPOSE는 포함하지 않는다.. bug 참조.

관련된 정보를 출력해주는 명령어

  • docker history 이미지의 이력 정보를 보여준다.
  • docker tag 이미지에 이름으로 태그를 붙여준다(local 혹은 registry).

레지스트리(Registry) & 저장소(Repository)

저장소(repository)란 컨테이너를 위한 파일 시스템을 생성할 수 있는 호스트되는 태그가 붙어있는 이미지들의 집합.

레지스트리란 저장소를 저장해두고 HTTP API를 통해 저장소의 업로드, 관리, 다운로드를 제공하는 호스트를 의미한다. @@@

Docker.io는 매우 다양한 저장소를 포함하고 있는 이미지 [index]를 가지고 있는 중앙 레지스트리이다. @@@

  • docker login 레지스트리에 로그인한다.
  • docker search 레지스트리에서 이미지를 검색한다.
  • docker pull 이미지를 레지스트리에서 로컬 머신으로 가져온다(pull).
  • docker push 이미지를 로컬 머신에서 레지스트리에 집어넣는다(push).

Dockerfile

Docker 설정 파일. docker build 명령어를 통해서 Docker 컨테이너를 만들어낸다. 또한 docker commit 명령어보다 추천되는 명령어이다.

http://github.com/wsargent/docker-devenv를 추천한다. 더 자세한 내용은 best practices 이 글을 추천한다.

레이어

Docker에서 버전화된 파일 시스템은 레이어에 기반하고 있다.. 이는 파일 시스템을 위한 git commits나 차분이라고 생각할 수 있다.

링크

Docker 컨테이너들이 TCP/IP ports으로 링크를 통해 서로 정보를 주고받는다.. Redis로 링크 걸기 and Atlassian에서는 어떻게 작동되는지 예제를 보여준다.

참고 : 만약 컨테이너들 간에 오직 링크를 통해서만 통신을 허용하고 싶다면 Docker 데몬을 실행할 때 icc=false 옵션을 통해 프로세스간 통신을 막을 수 있다.

예를 들어 CONTAINER이라는 이름을 가진 컨테이너가 있다고 하자(docker run -name CONTAINER). 이 컨테이너는 Dockerfile에서 port를 아래와 같이 노출시킨다.

EXPOSE 1337

그리고 다음과 같이 LINKED라고 이름붙여진 또 다른 컨테이너를 만든다.

docker run -d -link CONTAINER:ALIAS -name LINKED user/wordpress

노출된 포트와 CONTAINER의 별칭이 아래와 같이 LINKED 컨테이너의 환경변수로 나타난다:

$ALIAS_PORT_1337_TCP_PORT
$ALIAS_PORT_1337_TCP_ADDR

이를 통해 연결할 수 있다.

이 링크를 삭제하려면 docker rm -link 명령어를 사용하면 된다.

볼륨

Docker의 볼륨은 유동적인 파일시스템이다. 볼륨은 특정 컨테이너에 연결되어있지 않아도 된다.

볼륨은 TCP/IP를 통한 링크가 사용가능한 환경에서 유용하다. 예를 들어 두 Docker 인스턴스에서 파일 시스템으로부터 떨어져서 통신을 해야하는 경우가 있다.

먼저 이것들을 docker 컨테이너에 동시에 마운트 하고 docker run -volume-from 명령어를 실행합니다.

더 자세한 사항은 advanced volumes 페이지를 참고해주세요.

포트 노출하기

포트를 노출시키는 일은 귀찮지만 유용하다.

먼저 Dockerfile에서 포트를 노출시킨다.

EXPOSE <CONTAINERPORT>

그리고 docker run 명령어를 통해서 컨테이너의 포트와 호스트의 포트를 맵핑시킨다.

docker run -p $HOSTPORT:$CONTAINERPORT -name CONTAINER -t someimage

Docker가 가상 머신에서 실행중이라면 추가적인 포트포워딩을 해줘야한다. 이러한 설정을 할 때는 Vagrantfile을 통해서 특정 범위의 포트를 노출시켜 동적으로 맵핑하는 게 편리하다.

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  ...

  (49000..49900).each do |port|
    config.vm.network :forwarded_port, :host => port, :guest => port
  end

  ...
end

만약 포트가 어디로 연결되었는지 기억이 안 난다면 docker port 명령어를 사용할 수 있다.

docker port CONTAINER $CONTAINERPORT

참고:

마지막에 실행된 컨테이너의 ID

alias dl='docker ps -l -q'
docker run ubuntu echo hello world
docker commit `dl` helloworld

명령어와 함께 커밋하기

docker commit -run='{"Cmd":["postgres", "-too -many -opts"]}' `dl` postgres

IP address 정보

docker run -i -t ubuntu /bin/bash

명령어를 사용하거나 아래 명령어를 사용합니다.

wget http://stedolan.github.io/jq/download/source/jq-1.3.tar.gz
tar xzvf jq-1.3.tar.gz
cd jq-1.3
./configure && make && sudo make install
docker inspect `dl` | jq -r '.[0].NetworkSettings.IPAddress'

이미지의 환경 변수 읽어오기

docker run -rm ubuntu env

오래된 컨테이너들 삭제하기

docker ps -a | grep 'weeks ago' | awk '{print $1}' | xargs docker rm

멈춰있는 컨테이너들 삭제하기

docker rm `docker ps -a -q`

이미지의 의존관계 이미지로 출력하기

docker images -viz | dot -Tpng -o docker.png
Posted by dewnine
,

CakePHP - View

PHP 2015. 5. 12. 18:56

뷰(View)는 MVC의 V입니다. 뷰는 요청에 대한 출력을 생성하는 역할을 담당합니다. 여기서 말하는 출력은 대부분의 경우 HTML 폼이나 XML, JSON 등을 의미하지만 파일 스트림의 생성과 사용자가 다운로드 가능한 PDF를 생성 할 뷰 레이어의 역할입니다.

CakePHP는 아래의 전형적인 그리기 시나리오에 대응하기위한 몇 가지 기본 뷰 클래스를 준비하고 있습니다. :

  • XML이나 JSON 웹 서비스를 만들 때 JSON과 XML 뷰 를 사용할 수 있습니다.
  • 보호 된 파일과 동적으로 생성 된 파일을 제공하는 경우, 미디어 뷰 를 사용할 수 있습니다.
  • 여러 테마의 뷰를 작성하는 경우 테마 를 사용할 수 있습니다.

뷰 템플릿

CakePHP의 뷰 레이어는 사용자와의 대화 수단입니다. 대부분의 경우 뷰는(X)HTML 문서를 브라우저에 반환합니다. 하지만 가끔은 Flash 개체에 AMF 데이터를 제공하거나 SOAP를 통해 원격 애플리케이션에 반응하거나 CSV 파일을 출력 할 필요가 있을지도 모릅니다.

기본적으로 CakePHP의 뷰 파일은 일반적인 PHP로 작성되고 확장자는 .ctp(CakePHP Template)입니다. 뷰 파일은 컨트롤러로부터 받은 데이터를 가져 오는 데 필요한 로직이 적혀 있습니다. 만약 Twig와 Smarty와 같은 템플릿 언어를 사용 싶다면 뷰의 서브 클래스가 템플릿 언어와 CakePHP의 중개를 해주는 것입니다.

뷰 파일은 /app/View/ 에있는 컨트롤러 이름의 폴더에 관련된 액션 이름으로 저장됩니다. 예를 들어, Products 컨트롤러의 “view()”액션 뷰 파일은 일반적으로/app/View/Products/view.ctp입니다.

CakePHP의 뷰 레이어는 여러 파트에 의해 만들어지고 있습니다. 각 파트는 각각 역할을 가지고 있으며, 이 장에서 설명하고 있습니다. :

  • View : 뷰는 실행중인 작업 특정 페이지의 일부분입니다. 응용 프로그램의 응답의 중심입니다.
  • Element : 재사용 가능한 간단한 코드입니다. 요소는 보통 뷰에서 그려집니다.
  • Layout : 응용 프로그램의 많은 인터페이스를 랩하고있을 표시 코드를 포함하는 뷰 파일입니다. 대부분의 뷰는 레이아웃 속에 그려집니다.
  • Helper :이 클래스는 뷰 레이어의 다양한 장소에서 필요한 로직을 캡슐화합니다. 특히, CakePHP 도우미 양식의 구축 및 AJAX 기능의 구축 모델 데이터의 페이지 전환, RSS 피드의 제공 등을 도와줍니다.

뷰의 상속

버전 2.1에서 추가.

뷰의 상속에 의해 어떠한 뷰를 다른 뷰에서 랩핑 할 수 있습니다. 뷰 블록 과 결합하여 뷰를 DRY 로 유지하기위한 강력한 방법을 제공합니다. 예를 들어, 당신이 작성하는 응용 프로그램의 특정 뷰에서 사이드 바의 렌더링을 바꿀 필요가 있다고 가정합니다. 이 경우 일반적인 뷰 파일을 상속하여 사이드 바의 마크업의 반복을 피할 수 있습니다. 이것은 다음과 같은 변경만으로 간단하게 가능합니다. :

 //app/View/Common/view.ctp
 <h1> <?php echo $this->fetch('title');?> </h1>
 <?php echo $this->fetch('content');?> 

 <div class = "actions">
 <h3> Related actions </h3>
 <ul>
      <?php echo $this->fetch('sidebar');?> 
 </ul>
 </div>

이 뷰 파일이 부모보기로 사용되었다고합니다. 그러자 sidebartitle 블록이 정의 된 뷰가 상속되는 것이 기대됩니다. content 블록은 CakePHP가 만드는 특별한 블록에서 뷰의 상속에 포착되지 않은 모든 콘텐츠가 포함되어 있습니다. 뷰 파일에 post 데이터가 저장되어있는 $posts라는 변수가있는 경우 뷰는 다음과 같이됩니다. :

<?php
//app/View/Posts/view.ctp
 $this->extend('/Common/view');

 $this->assign('title', $post);

 $this->start('sidebar');
 ?> 
 <li>
 <?php
 echo $this->Html->link('edit', array(
     'action'=> 'edit'
     $post [ 'Post'] [ 'id']
 ));?> 
 </li>
 <?php $this->end();?> 

//나머지 내용은 부모 뷰의 'content'블록으로 사용할 수 있습니다.
 <?php echo h($post [ 'Post'] [ 'body');

위의 예는 어떻게 뷰를 상속 할 수 있는지를 보여 주며 블록 세트를 생성합니다. 몇 가지 정의되지 않은 블록은 포착되고 content라는 특별한 이름의 블록에 배치됩니다. 뷰에 extend()의 호출이 포함 된 경우 현재 뷰 파일은 끝까지 실행됩니다. 일단 실행이 완료되면 상속 된 뷰가 그려집니다. 하나의 뷰 파일에서 두 번 이상 extend()가 호출 될 경우 다음 처리되는 부모 뷰를 덮어 씁니다. :

 $this->extend('/Common/view');
 $this->extend('/Common/index');

이 예에서는/Common/index.ctp를 부모 뷰와 그리기 결과를 얻을 수 있습니다.

상속 된 뷰는 원하는만큼 중첩 할 수 있습니다. 극단적 인 이야기 모든 뷰에서 다른 뷰를 상속하는 것조차 할 수 있습니다. 이 경우 각 부모 뷰는 하나 이전 뷰의 내용을 content 블록으로 가져올 수 있습니다.

content를 블록 이름으로 사용하는 것은 피해야한다. CakePHP는 상속 된 뷰에서 포착되지 않은 콘텐츠로 취급 해 버립니다.

뷰 블록을 사용

버전 2.1에서 추가.

뷰 블록은 $scripts_for_layout 대신 뷰/레이아웃 안에서는 어디에서나 슬롯이나 블록을 정의 할 수있는 확장 가능한 API를 제공합니다. 예를 들어 사이드 바 및 레이아웃의 끝과 시작에 어셋 읽기 영역의 구현등이 문이 블록의 전형적인 사용 예입니다. 블록을 구현하는 두 가지 방법이 있습니다. 캡쳐되는 블록으로 하거나 직접 할당 될 수 있습니다. start(), append(), end() 메서드는 포착되는 블록과 함께 작동합니다. :

 //sidebar 블록 만들기
 $this->start('sidebar');
 echo $this->element('sidebar/recent_topics');
 echo $this->element('sidebar/recent_comments');
 $this->end();


 //sidebar의 끝에 추가
 $this->append('sidebar');
 echo $this->element('sidebar/popular_topics');
 $this->end();

start()를 여러 번 사용하여 블록을 추가 할 수 있습니다. assign()는 클리어 하거나 임의의 타이밍에 블록을 덮어쓰는데 사용됩니다. :

 //sidebar 블록에서 이전 내용을 지우려면
 $this->assign('sidebar', '');

2.3에서 몇 가지 방법이 블록구조에 추가되었습니다. prepend()는 기존의 블록의 시작 부분에 내용을 추가합니다. :

 //sidebar의 선두에 추가
 $this->prepend('sidebar', 'this content goes on top of sidebar');

startIfEmpty()는 블록이 비어있거나 또는 정의되지 않은 경우에만 블록을 시작하고자 할 때 사용합니다. 블록이 이미 존재하는 경우는 포착된 콘텐츠는 폐기됩니다. 블록의 내용이 존재하지 않는 경우에 대해서 디폴트 내용을 준비하고 싶은 경우에 사용하면 편리합니다. :

//뷰 파일
//navbar 블록을 생성
 $this-> startIfEmpty('navbar');
 echo $this-> element('navbar');
 echo $this-> element('notifications');
 $this-> end();
 //부모의 view/layout
 <?php $this->startIfEmpty('navbar');?> 
 <p> 블록이 시점에서 정의되지 않은 경우, 대신해서 이 내용을 표시합니다. </p>
 <?php $this->end();?> 

//부모 view/layout의 어딘가 다른 곳
 echo $this-> fetch('navbar');

위의 예에서는 navbar 블록에 첫 번째 섹션에서 추가 된 내용 만 저장됩니다. 이 블록은 자식 뷰에 정의되어 있기 때문에 기본 내용은

태그와 함께 삭제됩니다.

content라는 블록의 사용은 피해야한다. 이 이름은 CakePHP 내부에서 뷰의 상속 레이아웃의 뷰 콘텐츠를 위해 사용하고 있습니다.

블록 표시

버전 2.1에서 추가.

블록의 표시는 fetch() 메소드를 사용합니다. fetch()는 블록이 존재하지 않았던 경우 ‘’를 반환하기 때문에 블록이 안전하게 출력됩니다. :

 echo $this->fetch('sidebar');

fetch를 사용하면 블록이 존재하는지 여부에 따라 블록으로 싸여져있는 내용의 표시를 전환 할 수 있습니다. :

 //in app/View/Layouts/default.ctp
 <?php if($this->fetch('menu')) :?> 
 <div class = "menu">
 <h3> Menu options </h3>
      <?php echo $this->fetch('menu');?> 
 </div>
 <?php endif;?>

2.3.0에서 블록의 기본 값을 지정할 수있게되었습니다. 이에 따라 블록의 내용이 비어있을 때 placeholder를 표시하는 것이 쉽게 가능합니다. 기본값은 2번째 인수로 지정합니다. :

  <div class = "shopping-cart">
 <h3> Your Cart </h3>
      <?php echo $this->fetch('cart', 'Your cart is empty');?> 
 </div>

버전 2.3에서 변경 : $default 인수는 2.3에 추가되었습니다.

스크립트와 CSS 파일의 블록을 사용

버전 2.1에서 추가.

블록은 비추천 레이아웃 변수 $scripts_for_layout을 바꿉니다. 이 변수 대신에 블록을 사용해야합니다. HtmlHelper는 뷰 블록을 연결합니다. script(), css(), meta() 의 각 메소드는 inline = false 옵션이 전달될 때 각각 같은 이름의 블록을 갱신합니다. :

  <?php
//뷰 파일에서
 $this->Html->script('carousel', array('inline'=> false));
 $this->Html->css('carousel', array('inline'=> false));
 ?> 

//레이아웃 파일 중
 <! DOCTYPE html>
 <html lang = "en">
 <head>
 <title> <?php echo $this->fetch('title');?> </title>
      <?php echo $this->fetch('script');?> 
      <?php echo $this->fetch('css');?> 
 </head>
//레이아웃이 아래 계속

HtmlHelper 스크립트와 CSS가 어떤 블록에 대응하는 방법을 제어합니다. :

//뷰 중
 $this->Html->script('carousel', array('block'=> 'scriptBottom'));

//레이아웃 중
 echo $this->fetch('scriptBottom');

레이아웃

레이아웃은 뷰를 감싸는 표시 용 코드를 포함합니다. 모든 뷰에서 보여주기를 원한다면 레이아웃에 배치되어야합니다.

레이아웃 파일은 /app/View/Layouts에 배치되어야합니다. 새로운 기본 레이아웃을 /app/View/Layouts/default.ctp로 작성하여 CakePHP의 기본 레이아웃은 덮어 씁니다. 일단 새로운 기본 레이아웃이 만들어지면 페이지가 렌더링 될 때 컨트롤러에 의해 렌더링 된 뷰 코드가 새로운 기본 레이아웃의 내부에 배치되게 됩니다.

레이아웃을 만들 때 뷰의 코드가 어디에 배치되는지를 CakePHP에 알려줄 필요가 있습니다. 그러기 위해서는 만든 레이아웃에 $this-> fetch(‘content’)가 포함되어 있는지 확인하십시오. 그러면 기본 레이아웃이 어떤 것인지 실제로 살펴보겠습니다. :

  <! DOCTYPE html>
 <html lang = "en">
 <head>
 <title> <?php echo $title_for_layout?> </title>
 <link rel = "shortcut icon"href = "favicon.ico"type = "image/x-icon">
 <! - 외부 파일과 스크립트 파일이 여기에로드됩니다(자세한 내용은 HTML 헬퍼를 참조하십시오) ->
 <?php
 echo $this->fetch('meta');
 echo $this->fetch('css');
 echo $this->fetch('script');
 ?> 
 </head>
 <body>

 <! - 만약 모든 뷰에서 메뉴를 표시 할 경우,
 여기에로드합니다.  ->
 <div id = "header">
 <div id = "menu"> ... </div>
 </div>

 <! - 뷰에 표시 할 것은 여기에 배치합니다.  ->
 <?php echo $this->fetch('content');?> 

 <! - 각 페이지에 표시 할 바닥 글은 여기에 추가하십시오.  ->
 <div id = "footer"> ... </div>

 </body>
 </html>

2.1 이전 버전에서는 fetch() 메소드는 사용할 수 없습니다. fetch('content')$content_for_layout을 대체 fetch('meta'), fetch('css'), fetch('script')의 각 행은 버전 2.0에서는 $scripts_for_layout 변수에 포함되어 있습니다.

내장 HtmlHelper를 사용하는 뷰의 경우, script, css, meta 블록에 정의 된 일부 내용이 포함되어 있습니다. 뷰에서 javascript와 CSS 파일이 포함 된 것은 편리합니다.

HtmlHelper::css() 와 HtmlHelper::script() 을 뷰 파일에서 사용할 때, html 소스를 같은 이름으로 블록 안에 배치하는 ‘inline’옵션은 ‘false’로하십시오.(자세한 사용법은 API를 참조하십시오.)

content 블록은 렌더링 된 뷰의 내용을 포함합니다.

$title_for_layout는 페이지 제목을 포함합니다. 이 변수는 자동으로 생성되지만 컨트롤러/뷰에서 설정하면 덮어 쓸 수 있습니다.

레이아웃의 제목을 설정하기 위해서는 컨트롤러에서 $title_for_layout 변수를 설정하는 것이 가장 간단합니다. :

  class UsersController extends AppController {
     public function view_active() {
         $this->set('title_for_layout', 'View Active Users');
     }
 }

또한 뷰 파일에서 title_for_layout 변수를 설정할 수도 있습니다. :

  $this->set('title_for_layout', $titleContent);

원하는만큼 레이아웃을 만들 수 있습니다. 레이아웃은 app/View/Layouts 디렉토리에 파일을 만들고, 컨트롤러 액션 중 하나 뷰 $layout 속성을 바꾸는 것만으로 만들 수 있습니다. :

 //컨트롤러
 public function admin_view() {
    //stuff
     $this->layout = 'admin';
 }

//뷰 파일에서
 $this->layout = 'loggedin';

예를 들어 내 사이트에 작은 광고 배너 영역이 있다고합니다. 이 경우, 작은 광고 영역이 포함 된 새로운 레이아웃을 만들어 다음과 같이 전체 컨트롤러의 액션에서 지정하는 것도 가능합니다.:

  class UsersController extends AppController {
     public function view_active() {
         $this->set('title_for_layout', 'View Active Users');
         $this->layout = 'default_small_ad';
     }

     public function view_image() {
         $this->layout = 'image';
        //output user image
     }
 }

CakePHP는 두 코어 레이아웃(CakePHP의 기본 레이아웃 외에) ‘ajax’와 ‘flash’를 제공하고 있습니다. Ajax 레이아웃은 Ajax 응답을 조립하기 위해 편리하고 빈 레이아웃으로 되어 있습니다.(ajax 호출은 인터페이스를 완벽하게 표현 한다기 보다는 약간의 마크 업이 필요한 것이 대부분입니다.) flash 레이아웃은 Controller::flash() 메소드 메시지 표시에 사용됩니다.

쉽고 빠르게 text/html이 아닌 컨텐츠를 제공하기 위해 다른 세 가지 핵심 레이아웃, xml, js, rss가 있습니다.

플러그인에서 레이아웃을 사용

버전 2.1에서 추가.

만약 기존의 플러그인에서 레이아웃을 사용하려면, 플러그인 기법 을 사용할 수 있습니다. 컨텍트 플러그인에서 컨텍트의 레이아웃을 사용하는 경우는 다음과 같습니다. :

  class UsersController extends AppController {
     public function view_active() {
         $this->layout = 'Contacts.contact';
     }
 }

엘리먼트

많은 응용 프로그램에는 다양한 페이지에서 때로는 다른 레이아웃의 페이지에서 반복 요구되는 표시 용 코드의 작은 블록이 있습니다. CakePHP는 재사용이 필요한 웹 사이트의 파트를 계속해서 사용에 도움을줍니다. 이 재사용 가능한 부품은 엘리먼트라고합니다. 광고, 도움말 박스, 네비게이션 컨트롤 엑스트라 메뉴, 로그인 폼 풍선은 CakePHP에서 엘리먼트로 구현됩니다. 엘리먼트는 기본적으로 다른 뷰 레이아웃 요소에 포함 할 수있는 작은 뷰입니다. 요소는 뷰에서 반복 렌더링되는 부분의 가독성을 개선하기 위해 사용할 수 있습니다. 응용 프로그램의 내용의 일부를 재사용하는 데 도움이됩니다.

엘리먼트는/app/View/Elements/폴더에 .ctp 확장자를 가진 이름으로 배치됩니다. 다음 예제는 뷰의 element 메소드를 사용하여 출력하고 있습니다. :

  echo $this->element('helpbox');

요소에 변수를 전달

element 메서드의 두 번째 인수를 통해 요소에 데이터를 전달할 수 있습니다. :

  echo $this->element('helpbox', array(
     "helptext"=> "Oh, this text is very helpful."
 ));

요소 파일의 내부에서는 인수로 전달 된 모든 변수를 매개 변수 배열의 구성원으로 사용할 수 있습니다.(뷰 파일에서 컨트롤러 Controller::set() 메소드처럼 동작합니다.) 위의 예에서는/app/View/Elements/helpbox.ctp에서 $helptext 변수를 사용할 수 있습니다. :

 //app/View/Elements/helpbox.ctp의 내부
 echo $helptext; //"Oh, this text is very helpful."라고 출력됩니다

View::element() 메서드는 엘리먼트에 대한 옵션을 지원합니다. 지원되는 옵션은 ‘cache’와 ‘callbacks’입니다. 예를 들면 :

  echo $this->element('helpbox', array(
         "helptext"=> "This is passed to the element as $helptext"
         "foobar"=> "This is passed to the element as $foobar"
     ),
     array(
         "cache"=> "long_view"//"long_view"캐시 설정을 사용합니다
         "callbacks"=> true//요소에서 before/afterRender가 불려 true로 설정하십시오
     )
 );

요소는 Cache 클래스를 통해 캐시됩니다. 구성된 캐시의 어느 하나에 요소가 저장되도록 설정할 수 있습니다. 그 결과, 어디에 언제까지 엘리먼트를 저장할 것인지를 유연하게 제어 할 수 있습니다. 응용 프로그램에서 동일한 요소의 다른 버전을 캐시하기 위해서는 다음과 같은 형식을 사용하여 독특한 캐시 키를 제공하십시오. :

  $this->element('helpbox', array(), array(
         "cache"=> array('config'=> 'short', 'key'=> 'unique value')
     )
 );

requestAction() 을 사용해서 요소의 장점을 최대한 활용할 수 있습니다. requestAction() 함수는 뷰 변수를 컨트롤러 액션에서 따온 배열로서 돌려줍니다. 이에 따라 요소를 진정한 MVC 스타일에 유지하는 것이 가능합니다. 엘리먼트용의 뷰 변수를 준비한 컨트롤러 액션을 만들고 그 뒤 컨트롤러로부터 엘리먼트 뷰 변수를 주기위해, element() 메서드의 두 번째 인수 속에서 requestAction()를 호출 해주세요.

이것을 실제로 확인하기 위해 Post의 예제 컨트롤러에 다음과 같은 코드를 추가하십시오. :

  class PostsController extends AppController {
    //...
     public function index() {
         $posts = $this->paginate();
         if($this->request->is('requested')) {
             return $posts;
         } else {
             $this->set('posts', $posts);
         }
     }
 }

그러면 엘리먼트 안에서 paginate된 posts 모델에 액세스 할 수 있습니다. 정렬 된 목록에서 최신의 5 건을 취득하기 위해서는 다음과 같이하면 좋습니다. :

 <h2> Latest Posts </h2>
 <?php $posts = $this->requestAction('posts/index/sort:created/direction:asc/limit:5'); ?> 
 <ol>
 <?php foreach($posts as $post) :?> 
 <li> <?php echo $post [ 'Post'] [ 'title'];?> </li>
 <?php endforeach;?> 
 </ol>

엘리먼트를 캐시하기

캐시 매개 변수의 전달만으로 CakePHP의 뷰 캐시의 혜택을 얻을 수 있습니다. true를 전달하면 ‘default’캐시 설정에 따라 엘리먼트가 캐시됩니다. false의 경우 어떤 캐시 설정을 사용할지를 설정할 수 있습니다. Cache 설정에 대한 자세한 내용은 Caching을 참조해주세요. 엘리먼트 캐시의 간단한 예는 다음과 같습니다. :

  echo $this->element('helpbox', array(), array('cache'=> true));

어떤 뷰에서 같은 엘리먼트가 두 번 이상 렌더링되는 경우 매번 다른 이름의 ‘key’매개 변수를 설정하여 확실하게 안정적으로 캐시 할 수 있습니다. 따라서 element()를 이전 호출시에 생성 된 캐시를 연속 element()의 호출의 결과로 덮어 것을 피할 수 있습니다. :

  echo $this->element(
     'helpbox'
     array('var'=> $var)
     array('cache'=> array('key'=> 'first_use', 'config'=> 'view_long')
 );

 echo $this->element(
     'helpbox'
     array('var'=> $differenVar)
     array('cache'=> array('key'=> 'second_use', 'config'=> 'view_long')
 );

위의 예에서는 2 개의 element()의 결과가 개별적으로 캐시되는 것이 보증되고 있습니다. 만약 모든 요소의시에서 동일한 설정을 사용하려면, View::$elementCache 를 설정하여 반복을 피할 수 있습니다. CakePHP는 element()에 아무것도 설정되어 있지 않은 경우,이 설정을 사용합니다.

플러그인 엘리먼트에 대한 요구

2.0

플러그인 엘리먼트를 로드하는 plugin 옵션을 사용하십시오.(버전 1.x의 data 옵션에서 이동했습니다.) :

  echo $this->element('helpbox', array(), array('plugin'=> 'Contacts'));

2.1

만약 플러그인을 사용하고 플러그인 요소를 사용하고 싶다고 생각한다면 익숙한 플러그인 기법 을 사용하는 것만으로 좋다. 뷰 컨트롤러/액션 플러그인 그리기 중일 때 다른 플러그인 이름이 사용되지 않으면 모든 엘리먼트에서 사용되는 플러그인 이름에 자동으로 접두사가 붙습니다. 만약 엘리먼트가 플러그인에 존재하지 않는 경우 메인 어플리케이션 폴더 안에서 검색됩니다. :

  echo $this->element('Contacts.helpbox');

만약 뷰가 플러그인의 일부이면 플러그인 이름을 생략 할 수 있습니다. 예를 들어, Contacts 플러그인 ContactsController 안에있는 경우 :

 echo $this->element('helpbox');
//and
 echo $this->element('Contacts.helpbox');

이들은 같은 엘리먼트의 렌더링 결과가 됩니다.

버전 2.1에서 변경 : $options[plugin] 옵션은 사용되지 않으며 대신 Plugin.element이 추가되었습니다.

독자적인 View 클래스 생성

데이터 뷰의 새로운 유형을 추가하려면 사용자 정의 뷰 클래스를 만들거나 어플리케이션에 사용자 정의 뷰의 렌더링 로직을 추가해야합니다. CakePHP의 뷰 클래스의 대부분의 구성 요소와 마찬가지로 몇 가지 규칙이 있습니다. :

  • 뷰 클래스는 App/View에 배치하십시오. 예) App/View/PdfView.php
  • 뷰 클래스 이름은 View를 클릭하십시오. 예) PdfView
  • 뷰 클래스 이름을 참조 할 때 View 접미사를 생략해야합니다. 예) $this-> viewClass = 'Pdf';
    또한 제대로 작동하도록 View를 상속합시다. :
 //in App/View/PdfView.php

 App::uses('View', 'View');
 class PdfView extends View {
     public function render($view = null $layout = null) {
        //custom logic here.
     }
 }

render 메소드를 대체하면 콘텐츠가 렌더링되는 방법을 완전히 제어 할 수 있습니다.

뷰 API

class View

뷰 메소드는 모든 뷰 요소 레이아웃 파일에서 액세스 할 수 있습니다. $this-> method()의 형식에서 호출하십시오.

View::set(string $var, mixed $value)

뷰는 컨트롤러 객체에서 볼 수있는 set()와 유사한 set() 메소드가 있습니다. 뷰 파일에서 set()를 사용하면 나중에 렌더링되는 레이아웃과 요소에 변수를 추가 할 수 있습니다. set()의 사용법에 대해 자세히 알고 싶다면, 컨트롤러 메소드를 참조해주세요.

뷰 파일은 다음과 같이 작성할 수 있습니다. :

  $this->set('activeMenuButton', 'posts');

그리고 레이아웃은 $activeMenuButton 변수를 사용할 수 ‘posts’라는 값입니다.

View::getVar(string $var)

$var라는 뷰 변수를 가져올 수 있습니다.

View::getVars()

현재 드로잉 범위에서 사용할 수있는 모든 뷰 변수의 목록을 가져옵니다. 변수 이름의 배열이 반환됩니다.

View::element(string $elementPath, array $data, array $options = array())

요소 또는 뷰의 일부를 그립니다. 더 자세히 알고 싶다면, 요소 를 참조하십시오.

View::uuid(string $object, mixed $url)

객체의 유형이나 URL에 따라 독특하고 무작위가 아닌 DOM ID를 생성합니다. 이 방법은 종종 JsHelper 같은 엘리먼트에 대한 독특한 DOM ID의 생성을 필요로하는 헬퍼에 의해 사용됩니다. :

$uuid = $this->uuid('form', array('controller'=> 'posts', 'action'=> 'index'));
//$uuid contains 'form0425fe3bad'

View::addScript(string $name, string $content)

내부의 스크립트 버퍼에 내용을 추가합니다. 이 버퍼는 레이아웃에서 $scripts_for_layout로 이용됩니다. 이 메소드는 javascript와 css를 직접 레이아웃에 추가 할 필요가있는 헬퍼를 만들 때 도움이됩니다. 레이아웃과 레이아웃 안의 요소에서 추가 된 스크립트는 $scripts_for_layout에 추가되지 않는다는 것을 명심하라. 이 방법은 대부분의 경우 JsHelper 과 HtmlHelper 도우미 헬퍼 중에서 사용됩니다.

버전 2.1에서 삭제 : 대신 뷰 블록을 사용 하는 기능을 사용하십시오.

View::blocks()

정의 된 모든 블록의 이름을 배열로 가져옵니다.

View::start($name)

뷰 블록에 대한 블록의 포착을 시작합니다. 뷰 블록을 사용 을 참조하십시오.

버전 2.1에서 추가.

View::end()

가장 최근에 시작된 블록의 포착을 종료합니다. 뷰 블록을 사용 을 참조하십시오.

버전 2.1에서 추가.

View::append($name, $content)

$name 블록에 추가합니다. 뷰 블록을 사용 을 참조하십시오.

버전 2.1에서 추가.

View : prepend($name, $content)

$name 블록의 시작 부분에 추가합니다. 뷰 블록을 사용 을 참조하십시오.

버전 2.3에서 추가.

View::startIfEmpty($name)

지정한 블록이 공백일 경우에만 블록을 시작합니다. 블록의 모든 컨텐츠를 캡처, 만약 블록이 이미 정의되어있는 경우는 파기됩니다.

버전 2.3에서 추가.

View::assign($name, $content)

블록의 값에 대입합니다. 이미 존재하고 있던 내용을 덮어 쓰게됩니다. 뷰 블록을 사용 을 참조하십시오.

버전 2.1에서 추가.

View::fetch($name )

블록의 값을 가지고옵니다. 정의되지 않은 블록의 경우 ‘가 돌아갑니다. 뷰 블록을 사용 을 참조하십시오.

버전 2.1에서 추가.

View::extend($name )

현재보기/요소/레이아웃을 지정의 이름으로 상속합니다. 뷰의 상속 을 참조하십시오.

버전 2.1에서 추가.

property View::$layout

현재 뷰가 래핑 된 레이아웃을 설정합니다.

property View::$elementCache

요소를 캐시하기 위해 사용되는 캐시 설정입니다. 이 속성을 설정하는 자식 요소를 캐시하는 데 사용되는 기본 설정이 변경됩니다. 이 기본값은 element 메서드 ‘cache’옵션이 사용된다고 덮어 씁니다.

property View::$request

CakeRequest 의 인스턴스입니다. 현재 요청에 대한 정보에 액세스하기 위해이 인스턴스를 사용합니다.

property View::$output

뷰 파일 또는 배치 컨텐츠 중 하나의 뷰에서 마지막으로 렌더링 된 콘텐츠가 포함되어 있습니다.

버전 2.1에서 철폐 : 대신 $view-> Blocks-> get(‘content’); 을 사용하십시오.

property View::$Blocks

ViewBlock 의 인스턴스입니다. 뷰의 렌더링 중에 뷰 차단 기능을 제공하기 위해 사용되고 있습니다.

버전 2.1에서 추가.

'PHP' 카테고리의 다른 글

CakePHP - View - Json 과 XML 뷰  (0) 2015.05.13
CakePHP - 뷰 - 테마  (0) 2015.05.13
[CakePHP] Controller - Components  (0) 2015.05.08
[CakePHP] Controller - PageController  (0) 2015.05.08
[CakePHP] Controller - Scaffolding  (0) 2015.05.08
Posted by dewnine
,