Всем доброгов времени суток.
Вариант задачи 1.
Вопрос встал такой:
Два поля с опциией чекбокс (может ещё третью опции но это позже главное понять как две задать). Для фирмы и для частника.
Отобразить в ноде или в блоке список городов и второй список с городами а в третьем поле будет выведена цена доставки.
Как я понял это что то надо копать с полями но видимо ещё и какие то правила надо задавать? Кто подскажет как быстрее? Может фильтрами быстрее с таксономией... но там же нет соответствия...
Вариант задачи 2.
Опции остаются фирма и частник
Аноним сам в этом блоке в поле может ввести название города и сам же задать город доставки и ему отобразиться то что соответсвует эти двум критериям.
Тут уже сто то с поиском мутить надо или тоже фильтром... но как это сделать?
Спасибо
Комментарии
Вариант задачи 1, можно более развёрнуто ?
Люди заходят на ноду без регистрации просто анонимы или может через блок как то сделать... снизу где нить присандалить.. (но не на всех нодах такое). Там находитсья две опции для частного лица и для фирмы третья для вип (воообщем то просто скидка). Третью пока можно опустить.
Далее два списка откуда из города и второй список куда в город... после выбора выводиться стоимость там же рядом.
как-то так
Думаю надо двигаться в этом направлении.
<?php function MYMODULE(){
$form['price'] = array(
$form = drupal_get_form('MYMODULE_example_city_form');
$form = drupal_render($form);
return $form;
}
function
MYMODULE_example_city_form($form, &$form_state) {$form['city_from'] = array(
'#title' => 'Из города:',
'#type' => 'select',
'#options' => array(0 => '-выберите город-', 1 => 'Город-1', 2 => 'Город-2', 3 => 'Город-3', 4 => 'Город-4'),
'#default_value' => '0',
'#ajax' => array(
'callback' => 'MYMODULE_example_city_form_callback',
'wrapper' => 'price-div',
'progress' => array('type' => 'none'),
'effect' => 'fade',
),
);
$form['city_to'] = array(
'#title' => 'В город:',
'#type' => 'select',
'#options' => array(0 => '-выберите город-', 1 => 'Город-1', 2 => 'Город-2', 3 => 'Город-3', 4 => 'Город-4'),
'#default_value' => 0,
'#ajax' => array(
'callback' => 'MYMODULE_example_city_form_callback',
'wrapper' => 'price-div',
'progress' => array('type' => 'none'),
'effect' => 'fade',
),
);
'#prefix' => '<div id="price-div">',
'#markup' => MYMODULE_example_price_callback($form, $form_state),
'#suffix' => '</div>',
);
return
$form;}
function
MYMODULE_example_city_form_callback($form, $form_state) {return $form['price'];
}
function
MYMODULE_example_price_callback($form, $form_state) { // <<<<< функция подсчёта ценыif ($form_state['values']['city_from'] > 0 AND $form_state['values']['city_to'] > 0) {
return 'Цена: из города '.$form_state['values']['city_from'].' в город '.$form_state['values']['city_to'];
}
}
?>
Тоесть мне надо создать тип контента и шаблон к нему... и вот эту штуку вставить в шаблон?
Или это всё таки форма. Или это воообщем получается молуль....
Это модуль и это как одно из решений задачи...
спасибо конечно... ещё бы понять как его использовать.... он сам таблицу в базе данных создаст?
Я сам не программист я думал есть возможность стандартными средствами создать...
- В базе он ничего не создаст.
Можно ещё воспользоваться модулем https://www.drupal.org/node/149228]Computed Field">Computed">https://www.drupal.org/node/149228]Computed Field
но все равно для Вашей задачи потребуется знание php
тоесть массив данных будет храниться прям в текстовом фаиле - php? Это как то не очень... это если будет 5 городов то да... а если 60 000?
Начнём с простого как отобразить в ноде список не регистрируясь... это вообще возможно?
Нельзя как то просто через базу сдлеать? постгре желательно. Вывод информации он же достаточно простой а базу я заполню сам.
http://xandeadx.ru/blog/drupal/88
https://www.drupal.org/developing/api/database
Но разбираться тут долго не программеру...
Нет.
Список городов может храниться в ДБ, только надо знать, как она выглядит и какая логика будет при подсчете цены.
если база вида:
city_db:
|city_id |city_name |
|--------|----------|
|1 |Город-1 |
|2 |Город-2 |
|3 |Город-3 |
|4 |Город-4 |
---------------------
то чтобы её "перенести" в массив то функция будет такая:
<?phpfunction MYMODULE_city_array(){
$city_db = db_select('city_db', 'n')
->fields('n', array('city_id','city_name'))
->orderBy('n.city_id', 'ASC')
->execute();
$result_none['_none'] = '-выберите город-';
$result_str = array_keys($city_db->fetchAllKeyed());
$result = array_merge($result_none, $result_str);
return $result;?>
Чтобы массив городов попал в список, надо подставить получившийся массив в наш селектор:
<?php
$form['city_from'] = array(
'#title' => 'Из города:',
'#type' => 'select',
'#options' => MYMODULE_city_array(), // <--- массив городов
'#default_value' => '_none', // <--- дефолтное значение
'#ajax' => array(
'callback' => 'MYMODULE_example_city_form_callback',
'wrapper' => 'price-div',
'progress' => array('type' => 'none'),
'effect' => 'fade',
),
);?>
над логикой базы я подумаю...
Как мне его в ноде то вывести? Причём в определённой ноде...
PHP в самой ноде ругается токен.
идём сюда "\sites\all\modules\"
создаем каталог "Custom_city_module"
в каталоге "Custom_city_module" создаём два файла: "city_module.info" и "city_module.module"
содержимое файла "city_module.info":
<?php
name = Custom_city_module(city_module.module)
description = Rendering city selector and price in ajax.
package = Custom Module
core = 7.x
?>
содержимое файла "city_module.module":
<?php
$form['price'] = array(
function city_module(){
$form = drupal_get_form('city_module_form');
$form = drupal_render($form);
return $form;
}
function
city_module_form($form, &$form_state) {$form['city_from'] = array(
'#title' => 'Из города:',
'#type' => 'select',
'#options' => array(0 => '-выберите город-', 1 => 'Город-1', 2 => 'Город-2', 3 => 'Город-3', 4 => 'Город-4'),
'#default_value' => '0',
'#ajax' => array(
'callback' => 'city_module_form_callback',
'wrapper' => 'price-div',
'progress' => array('type' => 'none'),
'effect' => 'fade',
),
);
$form['city_to'] = array(
'#title' => 'В город:',
'#type' => 'select',
'#options' => array(0 => '-выберите город-', 1 => 'Город-1', 2 => 'Город-2', 3 => 'Город-3', 4 => 'Город-4'),
'#default_value' => 0,
'#ajax' => array(
'callback' => 'city_module_form_callback',
'wrapper' => 'price-div',
'progress' => array('type' => 'none'),
'effect' => 'fade',
),
);
'#prefix' => '<div id="price-div">',
'#markup' => city_module_price_callback($form, $form_state),
'#suffix' => '</div>',
);
return
$form;}
function
city_module_form_callback($form, $form_state) {return $form['price'];
}
function
city_module_price_callback($form, $form_state) { // <<<<< функция подсчёта ценыif ($form_state['values']['city_from'] > 0 AND $form_state['values']['city_to'] > 0) {
return 'Цена: из города '.$form_state['values']['city_from'].' в город '.$form_state['values']['city_to'];
}
}
?>
Если все правильно сделано, то в списке модулей появится "Custom_city_module(city_module.module)" - включаем.
После в ноде добавляем PHP-код <?php print render(city_module()); ?>
ругается на токен...
Warning: strip_tags() expects parameter 1 to be string, array given in _metatags_quick_add_head() (line 501 of /var/www/modules/metatags_quick/metatags_quick.module).
И ещё вот что появлятся на странице модулей..
Notice: Undefined index: name in system_sort_modules_by_info_name() (line 949 of /var/www/modules/system/system.admin.inc).
Notice: Undefined index: name in system_sort_modules_by_info_name() (line 949 of /var/www/modules/system/system.admin.inc).
Notice: Undefined index: name in system_sort_modules_by_info_name() (line 949 of /var/www/modules/system/system.admin.inc).
Notice: Undefined index: name in system_sort_modules_by_info_name() (line 949 of /var/www/modules/system/system.admin.inc).
Notice: Undefined index: name in system_sort_modules_by_info_name() (line 949 of /var/www/modules/system/system.admin.inc).
Notice: Undefined index: name in system_sort_modules_by_info_name() (line 949 of /var/www/modules/system/system.admin.inc).
Warning: uasort(): Array was modified by the user comparison function in system_modules() (line 800 of /var/www/modules/system/system.admin.inc).
Notice: Undefined index: name in _system_modules_build_row() (line 986 of /var/www/modules/system/system.admin.inc).
Я кстати сначала так и сделал тот код запихнул в модулс но только не сайтс\олл а напрямую в каталог модульс... тоже тогда на токен ругался
Он то включался но только не понятно что сним делать было... теперь ясно но теперь он не работает.
врубил ПХП фильтер ... показывает голую страницу...выводиться только содержание ноды... на белом фоне... но из модуля ничего не выводиться...
шаблон надо делать... это ерунда но как вывести инфу...
Работает в корневой модулей , но вот это выдаёт... в админке...
Strict warning: Only variables should be passed by reference in eval() (line 6 of /var/www/modules/php/php.module(80) : eval()'d code).
Notice: Undefined index: values in city_module_example_price_callback() (line 50 of /var/www/modules/city/city_module.module).
Strict warning: Only variables should be passed by reference in eval() (line 6 of /var/www/modules/php/php.module(80) : eval()'d code).
Warning: preg_match_all() expects parameter 2 to be string, array given in token_scan() (line 124 of /var/www/includes/token.inc).
Warning: strip_tags() expects parameter 1 to be string, array given in _metatags_quick_add_head() (line 501 of /var/www/modules/metatags_quick/metatags_quick.module).
вот это в ноде
Strict warning: Only variables should be passed by reference in eval() (line 6 of /var/www/modules/php/php.module(80) : eval()'d code).
хмм...
перед
<?php
function city_module(){
$form = drupal_get_form('city_module_form');
$form = drupal_render($form);
return $form;
}
?>
добавь вот это
<?php
function city_module_menu() {
$items['city_module/page'] = array(
'page callback' => 'city_module',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
return $items;
}
?>
и зайди по пути sitename.com/city_module/page
запихнул в корень модулей...
preview в админке..
Strict warning: Only variables should be passed by reference in eval() (line 6 of /var/www/modules/php/php.module(80) : eval()'d code).
Notice: Undefined index: values in city_module_example_price_callback() (line 59 of /var/www/modules/city/city_module.module).
Strict warning: Only variables should be passed by reference in eval() (line 6 of /var/www/modules/php/php.module(80) : eval()'d code).
Warning: preg_match_all() expects parameter 2 to be string, array given in token_scan() (line 124 of /var/www/includes/token.inc).
Warning: strip_tags() expects parameter 1 to be string, array given in _metatags_quick_add_head() (line 501 of /var/www/modules/metatags_quick/metatags_quick.module).
НА странице для анонима или при администрировании
Strict warning: Only variables should be passed by reference in eval() (line 6 of /var/www/modules/php/php.module(80) : eval()'d code).
До того сделал крон, вкл/выкл модуль и очистил кеш.
Может прямо из базы как то взять?
Так то он вроде работает только опции нет сверху... и вот эта ошибка
Придумал структуру базы данных.
Опции для частника и для предпринимателя.
|------------|-------|---------|
| city_id | price | zone_id |
|------------|-------|---------|
| Город - 1 | 60 | 1 |
|------------|-------|---------|
| Город - 2 | 80 | 1 |
|------------|-------|---------|
| Город - 3 | 90 | 2 |
|------------|-------|---------|
| Город - 4 | 100 | 3 |
|------------|-------|---------|
Логика такая..
Список 1 и списко 2 одинаковый из country_id
Если выбрана опция для частника.
1. Если Город из списка 1 и город из списка 2 имеет один и тот же zone_id то отобразить price для второго списка.
2. Если город из списка 1 и город из списка 2 имеет разный zone_id отобразить price который имеет большее значение zone_id
Для предпринимателя
1. Если Город из списка 1 и город из списка 2 одинаковые zone_id то отобразить price как сумму цен первого и второго. Если разные то тоже сумму из первого и второго.
Мда мыслю я как программист но пыха не знаю.... Как выбрать определённую таблицу из базы данных?
city_module.module - я поправил, перепиши его.
и можно скрин в студию с селекторами
сначала надо добить чтобы работал так. К БД прикрутить это не есть проблема.
Какие то ограничения на ПХП походу....
хз что за ошибка
ладно...
после функции city_module()
добавь вот это:
<?php
function city_array_id(){
$city_array = db_select('ТУТ_УКАЗАТЬ_БД', 'n')
->fields('n', array('city_id'))
->execute();
$result_none['_none'] = t('None');
$result_str = array_keys($city_array ->fetchAllKeyed());
$result = array_merge($result_none, $result_str);
return $result;
?>
в $form['city_from'] и $form['city_to']
измени значение:
<?php
'#options' => array(0 => '-выберите город-', 1 => 'Город-1', 2 => 'Город-2', 3 => 'Город-3', 4 => 'Город-4'),
'#default_value' => '0',
?>
на:
<?php
'#options' => city_array_id(),
'#default_value' => '_none',
?>
Теперь города будут браться из БД(которую ты указал ранее).
А конкретную таблицу задавать или он сам найдёт?
Вопрос про опцию для частника и для ВИП открыт
PDOException: SQLSTATE[42P01]: Undefined table: 7 ERROR: relation "drupal" does not exist LINE 3: drupal n ^: SELECT n.city_id AS city_id FROM {drupal} n; Array ( ) in city_array_id() (line 21 of /var/www/sites/all/mod
Вместо базы указал таблицу
PDOException: SQLSTATE[42501]: Insufficient privilege: 7 ERROR: permission denied for relation price: SELECT n.city_id AS city_id FROM {price} n; Array ( ) in city_array_id() (line 21 of /var/www/sites/
текс добавил доступ к таблице но вышло вот это
Notice: Undefined offset: 1 in DatabaseStatementBase->fetchAllKeyed() (line 2212 of /var/www/includes/database/database.inc).
Notice: Undefined offset: 1 in DatabaseStatementBase->fetchAllKeyed() (line 2212 of /var/www/includes/database/database.inc).
В коде заменил FetchALL но это не совсем правильно потому что терь он высвечивает порядковый номер а не название города..... добавил все поля... теперь только ошибка всё таже PHP о котороый ты не знаешь....
Правильно ли я понял что массива цены то нет? Он не видит цену