CMS Eleanor - Поиск
Полная версия этой страницы: Официальный форум Eleanor CMS » Вопросы по переделке модуля
Официальный форум Eleanor CMS » Поддержка пользователей системы Eleanor CMS » Разработка системы
DARK_Vovich
Я занялся созданием модуля каталога на основе модуля Новостей и возникли некоторые вопросы.

  1. Инпуты, селекты и пр.
    • Есть ли какие-то настройки у стандартных полей
      Template::Edit('tags',$tags)
      помимо типа (Edit, Select, Item)? Мне нужна возможность изменять размер и добавлять JS события.
    • Я добавил свои инпуты в форму добавления контента, вида:
      <input class="inputText" name="address" id="address" size="50" ENGINE="text" value="" onblur="if (this.value.length>0) {codeAddress(this.value);}" />
      , но данные из них не сохраняются в базу! При использовании стандартных Template::Edit - работает! Как это исправить?
  2. Как можно отключить функцию создания url (вручную и по заголовку) и сделать её вида myname_id.html ?
Alexander
Цитата (DARK_Vovich @ 2021-06-16 04:53)
Есть ли какие-то настройки у стандартных полей

Посмотрите, как устроен это метод. Третьим и четвертым параметром как раз и передаются настройки.

Цитата (DARK_Vovich @ 2021-06-16 04:53)
, но данные из них не сохраняются в базу! При использовании стандартных Template::Edit - работает! Как это исправить?

А Вы точно записываете их в базу?

Цитата (DARK_Vovich @ 2021-06-16 04:53)
Как можно отключить функцию создания url (вручную и по заголовку) и сделать её вида myname_id.html ?

Непонял
DARK_Vovich
Так, с 1 и 2 вопросом разобрался! Система действительно позволяет свои инпуты делать, очень удобно) Спасибо!

С 3 пунктом - я полностью удалил поля url и main_cat в таблице и хочу, чтобы URL к элементам каталога был одинаковый вида /modulename/point_$id.html (собственно, как стандартный nid выводится). Вообщем я прошелся по коду, поудалял лишнее и все вроде бы работает, как я хотел)

Но остались конструкции такие:
$url=$Mainclass->Url->ConstructUrl(array(array($arr['url'],'point'=>$arr['id'])));


Как из них безболезненно убрать $arr['url'] (а то крэшится в логи)?
DARK_Vovich
4. Я отказался от использования основной категории, сделал основным поле cats (отображать в категориях), т.е. возможность указывать несколько категорий основными. Но в шаблон они чего-то не хотят выводится:
$category=$Mainclass->lang['recyclepoints']['category'].(($c=$Mainclass->Categories_l->GetDump($arr['cats'])) ? implode(",",'<a href="'.$Mainclass->Categories_l->CategoryUrl($arr['cats']).'" title="'.strip_tags($c['description']).'">'.$c['title'].'</a>') : '<i>'.$Mainclass->lang['main']['no'].'</i>');

всегда возвращает нет категории.
Alexander
Цитата (DARK_Vovich @ 2021-06-16 04:53)
всегда возвращает нет категории.

Потому что поле cats - это категории через запятую (причем, начинается это поле запятой), а метод GetDump принимает на вход ТОЛЬКО целое число.
DARK_Vovich
Цитата (Alexander @ 2011-03-04, 16:55)
Потому что поле cats - это категории через запятую (причем, начинается это поле запятой), а метод GetDump принимает на вход ТОЛЬКО целое число.

А подскажи тогда, какой есть способ их выдернуть? (запятые до и после я убрал)
Alexander
Цитата (DARK_Vovich @ 2021-06-16 04:53)
А подскажи тогда, какой есть способ их выдернуть? (запятые до и после я убрал)

Я виже смысл в выдергивании только одной (основной категории). Или хочется выдернуть вообще все?
DARK_Vovich
Цитата (Alexander @ 2011-03-04, 22:24)
Я виже смысл в выдергивании только одной (основной категории). Или хочется выдернуть вообще все?

Да, нужно все выдернуть. У меня по задумке их будет не более 5-7.
Alexander
DARK_Vovich, в таком случае берете массив $Mainclass->categories->dump. Это ассоциативный массив, где ключами являются ИДы категорий. Пробегаетесь по нему и вытаскиваете нужные вам значения.
DARK_Vovich
Цитата (Alexander @ 2011-03-05, 1:45)
DARK_Vovich, в таком случае берете массив $Mainclass->categories->dump. Это ассоциативный массив, где ключами являются ИДы категорий. Пробегаетесь по нему и вытаскиваете нужные вам значения.


Александр, а можно поподробнее?

Я в начале модуля определил
$Mainclass->LoadClass('classes/others/class_categories.php');
$Mainclass->Categories->url_ending=$Mainclass->vars['m_recyclepoints_category_ending'];
$Mainclass->Categories->Init();


и затем вывожу так
$category=(($c=$Mainclass->Categories->dump($arr['cats'])) ? implode(",",'<a href="'.$Mainclass->Categories->CategoryUrl($arr['cats']).'" title="'.strip_tags($c['description']).'">'.$c['title'].'</a>') : '<i>'.$Mainclass->lang['main']['no'].'</i>');

пусто(

Даже если просто без подключений через
$category=$Mainclass->categories->dump($arr['cats']);

тоже пусто.
DARK_Vovich
Помогите пожалуйста с категориями, очень важно!

Еще 2 вопроса:
5. Мне нужно организовать вывод категорий на форме добавления в виде множества чекбоксов. Скажите, как это можно сделать?
Я ковырялся в файле classes/class_template.php и даже почти переделал вывод наподобии вывода множества радиокнопок, но так и не понял откуда выводится каждое значение в виде <option value="id">jjj</option> - в этом файле даже нет упоминания такой структуры.

6. В админке сортировка записей по категориям происходит только по первой категории (т.е. если она указана первой - то сортируется, 2 и далее - нет). Как сделать сортировку, если хотя бы где-то встречается данная категория? (см скрин)
Код отвечающий за фильтр.
$ficat=0;
	$fititle='';
	if(!empty($_REQUEST['filter']))
	{
		$pages_arr['filter']=1;
		if(!empty($_REQUEST['ficat']))
		{
			$pages_arr['ficat']=$ficat=$_REQUEST['ficat'];
			$where.=' AND `cats`='.(int)$ficat;
		}
		if(!empty($_REQUEST['fititle']))
		{
			$pages_arr['fititle']=$fititle=$_REQUEST['fititle'];
			$where.=' AND `title` LIKE \'%'.$Mainclass->Db->EscapeString($fititle).'%\'';
		}
	}
	if(count($pages_arr)<=1)
		unset($pages_arr['filter']);

7. Что делает выбор статуса обратить активность? (см. скрин)
Alexander
Цитата (DARK_Vovich @ 2021-06-16 04:53)
Даже если просто без подключений через...оже пусто.

Еще раз повтоярю, что $Mainclass->Categories->dump это АССОЦИАТИВНЫЙ массив, ключами которого являются ID категорий. Вы же наспильно пытаетесь оттуда извлечь значение, которое IDом категории НЕ ЯВЛЯЕТСЯ. Посмотрите хотя лог ошибок кода системы. Многое прояснится.

Цитата (DARK_Vovich @ 2021-06-16 04:53)
выводится каждое значение в виде <option value="id">jjj</option> - в этом файле даже нет упоминания такой структуры.

Все делается в методе GetCatOptions с вызозовом Template::Option.

Цитата (DARK_Vovich @ 2021-06-16 04:53)
Как сделать сортировку, если хотя бы где-то встречается данная категория?


WHERE `cats` LIKE '%,ID,%'


Цитата (DARK_Vovich @ 2021-06-16 04:53)
7. Что делает выбор статуса обратить активность?

Если категория не была активирована, она активируется. И наоброт: если была активирована - деактивируется. В 99.9% - бесполезная функция. Но может кому-то и пригодится.
DARK_Vovich
Спасибо!

4. С дампом так и не разобрался, поэтому скопировал функцию вывода категорий как в админке, все работает.

5. Я сделал вывод выбора категорий через чекбоксы, но не могу понять, как сделать, чтобы они сохранялись в бд?
Оригинал выводился так:
<select name="cats[]" size="10" multiple="multiple" class="select"><option value="3">›&nbsp;Блог</option><option value="2">›&nbsp;События</option></select>

я сделал так:
<input type="checkbox" name="cats" value="1" /> Категория1  <input type="checkbox" name="cats" value="2" /> Категория2  <input type="checkbox" name="cats" value="3" /> Категория3

Но не сохраняется (с cats[] тоже самое)

и новый вопрос:
7. Мне в админке нужно новая страница. Написал соответствующую функцию, включил её в меню, все работает, но эта страница не схватывается шаблонизатором! Т.е. при переходе на неё весь html код исчезает и выводится белая страница только с кодом функции который присвоен $content="". В чем может быть проблема? Вроде бы прописал перехват адреса.
Alexander
Цитата (DARK_Vovich @ 2021-06-16 04:53)
Но не сохраняется (с cats[] тоже самое)

А как Вы сохраняете?

Цитата (DARK_Vovich @ 2021-06-16 04:53)
аписал соответствующую функцию, включил её в меню, все работает, но эта страница не схватывается шаблонизатором!

Это как?
DARK_Vovich
Цитата (Alexander @ 2011-03-24, 19:17)
Это как?


Вот смотрите, написал функцию сохранения данных в файл и вставил это в admin/index.php:
function MakeMapFile($error='') 
{global $Mainclass,$title;
	$title=$Mainclass->lang['actionsmap']['makemap'];
	$addon_fields='';
	$AddonFields=$Mainclass->LoadClass('classes/others/class_addon_fields.php');
	$content=$Mainclass->Template->Title($title)
	.$Mainclass->Template->OpenTable();
	$result=$Mainclass->Db->Query('SELECT `id`,`title`,`text`,`af`,`address`,`lat`,`lng` FROM `f_mytable` INNER JOIN `f_mytable_l` USING(`id`) WHERE `language`IN(\'\',\''.$Mainclass->lang_name.'\') AND `status`=1 AND `main_cat`=1',__file__,__line__);
	$kml=array('<?xml version="1.0" encoding="UTF-8"?>');
	$kml[]='<kml xmlns="http://www.opengis.net/kml/2.2">';
	$kml[]=' <Document>';
	$kml[]='  <Style id="readyStyle">';
	$kml[]='   <IconStyle id="readyIcon">';
	$kml[]='   <Icon>';
	$kml[]='    <href>http://code.google.com/intl/ru-RU/apis/maps/documentation/javascript/examples/images/beachflag.png</href>';
	$kml[]='   </Icon>';
	$kml[]='   </IconStyle>';
	$kml[]='  </Style>';
	while($arr=$Mainclass->Db->Fetch_assoc($result)) {
		$af=$AddonFields->OutPut($arr['af']);
		if($af)
		{
			foreach($af as &$v)
				if($v['value']!='')
					$addon_fields=$v['title'].': '.$v['descr'];
		}
		unset($arr['af']);
		$kml[]='	<Placemark id="placemark'.$arr['id'].'">';
		$kml[]='		<name>'.ConvertToUTF($arr['title']).'</name>';
		$kml[]='		<description>';
		$kml[]='			<br />'.ConvertToUTF('<b>Место:</b> '.$arr['address']).'';
		$kml[]='			<br /><b>'.ConvertToUTF($af['datetime']['title']).':</b> '.ConvertToUTF($af['datetime']['value']).'';
		$kml[]='			<br /><b>'.ConvertToUTF($af['organizator']['title']).':</b> '.ConvertToUTF($af['organizator']['value']).'';
		$kml[]='			<br /><b>'.ConvertToUTF('Подробности:</b> '.$arr['text']).'';
		if($af['vkevent']['value']){
			$kml[]='			<br />'.ConvertToUTF('<b>Встреча ВКонтакте:</b>').' <a href="'.$af['vkevent']['value'].'" target="_blank">'.$af['vkevent']['value'].'</a><br />';
		}
		$kml[]='		</description>';
		$kml[]='   		<styleUrl>#readyStyle</styleUrl>';
		$kml[]='   		<Point>';
		$kml[]='    		<coordinates>'.$arr['lng'].','.$arr['lat'].'</coordinates>';
		$kml[]='   		</Point>';
		$kml[]='  	</Placemark>';
		$kml[]=$arr['af'];
	}
	$kml[]=' </Document>';
	$kml[]='</kml>';
	$file_gb="maps/ready.kml"; // файл
	$file_tmp="maps/markers_tmp.kml"; // временный файл
	$mydata=join("\n", $kml);; // данные
	// проверяем, не было ли сбоя в предыдущем запуске скрипта
	if(file_exists($file_tmp)) die("fatal error, call administrator!");
	// копируем содержимое файла в tmp
	if(copy($file_gb, $file_tmp))
	{
		// удачно скопировался, можно перезаписывать основной файл
		if($w=fopen($file_gb,"w+"))
		{
		flock($w,2); // блокируем файл
		fwrite($w,$mydata."\n"); // записываем первую строку
		if(!$r=fopen($file_tmp,"w+")) die("can't open file");
		flock($r,1);
		while($mydata=fgets($r,10240)) // читаем построчно
		{
			fputs($w,$mydata); // пишем построчно
		}
		flock($r,3);
		fclose($r);
		flock($w,3);
		fclose($w);
		unlink($file_tmp);
		$content.=$Mainclass->Template->OpenTable()
		.'Все ок';
		}	
	} 
	else {
		$content.=$Mainclass->Template->Message($Mainclass->lang['actionsmap']['no_way']);
	}
	$content.=$Mainclass->Template->CloseTable();
	echo $content;
}

Соответственно сверху в файле подключил в меню
array($Mainclass->Url->ConstructUrl(array('do'=>'makemapfile')),((isset($_GET['do']) and $_GET['do']=='makemapfile' and !isset($_GET['event'])) ? '!' : '').$Mainclass->lang['actionsmap']['makemap']),

и
elseif(isset($_GET['makemapfile']))
	MakeMapFile((int)$_GET['makemapfile']);


Так вот, при выполнении кода в контент выводится только белый лист с "Все ок", без оформления админки. Может я что-то упустил? :dntknw:
Alexander
По-моиму Вы упустили $Mainclass->ShowDecoration() ...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.