1/Убираем ID публикации в DLE v.17

Введение

Данный материал предназначен для сайтов на CMS Datalife Engine v.17

После применения всех инструкций у Вас будет возможность выбрать в настройках сайта новый тип адреса без ID для публикаций.

Все публикации в таком типе обязаны быть привязаны к какой-либо категории, иначе система не отличит её от статической страницы. Все публикации должны иметь уникальное значение в поле "ЧПУ URL статьи".

Добавляем новую функцию

Открываем файл /engine/modules/functions.php

В конце файла перед (~4062 строка):

?>

Добавляем выше:

function generate_link_fullstory($data_news, $is_local = false) {
	global $config;

	if ($config['allow_alt_url']) {
		if ($config['seo_type'] > 0) {
			$alt_name = $data_news['alt_name'];
			if ($config['seo_type'] == 3) {
				$alt_name = $data_news['id'] . "-" . $alt_name;
			}

			if ($data_news['category'] and $config['seo_type'] > 1) {
				if($cats_url = get_url( $data_news['category'] )) {
					$full_link = $cats_url . "/" . $alt_name . ".html";
				} else {
					$full_link = $alt_name . ".html";
				}
			} else {
				$full_link = $alt_name . ".html";
			}
		} else {
			$full_link = date('Y/m/d/', $data_news['date']) . $data_news['alt_name'] . ".html";
		}
	} else {
		$full_link = "index.php?newsid=" . $data_news['id'];
	}
	if ($is_local)
		return $full_link;
	return $config['http_home_url'] . $full_link;
}

Открываем файл /engine/inc/include/functions.inc.php

В конце файла перед (~2322 строка):

?>

Добавляем выше:

function generate_link_fullstory($data_news, $is_local = false) {
	global $config;

	if ($config['allow_alt_url']) {
		if ($config['seo_type'] > 0) {
			$alt_name = $data_news['alt_name'];
			if ($config['seo_type'] != 3) {
				$alt_name = $data_news['id'] . "-" . $alt_name;
			}

			if ($data_news['category'] and $config['seo_type'] > 1) {
				if($cats_url = get_url( $data_news['category'] )) {
					$full_link = $cats_url . "/" . $alt_name . ".html";
				} else {
					$full_link = $alt_name . ".html";
				}
			} else {
				$full_link = $alt_name . ".html";
			}
		} else {
			$full_link = date('Y/m/d/', $data_news['date']) . $data_news['alt_name'] . ".html";
		}
	} else {
		$full_link = "index.php?newsid=" . $data_news['id'];
	}
	if ($is_local)
		return $full_link;
	return $config['http_home_url'] . $full_link;
}

Мы внедрили функцию, позволяющую генерировать ссылку на полный текст новости как для пользовательского интерфейса, так и для административной панели. Теперь нет необходимости добавлять условия в каждом месте, где требуется эта ссылка. Достаточно просто вызвать функцию.

Изменяем "точки входа"

Открываем файл /engine/download.php

Ищем (~78 строка):

				if ($config['allow_alt_url']) {

					if ($config['seo_type'] == 1 or $config['seo_type'] == 2) {

						if ($row_news['category'] and $config['seo_type'] == 2) {

							$full_link = $config['http_home_url'] . get_url($row_news['category']) . "/" . $row_news['id'] . "-" . $row_news['alt_name'] . ".html";
						} else {

							$full_link = $config['http_home_url'] . $row_news['id'] . "-" . $row_news['alt_name'] . ".html";
						}
					} else {

						$full_link = $config['http_home_url'] . date('Y/m/d/', $row_news['date']) . $row_news['alt_name'] . ".html";
					}
				} else {

					$full_link = $config['http_home_url'] . "index.php?newsid=" . $row_news['id'];
				}

Заменяем на:

$full_link = generate_link_fullstory($row_news);

Открываем файл /engine/ajax/adminfunction.php

Ищем (~851 строка):

		if( $config['allow_alt_url'] ) {

			if( $config['seo_type'] == 1 OR $config['seo_type'] == 2 ) {

				if( $row['category'] and $config['seo_type'] == 2 ) {

					$full_link = $config['http_home_url'] . get_url( $row['category'] ) . "/" . $row['id'] . "-" . $row['alt_name'] . ".html";

				} else {

					$full_link = $config['http_home_url'] . $row['id'] . "-" . $row['alt_name'] . ".html";

				}

			} else {

				$full_link = $config['http_home_url'] . date( 'Y/m/d/', $row['date'] ) . $row['alt_name'] . ".html";
			}

		} else {

			$full_link = $config['http_home_url'] . "index.php?newsid=" . $row['id'];

		}

Заменяем на:

$full_link = generate_link_fullstory($row);

Открываем файл /engine/ajax/comments.php

Ищем (~48 строка):

	if( $config['seo_type'] == 1 OR $config['seo_type'] == 2 ) {

		if( $category_id AND $config['seo_type'] == 2 ) {

            $c_url = get_url( $category_id );
            $full_link = $config['http_home_url'] . $c_url . "/" . $row['id'] . "-" . $row['alt_name'] . ".html";
			$row['alt_name'] = $row['id'] . "-" . $row['alt_name'];
			$link_page = $config['http_home_url'] . $c_url . "/" . 'page,1,';
			$news_name = $row['alt_name'];

		} else {

			$full_link = $config['http_home_url'] . $row['id'] . "-" . $row['alt_name'] . ".html";
			$row['alt_name'] = $row['id'] . "-" . $row['alt_name'];
			$link_page = $config['http_home_url'] . 'page,1,';
			$news_name = $row['alt_name'];
		}

	} else {

		$link_page = $config['http_home_url'] . date( 'Y/m/d/', $row['date'] ) . 'page,1,';
		$news_name = $row['alt_name'];
		$full_link = $config['http_home_url'] . date( 'Y/m/d/', $row['date'] ) . $row['alt_name'] . ".html";
	}

Заменяем на:

	if( $config['seo_type'] > 0 ) {

		$alt_name = $row['alt_name'];
		if ($config['seo_type'] != 3) {
			$alt_name = $row['id'] . "-" . $alt_name;
		}

		if( $category_id AND $config['seo_type'] > 1 ) {

			if($c_url = get_url( $category_id )) {
				$full_link = $config['http_home_url'] . $c_url . "/" . $alt_name . ".html";
				$link_page = $config['http_home_url'] . $c_url . "/" . 'page,1,';
			} else {
				$full_link = $config['http_home_url'] . $alt_name . ".html";
				$link_page = $config['http_home_url'] . 'page,1,';
			}

		} else {

			$full_link = $config['http_home_url'] . $alt_name . ".html";
			$link_page = $config['http_home_url'] . 'page,1,';
		}
		$news_name = $alt_name;

	} else {

		$link_page = $config['http_home_url'] . date( 'Y/m/d/', $row['date'] ) . 'page,1,';
		$news_name = $row['alt_name'];
		$full_link = $config['http_home_url'] . date( 'Y/m/d/', $row['date'] ) . $row['alt_name'] . ".html";
	}

Открываем файл /engine/ajax/editcomments.php

Ищем (~1005 строка):

		if( $config['allow_alt_url'] ) {

			if( $config['seo_type'] == 1 OR $config['seo_type'] == 2 ) {

				if( $row['category'] and $config['seo_type'] == 2 ) {

					$full_link = $config['http_home_url'] . get_url( $row['category'] ) . "/" . $row['id'] . "-" . $row['alt_name'] . ".html";

				} else {

					$full_link = $config['http_home_url'] . $row['id'] . "-" . $row['alt_name'] . ".html";

				}

			} else {

				$full_link = $config['http_home_url'] . date( 'Y/m/d/', $row['date'] ) . $row['alt_name'] . ".html";
			}

		} else {

			$full_link = $config['http_home_url'] . "index.php?newsid=" . $row['id'];

		}

Заменяем на:

$full_link = generate_link_fullstory($row);

Открываем файл /engine/ajax/editnews.php

Ищем (~1813 строка):

	if( $config['allow_alt_url'] ) {
		if( $config['seo_type'] == 1 OR $config['seo_type'] == 2 ) {
			if( intval( $row['category'] ) and $config['seo_type'] == 2 ) {
				$full_link = $config['http_home_url'] . get_url( intval( $row['category'] ) ) . "/" . $row['id'] . "-" . $row['alt_name'] . ".html";
			} else {
				$full_link = $config['http_home_url'] . $row['id'] . "-" . $row['alt_name'] . ".html";
			}
		} else {
			$full_link = $config['http_home_url'] . date( 'Y/m/d/', strtotime( $row['date'] ) ) . $row['alt_name'] . ".html";
		}
	} else {
		$full_link = $config['http_home_url'] . "index.php?newsid=" . $row['id'];
	}

Заменяем на:

$full_link = generate_link_fullstory($row);

Открываем файл /engine/ajax/find_relates.php

Ищем (~131 строка):

	if( $config['allow_alt_url'] ) {

		if( $config['seo_type'] == 1 OR  $config['seo_type'] == 2 ) {

			if( $related['category'] and $config['seo_type'] == 2 ) {

				$full_link = $config['http_home_url'] . get_url( $related['category'] ) . "/" . $related['id'] . "-" . $related['alt_name'] . ".html";

			} else {

				$full_link = $config['http_home_url'] . $related['id'] . "-" . $related['alt_name'] . ".html";

			}

		} else {

			$full_link = $config['http_home_url'] . date( 'Y/m/d/', $related['date'] ) . $related['alt_name'] . ".html";
		}

	} else {

		$full_link = $config['http_home_url'] . "index.php?newsid=" . $related['id'];

	}

Заменяем на:

$full_link = generate_link_fullstory($related);

Открываем файл /engine/classes/comments.class.php

Ищем (~301 строка):

			if( $config['allow_alt_url'] ) {

				if( $config['seo_type'] == 1 OR $config['seo_type'] == 2 ) {

					if( $row['category'] and $config['seo_type'] == 2 ) {

						$full_link = $config['http_home_url'] . get_url( $row['category'] ) . "/" . $row['post_id'] . "-" . $row['alt_name'] . ".html";

					} else {

						$full_link = $config['http_home_url'] . $row['post_id'] . "-" . $row['alt_name'] . ".html";

					}

				} else {

					$full_link = $config['http_home_url'] . date( 'Y/m/d/', strtotime ($row['newsdate']) ) . $row['alt_name'] . ".html";
				}

			} else {

				$full_link = $config['http_home_url'] . "index.php?newsid=" . $row['post_id'];

			}

Заменяем на:

			$full_link = generate_link_fullstory([
				'id'		=> $row['post_id'],
				'date'		=> $row['newsdate'],
				'alt_name'	=> $row['alt_name'],
				'category'	=> $row['category'],
			]);

Открываем файл /engine/classes/google.class.php

Ищем (~407 строка):

				if( $this->allow_url ) {

					if( $config['seo_type'] == 1 OR  $config['seo_type'] == 2 ) {

						if( $row['category'] and $config['seo_type'] == 2 ) {

							$cats_url = get_url( $row['category'] );

							if($cats_url) {

								$loc = $cats_url . "/" . $row['id'] . "-" . $row['alt_name'] . ".html";

							} else $loc = $row['id'] . "-" . $row['alt_name'] . ".html";

						} else {

							$loc = $row['id'] . "-" . $row['alt_name'] . ".html";

						}

					} else {

						$loc = date( 'Y/m/d/', $row['date'] ) . $row['alt_name'] . ".html";
					}

				} else {

					$loc = "index.php?newsid=" . $row['id'];

				}

Заменяем на:

$loc = generate_link_fullstory($row, true);

Открываем файл /engine/inc/addnews.php

Ищем (~1235 строка):

	if( $config['allow_alt_url'] ) {
		if( $config['seo_type'] == 1 OR $config['seo_type'] == 2 ) {
			if( intval( $row['category'] ) and $config['seo_type'] == 2 ) {
				$full_link = $config['http_home_url'] . get_url( intval( $row['category'] ) ) . "/" . $row['id'] . "-" . $row['alt_name'] . ".html";
			} else {
				$full_link = $config['http_home_url'] . $row['id'] . "-" . $row['alt_name'] . ".html";
			}
		} else {
			$full_link = $config['http_home_url'] . date( 'Y/m/d/', strtotime( $row['date'] ) ) . $row['alt_name'] . ".html";
		}
	} else {
		$full_link = $config['http_home_url'] . "index.php?newsid=" . $row['id'];
	}

Заменяем на:

$full_link = generate_link_fullstory($row);

Открываем файл /engine/inc/cmoderation.php

Ищем (~68 строка):

			if( $config['allow_alt_url'] ) {

				if( $config['seo_type'] == 1 OR $config['seo_type'] == 2 ) {

					if( $row['category'] and $config['seo_type'] == 2 ) {

						$full_link = $config['http_home_url'] . get_url( $row['category'] ) . "/" . $row['id'] . "-" . $row['alt_name'] . ".html";

					} else {

						$full_link = $config['http_home_url'] . $row['id'] . "-" . $row['alt_name'] . ".html";

					}

				} else {

					$full_link = $config['http_home_url'] . date( 'Y/m/d/', $row['date'] ) . $row['alt_name'] . ".html";
				}

			} else {

				$full_link = $config['http_home_url'] . "index.php?newsid=" . $row['id'];

			}

Заменяем на:

$full_link = generate_link_fullstory($row);

Ищем (~269 строка):

	if( $config['allow_alt_url'] ) {

		if( $config['seo_type'] == 1 OR $config['seo_type'] == 2 ) {

			if( intval( $row['category'] ) and $config['seo_type'] == 2 ) {

				$full_link = $config['http_home_url'] . get_url( intval( $row['category'] ) ) . "/" . $row['post_id'] . "-" . $row['alt_name'] . ".html";

			} else {

				$full_link = $config['http_home_url'] . $row['post_id'] . "-" . $row['alt_name'] . ".html";

			}

		} else {

			$full_link = $config['http_home_url'] . date( 'Y/m/d/', $row['newsdate'] ) . $row['alt_name'] . ".html";
		}

	} else {

		$full_link = $config['http_home_url'] . "index.php?newsid=" . $row['post_id'];

	}

Заменяем на:

	$full_link = generate_link_fullstory([
		'id'		=> $row['post_id'],
		'date'		=> $row['newsdate'],
		'alt_name'	=> $row['alt_name'],
		'category'	=> $row['category'],
	]);

Открываем файл /engine/inc/comments.php

Ищем (~161 строка):

		if( $config['allow_alt_url'] ) {

			if( $config['seo_type'] == 1 OR $config['seo_type'] == 2 ) {

				if( intval( $row['category'] ) and $config['seo_type'] == 2 ) {

					$full_link = $config['http_home_url'] . get_url( intval( $row['category'] ) ) . "/" . $row['post_id'] . "-" . $row['alt_name'] . ".html";

				} else {

					$full_link = $config['http_home_url'] . $row['post_id'] . "-" . $row['alt_name'] . ".html";

				}

			} else {

				$full_link = $config['http_home_url'] . date( 'Y/m/d/', $row['newsdate'] ) . $row['alt_name'] . ".html";
			}

		} else {

			$full_link = $config['http_home_url'] . "index.php?newsid=" . $row['post_id'];

		}

Заменяем на:

		$full_link = generate_link_fullstory([
			'id'		=> $row['post_id'],
			'date'		=> $row['newsdate'],
			'alt_name'	=> $row['alt_name'],
			'category'	=> $row['category'],
		]);

Открываем файл /engine/inc/complaint.php

Ищем (~268 строка):

	if( $config['allow_alt_url'] ) {

		if( $config['seo_type'] == 1 OR $config['seo_type'] == 2 ) {

			if( $row['category'] and $config['seo_type'] == 2 ) {

				$full_link = $config['http_home_url'] . get_url( $row['category'] ) . "/" . $row['post_id'] . "-" . $row['alt_name'] . ".html";

			} else {

				$full_link = $config['http_home_url'] . $row['post_id'] . "-" . $row['alt_name'] . ".html";

			}

		} else {

			$full_link = $config['http_home_url'] . date( 'Y/m/d/', strtotime ($row['newsdate']) ) . $row['alt_name'] . ".html";
		}

	} else {

		$full_link = $config['http_home_url'] . "index.php?newsid=" . $row['post_id'];

	}

Заменяем на:

	$full_link = generate_link_fullstory([
		'id'		=> $row['post_id'],
		'date'		=> $row['newsdate'],
		'alt_name'	=> $row['alt_name'],
		'category'	=> $row['category'],
	]);

Ищем (~427 строка):

	if( $config['allow_alt_url'] ) {

		if( $config['seo_type'] == 1 OR $config['seo_type'] == 2 ) {

			if( $row['category'] and $config['seo_type'] == 2 ) {

				$full_link = $config['http_home_url'] . get_url( $row['category'] ) . "/" . $row['post_id'] . "-" . $row['alt_name'] . ".html";

			} else {

				$full_link = $config['http_home_url'] . $row['post_id'] . "-" . $row['alt_name'] . ".html";

			}

		} else {

			$full_link = $config['http_home_url'] . date( 'Y/m/d/', strtotime ($row['newsdate']) ) . $row['alt_name'] . ".html";
		}

	} else {

		$full_link = $config['http_home_url'] . "index.php?newsid=" . $row['post_id'];

	}

Заменяем на:

	$full_link = generate_link_fullstory([
		'id'		=> $row['post_id'],
		'date'		=> $row['newsdate'],
		'alt_name'	=> $row['alt_name'],
		'category'	=> $row['category'],
	]);

Открываем файл /engine/inc/editnews.php

Ищем (~318 строка):

		if( $config['allow_alt_url'] ) {

			if( $config['seo_type'] == 1 OR $config['seo_type'] == 2 ) {

				if( $row['category'] and $config['seo_type'] == 2 ) {

					$cats_url = get_url( $row['category'] );

					if($cats_url) {

						$full_link = $config['http_home_url'] . $cats_url . "/" . $row['id'] . "-" . $row['alt_name'] . ".html";

					} else $full_link = $config['http_home_url'] . $row['id'] . "-" . $row['alt_name'] . ".html";

				} else {

					$full_link = $config['http_home_url'] . $row['id'] . "-" . $row['alt_name'] . ".html";

				}

			} else {

				$full_link = $config['http_home_url'] . date( 'Y/m/d/', strtotime( $row['date'] ) ) . $row['alt_name'] . ".html";
			}

		} else {

			$full_link = $config['http_home_url'] . "index.php?newsid=" . $row['id'];

		}

Заменяем на:

$full_link = generate_link_fullstory($row);

Ищем (~2567 строка):

		if( $config['allow_alt_url'] ) {
			if( $config['seo_type'] == 1 OR $config['seo_type'] == 2 ) {

				if( $row['category'] and $config['seo_type'] == 2 ) {

					$cats_url = get_url( $row['category'] );

					if($cats_url) {

						$full_link = $config['http_home_url'] . $cats_url . "/" . $row['id'] . "-" . $row['alt_name'] . ".html";

					} else $full_link = $config['http_home_url'] . $row['id'] . "-" . $row['alt_name'] . ".html";

				} else {

					$full_link = $config['http_home_url'] . $row['id'] . "-" . $row['alt_name'] . ".html";

				}

			} else {
				$full_link = $config['http_home_url'] . date( 'Y/m/d/', strtotime( $row['date'] ) ) . $row['alt_name'] . ".html";
			}
		} else {
			$full_link = $config['http_home_url'] . "index.php?newsid=" . $row['id'];
		}

Заменяем на:

$full_link = generate_link_fullstory($row);

Открываем файл /engine/modules/addcomments.php

Ищем (~500 строка):

			if( $config['allow_alt_url'] ) {

				if( $config['seo_type'] == 1 OR $config['seo_type'] == 2 ) {

					if( $row['category'] and $config['seo_type'] == 2 ) {

						$full_link = $config['http_home_url'] . get_url( $row['category'] ) . "/" . $row['id'] . "-" . $row['alt_name'] . ".html";

					} else {

						$full_link = $config['http_home_url'] . $row['id'] . "-" . $row['alt_name'] . ".html";

					}

				} else {

					$full_link = $config['http_home_url'] . date( 'Y/m/d/', $row['date'] ) . $row['alt_name'] . ".html";
				}

			} else {

				$full_link = $config['http_home_url'] . "index.php?newsid=" . $row['id'];

			}

Заменяем на:

$full_link = generate_link_fullstory($row);

Открываем файл /engine/modules/addnews.php

Ищем (~626 строка):

					if ($config['allow_alt_url']) {
						if ($config['seo_type'] == 1 or $config['seo_type'] == 2) {
							if (intval($row['category']) and $config['seo_type'] == 2) {
								$full_link = $config['http_home_url'] . get_url(intval($row['category'])) . "/" . $row['id'] . "-" . $row['alt_name'] . ".html";
							} else {
								$full_link = $config['http_home_url'] . $row['id'] . "-" . $row['alt_name'] . ".html";
							}
						} else {
							$full_link = $config['http_home_url'] . date('Y/m/d/', strtotime($row['date'])) . $row['alt_name'] . ".html";
						}
					} else {
						$full_link = $config['http_home_url'] . "index.php?newsid=" . $row['id'];
					}

Заменяем на:

$full_link = generate_link_fullstory($row);

Открываем файл /engine/modules/show.custom.php

Ищем (~209 строка):

	if( $config['allow_alt_url'] ) {

		if( $config['seo_type'] == 1 OR $config['seo_type'] == 2  ) {

			if( $row['category'] and $config['seo_type'] == 2 ) {

				$cats_url = get_url( $row['category'] );

				if($cats_url) {

					$full_link = $config['http_home_url'] . $cats_url . "/" . $row['id'] . "-" . $row['alt_name'] . ".html";

				} else $full_link = $config['http_home_url'] . $row['id'] . "-" . $row['alt_name'] . ".html";

			} else {

				$full_link = $config['http_home_url'] . $row['id'] . "-" . $row['alt_name'] . ".html";

			}

		} else {

			$full_link = $config['http_home_url'] . date( 'Y/m/d/', $row['date'] ) . $row['alt_name'] . ".html";
		}

	} else {

		$full_link = $config['http_home_url'] . "index.php?newsid=" . $row['id'];

	}

Заменяем на:

$full_link = generate_link_fullstory($row);

Открываем файл /engine/modules/show.full.php

Ищем (~224 строка):

					if( $config['allow_alt_url'] ) {
						if( $config['seo_type'] == 1 OR $config['seo_type'] == 2 ) {
							if( intval( $row_link['category'] ) and $config['seo_type'] == 2 ) {

								$cats_url = get_url( $row_link['category'] );
								if( $cats_url ) $cats_url .= "/";

								$link = $config['http_home_url'] . $cats_url . $row_link['id'] . "-" . $row_link['alt_name'] . ".html";
							} else {
								$link = $config['http_home_url'] . $row_link['id'] . "-" . $row_link['alt_name'] . ".html";
							}
						} else {
							$link = $config['http_home_url'] . date( 'Y/m/d/', strtotime( $row_link['date'] ) ) . $row_link['alt_name'] . ".html";
						}
					} else {
						$link = $config['http_home_url'] . "index.php?newsid=" . $row_link['id'];
					}

Заменяем на:

$link = generate_link_fullstory($row_link);

Ищем (~236 строка):

					if( $config['allow_alt_url'] ) {
						if( $config['seo_type'] == 1 OR $config['seo_type'] == 2 ) {
							if( intval( $row_link['category'] ) and $config['seo_type'] == 2 ) {

								$cats_url = get_url( $row_link['category'] );
								if( $cats_url ) $cats_url .= "/";

								$link = $config['http_home_url'] .$cats_url . $row_link['id'] . "-" . $row_link['alt_name'] . ".html";
							} else {
								$link = $config['http_home_url'] . $row_link['id'] . "-" . $row_link['alt_name'] . ".html";
							}
						} else {
							$link = $config['http_home_url'] . date( 'Y/m/d/', strtotime( $row_link['date'] ) ) . $row_link['alt_name'] . ".html";
						}
					} else {
						$link = $config['http_home_url'] . "index.php?newsid=" . $row_link['id'];
					}

Заменяем на:

$link = generate_link_fullstory($row_link);

Ищем (~303 строка):

			if( $config['seo_type'] == 1 OR $config['seo_type'] == 2 ) {

				if( $category_id AND $config['seo_type'] == 2 ) {

					$c_url = get_url(  $row['category'] );

					if($c_url) {
						$full_link = $config['http_home_url'] . $c_url . "/" . $row['id'] . "-" . $row['alt_name'] . ".html";
					} else {
						$full_link = $config['http_home_url'] . $row['id'] . "-" . $row['alt_name'] . ".html";
					}

					if ($config['seo_control'] AND ( isset($_GET['seourl']) OR strpos ( $_SERVER['REQUEST_URI'], "?" ) !== false ) ) {

						if ($_GET['seourl'] != $row['alt_name'] OR $_GET['seocat'] != $c_url OR strpos ( $_SERVER['REQUEST_URI'], "?" ) !== false OR (isset($_GET['news_page']) AND $_GET['news_page'] == 1 AND $cstart < 2 AND $view_template != "print") OR ($view_template == "print" AND $news_page > 1) ) {

							$re_url = explode ( "index.php", strtolower ( $_SERVER['PHP_SELF'] ) );
							$re_url = reset ( $re_url );

							header("HTTP/1.0 301 Moved Permanently");
							header("Location: {$re_url}{$c_url}/{$row['id']}-{$row['alt_name']}.html");
							die("Redirect");

						}

					}

					$print_link = $config['http_home_url'] . $c_url . "/print:page,1," . $row['id'] . "-" . $row['alt_name'] . ".html";
					$short_link = $config['http_home_url'] . $c_url . "/";
					$row['alt_name'] = $row['id'] . "-" . $row['alt_name'];
					$link_page = $config['http_home_url'] . $c_url . "/" . 'page,' . $news_page . ',';
					$news_name = $row['alt_name'];

				} else {

Заменяем на:

			if( $config['seo_type'] > 0 ) {

				$alt_name = $row['alt_name'];
				if ($config['seo_type'] != 3) {
					$alt_name = $row['id'] . "-" . $alt_name;
				}

				if( $category_id AND $config['seo_type'] > 1 ) {

					if($c_url = get_url(  $row['category'] )) {
						$full_link = $config['http_home_url'] . $c_url . "/" . $alt_name . ".html";
					} else {
						$full_link = $config['http_home_url'] . $alt_name . ".html";
					}

					if ($config['seo_control'] AND ( isset($_GET['seourl']) OR strpos ( $_SERVER['REQUEST_URI'], "?" ) !== false ) ) {

						if ($_GET['seourl'] != $row['alt_name'] OR $_GET['seocat'] != $c_url OR strpos ( $_SERVER['REQUEST_URI'], "?" ) !== false OR (isset($_GET['news_page']) AND $_GET['news_page'] == 1 AND $cstart < 2 AND $view_template != "print") OR ($view_template == "print" AND $news_page > 1) ) {

							$re_url = explode ( "index.php", strtolower ( $_SERVER['PHP_SELF'] ) );
							$re_url = reset ( $re_url );

							header("HTTP/1.0 301 Moved Permanently");
							header("Location: {$re_url}{$c_url}/{$alt_name}.html");
							die("Redirect");

						}

					}

					$print_link = $config['http_home_url'] . $c_url . "/print:page,1," . $alt_name . ".html";
					$short_link = $config['http_home_url'] . $c_url . "/";
					$link_page = $config['http_home_url'] . $c_url . "/" . 'page,' . $news_page . ',';
					$news_name = $alt_name;

				} else {

Ищем (~1265 строка):

					if( $config['allow_alt_url'] ) {

						if( $config['seo_type'] == 1 OR $config['seo_type'] == 2 ) {

							if( $related['category'] and $config['seo_type'] == 2 ) {

								$cats_url = get_url( $related['category'] );

								if( $cats_url ) $cats_url .= "/";

								$rel_full_link = $config['http_home_url'] . $cats_url . $related['id'] . "-" . $related['alt_name'] . ".html";

							} else {

								$rel_full_link = $config['http_home_url'] . $related['id'] . "-" . $related['alt_name'] . ".html";

							}

						} else {

							$rel_full_link = $config['http_home_url'] . date( 'Y/m/d/', $related['date'] ) . $related['alt_name'] . ".html";
						}

					} else {

						$rel_full_link = $config['http_home_url'] . "index.php?newsid=" . $related['id'];

					}

Заменяем на:

$rel_full_link = generate_link_fullstory($related);

Открываем файл /engine/modules/show.short.php

Ищем (~221 строка):

		if( $config['allow_alt_url'] ) {

			if( $config['seo_type'] == 1 OR $config['seo_type'] == 2  ) {

				if( $row['category'] and $config['seo_type'] == 2 ) {

					$cats_url = get_url( $row['category'] );

					if($cats_url) {

						$full_link = $config['http_home_url'] . $cats_url . "/" . $row['id'] . "-" . $row['alt_name'] . ".html";

					} else $full_link = $config['http_home_url'] . $row['id'] . "-" . $row['alt_name'] . ".html";

				} else {

					$full_link = $config['http_home_url'] . $row['id'] . "-" . $row['alt_name'] . ".html";

				}

			} else {

				$full_link = $config['http_home_url'] . date( 'Y/m/d/', $row['date'] ) . $row['alt_name'] . ".html";
			}

		} else {

			$full_link = $config['http_home_url'] . "index.php?newsid=" . $row['id'];

		}

Заменяем на:

$full_link = generate_link_fullstory($row);

Открываем файл /engine/modules/topnews.php

Ищем (~98 строка):

		if( $config['allow_alt_url'] ) {

			if( $config['seo_type'] == 1 OR $config['seo_type'] == 2 ) {

				if( $row['category'] and $config['seo_type'] == 2 ) {

					$cats_url = get_url( $row['category'] );

					if( $cats_url ) $cats_url .= "/";

					$full_link = $config['http_home_url'] . $cats_url . $row['id'] . "-" . $row['alt_name'] . ".html";

				} else {

					$full_link = $config['http_home_url'] . $row['id'] . "-" . $row['alt_name'] . ".html";

				}

			} else {

				$full_link = $config['http_home_url'] . date( 'Y/m/d/', $row['date'] ) . $row['alt_name'] . ".html";
			}

		} else {

			$full_link = $config['http_home_url'] . "index.php?newsid=" . $row['id'];

		}

Заменяем на:

$full_link = generate_link_fullstory($row);

Теперь все "точки входа" способны создавать ссылки нового типа.

Дополняем проверки отображения

Открываем файл /engine/init.php

Ищем (~165 строка):

if (isset ( $_GET['news_page'] )) $news_page = intval ( $_GET['news_page'] ); else $news_page = 0;

Добавляем ниже:

if (isset ( $_GET['seourl'] )) $seourl = $db->safesql( $_GET['seourl'] ); else $seourl = '';
if (isset ( $_GET['seocat'] )) $seocat = $db->safesql( $_GET['seocat'] ); else $seocat = '';

Ищем (~183 строка):

if (!$subaction AND $newsid) $dle_module = "showfull";

Добавляем ниже:

if (($config['seo_type'] != 3 AND !$subaction AND $newsid) OR ($config['seo_type'] == 3 AND $seourl AND $seocat)) $dle_module = "showfull";

Открываем файл /engine/engine.php

Ищем (~724 строка):

if ($year == '' AND $month == '' AND $day == '' AND !$newsid) {

Заменяем на:

if ($year == '' AND $month == '' AND $day == '' AND !$newsid AND $config['seo_type'] != 3) {

Ищем (~969 строка):

			// ################ Full News #################
			if ($subaction != '' OR $newsid) {

				if ( !$newsid ) $sql_news = "SELECT p.id, p.autor, p.date, p.short_story, p.full_story, p.xfields, p.title, p.descr, p.keywords, p.category, p.alt_name, p.comm_num, p.allow_comm, p.allow_main, p.approve, p.fixed, p.allow_br, p.symbol, p.tags, p.metatitle, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.view_edit, e.disable_index, e.related_ids, e.access, e.editdate, e.editor, e.reason, e.user_id, e.disable_search, e.need_pass, e.allow_rss, e.allow_rss_turbo, e.allow_rss_dzen {$user_select}FROM " . PREFIX . "_post p LEFT JOIN " . PREFIX . "_post_extras e ON (p.id=e.news_id) {$user_join}WHERE alt_name ='{$news_name}' AND date >= '{$year}-{$month}-{$day}' AND date < '{$year}-{$month}-{$day}' + INTERVAL 24 HOUR LIMIT 1";
				else $sql_news = "SELECT p.id, p.autor, p.date, p.short_story, p.full_story, p.xfields, p.title, p.descr, p.keywords, p.category, p.alt_name, p.comm_num, p.allow_comm, p.allow_main, p.approve, p.fixed, p.allow_br, p.symbol, p.tags, p.metatitle, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.view_edit, e.disable_index, e.related_ids, e.access, e.editdate, e.editor, e.reason, e.user_id, e.disable_search, e.need_pass, e.allow_rss, e.allow_rss_turbo, e.allow_rss_dzen {$user_select}FROM " . PREFIX . "_post p LEFT JOIN " . PREFIX . "_post_extras e ON (p.id=e.news_id) {$user_join}WHERE  p.id = '{$newsid}'";

				if ($subaction == '') $subaction = "showfull";
			}

Заменяем на:

			// ################ Full News #################
			if ($config['seo_type'] != 3 AND ($subaction != '' OR $newsid)) {

				if ( !$newsid ) $sql_news = "SELECT p.id, p.autor, p.date, p.short_story, p.full_story, p.xfields, p.title, p.descr, p.keywords, p.category, p.alt_name, p.comm_num, p.allow_comm, p.allow_main, p.approve, p.fixed, p.allow_br, p.symbol, p.tags, p.metatitle, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.view_edit, e.disable_index, e.related_ids, e.access, e.editdate, e.editor, e.reason, e.user_id, e.disable_search, e.need_pass, e.allow_rss, e.allow_rss_turbo, e.allow_rss_dzen {$user_select}FROM " . PREFIX . "_post p LEFT JOIN " . PREFIX . "_post_extras e ON (p.id=e.news_id) {$user_join}WHERE alt_name ='{$news_name}' AND date >= '{$year}-{$month}-{$day}' AND date < '{$year}-{$month}-{$day}' + INTERVAL 24 HOUR LIMIT 1";
				else $sql_news = "SELECT p.id, p.autor, p.date, p.short_story, p.full_story, p.xfields, p.title, p.descr, p.keywords, p.category, p.alt_name, p.comm_num, p.allow_comm, p.allow_main, p.approve, p.fixed, p.allow_br, p.symbol, p.tags, p.metatitle, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.view_edit, e.disable_index, e.related_ids, e.access, e.editdate, e.editor, e.reason, e.user_id, e.disable_search, e.need_pass, e.allow_rss, e.allow_rss_turbo, e.allow_rss_dzen {$user_select}FROM " . PREFIX . "_post p LEFT JOIN " . PREFIX . "_post_extras e ON (p.id=e.news_id) {$user_join}WHERE  p.id = '{$newsid}'";

				if ($subaction == '') $subaction = "showfull";
			}

			// ################ Full News without ID #################
			else if ($config['seo_type'] == 3 AND $seourl AND $category_id) {

				$sql_news = "SELECT p.id, p.autor, p.date, p.short_story, p.full_story, p.xfields, p.title, p.descr, p.keywords, p.category, p.alt_name, p.comm_num, p.allow_comm, p.allow_main, p.approve, p.fixed, p.allow_br, p.symbol, p.tags, p.metatitle, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.view_edit, e.disable_index, e.related_ids, e.access, e.editdate, e.editor, e.reason, e.user_id, e.disable_search, e.need_pass, e.allow_rss, e.allow_rss_turbo, e.allow_rss_dzen {$user_select}FROM " . PREFIX . "_post p LEFT JOIN " . PREFIX . "_post_extras e ON (p.id=e.news_id) {$user_join}WHERE  p.alt_name = '{$seourl}' AND p.category = '{$category_id}'";

				if ($subaction == '') $subaction = "showfull";
				$category = "";
			}

Эти изменения обеспечивают правильное распознавание нового типа адресов CMS.

Добавляем перенаправления

Открываем файл /.htaccess

Ищем (~16 строка):

RewriteRule ^([^.]+)/([0-9]+)-(.*).html$ index.php?newsid=$2&seourl=$3&seocat=$1 [L]

Добавляем ниже:

	RewriteRule ^([^.]+)/page,([0-9]+),([0-9]+),(.*).html$ index.php?news_page=$2&cstart=$3&seourl=$4&seocat=$1&category=$1 [L]
	RewriteRule ^([^.]+)/page,([0-9]+),(.*).html$ index.php?news_page=$2&seourl=$3&seocat=$1&category=$1 [L]
	RewriteRule ^([^.]+)/print:page,([0-9]+),(.*).html$ index.php?mod=print&news_page=$2&seourl=$3&seocat=$1&category=$1 [L]
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteRule ^([^.]+)/(.*).html$ index.php?seourl=$2&seocat=$1&category=$1 [L]

Публикация, которая раньше была доступна по адресу https://site.com/category/1-title-news.html, теперь также доступна по адресу https://site.com/category/title-news.html

Добавляем проверки сохранения публикаций

Открываем файл /engine/inc/addnews.php

Ищем (~931 строка):

	foreach ( $category_list as $selected ) {
		if( $allow_list[0] != "all" AND !in_array( $selected, $allow_list ) ) msg( "error", array('jаvascript:history.go(-1)' => $lang['addnews'], '' => $lang['addnews_error'] ), $lang['news_err_41'], "jаvascript:history.go(-1)" );
	}

Добавляем ниже:

	if( $config['seo_type'] == 3 AND $category_list[0] == 0 ) msg( "error", array('jаvascript:history.go(-1)' => $lang['addnews'], '' => $lang['addnews_error'] ), $lang['news_err_id'], "jаvascript:history.go(-1)" );

Ищем (~977 строка):

	if(!$alt_name) $alt_name = totranslit( stripslashes( $title ), true, false, $config['translit_url'] );

Заменяем на:

	if(!$alt_name) {
		$alt_name = totranslit( stripslashes( $title ), true, false, $config['translit_url'] );

		if( $config['allow_alt_url'] AND $config['seo_type'] == 3 ) {

			$count = $db->super_query( "SELECT COUNT(*) as count FROM " . PREFIX . "_post WHERE alt_name LIKE '{$alt_name}'" );

			if( $count['count'] ) {
				$db->query( "SELECT alt_name FROM " . PREFIX . "_post WHERE alt_name LIKE '{$alt_name}_%'" );

				$check_keys = [];
				while($found_news = $db->get_row()) {
					if( $found_news['id']) {
						$check_keys[] = intval(str_replace($alt_name . '_', '', $found_news['alt_name']));
					}	
				}

				$prefix_key = 1;
				if (count($check_keys) > 0) {
					sort($check_keys, SORT_NUMERIC);
					$max_key = max($check_keys);
					$prefix_key = $max_key + 1;
					for($i=1;$i<=$max_key;$i++) {
						if(!in_array($i, $check_keys)) {
							$prefix_key = $i;
							break;
						}
					}
				}

				$alt_name .= '_' . $prefix_key;
			}

		}
	}

Ищем (~1017 строка):

	if( $config['allow_alt_url'] AND !$config['seo_type'] ) {

		$db->query( "SELECT id, date FROM " . PREFIX . "_post WHERE alt_name ='{$alt_name}'" );

		while($found_news = $db->get_row()) {
			if( $found_news['id'] AND date( 'Y-m-d', strtotime( $found_news['date'] ) ) == date( 'Y-m-d', $_TIME ) ) {
				msg( "error", array('jаvascript:history.go(-1)' => $lang['addnews'], '' => $lang['addnews_error'] ), $lang['news_err_42'], "jаvascript:history.go(-1)" );
			}	
		}

	}

Добавляем ниже:

	else if( $config['allow_alt_url'] AND $config['seo_type'] == 3 ) {

		$count = $db->super_query( "SELECT COUNT(*) as count FROM " . PREFIX . "_post WHERE alt_name ='{$alt_name}'" );

		if( $count['count'] ) {
			msg( "error", array($_SESSION['admin_referrer'] => $lang['edit_all_title'], '' => $lang['addnews_error'] ), $lang['news_err_42'], "jаvascript:history.go(-1)" );
		}

	}

Открываем файл /engine/inc/editnews.php

Ищем (~2097 строка):

	foreach ( $category_list as $selected ) {
		if( $allow_list[0] != "all" AND ! in_array( $selected, $allow_list ) AND $ifdelete != "yes") msg( "error", $lang['addnews_error'], $lang['news_err_41'], "jаvascript:history.go(-1)" );
	}

Добавляем ниже:

	if( $config['seo_type'] == 3 AND $category_list[0] == 0 ) msg( "error", array('jаvascript:history.go(-1)' => $lang['addnews'], '' => $lang['addnews_error'] ), $lang['news_err_id'], "jаvascript:history.go(-1)" );

Ищем (~2151 строка):

	if(!$alt_name) $alt_name = totranslit( stripslashes( $title ), true, false, $config['translit_url'] );

Заменяем на:

	if(!$alt_name) {
		$alt_name = totranslit( stripslashes( $title ), true, false, $config['translit_url'] );

		if( $config['allow_alt_url'] AND $config['seo_type'] == 3 ) {

			$count = $db->super_query( "SELECT COUNT(*) as count FROM " . PREFIX . "_post WHERE alt_name LIKE '{$alt_name}'" );

			if( $count['count'] ) {
				$db->query( "SELECT alt_name FROM " . PREFIX . "_post WHERE alt_name LIKE '{$alt_name}_%'" );

				$check_keys = [];
				while($found_news = $db->get_row()) {
					if( $found_news['id']) {
						$check_keys[] = intval(str_replace($alt_name . '_', '', $found_news['alt_name']));
					}	
				}

				$prefix_key = 1;
				if (count($check_keys) > 0) {
					sort($check_keys, SORT_NUMERIC);
					$max_key = max($check_keys);
					$prefix_key = $max_key + 1;
					for($i=1;$i<=$max_key;$i++) {
						if(!in_array($i, $check_keys)) {
							$prefix_key = $i;
							break;
						}
					}
				}

				$alt_name .= '_' . $prefix_key;
			}

		}
	}

Ищем (~2380 строка):

				if( $config['allow_alt_url'] AND !$config['seo_type'] ) {

					$db->query( "SELECT id, date FROM " . PREFIX . "_post WHERE alt_name ='{$alt_name}' AND id != '$item_db[0]' " );

					while($found_news = $db->get_row()) {
						if( $found_news['id'] AND date( 'Y-m-d', strtotime( $found_news['date'] ) ) == date( 'Y-m-d', $_TIME ) ) {
							msg( "error", array($_SESSION['admin_referrer'] => $lang['edit_all_title'], '' => $lang['addnews_error'] ), $lang['news_err_42'], "jаvascript:history.go(-1)" );
						}	
					}

				}

Добавляем ниже:

				else if( $config['allow_alt_url'] AND $config['seo_type'] == 3 ) {

					$count = $db->super_query( "SELECT COUNT(*) as count FROM " . PREFIX . "_post WHERE alt_name ='{$alt_name}' AND id != '$item_db[0]' " );

					if( $count['count'] ) {
						msg( "error", array($_SESSION['admin_referrer'] => $lang['edit_all_title'], '' => $lang['addnews_error'] ), $lang['news_err_42'], "jаvascript:history.go(-1)" );
					}

				}

При добавлении или сохранении публикации теперь будут отображаться ошибки, требующие выбора категории или обеспечивающие уникальность адреса ЧПУ. Если адрес ЧПУ не указан, система автоматически сгенерирует его, добавив инкрементный префикс в случае, если уже имеются публикации с таким ЧПУ в базе данных.

Добавляем в настройку CMS новую опцию

Открываем файл /engine/inc/options.php

Ищем (~670 строка):

showRow( $lang['opt_sys_seotype'], $lang['opt_sys_seotyped'], makeDropDown( array ("1" => $lang['opt_sys_seo_1'], "2" => $lang['opt_sys_seo_2'], "0" => $lang['opt_sys_seo_3'] ), "save_con[seo_type]", "{$config['seo_type']}" ) );

Заменяем на:

showRow( $lang['opt_sys_seotype'], $lang['opt_sys_seotyped'], makeDropDown( array ("1" => $lang['opt_sys_seo_1'], "2" => $lang['opt_sys_seo_2'], "3" => $lang['opt_sys_seo_3'], "0" => $lang['opt_sys_seo_4'] ), "save_con[seo_type]", "{$config['seo_type']}" ) );

Ищем (~1119 строка):

$db->query( "INSERT INTO " . USERPREFIX . "_admin_logs (name, date, ip, action, extras) values ('".$db->safesql($member_id['name'])."', '{$_TIME}', '{$_IP}', '48', '')" );

Добавляем выше:

	if( intval($_POST['save_con']['seo_type']) == 3) {
		$count = $db->super_query( "SELECT COUNT(*) as count FROM " . PREFIX . "_post WHERE category = '0'" );
		if( $count['count'] ) {
			msg( "error", $lang['opt_denied'], $lang['news_err_id_save_1'], "jаvascript:history.go(-1)" );
		}

		$count = $db->super_query( "SELECT COUNT(*) as count FROM (SELECT alt_name FROM " . PREFIX . "_post GROUP BY alt_name HAVING COUNT(*) > 1) d" );
		if( $count['count'] ) {
			msg( "error", $lang['opt_denied'], $lang['news_err_id_save_2'], "jаvascript:history.go(-1)" );
		}
	}

Теперь в настройках появилась возможность выбора нового типа ЧПУ, сопровождаемая проверкой соответствия требованиям для уже существующих публикаций.

Дополняем языковые пакеты

Открываем файл /language/Russian/adminpanel.lng

Ищем (~1880 строка):

'opt_sys_seotyped'		=>	"<b>Тип 1</b> - ссылки на полную новость будут иметь вид <b>http://yoursite.com/id-имя новости.html</b><br><br><b>Тип 2</b> - ссылки на полную новость будут иметь вид <b>http://yoursite.com/категория/подкатегория/id-имя новости.html</b><br><br><b>Тип 3</b> - ссылки на полную новость будут иметь вид <b>http://yoursite.com/2008/04/02/имя новости.html</b>, внимание данный тип несет повышенную нагрузку на сервер",

Заменяем на:

'opt_sys_seotyped'		=>	"<b>Тип 1</b> - ссылки на полную новость будут иметь вид <b>http://yoursite.com/id-имя новости.html</b><br><br><b>Тип 2</b> - ссылки на полную новость будут иметь вид <b>http://yoursite.com/категория/подкатегория/id-имя новости.html</b><br><br><b>Тип 3</b> - ссылки на полную новость будут иметь вид (без ID) <b>http://yoursite.com/категория/подкатегория/имя новости.html</b><br><br><b>Тип 4</b> - ссылки на полную новость будут иметь вид <b>http://yoursite.com/2008/04/02/имя новости.html</b>, внимание данный тип несет повышенную нагрузку на сервер",

Ищем (~1883 строка):

'opt_sys_seo_3'			=>	"Тип 3",

Добавляем ниже:

'opt_sys_seo_4'			=>	"Тип 4",
'news_err_id'			=>	"Не выбрана категория публикации, обязательная для выбранного типа ЧПУ. Вернитесь назад и укажите категорию.",
'news_err_id_save_1'	=>	"Выбранный тип ЧПУ недоступен, если в системе имеются публикации без указанных категорий. Для начала укажите категорию для каждой из публикаций.",
'news_err_id_save_2'	=>	"Выбранный тип ЧПУ недоступен, если присутствуют публикации с одинаковыми значениями в поле \"ЧПУ URL статьи\". Сначала необходимо устранить это несоответствие.",

Мы выполняем аналогичные шаги и для других языков (английского и украинского), однако это необязательно, если вы не пользуетесь ими.

Настройки сайта Datalife Engine

Заключение

Datalife Engine для меня не просто система управления контентом (CMS), это своего рода "школа обучения". Благодаря этой платформе я освоил PHP и начал разрабатывать свои первые модули.

Несомненно, CMS не идеальна, и ранее я многократно слышал, как люди "плевались" при упоминании данной CMS. Сегодня я почувствовал целиком и полностью почему. Это не нормально, когда для изменения шаблона формирования полного URL публикации приходится вносить правки в 25 (!!!) файлов, при этом более 75% изменений сводятся к модификации одного и того же функционала. Самое разумное решение: заменить на функцию в едином месте.

Данный блог является примерно работоспособности подобных изменений.