Вывод в ноде или блоке определённого поля если из списка выбрано.

Главные вкладки

Аватар пользователя eureur.eu eureur.eu 25 октября 2014 в 19:24

Всем доброгов времени суток.

Вариант задачи 1.
Вопрос встал такой:
Два поля с опциией чекбокс (может ещё третью опции но это позже главное понять как две задать). Для фирмы и для частника.
Отобразить в ноде или в блоке список городов и второй список с городами а в третьем поле будет выведена цена доставки.

Как я понял это что то надо копать с полями но видимо ещё и какие то правила надо задавать? Кто подскажет как быстрее? Может фильтрами быстрее с таксономией... но там же нет соответствия...

Вариант задачи 2.
Опции остаются фирма и частник
Аноним сам в этом блоке в поле может ввести название города и сам же задать город доставки и ему отобразиться то что соответсвует эти двум критериям.

Тут уже сто то с поиском мутить надо или тоже фильтром... но как это сделать?

Спасибо

Комментарии

Аватар пользователя eureur.eu eureur.eu 25 октября 2014 в 20:07

Люди заходят на ноду без регистрации просто анонимы или может через блок как то сделать... снизу где нить присандалить.. (но не на всех нодах такое). Там находитсья две опции для частного лица и для фирмы третья для вип (воообщем то просто скидка). Третью пока можно опустить.
Далее два списка откуда из города и второй список куда в город... после выбора выводиться стоимость там же рядом.

Аватар пользователя meles meles 25 октября 2014 в 21:22

как-то так Smile
Думаю надо двигаться в этом направлении.

<?php

function MYMODULE(){
$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(=> '-выберите город-'=> 'Город-1'=> 'Город-2'=> 'Город-3'=> 'Город-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(=> '-выберите город-'=> 'Город-1'=> 'Город-2'=> 'Город-3'=> 'Город-4'),
    
'#default_value' => 0,
    
'#ajax' => array(
      
'callback' => 'MYMODULE_example_city_form_callback',
      
'wrapper' => 'price-div',
      
'progress' => array('type' => 'none'),
      
'effect' => 'fade',
    ),
  );

    

$form['price'] = array(
        
'#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'] > AND $form_state['values']['city_to'] > 0) {
return 
'Цена: из города '.$form_state['values']['city_from'].' в город '.$form_state['values']['city_to'];
}
}
?>
Аватар пользователя eureur.eu eureur.eu 26 октября 2014 в 19:46

Тоесть мне надо создать тип контента и шаблон к нему... и вот эту штуку вставить в шаблон?

Или это всё таки форма. Или это воообщем получается молуль....

Аватар пользователя eureur.eu eureur.eu 27 октября 2014 в 12:22

спасибо конечно... ещё бы понять как его использовать.... он сам таблицу в базе данных создаст?
Я сам не программист я думал есть возможность стандартными средствами создать...

Аватар пользователя eureur.eu eureur.eu 27 октября 2014 в 15:43

тоесть массив данных будет храниться прям в текстовом фаиле - php? Это как то не очень... это если будет 5 городов то да... а если 60 000?

Начнём с простого как отобразить в ноде список не регистрируясь... это вообще возможно?

Нельзя как то просто через базу сдлеать? постгре желательно. Вывод информации он же достаточно простой а базу я заполню сам.
http://xandeadx.ru/blog/drupal/88
https://www.drupal.org/developing/api/database

Но разбираться тут долго не программеру...

Аватар пользователя meles meles 27 октября 2014 в 17:55

eureur.eu wrote:
тоесть массив данных будет храниться прям в текстовом фаиле - php?

Нет.
Список городов может храниться в ДБ, только надо знать, как она выглядит и какая логика будет при подсчете цены.

если база вида:
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',
    ),
  );
?>
Аватар пользователя eureur.eu eureur.eu 27 октября 2014 в 18:35

над логикой базы я подумаю...
Как мне его в ноде то вывести? Причём в определённой ноде...
PHP в самой ноде ругается токен.

Аватар пользователя meles meles 27 октября 2014 в 21:59

идём сюда "\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
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(=> '-выберите город-'=> 'Город-1'=> 'Город-2'=> 'Город-3'=> 'Город-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(=> '-выберите город-'=> 'Город-1'=> 'Город-2'=> 'Город-3'=> 'Город-4'),
    
'#default_value' => 0,
    
'#ajax' => array(
      
'callback' => 'city_module_form_callback',
      
'wrapper' => 'price-div',
      
'progress' => array('type' => 'none'),
      
'effect' => 'fade',
    ),
  );

    

$form['price'] = array(
        
'#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'] > 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()); ?>

Аватар пользователя eureur.eu eureur.eu 28 октября 2014 в 1:33

ругается на токен...

    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).

И ещё вот что появлятся на странице модулей..

    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).
    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).

Я кстати сначала так и сделал тот код запихнул в модулс но только не сайтс\олл а напрямую в каталог модульс... тоже тогда на токен ругался

Он то включался но только не понятно что сним делать было... теперь ясно но теперь он не работает.

врубил ПХП фильтер ... показывает голую страницу...выводиться только содержание ноды... на белом фоне... но из модуля ничего не выводиться...

шаблон надо делать... это ерунда но как вывести инфу...

Работает в корневой модулей , но вот это выдаёт... в админке...

    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).
    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).

вот это в ноде

    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).
Аватар пользователя meles meles 27 октября 2014 в 22:07

хмм...
перед

<?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

Аватар пользователя eureur.eu eureur.eu 28 октября 2014 в 1:29

запихнул в корень модулей...

preview в админке..

    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).
    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).

НА странице для анонима или при администрировании

    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).

До того сделал крон, вкл/выкл модуль и очистил кеш.

Может прямо из базы как то взять?

Так то он вроде работает только опции нет сверху... и вот эта ошибка

Аватар пользователя eureur.eu eureur.eu 28 октября 2014 в 14:01

Придумал структуру базы данных.

Опции для частника и для предпринимателя.

|  var128    | real  |  int2   |
|------------|-------|---------|
|  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 как сумму цен первого и второго. Если разные то тоже сумму из первого и второго.

Мда мыслю я как программист но пыха не знаю.... Как выбрать определённую таблицу из базы данных?

Аватар пользователя meles meles 28 октября 2014 в 20:01

city_module.module - я поправил, перепиши его.
и можно скрин в студию с селекторами

eureur.eu wrote:
Как выбрать определённую таблицу из базы данных?

сначала надо добить чтобы работал так. К БД прикрутить это не есть проблема.

Аватар пользователя meles meles 30 октября 2014 в 9:12

хз что за ошибка
ладно...
после функции 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(=> '-выберите город-'=> 'Город-1'=> 'Город-2'=> 'Город-3'=> 'Город-4'),
'#default_value' => '0',
?>

на:

<?php
'#options' => city_array_id(),
'#default_value' => '_none',
?>

Теперь города будут браться из БД(которую ты указал ранее).

Аватар пользователя eureur.eu eureur.eu 1 ноября 2014 в 20:37

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 о котороый ты не знаешь....

Правильно ли я понял что массива цены то нет? Он не видит цену