검색창 열기

네이버 지도 API 터치 이벤트

네이버 지도 js api 로 웹 페이지를 만들면


클릭 이벤트를 아무리 걸어도 모바일에서 터치했을 때 먹히질 않는 문제가 있는데


이게 NHN 의 의도인지 아닌지는 잘 모르겠고


여튼 그게 너무 답답해서 만들어봄


https://github.com/lazygyu/nmap_touch


그나저나 블로그 옮기려고 여기 글 안 쓰고 있는데 옮기기가 너무 귀찮네요 ㅠ

저작자 표시 비영리 동일 조건 변경 허락
신고

이 글의 트랙백 주소 : http://lazygyu.tistory.com/trackback/109 관련글 쓰기

  • check offers

    from check offers 2015.02.03 17:12

    奎 :: 닿지 않아도 볼 수 있다면

Comments

::

Learning the Yii Framework 7 / 8

Yii 기본 편집

게시물은 Yii 프레임워크 배우기 시리즈의 8 7번째 문서입니다.

Learning the Yii Framework

1.     Introduction to the Yii Framework

2.     Getting Started with the Yii Framework

3.     Configuring Yii

4.     Defining Databases for the Yii Application

5.     Creating Models, Views, and Controllers in Yii

6.     Basic Model Edits in Yii

7.     Basic View Edits in Yii

8.     Basic Controller Edits in Yii

제가 가장 좋아하는 PHP 프레임워크인 Yii 대한 일곱번째 포스트입니다. 이번 글에서는 Yii 프레임워크가 자동으로 생성한 기본 뷰를 편집해보도록 하겠습니다. 코드 예제를 위해 포스트들에서 계속 만들어오던 고객 관리 프로그램 예제를 사용하도록 하겠습니다. 혹시 필요하다면 이전 포스트들을 읽고 오세요.

 (Note: In October 2010, I’ve updated this entire series to reflect changes in Yii since this series was written, and to take into account feedback provided through the comments. Some outdated material will be crossed out, but left in to reflect how things have changed since the series was begun in June 2009.)

명령행 도구, Gii 도구를 사용해서 어플리케이션을 생성했을 , Yii 프레임워크가 자동으로 설정 파일과 컨트롤러, 등에 사용될 여러 파일과 폴더들을 생성해 주었습니다. 뷰는 폴더로 구분되어 있는 PHP 파일들입니다. 아마 첫번째로 수정하고 싶은 파일은 protected/views/layouts/main.php 겁니다(protected 어플리케이션의 최상위 디렉토리입니다). 페이지는 어플리케이션의 모든 페이지에 대한 틀입니다. 당장 자신만의 스타일로 파일을 뜯어 고치고 싶겠지만, 일단 개의 포인트를 먼저 짚고 넘어가도록 하겠습니다.

 

HEAD 태그의 시작 부분에 외부 파일들을 링크하는 부분들이 있습니다.

<link rel="stylesheet" type="text/css" href="<?php echo Yii::app()->request->baseUrl; ?>/css/main.css" />

 

Yii::app() 어플리케이션 자체를 가리키는 부분입니다. 이걸 통해서 유저가 현재 보고 있는 페이지나 이전에 보았던 페이지, 기타 여러 가지 정보에 접근할 있습니다. Yii::app()->request 현재 유저가 접근한 페이지(혹은 요청한 페이지) 가리킵니다. ->baseUrl 부분은 어플리케이션의 최상의 주소를 가리킵니다. 예를 들면 http://www.example.com 같은 형태죠. CSS, 자바스크립트, 이미지 등의 외부 파일을 사용하기 위해서는 반드시 Yii::app()->request->baseUrl 통해서 해야 합니다. 단순히 상대경로를 사용할 경우 Yii 주소가 변경되었을 혼란이 생길 있습니다. (예를 들면 www.example.com/index.php/site/login 같은 경우죠)

다음에는 페이지의 제목이 동적으로 표현되어 있는 것을 있습니다.

<title><?php echo CHtml::encode($this->pageTitle); ?></title>

 

기본적으로 pageTitle 값은 어플리케이션의 이름에 현재 페이지에 관한 내용을 덧붙인 것으로 설정되어 있습니다. (환경설정 파일에 정의되어 있습니다.) 부분을 변경하는 방법은 나중에 다시 설명하도록 하겠습니다.

CHtml::encode() 메소드는 단순히 크로스사이트 스크립팅 공격(XSS) 방지하기 위한 부분입니다. 메소드는 앞으로 파일 여기저기서 필요에 따라 적절하게 사용되는 것을 보게 겁니다.

아마 아래와 같은 내용도 있을겁니다.

<div id="logo"><?php echo CHtml::encode(Yii::app()->name); ?></div>

 

Yii:app()->name 어플리케이션의 이름입니다. Config/main.php 파일에 정의되어 있지요. 사용을 하건 말건 그건 사실 사용자 맘이지만, 혹시 사용할 때를 위해서 알아둡시다.

기본 레이아웃 파일은 아래와 같은 위젯을 사용하고 있습니다.

<?php $this->widget('zii.widgets.CMenu',array(...

 

위젯은 외부 파일의 PHP 코드 조각을 내부로 포함시킬 있는 방법입니다. 위젯은 특정한 뷰에 얽매이지 않기 때문에 어떤 파일에라도 마음대로 사용할 있습니다. , 위젯을 사용하면 유지보수 이식성을 위해 PHP 코드를 나누어 관리할 있는 장점도 있습니다. 위에 나와있는 코드는 CMenu 위젯을 위치에 놓겠다는 뜻입니다. 위젯은 Zii 확장기능의 일부분입니다. 많은 위젯을 보고 싶으면 Yii documentation 참고하세요.


Yii 1.1 버전 추가사항 : Yii 1.1 에서는 유용한 확장기능들을 zii 라는 네임스페이스에 모아서 제공하고 있습니다. Yii 이전 버전들은 MainMenu 컴포넌트를 생성하지만 1.1 버전은 CMenu 위젯을 사용합니다. 기본 레이아웃은 또한 Zii 포함된 CBreadcrumbs 위젯도 사용하고 있습니다.


마지막으로, 레이아웃 스크립트 파일에는 가장 중요한 아래와 같은 라인이 있습니다.

<?php echo $content; ?>

 

아마 $content 대한 정의를 코드 내에서 찾을 수가 없을 겁니다. $this->content $model->content 아니고 단순히 $content 라는 점에 주의하세요. 부분은 페이지의 내용이 레이아웃 내에 삽입되는 곳입니다. 다른 HTML PHP 코드들은 전체 사이트에 공통적으로 적용되는 틀이지만 $content 값은 페이지마다 다릅니다. 그럼 값은 어디에서 오는 걸까요?

: 정확히 말하면 URL 구조는 urlManager 사용하는지 아닌지에 따라 달라지고, urlManager 사용한다면 설정값에 따라서도 달라집니다. 자세한 내용은 Yii 설정하기 포스트를 참조하세요.

예를 들어서 www.example.com/index.php/employee/view/id/1 이라는 페이지에 접근하는 경우를 봅시다. 페이지는 1 이라는 ID 가진 직원의 정보를 보여주는 페이지입니다. EmployeeController 클래스의 actionView() 메소드를 호출하게 되죠. 해당 메소드는 기본 (primary key)값을 1 해서 Employee 모델을 불러오구요, ‘View라는 뷰를 렌더링하게 됩니다. 코드는 아래와 같습니다. (protected/contollers/EmployeeController.php 에서 발췌한 코드입니다)

public function actionView($id)

{

    $this->render('view',array(

        'model'=>$this->loadModel($id),

    ));

}

 

컨트롤러의 loadModel 메소드는 실제 모델을 검색합니다. 부분은 일단 신경쓰지 않기로 하죠. $this->render() 부분은 주어진 이름의 뷰를 화면에 그려주는 역할을 하는 부분입니다. 경우에는 ‘view’ 라는 이름을 가진 뷰가 되겠지요. 이건 실제로는 Yii protected/views/employee/view.php 라는 스크립트를 실행하게 된다는 의미입니다. 해당 스크립트는 $model 변수( 코드에서 넘겨주고 있는) 사용해서 직원의 정보를 보여줍니다. (특히, view.php zii.widgets.CDetailView 라는 위젯을 사용해서 세부 사항들을 표시해줍니다.) 해당 뷰가 실행된 결과는 모종의 과정을 거쳐서 $content 변수에 할당되고, 값은 레이아웃으로 넘어와 $content 위치에 삽입됩니다.

마지막으로 레이아웃에 대해 하나 알아두어야 점은, 어플리케이션의 부분에 따라 손쉽게 여러가지 다른 레이아웃을 사용할 있다는 것입니다. 이를 위해서는 컨트롤러 메소드 내에서 뷰를 렌더링 하기 전에 레이아웃 설정값을 확장자를 제외한 레이아웃 파일의 이름으로 설정해주면 됩니다. 아래 코드는 index 호출에 대해 protected/views/layouts/home.php 레이아웃을 사용하겠다는 뜻입니다.

class SiteController extends CController

{...

    public function actionIndex()

    {...

        $this->layout = 'home';

Yii 1.1.x 버전 이상에서는 main.php 템플릿을 사용한 1단짜리(column1) 2단짜리(column2) 레이아웃을 모두 생성합니다. 컨트롤러는 전체 컨트롤러에서 사용할 레이아웃 파일을 지정할 있습니다.

class EmployeeController extends Controller

{

    public $layout='//layouts/column2';

참고: 클래스의 메소드 안에서 $this->layout $layout 동등하게 취급됩니다. ( 코드에서 지정한 $layout) 첫번째 예제는 특정한 동작에 대해서 레이아웃을 지정하고 있고, 두번째 예제는 전체 컨트롤러의 레이아웃을 지정하고 있습니다.

 

이제 스크립트를 살펴봅시다. 첫번째로 해야 일은 기본적인 형태를 원하는 것으로 변경하는 일입니다. 예를 들어, 기본적으로 생성된 뷰는 모델의 정보를 보여주는 테이블 형태로 되어 있습니다. 보통의 경우 모델의 모든 정보를 보여주고 싶은 경우는 별로 없을 겁니다. DIV P 태그를 사용해서 보여주고 싶을 수도 있지요. 이것들은 간단한 수정입니다. 위쪽에서 살펴봤듯이 모델의 정보는 model 이라는 이름의 변수로 넘겨집니다. 따라서 $model->이름 사용해서 필드의 값에 접근이 가능합니다.


Yii 1.1 수정 : 파일에 변동된 부분이 있습니다. 기존 버전의 목록(list.php) 파일이 이제는 인덱스(index.php) 되었습니다. 인덱스 페이지는 CListView 위젯을 통해 리스트를 표시하게 되어 있습니다. 기존의 show.php 뷰는 이제 view.php 되었습니다. 파일은 CDetailView 위젯을 사용해서 특정 레코드의 정보들을 표시하고 있습니다. 특정한 형태의 정보를 표시하기 위한 여러 개의 파일을 _view.php 사용해서 만들 있습니다. 모든 파일은 현재 위치를 표시하는 부분을 상단에 가지고 있는데, 이는 메인 레이아웃에서 사용하는 CBreadcrumbs 위젯을 이용합니다.


: 사이트에 로그인 상태에서 (특별히 설정을 변경하지 않았다면 admin/admin 으로 접근해서 로그인이 가능합니다) www.example.com/index.php/department 접근하게 되면, 새로운 부서정보를 이미 추가할 있습니다. 해보면 아래 내용을 이해하기가 쉬울 거에요.

인덱스 뷰와 어드민 모두 Zii 위젯을 이용해 여러 개의 모델을 보여주고 있습니다. Index.php CListView 위젯을 사용하고, _view.php 파일을 틀로 쓰고 있습니다. _view.php 파일이나 index.php 파일에 있는CListView 설정을 수정하면 목록의 표시 형식을 변경할 있습니다. "Manage XXX" 를 클릭해서 접근 가능한 관리자 페이지는 CGridView 위젯을 사용하고 있습니다. 이 위젯은 각 데이터에 대한 상세정보 보기, 편집, 삭제에 대한 링크를 포함한 테이블을 만들어 줍니다. 테이블은 AJAX 를 통해 페이징 및 검색이 가능합니다. 이것은 Yii 가 뭘 해줄 수 있는지를 아주 극명하고 훌륭하게 보여주는 예시입니다. 아래 그림은 Yii 생성한 부서 관리 페이지를 아무런 수정도 하지 않은 상태입니다.

Department Admin Page

Department Admin Page

생성 뷰와 업데이트 뷰 스크립트 들은 페이지 헤더에 관한 내용들을 담고 있고, 그 뒤엔 아래와 같은 코드로 form 뷰를 불러옵니다.

<?php echo $this->renderPartial('_form', array('model'=>$model)); ?>

이 코드는 모델 정보를 _form.php 로 넘겨서 나오는 결과 폼을 해당 부분에 렌더링 합니다.

생성된 코드를 살펴봅시다. Department 폼은 단순히 부서 이름만을 입력받는 폼입니다. 나무랄 데가 없죠. 하지만 Employee 모델 쪽은 좀 수정해야 할 부분이 있습니다. www.example.com/index.php/employee/create/ 주소로 접근해봅시다.

기본적으로 Gii 를 통해서 생성된 폼은 모든 모델 속성에 대한 입력을 받도록 되어있습니다. 하지만 몇몇 필드들은 이렇게 직접 입력을 받는 게 적합하지 않습니다. 예를 들면 생성 / 수정된 날짜 같은 필드가 그렇죠. 이런 필드는 타임 스탬프 값을 자동으로 계산해서 넣어주어야 합니다. 또한 관계가 있는 모델, 예를 들어 Employee 와 Department 같은 경우 드롭다운 메뉴를 통해서 이 직원이 어느 부서에 속해있는지를 클릭을 통해 선택하게 하는 편이 좋을 것 같습니다. Yii 가 생성한 코드는 이런 일까지 해주지는 않습니다. 폼의 입력 요소들은 보통 그냥 아래와 같은 코드로 만들어진 텍스트 박스입니다.

<?php echo $form->textField($model,'departmentId'); ?>


$form 변수는 CActiveForm 타입의 객체입니다. textField() 메소드는 텍스트 입력 엘리먼트를 생성하는 메소드구요. 첫 번째 매개변수는 해당 입력 요소가 $model 객체를 위한 것이라는 것을 알려줍니다. (컨트롤러에서 넘겨주는 Model 타입의 현재 인스턴스를 가리킵니다.) 두 번째 매개변수는 이 요소가 해당 모델의 어떤 속성을 위한 것인지를 규정합니다.

다른 모델을 통해서 드롭다운 메뉴를 생성하려면 아래와 같이 하면 됩니다.

<?php echo $form->dropDownList($model,'departmentId', CHtml::listData(Department::model()->findAll(), 'id', 'name')); ?>

먼저, $form 객체의 dropDownList() 메소드는 드롭다운 목록을 생성합니다. 이 드롭다운 메뉴를 폼에서 할당하고자 하는 모델과 연결해야 할 필요가 있기 때문에 첫 번째 매개변수는 아까와 마찬가지로 그냥 $model 을 쓰면 됩니다. 두 번째 매개변수는 폼/모델 필드의 이름입니다. departmentId 는 Employee 모델의 필드죠. 그 다음에는 드롭다운 메뉴에 사용될 목록을 가져오는 메소드를 제공해야 합니다. 여기서는 CHtml::listData() 메소드죠. 이 메소드는 값 목록을 드롭다운 메뉴에서 사용할 수 있는 형태로 반환합니다. 이 경우 데이터 소스는 Departments (부서들)이 되겠죠. 이 부서들을 불러오기 위해서 모델 내의 모든 레코드를 검색하는 메소드인 ModelName::model()->findAll() 을 사용합니다. CHtml::listData() 메소드의 뒤쪽 두 매개변수는 드롭다운 메뉴 항목의 값과 표시될 텍스트를 가져올 필드를 나타냅니다. 이 경우에는 부서의 ID 와 부서의 이름이 되겠죠.

또 다른 작업의 예로는 다른 관리 기능들로 연결된 링크를 제거하거나 편집하는 일 등이 있을겁니다.

마지막으로, 페이지의 제목을 변경하기로 결정했다면 아래와 같은 코드로 하면 됩니다.:

<?php $this->pageTitle = $model->something; ?>


여기서 $this->pageTitle 을 변경한다는 점을 주의하세요. $model->pageTitle 을 변경해선 안됩니다. $model 의 필드, 예를 들어서 제목이나 이름 등을 페이지 제목으로 사용하고 싶다면 Yii::app()->name 에 해당 값을 추가해서 사용해도 됩니다.

자, 이것으로 간단한 첫 Yii 뷰 제작을 훑어보았습니다. 다음번 글에서는 컨트롤러를 수정하는 법과 제가 찾아낸 몇몇 놀라운 사실들을 설명하도록 하겠습니다. 늘 읽어주셔서 감사드립니다. 질문이나 하고싶은 말이 있으면 꼭 알려 주세요!


This is a translation of a work originally written in English by Larry Ullman (www.LarryUllman.com). It is translated and republished with his permission.

이 글은 영어로 작성된 Larry Ullman 의 원본 글을 번역한 것입니다 ( http://www.LarryUllman.com ). 이 글은 저자의 허락을 받아 번역되었습니다.      

 

저작자 표시 비영리 동일 조건 변경 허락
신고

이 글의 트랙백 주소 : http://lazygyu.tistory.com/trackback/108 관련글 쓰기

  • africanlawyerblog.com

    from africanlawyerblog.com 2014.10.15 17:32

    奎 :: 닿지 않아도 볼 수 있다면

Comments

  • LazyGyu 2013.07.01 18:01 신고 수정/삭제 답글 달기

    저는 Yii 를 안 쓰기로 결정해서 잊고 있었는데 7, 8 편도 해달라는 분들이 있어서 짬 날때 대충 7편 올립니당

  • jinjin 2013.07.23 17:02 신고 수정/삭제 답글 달기

    안쓰게 된 동기가 뭔지 알려주실수 있나요?

    • LazyGyu 2013.07.24 10:10 신고 수정/삭제

      사이트 리뉴얼에 사용하려고 했었는데 덩치가 큰 사이트라 이런 형태의 프레임워크에는 잘 안 맞겠더라구요.

      중소규모 사이트를 처음부터 작성하기 위한 프레임워크로는 굉장히 좋다고 생각하고 있습니다.

  • jinjin 2013.07.24 12:28 신고 수정/삭제 답글 달기

    답변 감사드립니다.
    한가지 더 여쭤봐도 될가요.
    Restfull API를 만들려 찾아보니 "Restfullyii" 라는 extension이 있더라구요.
    어찌어찌 설치는 했는데 실지로 이용하는 예제코드를 아직 찾지 못했습니다.
    초보라서 매뉴얼만 보고는 이해가 잘안되서요.
    혹시 경험이 있으시면 간단한 Sample이나 관련 url을 알려드릴수 있나요.

    바쁘실텐데 미안한 부탁드립니다.

    • LazyGyu 2013.07.25 16:31 신고 수정/삭제

      안타깝지만 저도 실 업무에서 사용은 전혀 해보지 않아서 관련 정보에 대해 말씀드릴 수 있는 게 없네요..

::

댓글알리미 규격 (테터툴즈 호환)

테터계열 블로그들에서 시작된 댓글 알리미 프로토콜.


딱히 스펙 문서는 못 찾았고 여기저기 뒤져가며 (특히 워드프레스 플러그인 소스가 웹에서 바로 접근이 가능해서 큰 도움이 되었긔) 확인함.


1. 댓글 알리미 요청 보내기


- 댓글에 댓글이 달릴 때 해당 댓글의 홈페이지 주소로 아래 내용을 POST 로 쏴주면 된다.


(표 출처 : http://egoing.net/1054 )

keytypedefaultdescription
modestringfb

request가 댓글 알리미임을 지정, 
반드시 'fb'로 전달해야 함

s_home_titlestring''블로그 타이틀
s_namestring''블로그 주인장
s_noint
포스트 식별번호
urlstring''블로그 주소
s_urlstring''포스트 퍼머링크
s_post_titlestring''포스트 제목
r1_noint
댓글 식별번호
r1_namestring''댓글러 이름
r1_rnoint
댓글의 부모 댓글의 식별번호 
(텍큐는 댓글이 2depth만 지원하므로 0)
r1_homepagestring''댓글러의 블로그주소
r1_regdatetimestamp
댓글 등록시간
r1_bodystring
댓글 내용
r1_urlstring''댓글의 퍼머링크
r2_noint
답글 식별번호
r2_namestring''답글러 이름
r2_rnoint
답글의 부모 댓글 식별번호 r1_no와 같음.
r2_homepagestring''답글의 블로그주소
r2_regdatetimestamp
답글의 등록시간
r2_bodystring
답글 내용
r2_urlstring''답글의 퍼머링크


리턴값은 필요 없으니까 걍 요청 쏘고 잊어버리면 됨.


2. 댓글 알리미 요청 받기


홈페이지 루트로 들어오는 POST 요청 중에 mode 가 fb 인 요청을 받아서 위 표의 내용에 따라 검사하고 저장해뒀다가 관리자 화면에 띄워주면 된다.


참 쉽죠잉?

저작자 표시 비영리 동일 조건 변경 허락
신고

이 글의 트랙백 주소 : http://lazygyu.tistory.com/trackback/107 관련글 쓰기

Comments

::

티스토리 툴바