Хорошо, спасибо за помощь.
  • avatar alooze
  • 1
Вынесите только проверку $mode = (isset($mode))? $mode: 'full'; до функции. А то если вызов сниппета будет без параметра, получите ошибку «неизвестная переменная».
Упс…
Спасибо Вам огромное. Я исправил, теперь все работает!
function my_calendar($fill=array(),$mode)
и
my_calendar(array(date(«Y-m-d»)),$mode)
  • avatar alooze
  • 1
У вас параметр

$mode = (isset($mode)) ? $mode : 'full';


проверяется внутри функции. А в функцию он не передается. Поэтому isset вернет всегда false.
Хм… а может ли быть такое, что этот код внутри функции? Хотя если выносишь за функцию, то не работает. Имена переменных менял, больше они нигде не встречаются.
Я приведу код, может там что можно увидеть.
Ну учитывая что пишу я на php хреново, учусь еще, ошибка там точно есть)

/*
# Name: MODxPlaning
# Description: Code that displays calendar whis events
# Category: snippet
# Version: 1.0.2
# Install - create a new snippet named MODxPlaning & paste 
# include_once(MODX_BASE_PATH.'assets/modules/calendar/index.php'); into body
# 
# 
*/


/*$select = "SELECT * FROM $mod_table";
				$sql= mysql_query($select);
				echo mysql_num_rows($sql); */


function my_calendar($fill=array()) { 
require_once($_SERVER['DOCUMENT_ROOT'].'/manager/includes/protect.inc.php');
include_once ($_SERVER['DOCUMENT_ROOT'].'/manager/includes/config.inc.php');
$modx = new DocumentParser;
include_once(MODX_BASE_PATH."manager/includes/document.parser.class.inc.php");
include_once(MODX_BASE_PATH.'assets/modules/calendar/config.inc.php');

$mode = (isset($mode)) ? $mode : 'full';

  $month_names=array("Январь","Февраль","Март","Апрель","Май","Июнь",
  "Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"); 
  if (isset($_GET['y'])) $y=$_GET['y'];
  if (isset($_GET['m'])) $m=$_GET['m']; 
  if (isset($_GET['date']) AND strstr($_GET['date'],"-")) list($y,$m)=explode("-",$_GET['date']);
  if (!isset($y) OR $y < 1970 OR $y > 2057) $y=date("Y");
  if (!isset($m) OR $m < 1 OR $m > 12) $m=date("m");

  $month_stamp=mktime(0,0,0,$m,1,$y);
  $day_count=date("t",$month_stamp);
  $weekday=date("w",$month_stamp);
  if ($weekday==0) $weekday=7;
  $start=-($weekday-2);
  $last=($day_count+$weekday-1) % 7;
  if ($last==0) $end=$day_count; else $end=$day_count+7-$last;
  $today=date("Y-m-d");
  $prev=date('?\m=m&\y=Y',mktime (0,0,0,$m-1,1,$y));  
  $next=date('?\m=m&\y=Y',mktime (0,0,0,$m+1,1,$y));
  $i=0;
  $out = '
  <style>
    .bud {background: #ddd}
	.vyh {background: red; color:#fff}
	td {position:relative}
    .modal_none {display:none;position:absolute;z-index:10; width:200px; top:-4px; left:15px;padding:5px; font-size:12px; margin:1px; color:#666; background:#fadfad; text-align:left}
	td {padding:4px;text-align:center}
	td.day {border:1px solid #ddd}
	td:hover .modal_none {display:block}
	td.today {background: red; color:#fff}
	td.today a {color:#fff !important}
  </style>
  <table class="planingGrid"> 
 <tr>
  <td colspan=7> 
   <table width="98%" border=0 cellspacing=0 cellpadding=0> 
    <tr> 
     <td align="left"><a href="'.$_SERVER['PHP_SELF'].$prev.'"><<<</a></td> 
     <td align="center">'.$month_names[$m-1]." ".$y.'</td> 
     <td align="right"><a href="'.$_SERVER['PHP_SELF'].$next.'">>>></a></td> 
    </tr> 
   </table> 
  </td> 
 </tr> 
 <tr>
 <td class="bud">Пн</td>
 <td class="bud">Вт</td>
 <td class="bud">Ср</td>
 <td class="bud">Чт</td>
 <td class="bud">Пт</td>
 <td class="vyh">Сб</td>
 <td class="vyh">Вс</td>
 </tr>';		
							
  for($d=$start;$d<=$end;$d++) { 
    if (!($i++ % 7)) $out .= " <tr>\n";
    $out .= '';
    if ($d < 1 OR $d > $day_count) {
      $out .= '<td class="day" align="left" valign="top" width="14%"> ';
    } else {
      $now="$y-$m-".sprintf("%02d",$d);
	  
      if (is_array($fill) AND in_array($now,$fill)) {
        $out .= '<td class="today" align="left" valign="top" width="14%">
				<b><a href=""  onClick="javascript: window.alert(\'Выбрана дата '.$now.'\');">'.$d.'</a></b>'; 
      } else {
	  
        $out .= " <td class='day' align='left' valign='top' width='14%'>
				  <div style='position:relative'>
				  <span>".$d."</span>";		  
      }
	  $event = $y."-".$m."-".sprintf("%02d",$d);
		// делаем запрос в БД за событиями
        $select = "SELECT * FROM $mod_table WHERE date='".$event."' ";
		//$select = $modx->db->query( "SELECT * FROM `modx_planing` ORDER BY date ASC" );
		$sql= mysql_query($select);
		//echo mysql_num_rows($sql);
		// выводим записи бронирования в ячейках календаря
		
		//mode param		
		switch ($mode) {
				case "modal" :
							if (mysql_num_rows($sql) != 0) {
							$out .= '<div style="position:absolute; top:-4px; right:-4px; cursor:pointer;width:0;height:0;border-top: 10px solid red;border-left: 10px solid transparent;">
							</div>';
															
							$out .= '<div class="modal_none">';
							}
							for($count = 0; $count<mysql_num_rows($sql); $count++)
								{
									//$r = mysql_fetch_assoc($sql);
									$r = mysql_fetch_assoc($sql);
									if (isset($r['date']))	{
															$event = 
															'<b>'.$r['name'].'</b>
															
															<small>'." с ".$r['time']." до ".$r['time2']
															."</small>";
															$out .= $event;
														} 
											else
											{
												$out .= "Пока тут пусто";
											}
								}
							//$out .= '</div>';
				break;
				case "full" :
								for($count = 0; $count<mysql_num_rows($sql); $count++)
								{
									//$r = mysql_fetch_assoc($sql);
									$r = mysql_fetch_assoc($sql);
									if (isset($r['date'])) {
																$event = '<b>'.$r['name'].'</b>
																
																<small>'." с ".$r['time']." до ".$r['time2']
																."</small>";
																$out .= $event;
				  
																} 
																	else
																{
																	$out .= "Пока тут пусто";
																}
				     }
				break;
				}
								$out .= '</div>';
		
    } 
    $out .= "</td>\n";
    if (!($i % 7))  $out .= " </tr>\n";
  } 

$out .= '</table>'; 
echo $out;
}
if (isset($_GET['date'])) echo "выбрана дата ".$_GET['date'];
my_calendar(array(date("Y-m-d"))); 
  • avatar alooze
  • 1
Либо ошибка где-то в самом вызове сниппета (и не срабатывает isset), либо в пропущенных частях кода как-то меняется параметр. Есть еще вариант с неудачным названием самого параметра, например, выбрана какая-то глобальная переменная; но я сходу не могу предположить какая переменная может так себя вести.

Больше идей пока нет.
  • avatar Ronef
  • 0
Прошу прощения, если показалось что «в штыки», на самом деле это не так ;-)
  • avatar tiptop
  • 0
Во-первых, правил не так уж и много. Во-вторых, одни и те же правила применяются практически без изменений из проекта в проект, например, для шаблона Новости — скрыть лишние поля и вкладки, переименовать оставшиеся. Копипастишь и меняешь только идентификатор шаблона.
В-третьих, это дело привычки, столько лет работал без модуля ddMMEditor и пока не вижу смысла заменять один чанк на модуль с 200кб файлов к нему.
Но я не говорю, что модуль вещь вообще не нужная, он просто лично мне и в данный момент не интересен. А так, вам только респект и уважуха за проделанную работу. И не стоит мое мнение воспринимать на столько в штыки :)
  • avatar akool
  • 0
Ну там доп. возможности еще для универсальности.
Никто ж не спорит, что одним запросом менее затратно. ))
  • avatar Ronef
  • 0
Если говорить вообще, то, честно говоря, я слабо себе представляю, чем может быть удобней писать правила руками в чанк по сравнением с модулем. Единственное, что приходит в голову — это использование php (условия, переменные, etc). Это конечно всё прекрасно, но если нужны такие хитро-мудрые правила, в модуле предусмотрена возможность вписать что угодно руками (и даже есть возможность вписать сверху всех правил и/или снизу всех правил).

Можно по старинке использовать чанк и писать всё руками, но лично мне кажется что всегда помнить все параметры всех виджетов MM, id`шники всех шаблонов, ролей, все названия полей документов и все TV для данного проекта или каждый раз всё это смотреть — есть большой изврат.

Make your choice ;-)
  • avatar tiptop
  • 0
У меня была мысль на счет того, что все дело именно в чанке, но так как сам по себе этот модуль мне не больно нужен и ставился он только ради ознакомления, разбираться было лень. Не заработал — и не надо ))) Так что документацию поправить точно не помешает :)
  • avatar Ronef
  • 0
Возможно, стоит модулю проверять, не указан ли чанк в конфиге MM, если указан — работать с ним, но здесь проблема будет с комментариями и пр. Либо, может быть, стоит научить ManagerManager применять правила и из чанка и из файла, но здесь проблема — в какой последовательности? Подумаем над всем этим.
  • avatar Ronef
  • 0
Модуль записывает правила в файл /assets/plugins/managermanager/mm_rules.inc.php. Но если у вас в конфигурации ManagerManager прописан чанк, то сам ManagerManager будет брать правила из этого чанка, не обращая никакого внимания на то, что находится в файле. С высокой вероятностью именно это является причиной всех «косяков с модулем».

Но это не косяки модуля, не проблемы с модулем, не глюки и не что-либо ещё такое. То есть, всё функционирует, программных ошибок нет, ошибки именно человеческие. Думаю, стоит добавить в документацию к модулю заметку о том, что надо убрать имя чанка из конфигурации ManagerManager. Сейчас уже написано «Модуль изменяет файл assets/plugins/managermanager/mm_rules.inc.php плагина ManagerManager.», мне думалось, что этого вполне достаточно для понимания механизма, но, видимо, нет)
  • avatar tiptop
  • 0
Честно говоря, с этим модулем у меня тоже были косяки, добавляешь через него правило — а оно не хочет фурычить. А прописываешь правило руками в чанке — работает. Снес этот модуль нафиг и больше его ни где не ставлю, да мне уже и привычнее через чанк все делать. По этой причине скриншоты и примеры привести не могу, но если кто еще столкнется, отпишитесь.
Спасибо! Будем ждать обновления.

Ссылки в Babel я тоже поправил, а форма — это форма создания/привязки страницы с переводом, в принципе, ничего не будет страшного, если она не будет работать на AJAX. В конце концов, переводы создаются достаточно редко, одну перезагрузку страницы пережить можно.

Патч для Babel у меня есть. Только я не совсем понял, что конкретно вы хотели бы с ним сделать. По уму из него надо Pull Request делать в репозитории самого Babel (правки-то все вполне легитимные), только он, кажется, как-то заглох… Последний пакет — больше года назад.
  • avatar danik
  • 0
Благодарю за отзыв. Проблема была в плагине. Я уже исправил, но пакет обновлю только завтра. Однако ссылки на переводы — это, как ни странно, ссылки, и ajax'а с ними не будет. Впринципе исправить это довольно просто, нужно отредактировать чанк mgr/babelboxitem.tpl, для ссылки добавить атрибут onclick=«MODx.loadPage( 'url' ); return false;», вместо url — то что в атрибуте href. Правда там еще какая то форма предусмотрена, я ее только в чанке видел. С ней все сложнее… Будет здорово, если знающие git зафигачат патчи для расширений (я уже задолбался с этим делом)
  • avatar Dmi3yy
  • 0
До Сборки ClipperCMS пока не добрался
но так же рекомендую глянуть:
github.com/dmi3yy/modx.evo.custom/
тут помимо MODX есть много полезных снипетов плагинов которые сразу устанавливаются с MODX что упрощает и ускоряет разработку
Да вы издеваетесь?))) Стока букав, хотя решается 1 SQL запросом)
  • avatar akool
  • 1
Т.к. отличия у ClipperCMS только в лучшую сторону, а совместимость с Evolution полная, то думаю, что хорошим решением будет выбор ClipperCMS в виду перспективности.
Стоит лишь учесть, что часто упоминаемый сниппет Ditto там называется List, но улучшен и по параметрам должен быть аналогичен.
Если возникнут сложности — смело на этом сайте спрашивайте. Поможем.
  • avatar akool
  • 0
Сниппет для таких задач от alooze