[php]간단한 달력만들기

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>달력</title>
</head>
<body>
    <?php
    if(empty($_GET['date'])){ // 입력값이 없으면 오늘을 기준으로 한다
        $thisDay = date("Y-m-d");    
    } else {
        if(isset($_GET['btn'])){
            if($_GET['btn'] == 'prev'){ // 이전달 구하기
                $thisDay = date("Y-m-d", strtotime($_GET['date']." -1 month"));
            } elseif($_GET['btn'] == 'next'){ // 다음달 구하기
                $thisDay = date("Y-m-d", strtotime($_GET['date']." +1 month"));
            }
        } else {
            $thisDay = $_GET['date']; //입력한 날짜 가져오기
        }
    }
    
    $thisDayArry = explode('-', $thisDay);
    $thisY = $thisDayArry[0];
    $thisM = $thisDayArry[1];
    $thisD = $thisDayArry[2];

    $maxDay = date("t", strtotime($thisDay)); // 총일수
    $startWeek = date("w", strtotime($thisY."-".$thisM."-01")); // 1일은 무슨 요일인가
    $maxWeek = ceil(($maxDay+$startWeek)/7); // 총주수
    $endWeek = date("w", strtotime($thisY."-".$thisM."-".$maxDay));// 마지막일은 무슨 요일인가

    ?>
    <form action="./cal.php" method="GET">
        <a href="./cal.php?date=<?php echo $thisDay?>&btn=prev">prev</a>
        <input type="text" name="date" value="<?php echo $thisDay?>">
        <a href="./cal.php?date=<?php echo $thisDay?>&btn=next">next</a>
    </form>

    <table>
        <thead>
            <tr>
                <th>일</th>
                <th>월</th>
                <th>화</th>
                <th>수</th>
                <th>목</th>
                <th>금</th>
                <th>토</th>
            </tr>
        </thead>
        <tbody>
            <?php $day=1; ?>
            <?php for($i=1; $i<=$maxWeek; $i++){?>
                <tr>
                <?php for($j=0; $j<7; $j++){ ?>
                    <td>
                        <?php 
                        if(($i==1 && $j < $startWeek) || ($i==$maxWeek && $j> $endWeek) ){ // 첫째 주이고 j가 1일의 요일보다 작은 경우 패스 || 마지막 주 이고 j가 마지막일의 요일보다 크면 패스
                            echo '';
                        } else {
                            if($day == $thisD){ echo '<b>'; }
                            echo $day;
                            if($day == $thisD){ echo '</b>'; }
                            $day++;
                        }
                        ?>
                    </td>
                <?php } ?>
                </tr>
            <?php } ?>
        </tbody>
    </table>
</body>
</html>

참고사이트:
https://phpheaven.tistory.com/104

[그누보드5] 관리자에 게시판관리 기능 추가

그누보드관리자페이지에서 게시판명을 클릭하면 사용자 화면으로 링크가 이동되는데 이걸 관리자페이지에서 관리 할 수 있으면 편할거 같아 공유할 목적으로 만들어진 소스입니다.

사용방법:

링크를 참조하여 제작하였습니다.

https://sir.kr/g5_tip/2692

[apache] SecRuleEngine off

cafe24에서 가상호스팅 centos7 구매 후 그누보드 설치하여 사용하는데 아래와 같은 메세지를 출력함.

You don’t have permission to access /bbs/login_check.php on this server.

대부분의 경우 파일권한을 확인하면 되지만 이번에는 권한 이외에 다른 부분이 문제 였다.

에러 로그를 확인

#vi /etc/httpd/logs/error_log

[Fri Jul 19 22:03:31.444003 2019] [:error] [pid 3220] [client xxx.xxx.xxx.xxx] [client xxx.xxx.xxx.xxx] ModSecurity: Access denied with code 403 (phase 2). Pattern match "\\\\%((?!$|\\\\W)|[0-9a-fA-F]{2}|u[0-9a-fA-F]{4})" at ARGS:url. [file "/etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_20_protocol_violations.conf"] [line "465"] [id "950109"] [rev "2"] [msg "Multiple URL Encoding Detected"] [severity "WARNING"] [ver "OWASP_CRS/2.2.9"] [maturity "6"] [accuracy "8"] [tag "OWASP_CRS/PROTOCOL_VIOLATION/EVASION"] [hostname "mysite.com"] [uri "/bbs/login_check.php"] [unique_id "XTG-o0jziQZT3ktA@GaorgAAAAA"], referer: http://mysite.com/bbs/login.php?url=http%3A%2F%2Fmysite.com%2Fadm

/etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_20_protocol_violations.conf 에서 465 라인이 해당 요청이 규칙에 위반 되어서 접근을 제한 하는것 같다. httpd.conf 에서 해당 규칙을 제외시켜준다.

#vi /etc/httpd/conf/httpd.conf

<Directory>
  ...
  ...
  SecRuleEngine Off
</Directory>
service httpd restart

참고 사이트
https://www.enteroa.com/2015/02/07/195/

[jquery]scrollMagic 사용법

<script src="/TweenMax.min.js"></script>
<script src="/ScrollMagic.min.js"></script>
<script src="/animation.gsap.min.js"></script>
<script src="/debug.addIndicators.min.js"></script>

var controller = new ScrollMagic.Controller();
$(".element").each(function(e){
    var _this = this;
    var scene = new ScrollMagic.Scene({triggerElement: _this, duration: "100%"})
    .setTween(_this, {y: "40%", ease: Linear.easeNone})
    .addIndicators() // add indicators (requires plugin)
    .addTo(controller)
    .reverse(false); // 뒤로돌아가지 않음
})

https://github.com/janpaepke/ScrollMagic

[npm]babel 설치하기

바벨을 설치하기 전에 webpack을 설치해야한다. 준비가 안되었을 경우 아래글을 먼저 읽기

npm을 이용해서 webpack 설치하기
http://blog.ujsstudio.com/?p=194

npm install --save-dev babel-loader @babel/core
npm install @babel/preset-env --save-dev

webpack.config.js에 바벨로더를 추가해준다

const path = require('path');
module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'main.js',
    path: path.resolve(__dirname, 'dist')
  },
  devServer:{
    contentBase: './dist' //개발서버가 root가 아닌 dist 폴더를 인식
  },
  module: {
    rules: [
      { test: /\.js$/, exclude: /node_modules/, loader: "babel-loader" }
    ]
  }
};

.babelrc 파일을 루트(webpack.config.js와 같은 위치)에 생성하고 아래와 같이 입력

{
    "presets": ["@babel/preset-env"]
}

npm run devserver 명령을 통해서 바벨이 잘 작동되는지 확인하면 된다.

참조
https://babeljs.io/setup

[npm]webpack 설치하기

mkfir webpack-demo
cd webpack-demo
npm init -y
npm install webpack --save-dev
npm install webpack-cli --save-dev
npm install webpack-dev-server --save-dev

webpack.config.js 파일을 생성하고 아래와 같이 세팅해준다.

//webpack.config.js

const path = require('path');
module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'main.js',
    path: path.resolve(__dirname, 'dist')
  },
  devServer:{
    contentBase: './dist' //개발서버가 root가 아닌 dist 폴더를 인식
  },
};

package.json 파일에 스크립트를 추가한다.

{
  "name": "webpack-demo",
  "version": "1.0.0",
  "description": "",
  "private": true,
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "bulid": "webpack",
    "devserver": "webpack-dev-server --open --progress"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "webpack": "^4.33.0",
    "webpack-cli": "^3.3.4",
    "webpack-dev-server": "^3.7.1"
  },
}

스크립트를 수정할 때마다 빌드명령하는게 불편하기 때문에 wevpack-dev-server를 이용한다. package.json 에 등록한 스크립트 ‘devserver’를 실행시키기 위해서 npm run devserver 한다. 소스를 변경하면 개발서버가 변경을 감지해서 빌드한것 처럼 브라우저를 갱신 시켜준다.

[참고]
https://webpack.js.org/guides/getting-started/#basic-setup

[같이 읽기]
바벨설치하기 : http://blog.ujsstudio.com/?p=198

[javascript] 아이프레임간 데이터 전송 방법

외부사이트를 아이프레임으로 불러오는 경우 높이 값을 수정하고 싶을때 ‘targetWindow.postMessage’를 이용해서 필요한 데이터를 전송, 전달 받을 수 있다.

크로스도메인에서도 사용가능한 방법이다.

<!-- mysite.com -->

<iframe id ="sizetracker" src="http://redcong.com/test.php" scrolling="auto" frameborder="0" allowtransparency="true" class="reser_frame" style="height: 500px !important;"></iframe>
<script type="text/javascript">
	window.addEventListener("message", function(e){
		var data = JSON.parse(e.data);
	    console.log(data);
	}, false);
</script>
<!-- example.com -->

<div>...</div>
<script type="text/javascript">
  parent.postMessage(
  '{"height": '+ document.body.scrollHeight +'}',
  "http://mysite.com" // '*' 사용할 경우 모든 도메인 허용
</script>

참조:
https://developer.mozilla.org/ko/docs/Web/API/Window/postMessage

[fullpage]ios에서 overflow 안될때

ios에서 fullpage 요소 밖에 fixed된 요소에 overflow가 작동 안할때 해결방법

<div id="gnb">...</div>
<div id="fullpage">
    <div class="section"></div>
    <div class="section"></div>
    <div class="section"></div>
</div>

<script type="text/javascript">
    $('#fullpage').fullpage({
        normalScrollElements: '#gnb'
    });
</script>

[javascript]아이프레임에서 부모 요소 접근하기

아이프레임안에서 iframe 속성 제어와 같이 바깥요소를 제어하려면 어떻게해야 할까

window.parent.document를 사용하면 바깥 document객체에 접근할 수 있다. 아래는 inner.html이 index.html의 ‘.hello’ 요소에 접근해서 텍스트를 변경하는 예제이다.

<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <iframe src="./inner.html" frameborder="0"></iframe>
</body>
</html>
<!-- inner.html -->
<div>...</div>
<script>
    var parent = window.parent.document;
    parent.querySelector('.hello').innerHTML = 'world';
</script>