воскресенье, 1 сентября 2013 г.

Ditto фильтр + форма + ajax

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

Создадим TV-параметр, по которому у нас будут отличаться наши документы:
Имя: Radio
Тип ввода: Text

Создадим документы, которые будем фильтровать, заодно присвоим им значение TV-параметра radio:
res1 (radio = 'rad1')
res2 (radio = 'rad1')
res3 (radio = 'rad2')
res4 (radio = 'rad2')

Сделаем простейшую форму, которая будет содержать к примеру только radio buttons и собственно окошко, в котором у нас будут отображаться результаты поиска. Форма будет содержать кнопку Submit и Reset.

<form id="search">
<label><input type="radio" name="name1" value="rad1" />Select rad1</label><br />
<label><input type="radio" name="name1" value="rad2" />Select rad2</label><br />
<input type="reset" id="reset" value="Reset" />
<input id="submit-request" type="button" value="Отправить" />
</form>

<div id="result">

</div>
(при желании можно повесить стилей для наглядности)

вот мои:
#result
{
width: 400px;
height: 200px;
margin: 10px;
background-color: #dddddd;
border: 1px solid silver;
}

.each-block
{
margin: 5px;
background-color: greenyellow;

}

В нижнем div у нас будет отображаться результаты отфильтрованного Ditto. Сам ditto сделаем в другом документе. 
Создадим шаблон документа, в котором будут выдаваться результаты Ditto с фильтром:

[!Ditto? &parents=`1` &tpl=`tpl-ditto-searchresult` &extenders=`request`!]

Повесим его на документ, у которого будет URL = search-result.html

Шаблон для Ditto взял элементарный:

<div class="each-block">
[+pagetitle+]

</div>

Теперь собственно сам Ajax:

Подключим jQuery
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>

Скрипт для Submit и Reset:
<script type="text/javascript">
$(document).ready(function(){
$("#submit-request").click(function(){
var radio = $('input[name="name1"]:checked').val();
$('#result').load('search-result.html', 'ditto_filter=radio,'+radio+',2')
});
$("#reset").click(function(){
$('#result').load('search-result.html', '');
});
});

</script>

Немного из учебника:
Синтаксис:
$("селектор").load(url,данные,функция)
селектор выбирает элемент, в котором будет отображен результат AJAX запроса.
url адрес, на который будет отправлен AJAX запрос.
данные является необязательным параметром. Данные, которые будут переданы вместе с запросом.

функция является необязательным параметром. Функция, которая будет вызвана после выполнения запроса.

суббота, 17 августа 2013 г.

Нет изображения? Отобразить дефолтное

При необходимости отобразить внутри шаблона(темплейта) ditto дефолтное изображение, в случае если поле TV с изображением пустое.

Делаем обычный вызов ditto

[!Ditto? &tpl=`tpl-ditto-mytemplate`!]

Само изображение будет находится в TV параметре. Здесь без излишков делаем просто имя image и тип image

И в самом шаблоне дитто (с именем tpl-ditto-mytemplate) мы сможем его вызвать просто:

[+image+]

Для работы схемы которую я предлагаю нам необходим сниппет PHx. Допустим его поставили и всё работает.

Мы делаем следующий вызов:

[+phx:if=`[+image+]`:ne=``:then=`<img src="[(site_url)][+image+]" alt="" />`:else=`<img src="[(site_url)]{{default-ava-path}}" alt="" />`+]

В моем случае я сделал вызвал путь к дефолтному изображению из чанка {{default-ava-path}}
Т.е. там написано что-то примерно следующее: assets/images/no-ava.jpg

среда, 16 января 2013 г.

Сортировка в evoGallery

Была проблема с сортировкой в EvoGallery! В админке, после загрузки фотографий в галерею, не возможно было их упорядочить в нужном для пользователя порядке. Причем сортировка некоторых изображений работала, а некоторые после применения изменений возвращались на прежние места.
Проблема решилась после проверки БД. Получается фотографий было очень много (более 128 штук) и при загрузке им в БД присваивался id в поле sortorder. У sortorder был тип init (который вмещает всего 128 значений). В результате в базе лежало несколько фотографий со значением sortorder = 127. Проблема была решена изменением типа для sortorder с init на int.

воскресенье, 9 декабря 2012 г.

Не работал phx

Редактировал сайт и изредка заливал его на лайв. После того, как заказчик занес в базу несколько товаров я решил актуализировать сайт у себя на локальной машине. Перенёс базу, картинки, запускаю, всё работает. Отказывается работать phx-плагин. Лайв проверяю - там всё ок.

Как оказалось проблема была в том, что пути я не сбросил.

Мораль: сбрасывайте в конфиге пути к файлам.

понедельник, 19 ноября 2012 г.

WebSignup не видит все поля (в частности номер телефона)

Оригинал статьи http://community.modx-cms.ru/blog/questions/8077.html

При регистрации пользователя, в форме заполняю поля телефон, адрес, но они не сохраняются. Сохраняется только полное имя.
В чем может быть причина?

Решил вопрос так: в файле assets/snippets/weblogin/websignup.inc.php после (примерно 36 строка)
$zip = $modx->db->escape($modx->stripTags($_POST['zip']));
добавил
$phone = $modx->db->escape($modx->stripTags($_POST['phone']));
Затем в секции // load template section #1 добавил
$tpl = str_replace("[+phone+]",$phone,$tpl);
Затем заменил
$sql = "INSERT INTO ".$modx->getFullTableName("web_user_attributes")." (internalKey, fullname, email, zip, state, country) 
            VALUES($key, '$fullname', '$email', '$zip', '$state', '$country');";
на
$sql = "INSERT INTO ".$modx->getFullTableName("web_user_attributes")." (internalKey, fullname, email, zip, phone, state, country) 
            VALUES($key, '$fullname', '$email', '$zip', '$phone', '$state', '$country');";

Точно также для поля адрес.
Теперь поля сохраняются.

четверг, 31 мая 2012 г.

Два независимых меню на странице

Несколько раз сталкивался с необходимостью реализовать два меню на одной странице, захотелось создать универсальное решение.

Задача: необходимо сделать меню вида:

Товары

  • Одежда
  • Обувь
  • Головные уборы

Статьи

  • Выбор аксесуаров
  • Качество


Решение:

!Необходимо установить PHx
В админке создаем следующие документы:

  Магазин
    -одежда
    -обувь
    -головные уборы
    +Статьи                    //делаем ресурс неактивным для отображения в меню
       -выбор аксесуаров
       -качество

Для ресурса Магазин делаем 2 tv параметра.
menu-title    Статьи
menu-cell     [[Wayfinder? &startId=`24`]] //сюда жестко прописываем id ресурса, который содержит пункты доп. меню.
В поле [*longtitle*] прописываем заголовок нашего меню.

Далее нам нужно будет создать 3 шаблона для страниц. Опишу листинги меню.

Первый для главной страницы (Магазин).

<div>
  <h2>[*longtitle*]</h2>

    <ul>
      [!Wayfinder? &startId=`[*id*]`!]
    </ul>

  <h2>[*menu-title*]</h2>

    <ul>
      [*menu-cell*]
    </ul>

</div>

Второй шаблон для пунктов первого меню (Одежда, Обувь, Головные уборы).

<div>

  <h2>[*id:parent=`longtitle`*]</h2>

    <ul>
      [!Wayfinder? &startId=`[*parent*]`!]
    </ul>

  <h2>[!GetField? &docid=`[*parent*]` &field=`menu-title`!]</h2>

    <ul>
      [!GetField? &docid=`[*parent*]` &field=`menu-cell`!]
    </ul>

</div>

Третий шаблон для пунктов второго меню (Выбор аксесуаров, Качество).

<div>

  <h2>[*parent:parent=`longtitle`*]</h2>

    <ul>
      [!Wayfinder? &startId=`[*parent:parent=`id`*]`!]
    </ul>

  <h2>[*id:parent='pagetitle'*]</h2>

    <ul>
      [!Wayfinder? &startId=`[*parent*]`!]
    </ul>

</div>

суббота, 21 апреля 2012 г.

Восстановление пароля к manager

Допустим случилось самое страшное. Вы забыли пароль для managera, превышено число попыток зайти на сайт, а запрет пропадает через пару веков.

1. Можно поменять пароль для юзера

update modx_manager_users set password = md5('blabla') where username='admin'

Таким образом мы установим для пользователя admin пароль blabla

2. Пароль поменяли. Но пытаясь вспомнить пароль мы превысили число допустимых попыток зайти на сайт. Для этого нам нужно

update modx_user_attributes set blockeduntil = '0' where id='1'

Или другими словами в базе данных меняем значение поля blockeduntil на ноль.