From 635f510d5f4adba0ee71c938376c064dfe8d9f91 Mon Sep 17 00:00:00 2001 From: inureyes Date: Thu, 1 Apr 2010 16:02:44 +0000 Subject: [PATCH] =?UTF-8?q?=20refs=20#514=20=20=20*=20trunk=EC=99=80=201.8?= =?UTF-8?q?=20=ED=8A=B8=EB=A6=AC=20=EB=8F=99=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- documents/changelog_ko.txt | 32 +++++++-- documents/manual_requirements.txt | 2 +- framework/boot/10-CoreClasses.php | 4 +- framework/id/textcube/config.default.php | 3 +- .../Textcube.Control.Session.Memcached.php | 21 ++++-- framework/legacy/Textcube.Control.Session.php | 6 +- framework/legacy/Textcube.Data.Category.php | 13 ++-- .../Locale.php => locales/Locales.php} | 6 +- framework/{locale => locales}/Po2php.php | 0 framework/utils/Browser.php | 30 ++++++-- interface/common/owner/header.php | 6 -- interface/control/server/index.php | 2 +- interface/i/category/index.php | 2 +- interface/i/search/index.php | 2 +- interface/i/tag/index.php | 2 +- interface/owner/entry/index.php | 56 +-------------- interface/owner/plugin/adminMenu/index.php | 2 +- interface/owner/plugin/index.php | 30 ++++---- interface/owner/setting/blog/index.php | 4 +- library/blog.skin.php | 16 ++--- library/model/blog.trash.php | 6 +- library/model/common.plugin.php | 10 +-- library/preprocessor.php | 2 +- library/view/view.php | 15 +++- plugins/ED_xquared/index.php | 4 +- plugins/FM_Markdown/index.php | 4 +- plugins/FM_Markdown/ttml.php | 24 +++---- plugins/FM_Modern/editor.js | 19 ++--- plugins/FM_TTML/index.php | 4 +- plugins/FM_TTML/ttml.php | 22 +++--- plugins/FM_Textile/index.php | 4 +- plugins/FM_Textile/ttml.php | 22 +++--- plugins/ST_TeamBlogSettings/index.php | 7 +- setup.php | 17 ++--- skin/admin/canon/basic.css | 44 +++++++++--- skin/admin/canon/communication.css | 6 ++ skin/admin/canon/editor.css | 23 +++--- skin/admin/canon/network.css | 18 ++++- skin/admin/canon/plugin.css | 22 +++--- skin/admin/canon/post.css | 5 ++ skin/admin/canon/reader.css | 70 ++++++++++++++----- skin/admin/canon/skin.css | 16 ++--- skin/admin/mobile/basic.css | 4 +- skin/admin/mobile/editor.css | 4 +- skin/admin/mobile/post.css | 23 ++++-- skin/admin/whitedream/reader.css | 10 +-- 46 files changed, 374 insertions(+), 270 deletions(-) rename framework/{locale/Locale.php => locales/Locales.php} (97%) rename framework/{locale => locales}/Po2php.php (100%) diff --git a/documents/changelog_ko.txt b/documents/changelog_ko.txt index 744d4993d..aef741a25 100644 --- a/documents/changelog_ko.txt +++ b/documents/changelog_ko.txt @@ -6,20 +6,44 @@ * 블로그 : 최근 공지와 최근 글의 필자 치환자 추가 및 동작 추가 (#1437) * 관리패널 : 모바일용 관리 모드 추가 (베타) (#1418) * 일반 : 다양한 배포본 개발을 돕는 camouflage 기능 추가 (알파) (#1431) - + * 일반 : DBModel에서 이스케이핑을 자동으로 판별하도록 함 (#1384) + === 변경된 점 === * 일반 : 스태틱 리소스의 더 많은 부분을 serviceURL에서 불러오도록 함 (대용량 서비스 구축시 리소스 서버 분리시 적용) (#1441) - + * 일반 : PHP 5.3에서의 호환성 조정 + * 일반 : 모바일 폰, WI-FI 및 와이브로를 사용하는 노트북에서 세션이 유지되도록 세션 처리 루틴을 변경 (#1460) + * 일반 : OpenID 모듈을 1.8 스키마로 재작성 (#1385) + * 블로그 : RSS로 출력가능한 글 수의 한계를 30에서 50으로 증가 (#1452) + * 블로그 : 컨텐츠 포매팅시 절대 경로 사용을 기본값으로 변경 (#1407) + * 에디터 : 글 저장시 저장 버튼이 꺼지도록 UI 변경 + * 리더 : RSS로 구독중인 글 목록이 스크롤을 따라 이동하도록 함 (#1161) + * 플러그인 : 구글맵 플러그인을 1.8 스키마로 업그레이드 (#1417) + * 관리패널 : canon 스킨의 디자인 개선 (#1161) + * 모블로깅 : 이메일 또는 모블로깅에서 엔터키를 줄바꿈으로 변환하도록 변경 (#1380) + * 모블로깅 : 모블로깅 작성시간이 메일 확인 시간이 아닌, 메일이 작성된 시간을 기준으로 하도록 수정 (#1449) + === 버그 수정 === * 일반 : 공지사항 등의 내부 피드 로드가 갱신되지 않는 오류 수정 (#1440) + * 일반 : 공지사항을 관리 패널을 들어갈 때 마다 읽어서 로그인이 느려지는 문제 수정 (#1440) * 일반 : RSS/ATOM 을 읽을 때 Cron이 실행되어 특정 경우 응답이 늦어 일부 리더 및 서비스에서 피드를 읽지 못하는 문제 수정 (#1178) + * 일반 : memcached 를 사용하는 모듈들에서 제 때 플러싱이 되지 않는 오류 수정 (#1455) + * 일반 : 세션 가비지 컬렉션이 정상적으로 동작하지 않는 문제 수정 (#1419) * 블로그 : 댓글 ajax 블록 로드시에 ATOM/RSS 피드 치환자가 동작하지 않는 문제 수정 (#1435) * 블로그 : 댓글 페이지 사용시 클릭했을때 2번째 페이지가 보이지 않는 문제 수정 (#1201) * 블로그 : 댓글을 폈을 때 접히지 않는 문제 수정 (#1201) + * 블로그 : 글 작성시 카테고리 관련 쿼리에 잠재적으로 발생할 수 있는 오류 수정 (#1358) * 모바일 : 아이폰 모드에서 댓글보기 동작 오류 수정 (#1436) * 모바일 : 아이폰뷰에서 블로그 소유자의 이름이 제대로 나오지 않는 문제 수정 (#1432) + * 모바일 : 모바일 모드에서 댓글에 댓글을 달지 못하는 문제 수정 (#1459) + * 모바일 : 모바일 모드의 댓글 전체 보기에서 비공개 글의 댓글이 출력되는 문제 수정 (#1458) + * 관리패널 : Canon 스킨에서 블로그 선택 부분이 보이지 않는 문제 수정 (#1461) + * 플러그인: 통계 관련 플러그인들에서 값 및 출력이 제대로 되지 않던 문제 수정 + * 에디터 : metaWeblogAPI 사용시 글 및 카테고리 정보를 제대로 가져오지 못하는 문제 수정 (#1433) * 에디터 : html 코드의 웹표준 변환이 제대로 변환되지 않는 문제 수정 (#1438) * 에디터 : 위지윅 에디터의 STD 참조 자바스크립트 에러 문제 수정 (#1439) + * 에디터 : 에디터 초기화 함수의 호출이 잘못되던 문제 수정 (#1457) + * 에디터 : Webkit 기반의 브라우저에서 html 처리 보정 루틴 개선 (#1438) + * POD : Cubrid에서 커밋 타이밍 조절 (#1277) * TTXML : 카테고리복원, 방명록 정보, 스팸필터 정보 복원시 잘못될 수 있는 문제 수정 (#1298) * TTXML : 댓글 알리미 정보가 복원되지 않는 문제 수정 (#1298) * OpenID : Transaction 관련을 $_SESSION에서 파일로 옮겨 세션 의존으로 인하여 생기는 문제 수정 (#1385) @@ -44,9 +68,9 @@ * rctps_rep_author_link : 저자가 작성한 글 목록 페이지로 가는 링크 === 모바일 관리 패널 안내 === -텍스트큐브 1.8.3에는 모바일 관리 패널의 초기 버전이 반영되었습니다. 아직 초기 버전이기 때문에 사용을 위해서는 옵션 파일의 수정이 필요합니다. 설치된 디렉토리의 config.php 에 아래의 한 줄을 추가하시면 됩니다. +텍스트큐브 1.8.3에는 모바일 관리 패널의 초기 버전이 반영되었습니다. 강제 사용을 끄기 위해서는 설치된 디렉토리의 config.php 에 아래의 한 줄을 추가하시면 됩니다. -$service['usemobileadmin'] = true; +$service['usemobileadmin'] = false; 이후 정식 기능이 될 경우에는 서버 메뉴의 환경 설정 패널에서 조정할 수 있게 될 예정입니다. diff --git a/documents/manual_requirements.txt b/documents/manual_requirements.txt index b312d589a..c9fdf335c 100644 --- a/documents/manual_requirements.txt +++ b/documents/manual_requirements.txt @@ -18,7 +18,7 @@ Textcube 1.8 Requirements * with mode_rewrite module * PHP 5.2 or above * with iconv / gd module - * MySQL 5.0 or above + * MySQL 5.0 / MariaDB 5.1 or above * with UTF-8 character set and collation settings For massive service or heavy load : diff --git a/framework/boot/10-CoreClasses.php b/framework/boot/10-CoreClasses.php index c89132eb5..3bd364454 100644 --- a/framework/boot/10-CoreClasses.php +++ b/framework/boot/10-CoreClasses.php @@ -711,7 +711,7 @@ function getValueByLocale($param) } else { $lang = ""; } - $locale = Locale::getInstance(); + $locale = Locales::getInstance(); switch ($locale->match($lang)) { case 3: $matched = $param[$i]; @@ -929,7 +929,7 @@ function & selectNode($path, $lang = null) { } else { $lang = ""; } - $locale = Locale::getInstance(); + $locale = Locales::getInstance(); switch ($locale->match($lang)) { case 3: diff --git a/framework/id/textcube/config.default.php b/framework/id/textcube/config.default.php index b1851d6ee..5d07f51ab 100644 --- a/framework/id/textcube/config.default.php +++ b/framework/id/textcube/config.default.php @@ -8,7 +8,7 @@ define('TEXTCUBE_VERSION', '1.9 : Alpha 1'); define('TEXTCUBE_COPYRIGHT', 'Copyright © 2004-2010. Needlworks / Tatter Network Foundation. All rights reserved. Licensed under the GPL.'); define('TEXTCUBE_HOMEPAGE', 'http://www.textcube.org/'); -define('TEXTCUBE_RESOURCE_URL', 'http://resources.textcube.org/1.8.2'); +define('TEXTCUBE_RESOURCE_URL', 'http://resources.textcube.org/1.8.3'); define('CRLF', "\r\n"); define('TAB', " "); define('INT_MAX',2147483647); @@ -58,5 +58,6 @@ $service['debug_session_dump'] = false; $service['debug_rewrite_module'] = false; $service['useNumericURLonRSS'] = false; +$service['forceinstall'] = false; //$service['adminskin'] = 'whitedream'; ?> diff --git a/framework/legacy/Textcube.Control.Session.Memcached.php b/framework/legacy/Textcube.Control.Session.Memcached.php index c84c2f015..79ff0c297 100644 --- a/framework/legacy/Textcube.Control.Session.Memcached.php +++ b/framework/legacy/Textcube.Control.Session.Memcached.php @@ -38,16 +38,19 @@ public static function getName() { public static function read($id) { if(is_null(self::$mc)) self::initialize(); - return self::$mc->get(self::$context->getProperty('service.domain')."/sessions/{$id}/{$_SERVER['REMOTE_ADDR']}"); + //return self::$mc->get(self::$context->getProperty('service.domain')."/sessions/{$id}/{$_SERVER['REMOTE_ADDR']}"); + return self::$mc->get(self::$context->getProperty('service.domain')."/sessions/{$id}"); } public static function write($id, $data) { if(is_null(self::$mc)) self::initialize(); - return self::$mc->set(self::$context->getProperty('service.domain')."/sessions/{$id}/{$_SERVER['REMOTE_ADDR']}",$data,0,self::$context->getProperty('service.timeout')); + //return self::$mc->set(self::$context->getProperty('service.domain')."/sessions/{$id}/{$_SERVER['REMOTE_ADDR']}",$data,0,self::$context->getProperty('service.timeout')); + return self::$mc->set(self::$context->getProperty('service.domain')."/sessions/{$id}",$data,0,self::$context->getProperty('service.timeout')); } public static function destroy($id, $setCookie = false) { - self::$mc->delete(self::$context->getProperty('service.domain')."/sessions/{$id}/{$_SERVER['REMOTE_ADDR']}"); + //self::$mc->delete(self::$context->getProperty('service.domain')."/sessions/{$id}/{$_SERVER['REMOTE_ADDR']}"); + self::$mc->delete(self::$context->getProperty('service.domain')."/sessions/{$id}"); self::$mc->delete(self::$context->getProperty('service.domain')."/anonymousSession/{$_SERVER['REMOTE_ADDR']}"); return self::$mc->delete(self::$context->getProperty('service.domain')."/authorizedSession/{$id}/{$_SERVER['REMOTE_ADDR']}"); } @@ -94,14 +97,16 @@ public static function setSessionAnonymous($currentId) { public static function isAuthorized($id) { if(is_null(self::$mc)) self::initialize(); /* OpenID and Admin sessions are treated as authorized ones*/ - $userid = self::$mc->get(self::$context->getProperty('service.domain')."/authorizedSession/{$id}/{$_SERVER['REMOTE_ADDR']}"); + //$userid = self::$mc->get(self::$context->getProperty('service.domain')."/authorizedSession/{$id}/{$_SERVER['REMOTE_ADDR']}"); + $userid = self::$mc->get(self::$context->getProperty('service.domain')."/authorizedSession/{$id}"); if(!empty($userid)) return true; else return false; } public static function isGuestOpenIDSession($id) { if(is_null(self::$mc)) self::initialize(); - $userid = self::$mc->get(self::$context->getProperty('service.domain')."/authorizedSession/{$id}/{$_SERVER['REMOTE_ADDR']}"); + //$userid = self::$mc->get(self::$context->getProperty('service.domain')."/authorizedSession/{$id}/{$_SERVER['REMOTE_ADDR']}"); + $userid = self::$mc->get(self::$context->getProperty('service.domain')."/authorizedSession/{$id}"); if(!empty($userid) && $userid < 0) return true; else return false; } @@ -132,7 +137,8 @@ public static function authorize($blogid, $userid) { $_SESSION['userid'] = $userid; $id = session_id(); if( self::isGuestOpenIDSession($id) ) { - $result = self::$mc->set(self::$context->getProperty('service.domain')."/authorizedSession/{$id}/{$_SERVER['REMOTE_ADDR']}",$userid,0,self::$context->getProperty('service.timeout')); + //$result = self::$mc->set(self::$context->getProperty('service.domain')."/authorizedSession/{$id}/{$_SERVER['REMOTE_ADDR']}",$userid,0,self::$context->getProperty('service.timeout')); + $result = self::$mc->set(self::$context->getProperty('service.domain')."/authorizedSession/{$id}",$userid,0,self::$context->getProperty('service.timeout')); if ($result) { return true; } @@ -141,7 +147,8 @@ public static function authorize($blogid, $userid) { if (self::isAuthorized(session_id())) return true; for ($i = 0; $i < 3; $i++) { $id = dechex(rand(0x10000000, 0x7FFFFFFF)) . dechex(rand(0x10000000, 0x7FFFFFFF)) . dechex(rand(0x10000000, 0x7FFFFFFF)) . dechex(rand(0x10000000, 0x7FFFFFFF)); - $result = self::$mc->set(self::$context->getProperty('service.domain')."/authorizedSession/{$id}/{$_SERVER['REMOTE_ADDR']}",$userid,0,self::$context->getProperty('service.timeout')); + //$result = self::$mc->set(self::$context->getProperty('service.domain')."/authorizedSession/{$id}/{$_SERVER['REMOTE_ADDR']}",$userid,0,self::$context->getProperty('service.timeout')); + $result = self::$mc->set(self::$context->getProperty('service.domain')."/authorizedSession/{$id}",$userid,0,self::$context->getProperty('service.timeout')); if ($result) { @session_id($id); diff --git a/framework/legacy/Textcube.Control.Session.php b/framework/legacy/Textcube.Control.Session.php index 81e2bd540..d84522524 100644 --- a/framework/legacy/Textcube.Control.Session.php +++ b/framework/legacy/Textcube.Control.Session.php @@ -153,9 +153,9 @@ public static function isAuthorized($id) { $result = self::query('cell',"SELECT id FROM ".self::$context->getProperty('database.prefix')."Sessions - WHERE id = '$id' - AND address = '{$_SERVER['REMOTE_ADDR']}' - AND (userid IS NOT NULL OR preexistence IS NOT NULL)"); + WHERE id = '$id' " +// AND address = '{$_SERVER['REMOTE_ADDR']}' + ."AND (userid IS NOT NULL OR preexistence IS NOT NULL)"); if ($result) return true; return false; diff --git a/framework/legacy/Textcube.Data.Category.php b/framework/legacy/Textcube.Data.Category.php index 22cd7e7f9..edf2488b8 100644 --- a/framework/legacy/Textcube.Data.Category.php +++ b/framework/legacy/Textcube.Data.Category.php @@ -7,6 +7,7 @@ class Category { function __construct() { $this->reset(); + $this->pointer = null; } function reset() { @@ -43,9 +44,10 @@ function open($filter = true, $fields = '*', $sort = 'priority') { $pool->setOrder($sort); $this->close(); $this->_result = $pool->getAll($fields); -// $this->_result = POD::query("SELECT $fields FROM {$database['prefix']}Categories WHERE blogid = ".getBlogId()." $filter $sort"); - if ($this->_result) + if ($this->_result) { $this->_count = count($this->_result); + $this->pointer = 0; + } return $this->shift(); } @@ -60,8 +62,8 @@ function close() { function shift() { $this->reset(); - if ($this->_result && ($row = POD::fetch($this->_result))) { - foreach ($row as $name => $value) { + if($this->_result && !empty($this->_result[$this->pointer])) { + foreach ($this->_result[$this->pointer] as $name => $value) { if ($name == 'blogid') continue; switch ($name) { @@ -74,6 +76,7 @@ function shift() { } $this->$name = $value; } + $this->pointer++; return true; } return false; @@ -228,4 +231,4 @@ function _error($error) { return false; } } -?> \ No newline at end of file +?> diff --git a/framework/locale/Locale.php b/framework/locales/Locales.php similarity index 97% rename from framework/locale/Locale.php rename to framework/locales/Locales.php index c8f5d0173..bccf45693 100644 --- a/framework/locale/Locale.php +++ b/framework/locales/Locales.php @@ -3,7 +3,7 @@ /// All rights reserved. Licensed under the GPL. /// See the GNU General Public License for more details. (/documents/LICENSE, /documents/COPYRIGHT) -final class Locale extends Singleton { +final class Locales extends Singleton { public static function getInstance() { return self::_getInstance(__CLASS__); } @@ -124,7 +124,7 @@ function _t_noop($t) { Direct locale call functions. */ function _t($t) { - $locale = Locale::getInstance(); + $locale = Locales::getInstance(); if(isset($locale->resource[$locale->domain]) && isset($locale->resource[$locale->domain][$t])) { return $locale->resource[$locale->domain][$t]; } else return $t; @@ -145,7 +145,7 @@ function _f($t) { // Function for skin language resource. // _t() follows the admin panel locale setting, however _text() follows the skin locale setting. function _text($t) { - $locale = Locale::getInstance(); + $locale = Locales::getInstance(); if(isset($locale->resource['blog']) && isset($locale->resource['blog'][$t])) { return $locale->resource['blog'][$t]; } else return $t; diff --git a/framework/locale/Po2php.php b/framework/locales/Po2php.php similarity index 100% rename from framework/locale/Po2php.php rename to framework/locales/Po2php.php diff --git a/framework/utils/Browser.php b/framework/utils/Browser.php index af557a0ef..3f19e7514 100644 --- a/framework/utils/Browser.php +++ b/framework/utils/Browser.php @@ -17,14 +17,20 @@ function __construct() { public function getBrowserName() { /// Blocking (is in development) $ctx = Model_Context::getInstance(); - if($ctx->getProperty('service.usemobileadmin') != true) { + if($ctx->getProperty('service.usemobileadmin',true) === false) { return 'unknown'; } if(!is_null($this->browserName)) return $this->browserName; if(isset($_SERVER['HTTP_USER_AGENT'])) { if(strpos($_SERVER['HTTP_USER_AGENT'],'iPhone') || - strpos($_SERVER['HTTP_USER_AGENT'],'iPod')) { - $this->browserName = 'mSafari'; + strpos($_SERVER['HTTP_USER_AGENT'],'iPod') || + strpos($_SERVER['HTTP_USER_AGENT'],'Mobile Safari') || + (strpos($_SERVER['HTTP_USER_AGENT'],'AppleWebkit')!== false && + (strpos($_SERVER['HTTP_USER_AGENT'],'SymbianOS')!== false || // Nokia + strpos($_SERVER['HTTP_USER_AGENT'],'Pre')!== false))){ // Palm pre + $this->browserName = 'MobileSafari'; + } else if(strpos($_SERVER['HTTP_USER_AGENT'],'Android')) { + $this->browserName = 'Android'; } else if(strpos($_SERVER['HTTP_USER_AGENT'],'Firefox') || strpos($_SERVER['HTTP_USER_AGENT'],'iceweasel') || strpos($_SERVER['HTTP_USER_AGENT'],'Minefield')) { @@ -35,10 +41,26 @@ public function getBrowserName() { $this->browserName = 'Chrome'; } else if (strpos($_SERVER['HTTP_USER_AGENT'],'Webkit')) { $this->browserName = 'Webkit'; + } else if (strpos($_SERVER['HTTP_USER_AGENT'],'IEMobile')) { + $this->browserName = 'IEMobile'; } else if (strpos($_SERVER['HTTP_USER_AGENT'],'MSIE')) { $this->browserName = 'IE'; + } else if (strpos($_SERVER['HTTP_USER_AGENT'],'Opera Mini')) { + $this->browserName = 'OperaMini'; } else if (strpos($_SERVER['HTTP_USER_AGENT'],'Opera')) { $this->browserName = 'Opera'; + } else if (strpos($_SERVER['HTTP_USER_AGENT'],'AvantGo')) { // Avantgo (palm) + $this->browserName = 'AvantGo'; + } else if (strpos($_SERVER['HTTP_USER_AGENT'],'DoCoMo')) { // DoCoMo Phones + $this->browserName = 'DoCoMo'; + } else if (strpos($_SERVER['HTTP_USER_AGENT'],'Minimo')) { // Firefox mini + $this->browserName = 'Minimo'; + } else if (strpos($_SERVER['HTTP_USER_AGENT'],'Maemo')) { // Firefox mini + $this->browserName = 'Maemo'; + } else if (strpos($_SERVER['HTTP_USER_AGENT'],'BlackBerry')!== false) { // Blackberry + $this->browserName = 'BlackBerry'; + } else if (strpos($_SERVER['HTTP_USER_AGENT'],'POLARIS')!== false) { // LGE Phone + $this->browserName = 'Polaris'; } else { $this->browserName = 'unknown'; } @@ -49,7 +71,7 @@ public function getVersion() { } public function isMobile() { - return (in_array($this->getBrowserName(),array('mSafari'))); + return (in_array($this->getBrowserName(),array('MobileSafari','Android','Maemo','OperaMini','Minimo','DoCoMo','AvantGo','BlockBerry'))); } public function isSafari() { } diff --git a/interface/common/owner/header.php b/interface/common/owner/header.php index 099ed8d0d..1dcc8220a 100755 --- a/interface/common/owner/header.php +++ b/interface/common/owner/header.php @@ -375,12 +375,6 @@ } ?> - - - diff --git a/interface/control/server/index.php b/interface/control/server/index.php index e9ba0c07d..2c9a6eded 100644 --- a/interface/control/server/index.php +++ b/interface/control/server/index.php @@ -16,7 +16,7 @@ $encodingList = array('UTF-8','EUC-KR','SHIFT_JIS','EUC-JP','BIG5','EUC-CN','EUC-TW','GBK'); // Languages -$locale = Locale::getInstance(); +$locale = Locales::getInstance(); $locale->setDirectory(ROOT.'/resources/locale/description'); $supportedLanguages = $locale->getSupportedLocales(); diff --git a/interface/i/category/index.php b/interface/i/category/index.php index be98902b8..d7bb6d11e 100644 --- a/interface/i/category/index.php +++ b/interface/i/category/index.php @@ -18,7 +18,7 @@ ?>