Drupal Modules
more_horiz
close

on 02nd March 2016 / by webmaster
Zyxware is happy to announce the release of new modules to the Drupal community. The modules were released in quick succession last month. slick menu : This module returns a theme that can be used for theming menus using the Slick JS Library. The themed menu will be displayed as a horizontal slider. Grid Height Normalizer: This module is suitable for e-commerce sites, where the details of products and services are showcased as tiles laid out on a grid. The different amount of data in each tile resulted in uneven size of the tiles, thus breaking the grid alignment. The Grid Height Normalizer retrieves the size of the biggest tile and applies it to all the other tiles, thus maintaining the grid layout. Image Showcase Block: Ideal for e-commerce sites, Image Showcase Block enables you to showcase the uploaded images in a block. The block for images is created using a slider. The module also offers options to zoom the selected image using the Elevate Zoom jQuery plugin. Multi Level Taxonomy Auto Complete: This module provides a flat taxonomy with hierarchy as auto-complete suggestion for a text field in custom form. The module uses the jQuery token input library for the autocomplete functionality. The appearance of the drop-down and chosen items can be changed by overriding the css. Ajax Pager API: If you are working with custom pages such as reports, or a content listing using custom queries, and want to replace the stock Drupal page with a pager that fetches the paged content using Ajax, this module is just right for you. In addition, this modules pager retains the history of the pages visited by the user from the paged element using Benjamin Lupton's History.js. This enables the users to navigate the previous pages using the browser back and forward buttons. Jquery Upload Fapi: This module helps to utilize the Jquery File Upload plugin in custom forms. The module defines a custom form field widget using the hook_element_info, which can be used in custom forms via code. Two more modules are expected to be released this week. We sincerely appreciate the combined efforts of the developers and the testing team who have made this possible. News Announcements Drupal Modules Leave a reply Your email address will not be published. Required fields are marker *
more_horiz
close

on 25th January 2016 / by abhai.sasidharan
This article is about a few drush commands as well as Linux commands that helped ease my work at times while working on remote servers. Mostly while updating or upgrading. The need for bulk operations in drush is often never met except using complex Linux commands often involving 'sed'. Operations like disable all non-core modules, enable the disabled modules from a list, create a list of all core and non-core modules in use and so on. Before updating or upgrading any site, you must always document all the extensions in the site. The pml command is quite useful to list extensions as shown below. //Lists all non core enabled modules drush pml --no-core --type=module --status=enabled //Lists all enabled core modules drush pml --core --type=module --status=enabled //Lists all disabled non core modules drush pml --no-core --type=module --status=disabled //List all disabled core modules drush pml --core --type=module --status=disabled // List all themes drush pml --type=theme // List modules with available updates. --core --no-core can be specified here as well. drush pm-updatestatusThese same commands can be combined with some useful Linux commands to document the outputs into text files. This will write the module's machine name into the txt file. For more details run "man cat" on your terminal. drush pml --no-core --type=module --status=enabled --pipe | cat > enabled_noncore_modules.txt drush pml --core --type=module --status=enabled --pipe | cat > enabled_core_modules.txt drush pml --no-core --type=module --status=disabled --pipe | cat > disabled_noncore_modules.txt drush pml --core --type=module --status=disabled --pipe | cat > disabled_core_modules.txt drush pml --type=theme --pipe | cat > themes.txt drush pm-updatestatus --pipe | cat > modules_to_update.txtRun "cat <filename>" to output it on terminal. Example "cat list.txt". The --pipe argument is quite useful in providing a piped output to use in the following command. Disable all non-core modules is quite easy. Disabling from a list of modules on the other hand may seem a bit more complex. /* Disable all non-core modules */ drush pml --no-core --type=module --status=enabled --pipe | xargs drush dis -y /* Disable all modules from a text file */ drush dis -y $(cat modules_list.txt) //OR cat > modules_list.txt | drush dis -y // The same can be applied for enabling /* Update all modules from a text file */ drush pm-updatecode $(cat modules.txt) //OR drush dl -y $(cat modules.txt)The command "drush pm-updatestatus" works only in versions above 6. It is recommended to update to a version above this. You can find a simple global installation for latest version of drush here. Drush provides the capability to write nested commands as seen earlier and so does Linux commands. You can mix and match with various commands. drush en -y $(drush pml --no-core --type=module --status=enabled --pipe) drush en -y $(drush pml --no-core --type=module --status=enabled --pipe | xargs cat > module_list.txt) /* The above commands are just for testing, they will work but will not affect the database.*/ Drush Drupal Modules Leave a reply Your email address will not be published. Required fields are marker *
close

on 24th August 2015 / by webmaster
The launch of Drupal 8 is bound to create more than a ripple in the pond. This latest version of Drupal, the world’s most popular enterprise web CMS, hosts around 200 new features and some much-needed advancements. The Drupal community has grown into a gigantic 12 lac+ group that is spread across 229 countries supporting close to 180 languages, which is no mean achievement by itself. In its spanking new avatar, Drupal 8 is going to benefit all those involved in Drupal website development especially those who write APIs or build complex applications and of course, anyone who is yearning for a better mobile interface. The buzz around the launch of Drupal 8 has reached a crescendo and there are a few solid reasons why Drupal 8 can be great for your business. So together, let’s explore what these reasons are: Building multi-language websites is easier: Drupal 8 makes website construction with multi-lingual interface simpler and faster. The major benefits for users and developers include easiness in setting customization, language maintenance alternatives and improvements in site translations. This small but significant addition will surely increase its usability and application. Drupal 8 is more accessible: The provision of centralized controls for Internet applications makes it the most accessible of versions so far. The addition of CKEditor has made HTML editing a breeze for Drupal Theme loyalists across the world. Introduction of Twig: PHP’s popular template engine “Twig”, known for its speed and flexibility, is part of Drupal 8, thus improving the security factor since PHP codes cannot be inserted directly into the templates. As Twig is known for its better logic and display segregation, this greatly enhances the overall effectiveness of Drupal 8. Content Authoring is optimized: The editing feature has been completely revamped in Drupal 8 thus making Drupal Development a lot more easier. Content management has been given the necessary fillip as editors can now edit on the front –end of a site, thus eliminating the need to access its back-end. The introduction of such awesome features is bound to make Drupal 8 a delight to work with, especially for the Drupal website development tech-teams who have been loyally attached to Drupal for long. Ever since its inception in 2006, Zyxware has been developing unique and innovative Drupal-based solutions for different industries including media, education, health care and non-profits. Our stringent observance of Drupal development standards is a sure-fire way of providing our clients with web platforms that are protected, effective and scalable too. We have a pool of extremely talented and experienced Drupal developers who will support you through out the project life cycle. To know more about our Drupal development services, please get in touch with us. For more information on our Drupal development services, please contact us. Drupal Development Drupal Modules Marketing Drupal Leave a reply Your email address will not be published. Required fields are marker *
close

on 20th August 2015 / by webmaster
Drupal has grown to be recognized as the most powerful and practical modular framework used by numerous website developers and business owners. The CMS community has adapted to the versatile and extremely functional structure of Drupal very quickly and Drupal modules have risen high on the must-have charts of web developers. As developer of a Drupal Website, you have such humongous choices and you will do well to take a quick peek into the best ones that are absolutely necessary for Drupal web development. For Developers: Back-up and Migrate: An absolute must-have for developers when it comes to migration through environments, as it allows you to dump the site's database without the cache tables. If your back-ups run on cron runs, this one is ideal for scheduled back-ups. Devel: You can’t do without this debugging tool for sites. Stage File Proxy: Downloading of images on demand is definitely required when you are testing a site locally and this Drupal module exactly does that. For Site Builders: Context: As the block page or admin page has severe curbs due to its unreadability on large sites, Context comes as a real savior as it is much more powerful and allows stuff, other than block placing, like adding body classes to various sections of the site. To top this, it’s also exportable. Date: With view integration as a super feature and JavaScript-based pop-up calendars, this useful Drupal module allows date fields to be included in the content easily. File Field Sources: If you need to add test content to a site or want to source a file from an outside URL, then this is the module you must have in your arsenal. It also allows the site builder to reference a current file from a file field, thus generally making life easier for you. For Better Performance: Memcache: Using this module for Drupal website development is a great advantage, as it helps the site scale and can be used in place of the database for cache tables. Boost: Static page caching for Drupal websites is provided by using Boost and enables scalability boost for attracting anonymous traffic regularly. SEO: MetaTag: This wonderful Drupal module is definitely a must-have on your agenda as it allows adding of Meta tag info on the site and this includes node content. MetaTag has replaced Nodewords which was widely used in Drupal 6 despite its bug issues. SEO Checklist: As a Drupal theme user, you simply cannot do without this Drupal SEO checklist as this versatile module uses the Drupal SEO best practices to check the website for appropriate search engine optimization. Over the past 9 years, Zyxware has been developing innovative and sophisticated Drupal-based solutions for different verticals. Using agile development methodology, we design high-performance websites with integrated features, appropriate for your specific business requirements. We have a pool of professionally qualified and experienced Drupal developers who will support you through out the different phases in the project life cycle. Our fully customized Drupal solutions will help you achieve positive results by considerably enhancing performance, minimizing the project costs and improving business value. If you would like to get more information about our Drupal development services, please contact us. Drupal Development Drupal Modules Marketing Web Development Leave a reply Your email address will not be published. Required fields are marker *
more_horiz
close

on 15th May 2015 / by anju.r
When you test a Drupal website , most of the time you come across the task "Implement Pathauto module" in you website. So before you start testing, you have to build an idea of what is Pathauto module and how you can test it. Pathauto, as its name suggests automatically generates user friendly URLs. Pathauto depends on the core module path, which is used to rename URLs. So please go through the explanation below to understand it more precisely. Pathauto module is implemented for generating friendly URLs for your contents such as nodes, taxonomy terms, users etc. This is generated automatically. This allows you to create URL aliases like /category/your-node-title instead of /node/1. These aliases are based upon a "pattern" system that uses tokens which the administrator can change. The modules enabled are Pathauto and Tokens. Cases to be tested Check whether the url of the content is like /category/your-node-title instead of /node/1 while creating content. How to test this? Click content--> Add content Create any of the content where pathauto module is applied. Check whether the url is created as such as website/node/2. (ie node/2 will be replaced by the pattern) Check the above case for all the contents. Check whether the url displayed is same for all users. Hope this article helps you to test the function more clearly. Happy testing. Drupal Drupal Modules Drupal Testing Leave a reply Your email address will not be published. Required fields are marker *
close

on 09th March 2015 / by arjun.s
CiviCRM is an open source tool which provides a web-based interface for Constituent Relationship Management. The main advantage is that it could be coupled with the Drupal environment (or any other CMS) and used as a Relationship management tool. Using the functionalities we can handle the relationships with the people, households, organizations etc. It also help us to create events, make personalised campaigns, make contributions etc. This article helps you to understand the basics of the CiviCRM module in Drupal and the basic usage of the same. Downloading and installing CiviCRM module You can get the details about the CiviCRM module from here. But you cannot download it directly from there, go to the specified link of Sourceforge.net project page of CiviCRM and download the latest version from there. Install it usually as installing a drupal module. But which is not enough, after copying the module folder to the custom module folder of your drupal installation and enabling the module you have to run the install.php of the CiviCRM separately, it would be specified to you at the CiviCRM home page. At the time of installation you will need a separate database for the CiviCRM module, since all the data of the CiviCRM system is stores into a separate database. Specify your custom database and install the CiviCRM as per the instructions. Now you are ready to go. The Module creates a new menu in the navigation menu, you can use the CiviCRM homepage through that link. Another advantage is that the system will fill the database with dummy data which is realy helpful in identifying the total working of the system. When you are at the CiviCRM homepage it provides a custom dashboard menu for accessing all the features of the CiviCRM system. Managing Contacts. Adding a new contact. A contact is a main part of a CRM system. Here we will store the information to contact a person (student, parent or staff) or a Household (Family information) or an Organization (Team or sponsor). Adding any of these includes entering all the related information like Contact details, address, communication preferences, notes, tags and groups etc. All these information's could be used to contact the specified person, group or organisation. Contact reports. Another option in contact menu is Contact reports, which will easily create reports on contact information like constituent summary, constituent detail, activities, current employees, relationships (between 2 contacts) etc. Listing contacts The contacts could be listed or searched from the Search->Find contacts menu. We can also use the advanced search or the full-text search or the search builder to build our own queries for advanced search options. After listing the contacts we can add relationship between 2 contacts. We can define new custom relationship from the menu Administer->Customise Data and Screens->Custom Fields. These relationships will help us to keep up a real world relationship in this System also. From the listed contacts we can select multiple contacts and do a list of predefined actions on either the selected records or for all the records. The search criteria could be edited at any time from the top area of the results listing page. Adding a new activity A new activity could be created and with a particular contact and we can also optionally assign the activity to another contact. These assigned activities will appear in the activity listing menu in their home. The status of the activity can also be specified which will help the users to track the status of the activity. Another option related to new activity is adding new email, here we can actually send a new email to some other contact in our contact list. We can select our own mail template which is already defined. Importing contacts or activities. Another option is that we can import contacts or activities from a specified file in any if the format like csv or sql query. Managing Groups We can create a group to which we can add contacts in the contact listings page. Manage tags We can create and manage tags here. These tags could be used for faster grouping ir searching of the contacts, activities, cases, attachments etc. Find and merge duplicate contacts This option could be used for finding and merging of the duplicate contacts present in the system. Contributions This part will handle the contributions to the various campaigns, events etc from various people and organisations. Managing contributions We can manage contributions through multiple menu items. We can create a new contribution from some of the existing contact or can create a new contact on the fly. For payment enter the payment and go ahead. This is like manually entering the details of a contribution made by some person or organization. The transaction id and/or check numbers could be entered also. We can also import contribution details from files. It allows you to import contributions details entered in other systems. The only constraint is that the file format is csv. Managing pledges Here pledges could be made by donors to pay a specific amount and pay an amount it at specific intervals to complete the total. Managing contribution pages Here we can manage the contribution pages. A contribution page sets the title, goal amount, start and end date of the contribution etc. A contribution page indicates about a reason where the persons can give to, eg:Member sign up and renewal, help and support etc. We can have many options in contribution pages like setting a widget, tell a friend etc. Manage personal Campaign page We can create personal campaign pages for events, contribution pages etc to help support them and can manage these campaign pages. The contributors like to give can give to the personal campaign pages. Manage price sets We can create price sets which could be applied to the various contribution pages. Different price sets could be used for different contribution pages or events as a predefined amount sets. Drupal Modules Drupal 7 CiviCRM Leave a reply Your email address will not be published. Required fields are marker *
more_horiz
close

on 19th January 2015 / by jibin.jose
This article will be explaining how to add a scroll bar for a Drupal block.There are certain circumstances, where we need to add scroll bars with a block. If you come across this situation please go through the full article. I have faced a situation to add a scroll bar inside a Drupal block for displaying an article title along with content in a trimmed format. Drupal block already has options to display a number of items inside the block. But if we display all in a single block it will be a big block and is it was not our requirement. If we want to display a block with a particular height you can use the below ideas. First thing we need to do is download jscrollpane libraries(jquery.jscrollpane.css,jquery.jscrollpane.min.js, jquery.mousewheel.js and mwheelIntent.js). You can download the file by clicking on jscrollpane download. Create a new folder jscroll pane inside the libraries folder and put the first three file there. Create another folder js inside the jscrollpane and put the mwheelIntent.js inside that js folder. The next thing is some theme change for getting the scroll bar. For example, if you want to apply the .jScrollPane() function to the field-name-body add the below line inside the css file .field-name-body { height: 200px; overflow: auto; } The above document will create a scroll bar for the given block There is also a drupal module scrollbar. Download the module here and extract the module inside the module folder. Enable the module. Go to admin/config/user-interface/scrollbar and configure as you want. In the configuration there is an option to add Elements to get the jScrollPane function Also configuration option to Show arrows for scrollbar.By this we can use scroll bar with or without arrow The above documents works for me. Hope this helps you too. Also advanced option as well as vertical and horizontal configuration available Drupal Drupal Modules Drupal Views Leave a reply Your email address will not be published. Required fields are marker *
more_horiz
close

on 09th January 2015 / by jacob.john
Consider the situation that you are using the fancy box module in your drupal 7 site and you have to display the images when clicked on in a pop-up.You just need to follow the steps mentioned below which can guide you through the various procedures. Install and enable the Libraries API ,the jQuery Update module and the fancyBox module. Go to admin/config/development/jquery_update and select the jQuery version to 1.7 or above. Download the fancyBox plugin and extract the directory into sites/all/libraries. To configure your image fields to use fancyBox, go to admin/structure/types and click "manage display" link next to the content type of your choice. Under the "format" column, select "fancyBox" next to the image field. You may also configure the options for this field. Now when the image added using the content-type will be displayed with the fancybox pop-up when clicked on the image. Drupal Drupal Modules Drupal 7 Leave a reply Your email address will not be published. Required fields are marker *
more_horiz
close

on 18th December 2014 / by thomas.john
This article will be explaining a module we implemented in site Free Drupal Themes, its called Theme Switcher. This module helps in switching between any enabled themes without logging in. In previous article How to enable multiple themes using command promte? I had explained how to enable multiple themes using drush. When we create a custom module to be in order first create a folder named "fdt_theme_switcher" in "sites/all/modules". Now lets start with info file named "fdt_theme_switcher.info". Here we are naming the module as FDT Theme Switcher for drupal 7. Also calling a css named "bar.css" for styling the block. /*fdt_theme_switcher.info*/ name = FDT Theme Switcher description = Enables the theme switching functionalities. package = FDT version = VERSION core = 7.x stylesheets[all][] = css/bar.cssNow lets create our module file named "fdt_theme_switcher.module". First will create a hook function called hook_page_build(). In this will call the function fdt_theme_switcher_generate(), to get theme switcher form. To display this in page top we assign it to variable '$page['page_top']['theme_switcher']'. $pagetop is displayed in sytem module html.tpl.php file. In fdt_theme_switcher_generate() it will return the form as a string. Will be calling the necessory js files also here. /** * Implements hook_page_build(). */ function fdt_theme_switcher_page_build(&$page) { //if(!user_access('administer')){ if(user_is_anonymous()){ $page['page_top']['theme_switcher'] = array( '#markup' => fdt_theme_switcher_generate()); drupal_add_js(drupal_get_path('module', 'fdt_theme_switcher').'/js/themeSwitcher.js'); } } /** * themeSwitcher.js */ (function ($) { Drupal.theme_switcher = Drupal.theme_switcher || {}; Drupal.behaviors.theme_switcher = { attach: function () { $('select#edit-theme').change(function() { $(this).closest("form").submit(); }); } }; })(jQuery);In fdt_theme_switcher_generate() its gets the value of current theme, and display theme switcher form. function fdt_theme_switcher_generate() { global $current_theme; $fdtpath="http://www.freedrupalthemes.net/customize-theme?n=$current_theme"; $output=""; $output.="<div id='top-bar'>"; $output.='<h2>Customize this theme</h2>'; $output.="<div id='top-bar-sub'>"; $output.=/*"Select a theme".*/drupal_render(drupal_get_form('fdt_theme_switcher_themeswitcher_form')); $output.="</div>"; $output.="</div>"; return $output; }Now lets call the form fdt_themeswitcher_form. In this form there is a select box to select the enabled themes and a button Switch -> To switch to new selected theme See the form below function fdt_theme_switcher_themeswitcher_form($form, &$form_state) { global $current_theme; $options = fdt_theme_switcher_options(); $form['themeswitcher']['theme'] = array( '#type' => 'item', '#markup' => '<p>Select a theme</p>' ); $form['themeswitcher']['theme'] = array( '#type' => 'select', '#title' => t('Select a theme'), '#default_value' => $current_theme, '#title_display' => 'attribute', '#options' => $options, '#required' => TRUE, ); $form['themeswitcher']['actions'] = array('#type' => 'actions'); $form['themeswitcher']['actions']['submit'] = array( '#type' => 'submit', '#value' => t('Switch'), '#id' => 'fdt_theme-submit', ); return $form; }Here we store current theme name to variable $current_theme and passed it as global. Now to display all the theme names in select box a function fdt_theme_switcher_options() is called and the value is stored to variable $options. See the code below function fdt_theme_switcher_options() { $options = array(); $themes = list_themes(); foreach ($themes as $name => $theme) { if ($theme->status) { $options[$name] = $theme->info['name']; } } return $options; }Now comes the form submit. When we submit function is called, values passed are themename, and baseurl as a global variable. Here will store the theme name to variable $themeurl in format t/<theme_name>. Now the function return will call drupal_goto() with coressponding theme name and enable it. See the submit fuction for each buttons function fdt_theme_switcher_themeswitcher_form_submit($form, &$form_state) { global $base_url; $themeurl="t/".$form_state['values']['theme']; $options = array( //'fragment' => '', 'query' => '', 'absolute' => TRUE, 'alias' => FALSE, 'prefix' => 'goto', 'external' => FALSE ); drupal_goto($themeurl,$options); }Ok, now we have enable the theme. But the problem comes when we go to inner pages for each theme we have to attach the theme name along with the url and when we click a link and goto external page the attached themename must be removed. In order to get this done we uses two hooks hook_url_inbound_alter() -> Will strip the "t/<theme_name>" from the urls internally hook_url_outbound_alter() -> Rewriteall urls in the site to include the t/<theme_name> In function url_inbound_alter() will get the theme name as a global variable, if not admin pages will return node values to variable result and when we are opening the page for the first time garland theme is set as default theme. In function url_outbound_alter() will set the path as $base_url."/t/".<theme_name>. See the code below. /** * Implements hook_url_inbound_alter() * */ function fdt_theme_switcher_url_inbound_alter(&$result, $path, $path_language) { global $current_theme; // All requests should have theme name and theme version except admin urls if ($path != 'admin' && (substr($path, 0, 6) != "admin/") && preg_match("/^t\/([^\/]*)\/?(.*)/", $path, $matches)) { $current_theme=$matches[1]; $result = $matches[2]; if ($result == '') { $result = "node"; } } else { if ($current_theme == '') { $current_theme='garland'; } } } /** * Implements hook_url_outbound_alter() * */ function fdt_theme_switcher_url_outbound_alter(&$path, &$options, $original_path) { global $current_theme, $base_url; if($original_path == 'http://www.freedrupalthemes.net') { $fdturl='http://www.freedrupalthemes.net'; return $fdturl; } if ($options['prefix'] == 'goto') { $options['prefix']=''; return; } if ($original_path == '') { $path=$base_url."/t/".$current_theme; $options = array( 'fragment' => '', 'query' => '', 'absolute' => TRUE, 'alias' => FALSE, 'prefix' => '', 'external' => TRUE ); return; } // Add theme name and theme version to all urls except admin urls if ($path != 'admin' && substr($path, 0, 6) != "admin/" && $current_theme != '') { if ($path == '<front>' || $path == '' || $path == '/') { $path = "t/$current_theme/"; } else { $path = "t/$current_theme/$path"; } } }Now to display this in a fixed postion we have to gave the styles accordingly. Feel free to test this module in our site Free Drupal Themes, and let me know your feedback. Web Development Drupal Drupal Themes Drupal Modules Drupal 7 Leave a reply Your email address will not be published. Required fields are marker *
more_horiz
close

on 11th December 2014 / by renjith
Suppose you have a drupal website which uses drupal ubercart module for handling payments. Your drupal website has several online products which can be purchased using credit card. In Drupal projects, we have to enter credit card informations in the Checkout page. Please consider the following testcases which can be used to test credit card functionality. Ensure that the user is able to select the credit card payment method in the checkout page. Ensure that a field 'Card Number' is displayed in the payment method block. Ensure that a field 'Expiration Date' is displayed in the payment method block. Ensure that a field 'CVV' is displayed in the payment method block. Ensure that the user is able to enter the credit card number, expiration date, and CVV number. Ensure that an error message is displayed on leaving any field blank. Ensure that an error message is displayed on entering an invalid card number. Ensure that an error message is displayed on entering characters/symbols in card number field. Ensure that an error message is displayed on selecting an invalid expiration date. Ensure that an error message is displayed on entering an invalid CVV number. Ensure that an error message is displayed on entering characters/symbols in CVV field. Ensure that the card number and cvv number are removed on refreshing the check out page. Ensure that the user is redirected to Review order page on entering the valid credit card details. Ensure that the payment method is displayed as credit card in the Review order page. Ensure that only the last 4 digits of the card no: is displayed in the Review order page. Ensure that the expiration date is displayed in the Review order page. Ensure that CVV number is not displayed in the Review order page. Ensure that the user is redirected to the Check out page on clicking the back button. Ensure that the card number and CVV number are not displayed in the check out page. Please note that the fields may change according to the specific project. In some of the projects, CVV fields may not be used. Here, I have specified all the fields. Thus, we can verify all the fields in the Drupal project by going through the above test cases. Drupal Drupal Modules Leave a reply Your email address will not be published. Required fields are marker *