Алгоритм работы с множеством прикреплённых файлов

aaachilov

Новичок
логику парсера тоже не сложно изменить - мне весь алгоритм работы в голове никак не представляется(((
 

aaachilov

Новичок
Вы объясните в чём корява реализация раз уж начали. какая разница парсеру - ему хоть {POPKA} {PAPKA} {PIPKA} хоть {IMAGE} хоть {picture} - мне нужен уникальный тег в рамках материала для каждого изображения которое закреплено за этим материалом. Причём присваивается IMG_№ отлично - но по той причине что таблица всех изображений одна не могу ешить вопрос с уникальностью. кнечно можно сначала перед записью узнать через запрос наибольшее значение идентификатора изображения к данному материалу т прибавить 1 - но это помоему не правильно
 

С.

Продвинутый новичок
Вот поэтому и коряво, что вводятся какие-то "левые" №. {POPKA} {PAPKA} {PIPKA} -- нормально, {IMG_№}, где № неизвестное заранее число --ненормально. Неужели не видишь разницы?

Посмотри как делается в других "парсерах". Например в парсере по названием PHP есть возмочность писать:
$var[$key], где $key -- хоть 1,2,3, хоть 'POPKA', 'PAPKA', 'PIPKA и никаких проблем.
 

aaachilov

Новичок
У меня тоже не важно чем будет № поидеи это и есть [$key] по моей задумке - так оно и парсится в цикле $var[$key] = {IMG_$key}- но как мне сделать этот кей уникальным в рамках одного материала - когда все материалы хранятся в одной таблице. Например тот же злосчастный ucoz - там ток же сделано $IMAGE1$ $IMAGE2$ $IMAGE3$ и так далее
 

С.

Продвинутый новичок
Лично я не представляю, как можно сделать нормальный шаблон, где количество элементов заранее неизвестнио, а обращение к ним идет по {IMG_№} или $IMAGE№. Только если как-то извратившись. Или имея как-то специальные особенности шаблонизатора, который может менять № в цикле, но я про такие не знаю. Любой адекватный шаблонизатор бы использовал какую-нибудь специальную форму записи индекса типа {IMG.№} или {IMG{№}}.
 

aaachilov

Новичок
но я про такие не знаю
Значит месяц не зря прошёл
:) Фиг знает - но все отлично парсится в цикле.
Вт мой класс-шаблонизатор
PHP:
class Content{	
	public $vars = array();
	public $content;
	public $parse_tpl;
// функция обработки тегов	{TAGS}
public function set($name, $val = "") {
		if(!is_array($val)) {
			$this->vars['{' . $name . '}'] = $val;
		} elseif(is_array($val)) {
			foreach($val as $k => $v) {
				$this->vars['{' . $name . '}'] .= $v;
			}
		} else {
			$this->vars[$name] = "";
		}
	}
// Функция обработки тегов изображений {IMG_№}
public function img($name, $val = "", $id = "") {
		if(!is_array($val)) {
			$this->vars['{' . $name.'_'.$id . '}'] = $val;
		} elseif(is_array($val)) {
			foreach($val as $k => $v) {
				$this->vars['{' . $name.'_'.$id . '}'] .= $v;
			}
		} else {
			$this->vars[$name] = "";
		}
	}
// функция обработки шаблонов
public function parse($tpl) {
		$this->parse_tpl = file_get_contents($tpl);
		foreach($this->vars as $k => $v) {
			$this->parse_tpl = str_replace($k, $v, $this->parse_tpl);
		}
		return $this->parse_tpl;
	}
// функция обработки основного шаблона {main.tpl}	
public function tpl($tpl) {
		$this->content = file_get_contents($tpl);
	}
// функция для подключения шаблонов	{include=file.tpl}
public function out_content() {
		preg_match_all("/\{include\=(.*?[.tpl])\}/is", $this->content, $mas);
		foreach($mas[0] as $k => $v) {
			$this->content = str_replace($mas[0][$k], $this->parse($mas[1][$k]), $this->content);
		}
		
		foreach($this->vars as $key => $val) {
			$this->content = str_replace($key, $val, $this->content);
		}
		echo $this->content;
	}
// Функция для обработки содержимого в тегах []сожержимое[/]	
public function set_block($b_tag, $b_true_or_false) {
		if($b_true_or_false) {
			$this->content = preg_replace("/\[{$b_tag}\](.*?)\[\/{$b_tag}\]/is", "$1", $this->content);
		} else {
			$this->content = preg_replace("/\[{$b_tag}\](.*?)\[\/{$b_tag}\]/is", "", $this->content);
		}
	}
}

$content = new content();
Этот ебольшой код справляется со всеми поставленными задачами.

Вот эта функция у меня парсит именно теги для изображений {IMG_№}
PHP:
public function img($name, $val = "", $id = "") {
		if(!is_array($val)) {
			$this->vars['{' . $name.'_'.$id . '}'] = $val;
		} elseif(is_array($val)) {
			foreach($val as $k => $v) {
				$this->vars['{' . $name.'_'.$id . '}'] .= $v;
			}
		} else {
			$this->vars[$name] = "";
		}
	}
принимает 3 входящих параметра например вот пример с циклом

PHP:
for ($i = 1; $i <= 3; $i++) {
			$img = "<img src='/image/$i.png' border='0' alt=''/><br />";
			$content->img('IMG', $img, $i);
			}
в результате будет три изображения которые выведутся по тегам {IMG_1}{IMG_2}{IMG_3}
Это так - для примера. Так что ничего замудрённог нет.
У меня вопрос в том - как мне в таблице с изображениями ко всем материалам сделать уникальную нумерцию материала от 1 в рамках одного материала
 

С.

Продвинутый новичок
Опять за рыбу деньги!
В том то и дело, что две разных системы нумерации надо связать. Сделать это можно, но только по уродски. Потому что нумерация по типу 1,2,3 здесь совершенно инородная и ненужная.
 

aaachilov

Новичок
не - ну можно конечно например id использывать в качестве нумерации - но если будет 10000 картинок тогда что тег будет {IMG_9865}
Но так не покатит - поотому что например я хочу сделать к материалу несколько скриншотов (универсально для всех маериалов) тогда я в случае с 1 2 3 просто могу прописать в шаблоне вывод 1 2 3 и он будет универсален длявсех шаблонов - а в случае с разными значениями и сам по себе этот парсинг ненужен - можно просто html изображения вставить
А Вы что можете посоветовать?
 

С.

Продвинутый новичок
А если по факту только одна или две картинки, что будет выдано для {IMG_3}?
Если 5 картинок, то показываться будут только 3? Какие из 5-ти, первые, случайные?
 

aaachilov

Новичок
А если по факту только одна или две картинки, что будет выдано для {IMG_3}?
перед тем как присваивать значения для имеющихся присвоить всем IMG от 1 до максимально разрешённого количества пустоту - а потом те которым нужно перезапишутся
Если 5 картинок, то показываться будут только 3? Какие из 5-ти, первые, случайные?
те которые 1 2 3 - остальные я могу нпример в сам текст вставить при добавлении. У меня сделана предварительная загрузка и например можно перетащить картинку в поле и счёлкнуть по ней и она вставится в материал



Просто я сначало сделал все в одной таблице и таких вопросов не возникало - но теперь когда таблицу для изображений сделал отдельно этот вопрос возник.
при добавлении то они нумеруются - как в случае если ещё картинки добавить нужно или если некоторые удалить что бы они в порядке возрастния добавлялись. Выбрать наибольшее значение кстати тоже не вариант - я так сделал сегодня - но если последнюю картинку удалить её номер исчезнет.

Можно в таблице с материалом вести счётчик - типа счётчика просмотров - при каждой записи в случае добавления картинки делать +1 к счётчику. В любом случаем нужно запись в таблицу с материалом делать и при редактировании выборку из неё таким образом без лишнего обращения к базе можно всегда знать наибольшее значение изображения и при новой записи нумерацию продолжать от эотго значения.
 
Сверху