2011-04-26 2 views
1

제한된 코딩 경험을 가진 컨텐츠 작성자가 기존 HTML (PHP)에서 선택한 컨텐츠의 만료 날짜를 지정할 수있는 쉬운 방법을 원합니다. 우리 사이트의 페이지 소스 코드에서 사용할 수 없도록 컨텐트 서버 측을 제거하는 것을 선호합니다. 잠재적 인 솔루션의클래스 속성 값을 기준으로 게재 전에 HTML 페이지를 변경하기 위해 PHP를 사용할 수 있습니까?

그림 나는 궁리하고 있습니다 :

<div class="story"> ... </div> 

것은 2011 그래서 나는에 값을 추가,의 내가 6 월 1 일부터 사라 위 사업부와 그 내용을 원하는 가정 해 봅시다 클래스 속성 (? XPath는)

<div class="story disappears-20110601"> ... </div> 

가 그럼 난 몇 가지 코드를 작성해야는 = 같은 패턴 "... YYYYMMDD disapears-"와 클래스 값이 모든 요소를 ​​찾습니다. 날짜 참조가 유효하고 그 날짜가 오늘 또는 이전 일 경우, 코드는 전체 div와 그 내용을 DOM에서 제거한 다음 만료 된 div없이 페이지를 제공합니다.

내가 이것을 설정하기 전에 개념을 어떻게 생각합니까? 그것은 실현 가능합니까? 사이트 전체에 구현되면 끔찍한 리소스 돼지가 될까요?

+1

는 이야기가 데이터베이스에서 오는 또는 모든 고정 된 HTML 페이지입니다 수행을? – jeroen

+1

제 의견으로는 당신이 잘못 생각한 것일 수 있습니다. 이 콘텐츠의 출처는 어디입니까? RSS 피드? 백 엔드 데이터베이스? 사용할 수 없어야하는 것을 기반으로 HTML을 파괴하지 않고, 사용 가능한 것을 기반으로 HTML의 구성을 필터링 할 수 있어야합니다. –

+0

만약 당신이 HTML을 통해 그것을 끝내면 클래스 attr을 사용하지 마십시오. 'data-disappear'를 사용하십시오. http : // ejohn.org/blog/html-5-data-attributes/ – Galen

답변

0

더 나은 방법은 콘텐츠를 데이터베이스 테이블에 저장하고 DATETIME 필드를 통해 만료일을 할당하는 것입니다. 이것에 대한 CSS 클래스를 사용하는 것은 작은 사각형 페그입니다.

+0

없음 데이터베이스를 사용할 수 있습니다. (내 잘못, 내가 맹세한다.) 나는 오픈 소스 CMS를 구현하기 위해 하드 추진하고있어 (문제는 해결되었지만) 내가 이기기 전까지 사이트의 코드는 다소 복잡합니다 .... – ErikJ

+0

그래, 나쁘다. – webbiedave

0

글쎄, 당신은 Regexp를 사용하여 할 수 있지만, 나는/할 수 있다고 생각한다. 하나의 디렉토리에 별도의 파일로 스토리를 저장하지 않고 file-name을 통해 파일을로드/삭제/편집하는 경우 하나에 대한 액세스 권한이있는 경우 데이터베이스를 사용하는 것이 좋습니다.

HTML을 통해 그렇게하는 것은 불쾌 할 것입니다. 제 의견으로는.

편집 : 나는 한 동안 PHP를 사용하지 않았기 때문에

<?php 
    $html_content = file_get_contents('...'); 
    preg_match('/class="story disappears-(\d*)"/i', $html_content, $match_array) 
    foreach($match_array as $val) { 
     if (intval($val) < intval(date('Ymd'))) { 
      $new_html_content = preg_replace('/(<div class="story disappears-'. $val .'">.*<\/div>)/', '', $html_content); 
      echo $new_html_content; 
     } 
    } 
?> 

그냥 보조 노트, 당신은이 첫 번째 디버깅을 시도해야한다, 나는 몇 가지 실수를 한 적이 있습니다. 그러나 오류가 발생하면 비틀 거리며 의견을 알려주십시오. 따라서 코드를 업데이트 할 수 있습니다. 여기

+0

그리고 likewebbiedave suggeste d : 데이터베이스에 액세스 할 수있는 경우 DATETIME 필드 유형을 추가해야합니다. – omninonsense

+0

데이터베이스를 사용할 수 없습니다. 컨텐츠 기고자 중 약 3/4은 정교한 기술자는 아니지만 Dreamweaver를 열고 입력 할 수 있습니다. 일단 우리가 WYSIWIG에없는 적절한 이름의 파일을 포함하는 수준에 이르면, 그것들은 너무 어려울 것입니다. 내용을 삭제하라는 전자 메일 알림을 보내는 것이 더 나을 것입니다. 그러나 코드 뷰로 이동하고 클래스를 추가하는 아이디어로 머리를 감쌀 수 있다고 생각합니다. – ErikJ

+0

아, 보통 건물을 더 간단하게 만듭니다. 내 고객을위한 CMS가 무엇인가를하기를 기대합니다. 날 믿어, 너 실망 할거야. (그러나 당신은 뭔가를 사용할 수 있습니다 ... (편집 대답) – omninonsense

0

당신을위한 코드입니다

<?php 

$content = <<<EOF 
<div> 
some text 1 
<div class="story disappears-20110101"> 20110101 </div> 
<div class="story disappears-20110601"> 20110601 </div> 
some text 2 
</div> 
EOF; 

$doc = new DOMDocument(); 
$doc->loadHTML($content); 
$xpath = new DOMXPath($doc); 
$expired = $xpath->query('//*[contains(@class, \'disappears-\')]'); 
$remove = array(); 
foreach ($expired as $n) 
    if (preg_match('~disappears-(\d{4})(\d{2})(\d{2})~', $n->getAttribute('class'), $m)) 
     if (time() > mktime(0, 0, 0, $m[2], $m[3], $m[1])) 
      $remove[] = $n; 
foreach ($remove as $n) 
    $n->parentNode->removeChild($n); 

echo $doc->saveHTML(); 

이 좋은 하루 되세요.

+0

고마워, 나는 그것을 돌려 줄 것이다! – ErikJ

+0

나는 [phpquery] (http://code.google.com/p/)를 사용하고 싶다. phpquery /) jquery 셀렉터에 익숙해 져서 이런 종류의 물건을 얻었습니다. 그러면 뭔가 할 수 있습니다. 'foreach (pq ("div [class^= disappears]") $ div) {do something}' – dwarfy

+0

좋아, 아이디어를 주셔서 감사합니다. 나는 탐구 할 것이다. – ErikJ

0

나는 데이터베이스가 있어야한다는 것을 의미합니다. 페이지가 손으로 코딩 된 경우에도 각 페이지를 서버에 업로드하고 백엔드에 업로드 된 페이지와 관련된 데이터베이스 항목을 생성하게 할 수 있습니다. 이 데이터베이스 항목은 만료 날짜와 같은 업로드 된 페이지에 대한 정보를 저장할 수 있습니다. 이렇게하면 페이지를 쉽게 구성하고 게재 할 수 있습니다.

+0

하하하! 그러나 PHP가 포함 된 Dreamweaver에는 비 기술자가 접할 필요가없는 부분이 포함되어 있습니다. 이봐 요, 우리는 PHP에 대한 OK를 얻었습니다. – ErikJ

0

이 XPath는 1.0 원하는 요소를 선택합니다

//*[ 
    20110601 
>= 
    substring-before(
     substring-after(
     concat(
      ' ', 
      normalize-space(@class), 
      ' ' 
     ), 
     ' disappears-' 
    ), 
     ' ' 
    ) 
] 
+0

코드를 제공해 주셔서 감사합니다. 나는 그것을 배우는 모자를 착용하고 내일 함께 놀 것이다. 나는 매우 고맙다. – ErikJ

+0

@ErikJ : 안녕하십니까. –

관련 문제